diff --git a/examples/z-experimental-refresh/README.md b/examples/z-experimental-refresh/README.md
new file mode 100644
index 0000000000000..078c5d65e90b5
--- /dev/null
+++ b/examples/z-experimental-refresh/README.md
@@ -0,0 +1,14 @@
+# z-experimental-refresh
+
+This is an **experimental** demo of React Fast Refresh.
+Please do not use these features in your application or project (yet).
+
+## Usage
+
+Run the following command to get started:
+
+```bash
+yarn dev
+# or
+npm run dev
+```
diff --git a/examples/z-experimental-refresh/components/ClickCount.js b/examples/z-experimental-refresh/components/ClickCount.js
new file mode 100644
index 0000000000000..9b736bc3decfa
--- /dev/null
+++ b/examples/z-experimental-refresh/components/ClickCount.js
@@ -0,0 +1,15 @@
+import { useCallback, useState } from 'react'
+import styles from './ClickCount.module.css'
+
+export default function ClickCount() {
+ const [count, setCount] = useState(0)
+ const increment = useCallback(() => {
+ setCount(v => v + 1)
+ }, [setCount])
+
+ return (
+
+ )
+}
diff --git a/examples/z-experimental-refresh/components/ClickCount.module.css b/examples/z-experimental-refresh/components/ClickCount.module.css
new file mode 100644
index 0000000000000..3cba6f351a456
--- /dev/null
+++ b/examples/z-experimental-refresh/components/ClickCount.module.css
@@ -0,0 +1,32 @@
+button.btn {
+ margin: 0;
+ border: 1px solid #d1d1d1;
+ border-radius: 5px;
+ padding: 0.5em;
+ vertical-align: middle;
+ white-space: normal;
+ background: none;
+ line-height: 1;
+ font-size: 1rem;
+ font-family: inherit;
+ transition: all 0.2s ease;
+}
+
+button.btn {
+ padding: 0.65em 1em;
+ background: #0076ff;
+ color: #fff;
+ border: none;
+ cursor: pointer;
+ transition: all 0.2s ease;
+}
+button.btn:focus {
+ outline: 0;
+ border-color: #0076ff;
+}
+button.btn:hover {
+ background: rgba(0, 118, 255, 0.8);
+}
+button.btn:focus {
+ box-shadow: 0 0 0 2px rgba(0, 118, 255, 0.5);
+}
diff --git a/examples/z-experimental-refresh/global.css b/examples/z-experimental-refresh/global.css
new file mode 100644
index 0000000000000..5827ef085ef3a
--- /dev/null
+++ b/examples/z-experimental-refresh/global.css
@@ -0,0 +1,41 @@
+body {
+ font-family: 'SF Pro Text', 'SF Pro Icons', 'Helvetica Neue', 'Helvetica',
+ 'Arial', sans-serif;
+ padding: 20px 20px 60px;
+ max-width: 680px;
+ margin: 0 auto;
+ font-size: 16px;
+ line-height: 1.65;
+ word-break: break-word;
+ font-kerning: auto;
+ font-variant: normal;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ text-rendering: optimizeLegibility;
+ hyphens: auto;
+}
+
+h2,
+h3,
+h4 {
+ margin-top: 1.5em;
+}
+
+code,
+pre {
+ font-family: Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono,
+ Bitstream Vera Sans Mono, Courier New, monospace, serif;
+ font-size: 0.92em;
+ color: #d400ff;
+}
+
+code:before,
+code:after {
+ content: '`';
+}
+
+hr {
+ border: none;
+ border-bottom: 1px solid #efefef;
+ margin: 6em auto;
+}
diff --git a/examples/z-experimental-refresh/next.config.js b/examples/z-experimental-refresh/next.config.js
new file mode 100644
index 0000000000000..7258b1fdf1924
--- /dev/null
+++ b/examples/z-experimental-refresh/next.config.js
@@ -0,0 +1,5 @@
+module.exports = {
+ experimental: {
+ reactRefresh: true,
+ },
+}
diff --git a/examples/z-experimental-refresh/package.json b/examples/z-experimental-refresh/package.json
new file mode 100644
index 0000000000000..97e0becd5a630
--- /dev/null
+++ b/examples/z-experimental-refresh/package.json
@@ -0,0 +1,15 @@
+{
+ "name": "z-experimental-refresh",
+ "version": "1.0.0",
+ "scripts": {
+ "dev": "next",
+ "build": "next build",
+ "start": "next start"
+ },
+ "dependencies": {
+ "next": "canary",
+ "react": "^16.9.0",
+ "react-dom": "^16.9.0"
+ },
+ "license": "MIT"
+}
diff --git a/examples/z-experimental-refresh/pages/_app.js b/examples/z-experimental-refresh/pages/_app.js
new file mode 100644
index 0000000000000..d305f97bab7f1
--- /dev/null
+++ b/examples/z-experimental-refresh/pages/_app.js
@@ -0,0 +1,5 @@
+import '../global.css'
+
+export default function MyApp({ Component, pageProps }) {
+ return
+}
diff --git a/examples/z-experimental-refresh/pages/index.js b/examples/z-experimental-refresh/pages/index.js
new file mode 100644
index 0000000000000..b912be8b631ec
--- /dev/null
+++ b/examples/z-experimental-refresh/pages/index.js
@@ -0,0 +1,35 @@
+import { useCallback, useEffect, useState } from 'react'
+import ClickCount from '../components/ClickCount'
+
+function Home() {
+ const [count, setCount] = useState(0)
+ const increment = useCallback(() => {
+ setCount(v => v + 1)
+ }, [setCount])
+
+ useEffect(() => {
+ const r = setInterval(() => {
+ increment()
+ }, 250)
+ return () => {
+ clearInterval(r)
+ }
+ }, [increment])
+
+ return (
+
+ Home
+
+
Auto Incrementing Value
+
Current value: {count}
+
+
+
+
Component with State
+
+
+
+ )
+}
+
+export default Home