PageSourceSearch

https://antfu.me/

html antfu.me collected 2026-10-02 15:07:26 UTC 14,454 bytes, 3 lines download raw bytes

1<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="author" content="Anthony Fu"><meta http-equiv="X-UA-Compatible" content="chrome=1"><meta name="revisit-after" content="7 days"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="/favicon.svg" type="image/svg+xml"><link rel="alternate" type="application/rss+xml" title="Anthony Fu's Blog" href="/feed.xml"><meta name="msapplication-TileColor" content="#ffffff"><title>Anthony Fu</title>
1<script>!function(){const e=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches,t=localStorage.getItem("vueuse-color-scheme")||"auto";("dark"===t||e&&"light"!==t)&&document.documentElement.classList.toggle("dark",!0)}()</script>
1<script type="module" crossorigin="" src="/assets/app-i8bZJj9W.js"></script>
1<link rel="modulepreload" crossorigin="" href="/assets/rolldown-runtime-hePW80VL.js"><link rel="stylesheet" crossorigin="" href="/assets/app-CcwtqiuP.css"><link rel="modulepreload" crossorigin="" href="/assets/pages-D_Il_SHa.js"><link rel="modulepreload" crossorigin="" href="/assets/vue.BHyNcdic-D2KugMlH.js"><link rel="modulepreload" crossorigin="" href="/assets/SponsorButtons-BS_4bhNf.js"><link rel="modulepreload" crossorigin="" href="/assets/SponsorButtonCollective-kvK_HKB6.js"></head><body class="font-sans text-gray-700 dark:text-gray-200 relative"><div id="app" data-server-rendered="true"><!--[--><header class="header z-40" data-v-f7964d7e=""><a aria-current="page" href="/" class="router-link-active router-link-exact-active w-12 h-12 absolute xl:fixed m-5 select-none outline-none" focusable="false" data-v-f7964d7e=""><svg viewBox="0 0 100 100" fill="none" xmlns="http://www.w3.org/2000/svg" data-v-f7964d7e="" data-v-69a3f4dd=""><title data-v-69a3f4dd="">Anthony Fu @ antfu.me</title><mask id="mask0_634_3" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="24" y="7" width="50" height="87" data-v-69a3f4dd=""><path d="M73.7892 9.12595C69.3501 1.20478 61.8262 17.7197 60.2461 21.1572C56.9356 28.6299 55.2305 35.5788 53.5 43.5C51.5438 41.4076 48.5048 36.8913 47 34.5C46 32.5 44.178 33.3348 45.2582 35.5C44.2048 33.7065 44 31 40.4582 28.8541C31.3543 28.0321 23.7209 43.6536 25 51.5C28.5029 62.7044 40 53 42.8659 47.9845C42.5649 50.8241 42.5649 54.7847 45.424 56.1298C48.5 57 49.8631 54.9342 51.8194 52.9913C50.6908 64.7236 49.2612 76.9042 53.1737 88.4123C54.9794 94.9884 61.3747 96.6324 62.0519 88.5618C62.9547 78.5482 60.4719 68.7589 57.4623 59.3431C56.6347 56.6529 55.5 54.5 54.6886 51.7956C54.6886 48 55.6585 50.6972 57.0861 52.244C58.7413 54.0375 64.309 59.3431 66.5 59.5C65 57.5 64.5348 56.8771 64.309 56.6529C61.9014 53.6638 59.0423 50.8989 56.4842 47.9845C61.6757 40.5117 66.7167 32.3663 70.1777 23.7726C71.6825 19.3637 74.8425 13.7591 73.7892 9.12595ZM43.3926 40.8853C41.7373 45.4437 39.7811 48.956 35.9439 52.0945C26.1502 60.1051 25.1428 47.741 28.6457 41.8568C33.16 32.4411 42.7154 24.0715 43.3926 40.8853ZM52.5 49C51.2962 50.7187 49.5314 53.3274 47.5 54C45.8447 54.4484 45.3488 53.2902 45.0478 51.7956C44.145 46.8636 45.725 42.0063 46.4021 37.2237C48.0574 40.3622 50.119 42.8614 52 46C52.3762 46.822 53.0267 48.1033 52.5 49ZM55.1299 56.1298C58.3652 65.9192 60.5471 76.1569 59.6442 86.3947C58.7413 95.362 55.8823 88.8607 54.7537 84.3023C52.4213 74.2887 53 63.5 54.227 53.8133C54.528 54.5606 54.9042 55.6067 55.1299 56.1298ZM71.4568 11.1436C69.8767 21.755 62.0519 36.7006 55.4308 45.0701C56.7851 38.0457 58.7413 31.2454 61.45 24.5946C61.6757 23.2495 71.6072 3.52135 71.4568 11.1436Z" fill="white" data-v-69a3f4dd=""></path></mask><g mask="url(#mask0_634_3)" data-v-69a3f4dd=""><path class="path1" d="M43.8252 39.3048C43.5 29 38 27 31 35.5C16.9959 58.4158 35 61 42.5 46C44.4559 42.5 45.5001 37 45.5001 37C44.8789 42.2731 43.8252 45.9801 43.8252 50C43.8252 56.6285 48 57.9 54.5 48.4C60.5 40.9 68.5 27.5 72 15.5C74.4792 7 70.5 4.5 64 16.5C55 31.5 50.7595 59 52.3 78C53.8038 96.5469 63 97.5 61 79.5C59.5082 66.0734 52 42.5 45.5001 33C48 38.5 57 52 65.5 58.5" stroke="black" stroke-width="2.5" stroke-linecap="round" data-v-69a3f4dd=""></path></g></svg></a><button title="Scroll to top" fixed="" right-3="" bottom-3="" w-10="" h-10="" hover:op100="" rounded-full="" hover-bg-hex-8883="" transition="" duration-300="" z-100="" print:hidden="" class="op0! pointer-events-none" data-v-f7964d7e=""><div i-ri-arrow-up-line="" data-v-f7964d7e=""></div></button><nav class="nav" data-v-f7964d7e=""><div class="spacer" data-v-f7964d7e=""></div><div class="right" print:op0="" data-v-f7964d7e=""><a href="/posts" class="" title="Blog" data-v-f7964d7e=""><span class="lt-md:hidden" data-v-f7964d7e="">Blog</span><div i-ri-article-line="" md:hidden="" data-v-f7964d7e=""></div></a><a href="/projects" class="" title="Projects" data-v-f7964d7e=""><span class="lt-md:hidden" data-v-f7964d7e="">Projects</span><div i-ri-lightbulb-line="" class="md:hidden" data-v-f7964d7e=""></div></a><a href="/talks" class="lt-md:hidden" title="Talks" data-v-f7964d7e="">Talks </a><a href="/sponsors-list" class="" title="Sponsors" data-v-f7964d7e=""><span class="lt-md:hidden" data-v-f7964d7e="">Sponsors</span><div i-ri-heart-line="" class="md:hidden" data-v-f7964d7e=""></div></a><a href="/podcasts" class="lt-md:hidden" title="Podcasts" data-v-f7964d7e=""><div i-ri-mic-line="" data-v-f7964d7e=""></div></a><a href="/photos" class="" title="Photos" data-v-f7964d7e=""><div i-ri-camera-3-line="" data-v-f7964d7e=""></div></a><a href="/demos" class="" title="Demos" data-v-f7964d7e=""><div i-ri-screenshot-line="" data-v-f7964d7e=""></div></a><a href="https://bsky.app/profile/antfu.me" target="_blank" title="Bluesky" class="lt-md:hidden" data-v-f7964d7e=""><div i-ri-bluesky-line="" data-v-f7964d7e=""></div></a><a href="https://github.com/antfu" target="_blank" title="GitHub" class="lt-md:hidden" data-v-f7964d7e=""><div i-uil-github-alt="" data-v-f7964d7e=""></div></a><a href="/feed.xml" target="_blank" title="RSS" class="lt-md:hidden" data-v-f7964d7e=""><div i-la-rss-square="" style="font-size:1.25rem;margin:0 -.125rem" data-v-f7964d7e=""></div></a><a class="select-none" title="Toggle Color Scheme" data-v-f7964d7e=""><div i-ri-sun-line="" dark:i-ri-moon-line=""></div></a></div></nav></header><main class="px-7 py-10 of-x-hidden"><!--[--><!----><div class="prose m-auto mb-8"><h1 class="mb-0 slide-enter-50">Anthony Fu</h1><!----><!----><!----><!----></div><article class=""><!--[--><div class="prose m-auto slide-enter-content"><p>Hey! I’m Anthony Fu, a fanatical open sourceror and design engineer.</p><p>Working at <a href="https://vercel.com" class="markdown-magic-link markdown-magic-link-link" target="_blank" rel="noopener"><span class="markdown-magic-link-image" style="background-image:url('https://github.com/vercel.png')"></span>Vercel</a> / <a href="https://github.com/nuxt/nuxt" class="markdown-magic-link markdown-magic-link-link" target="_blank" rel="noopener"><span class="markdown-magic-link-image" style="background-image:url('https://nuxt.com/assets/design-kit/icon-green.svg')"></span>Nuxt</a><br>Creator of <a href="https://github.com/vitest-dev/vitest" class="markdown-magic-link markdown-magic-link-link" target="_blank" rel="noopener"><span class="markdown-magic-link-image" style="background-image:url('https://github.com/vitest-dev.png')"></span>Vitest</a> <a href="https://github.com/slidevjs/slidev" class="markdown-magic-link markdown-magic-link-link" target="_blank" rel="noopener"><span class="markdown-magic-link-image" style="background-image:url('https://github.com/slidevjs.png')"></span>Slidev</a> <a href="https://github.com/vueuse/vueuse" class="markdown-magic-link markdown-magic-link-link" target="_blank" rel="noopener"><span class="markdown-magic-link-image" style="background-image:url('https://github.com/vueuse.png')"></span>VueUse</a> <a href="https://github.com/unocss/unocss" class="markdown-magic-link markdown-magic-link-link" target="_blank" rel="noopener"><span class="markdown-magic-link-image" style="background-image:url('https://github.com/unocss.png')"></span>UnoCSS</a> <a href="https://github.com/elk-zone/elk" class="markdown-magic-link markdown-magic-link-link" target="_blank" rel="noopener"><span class="markdown-magic-link-image" style="background-image:url('https://github.com/elk-zone.png')"></span>Elk</a> <a href="https://github.com/type-challenges/type-challenges" class="markdown-magic-link markdown-magic-link-link" target="_blank" rel="noopener"><span class="markdown-magic-link-image" style="background-image:url('https://github.com/type-challenges.png')"></span>
1Type Challenges</a><br>Core team of <a href="https://github.com/vuejs/core" class="markdown-magic-link markdown-magic-link-link" target="_blank" rel="noopener"><span class="markdown-magic-link-image" style="background-image:url('https://vuejs.org/logo.svg')"></span>Vue</a> <a href="https://github.com/nuxt/nuxt" class="markdown-magic-link markdown-magic-link-link" target="_blank" rel="noopener"><span class="markdown-magic-link-image" style="background-image:url('https://nuxt.com/assets/design-kit/icon-green.svg')"></span>Nuxt</a> <a href="https://github.com/vitejs/vite" class="markdown-magic-link markdown-magic-link-link" target="_blank" rel="noopener"><span class="markdown-magic-link-image" style="background-image:url('https://github.com/vitejs.png')"></span>Vite</a><br>Maintaining <a href="https://github.com/shikijs/shiki" class="markdown-magic-link markdown-magic-link-link" target="_blank" rel="noopener"><span class="markdown-magic-link-image" style="background-image:url('https://github.com/shikijs.png')"></span>Shiki</a> <a href="https://github.com/twoslashes/twoslash" class="markdown-magic-link markdown-magic-link-link" target="_blank" rel="noopener"><span class="markdown-magic-link-image" style="background-image:url('https://github.com/twoslashes.png')"></span>Twoslash</a> <a href="https://github.com/eslint-stylistic/eslint-stylistic" class="markdown-magic-link markdown-magic-link-link" target="_blank" rel="noopener"><span class="markdown-magic-link-image" style="background-image:url('https://github.com/eslint-stylistic.png')"></span>ESLint Stylistic</a></p><p>Dreaming up cool ideas and making them come true is where my passion lies. I am enthusiastic about building tools that help myself and others to be more productive and enjoy the process of crafting. You can find my <a href="/projects">full projects list here</a>.</p><p>I give <a href="/talks">talks</a> and write <a href="/posts">blog posts</a> about open source, coding, etc. I am co-hosting a podcast <a href="https://web.archive.org/web/20260117143100/https://bento.me/nocodingtoday" target="_blank" rel="noopener"><em>No Coding Today</em></a> <span op75="">(in Mandarin)</span>. Occasionally, I do live coding streams on <a href="https://www.youtube.com/anthonyfu7" target="_blank" rel="noopener">YouTube</a> and <a href="https://space.bilibili.com/668380" target="_blank" rel="noopener">哔哩哔哩</a>. From time to time, I make some generative-art, interactivity experiments on <a href="https://100.antfu.me/" target="_blank" rel="noopener">100.antfu.me</a>.</p><p>Outside of programming, I enjoy doing photography and traveling. I post <a href="/photos">photos on this page</a>. In case you are interested, here are the <a href="/use">hardware/software I use</a>.</p><div flex-auto=""></div><hr><p>Find me on</p><p flex="~ gap-2 wrap" class="mt--2!"><a href="https://github.com/antfu" target="_blank"><span op75="" i-simple-icons-github=""></span> GitHub</a><a href="https://bsky.app/profile/antfu.me" target="_blank"><span op75="" i-ri-bluesky-fill=""></span> Bluesky</a><a href="https://chat.antfu.me" target="_blank"><span op75="" i-simple-icons-discord=""></span> Discord Server</a><a href="https://x.com/antfu7" target="_blank"><span op75="" i-ri-twitter-x-fill=""></span> Twitter</a><a href="https://x.com/antfuzh" target="_blank"><span op75="" i-ri-twitter-x-fill=""></span> 中文推</a><a href="https://x.com/antfujp" target="_blank"><span op75="" i-ri-twitter-x-fill=""></span> 日本語</a></p><p>Or mail me at <span font-mono="">hi<span i-carbon-at=""></span>antfu.me</span></p><hr><!--[--><p>If you enjoy my work and find them useful, consider sponsor me and the ecosystem to help Open Source sustainable. Thank you!</p><p flex="~ gap-2 wrap items-center"><a href="https://opencollective.com/antfu" target="_blank" class="group btn-rose text-base p2 px3 pr2"></a></p><div i-ph-hand-heart-duotone="" group-hover="i-ph-hand-heart-fill text-rose" transition-all="" duration-200="" ease-out=""></div><a href="https://opencollective.com/antfu" target="_blank" class="group btn-rose text-base p2 px3 pr2">Sponsor the Ecosystem </a><span op50="" text-sm=""><a href="/posts/sponsorship-forwarding" target="_blank">How does this work?</a></span>
1<p></p><p flex="~ gap-2 wrap"><a href="https://github.com/sponsors/antfu" target="_blank" class="group btn-rose inline-block"></a></p><div i-ph-heart-duotone="" group-hover="i-ph-heart-fill text-rose" transition-all="" duration-200="" ease-out=""></div><a href="https://github.com/sponsors/antfu" target="_blank" class="group btn-rose inline-block">Sponsor to support Anthony </a><a href="https://afdian.com/a/antfu" target="_blank" class="group btn-yellow inline-block"><div i-ph-lightning-duotone="" group-hover="i-ph-lightning-fill text-yellow" transition-all="" duration-200="" ease-out=""></div>在爱发电上支持我</a><p></p><!--]--></div><!--]--></article><!----><!--]--><div class="mt-10 mb-6 prose m-auto flex slide-enter animate-delay-1200! copyright"><span class="text-sm op50"><a target="_blank" href="https://creativecommons.org/licenses/by-nc-sa/4.0/" style="color:inherit">CC BY-NC-SA 4.0</a> 2021-PRESENT © Anthony Fu</span><div class="flex-auto"></div></div></main><!----><!--]--></div>
1<script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
vendor: 1 bytes, line 1
1
2<script async id="netlify-rum-container" src="/.netlify/scripts/rum" data-netlify-rum-site-id="c371ba89-d187-498f-9bd9-e6bc5afd1fbb" data-netlify-deploy-branch="main" data-netlify-deploy-context="production" data-netlify-cwv-token="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzaXRlX2lkIjoiYzM3MWJhODktZDE4Ny00OThmLTliZDktZTZiYzVhZmQxZmJiIiwiYWNjb3VudF9pZCI6IjVjMTQ1YTVjMGVhZGE4Zjc0NTIzM2FlNyIsImRlcGxveV9pZCI6IjZhYWEyMmRiYjFkZmY2MDAwNzU0NTY5ZCIsImlzc3VlciI6Im5mc2VydmVyIn0.9qSVMoCXD6pNQ4Wt32n-3OemV7VZb1evIZiRSJMbDsw"></script>
2
3</body></html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.