diff --git a/src/client/directives/index.ts b/src/client/directives/index.ts
index 7b9d31a601..6513350e0d 100644
--- a/src/client/directives/index.ts
+++ b/src/client/directives/index.ts
@@ -7,6 +7,7 @@ import tooltip from './tooltip';
 import hotkey from './hotkey';
 import appear from './appear';
 import anim from './anim';
+import stickyContainer from './sticky-container';
 
 export default function(app: App) {
 	app.directive('userPreview', userPreview);
@@ -17,4 +18,5 @@ export default function(app: App) {
 	app.directive('hotkey', hotkey);
 	app.directive('appear', appear);
 	app.directive('anim', anim);
+	app.directive('sticky-container', stickyContainer);
 }
diff --git a/src/client/directives/sticky-container.ts b/src/client/directives/sticky-container.ts
new file mode 100644
index 0000000000..db29ea64b7
--- /dev/null
+++ b/src/client/directives/sticky-container.ts
@@ -0,0 +1,15 @@
+import { Directive } from 'vue';
+
+export default {
+	mounted(src, binding, vn) {
+		//const query = binding.value;
+
+		const header = src.children[0];
+		const currentStickyTop = getComputedStyle(src).getPropertyValue('--stickyTop');
+		src.style.setProperty('--stickyTop', `${parseInt(currentStickyTop) + header.offsetHeight}px`);
+		header.style.setProperty('--stickyTop', currentStickyTop);
+		header.style.position = 'sticky';
+		header.style.top = 'var(--stickyTop)';
+		header.style.zIndex = '1';
+	},
+} as Directive;
diff --git a/src/client/pages/user/index.timeline.vue b/src/client/pages/user/index.timeline.vue
index 1b7a96fff6..4941abdade 100644
--- a/src/client/pages/user/index.timeline.vue
+++ b/src/client/pages/user/index.timeline.vue
@@ -1,11 +1,11 @@
 <template>
-<div>
-	<MkTab v-model:value="with_" class="_gap _section">
+<div class="yrzkoczt" v-sticky-container>
+	<MkTab v-model:value="with_" class="_gap tab">
 		<option :value="null">{{ $ts.notes }}</option>
 		<option value="replies">{{ $ts.notesAndReplies }}</option>
 		<option value="files">{{ $ts.withFiles }}</option>
 	</MkTab>
-	<XNotes ref="timeline" class="_section _noGap_" :pagination="pagination" @before="$emit('before')" @after="e => $emit('after', e)"/>
+	<XNotes ref="timeline" class="_noGap_" :pagination="pagination" @before="$emit('before')" @after="e => $emit('after', e)"/>
 </div>
 </template>
 
@@ -56,3 +56,11 @@ export default defineComponent({
 	},
 });
 </script>
+
+<style lang="scss" scoped>
+.yrzkoczt {
+	> .tab {
+		background: var(--bg);
+	}
+}
+</style>