diff --git a/site/content/tutorial/07-lifecycle/04-tick/app-a/App.svelte b/site/content/tutorial/07-lifecycle/04-tick/app-a/App.svelte
new file mode 100644
index 0000000000..3386ff93df
--- /dev/null
+++ b/site/content/tutorial/07-lifecycle/04-tick/app-a/App.svelte
@@ -0,0 +1,35 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/site/content/tutorial/07-lifecycle/04-tick/app-b/App.svelte b/site/content/tutorial/07-lifecycle/04-tick/app-b/App.svelte
new file mode 100644
index 0000000000..c9cb6de420
--- /dev/null
+++ b/site/content/tutorial/07-lifecycle/04-tick/app-b/App.svelte
@@ -0,0 +1,37 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/site/content/tutorial/07-lifecycle/04-tick/text.md b/site/content/tutorial/07-lifecycle/04-tick/text.md
new file mode 100644
index 0000000000..b58b024ad6
--- /dev/null
+++ b/site/content/tutorial/07-lifecycle/04-tick/text.md
@@ -0,0 +1,21 @@
+---
+title: tick
+---
+
+The `tick` function is unlike other lifecycle functions in that you can call it any time, not just when the component first initialises. It returns a promise that resolves as soon as any pending state changes have been applied to the DOM (or immediately, if there are no pending state changes).
+
+When you invalidate component state in Svelte, it doesn't update the DOM immediately. Instead, it waits until the next *microtask* to see if there are any other changes that need to be applied, including in other components. Doing so avoids unnecessary work and allows the browser to batch things more effectively.
+
+You can see that behaviour in this example. Select a range of text and hit the tab key. Because the `