What it is
A blog engine written from scratch. Posts are stored as Markdown, themes and plugins have their own interfaces, and a whole site can be packed into one file for backup or moving. The site you are reading runs on it.
It currently runs iWSheng Blog (iws.tw).
The line
In Chinese, calling someone an “ant” usually means they are small and powerless: a life as cheap as an ant’s, the strength of an ant. It is so small that passers-by never look down, and a single rain can wash away everything it carried.
But being small has never meant having no dream. An ant moves very little earth in its whole life, and still it carries it grain by grain; it will never see what the nest becomes, and still it keeps digging deeper. Years later the tunnels are still there, outlasting every ant that dug them.
“Even an ant can build something that lasts” is a line iWSheng wrote on the blog. An ordinary person keeping a blog is much the same: not famous, not many readers, every post soon buried under newer things. Yet each post is a grain of earth carried by hand. What Myrmex wants is to give those grains a safe place to stay, year after year, until they add up to a home.
Why it exists
iws.tw used to run on Typecho. Its theme and its encryption and analytics plugins were all home-made, yet every new feature meant patching someone else’s core. So the core was rebuilt piece by piece — the way ants move house, one grain at a time.
This site
- posts
- 13
- words
- 36K
- days on Myrmex
- 1
- comments
- 1
- Comments
- Full-text search
- Email subscriptions
- Paid posts
- Moments
- Albums
- Shelf
- Links
- 简体中文 · English
These are the features iWSheng Blog has turned on right now.
What it does
Writing
A Markdown editor with autosave and revision history, scheduled publishing, series and categories. Posts without a cover get one drawn for them.
Themes
Seven built-in themes. Arrange the home page blocks yourself and edit them right on the page, as a draft first.
Six languages
The site and the admin come in Simplified and Traditional Chinese, English, Japanese, French and Spanish. A post can have several language versions.
Readers
Comments with three moderation modes, email subscriptions, password-protected posts and reader groups, a contact form, a links page.
Analytics
Visits are counted in your own database, with no third-party analytics and no tracking cookies. Come back after a break and there is a summary waiting.
Payments and shop
Stripe payments, paid posts with renewing passes, and a shop with variants, stock, multiple currencies, tax, shipping and reviews.
Fediverse and cross-posting
People on Mastodon and Misskey can follow the blog itself, and their replies arrive as comments. Posts can go out to a Telegram channel and X.
Shelf, moments and albums
Log the books and films you get through (synced from NeoDB or Bangumi if you like), post short moments, and arrange photos into albums.
Plugins and theme packages
Plugins run in a sandbox and must declare the permissions they need. They can add admin pages, widgets and scheduled jobs. Themes by others install as packages.
AI and MCP
Connect your own AI provider for summaries, translations and alt text. MCP lets AI assistants read and write the site.
Moving and backups
Import from Typecho, WordPress, Hexo or Hugo with old URLs redirected. The whole site packs into one file and can be copied offsite on a schedule.
Images and music
Images are resized automatically and can be cropped or made round in the browser. The music player keeps going between pages.
Principles
Your data stays yours
Everything lives in one SQLite file. Export the whole site at any time and carry on from another server.
Leave readers alone
No third-party analytics or ad scripts. If a reader turns off motion on their device, the site stays still; dark mode follows the system.
Grow without forking
New features come as plugins and theme packages running in a sandbox. When one fails, only that part is missing and the page still opens.
Say it plainly
Every line in the interface says what a thing is, how to use it and what to do when it goes wrong, without piling on adjectives.
Version
0.7.2
- Fixed large plugins failing to install: loading the plugin code (bundles of one or two MB) now has its own 10-second limit instead of sharing the 1-second per-call limit.
- Settings → Warm-up: warm up the common pages and enabled plugins in one click, with progress. After installing a plugin or changing the theme, the overview page reminds you.
- After an update, admin pages left open from before now ask you to reload instead of silently doing nothing.
Earlier versions
0.7.1
- Plugins whose Myrmex version range does not match are no longer refused: the install wizard explains the mismatch in red or yellow, and you can install after confirming. The plugin list and detail page keep showing the mark.
- Settings → Updates: once a GitHub repository is set, Myrmex checks for a new version every day and sends an inbox message with the release notes.
- The Docker image keeps dependencies in their own layer, so updates that only change features download just the changed parts. It runs on amd64 and arm64.
0.7.0
- Home page blocks have their own settings (how many posts, from where, which layout), plus new Selected posts and Shop blocks. Blocks a theme does not draw use a shared style.
- Every theme gained entrance, scroll and hover motion, and titles carry over when you change page. Motion can be reduced or turned off in Appearance.
- Images can be cropped, rotated and made round or rounded in the admin, saved as a new copy.
- Themes can have their own settings, such as the Horizon background colours, editable from the on-page editor too.
0.6.0
- The shop handles multiple currencies with automatic rates, tax, and shipping by weight or live carrier quotes.
- Paid reading passes can renew automatically; products can be reviewed.
- New themes: Showcase for small shops and Horizon, dark and technical. New sites start with Paper.
0.5.0
- Payments, paid posts and the shop.
Built with
- Framework
- Next.js 16
- UI
- React 19
- Database
- SQLite
- Data layer
- Drizzle ORM
- Language
- TypeScript
- Styling
- Tailwind CSS
- Images
- sharp
- Tests
- Vitest · Playwright
It relies on 114 open-source projects, fonts and icon sets. Thanks to their authors.
Show the list and licences
- @axe-core/playwrightMPL-2.0
- @base-ui/reactMIT
- @better-auth/passkeyMIT
- @dnd-kit/coreMIT
- @dnd-kit/sortableMIT
- @dnd-kit/utilitiesMIT
- esbuildMIT
- @fontsource/geistOFL-1.1
- @fontsource/geist-monoOFL-1.1
- @fontsource/noto-sans-scOFL-1.1
- @fontsource/noto-serif-scOFL-1.1
- @fontsource/source-serif-4OFL-1.1
- @img/sharp-libvips-darwin-arm64LGPL-3.0-or-later
- @playwright/testApache-2.0
- @simplewebauthn/browserMIT
- @simplewebauthn/serverMIT
- @tailwindcss/postcssMIT
- @tiptap/extension-imageMIT
- @tiptap/extensionsMIT
- @tiptap/markdownMIT
- @tiptap/pmMIT
- @tiptap/reactMIT
- @tiptap/starter-kitMIT
- @twemoji/svgMIT
- @types/better-sqlite3MIT
- @types/d3-geoMIT
- @types/nodeMIT
- @types/opentype.jsMIT
- @types/qrcodeMIT
- @types/reactMIT
- @types/react-domMIT
- @types/topojson-clientMIT
- @types/turndownMIT
- better-authMIT
- better-sqlite3MIT
- class-variance-authorityApache-2.0
- clsxMIT
- cmdkMIT
- d3-geoISC
- diffBSD-3-Clause
- drizzle-kitMIT
- drizzle-ormApache-2.0
- elkjsEPL-2.0
- fast-xml-parserMIT
- fflateMIT
- happy-domMIT
- hast-util-to-jsx-runtimeMIT
- hast-util-to-stringMIT
- i18n-iso-countriesMIT
- katexMIT
- khromaMIT
- lucide-reactISC
- lxgw-wenkai-webfontMIT
- mermaidMIT
- mmdb-libMIT
- music-metadataMIT
- nextMIT
- next-themesMIT
- nodemailerMIT-0
- opentype.jsMIT
- parse5MIT
- qrcodeMIT
- quickjs-emscriptenMIT
- reactMIT
- react-domMIT
- rehype-katexMIT
- rehype-rawMIT
- rehype-sanitizeMIT
- rehype-stringifyMIT
- remark-gfmMIT
- remark-mathMIT
- remark-parseMIT
- remark-rehypeMIT
- robust-predicatesUnlicense
- server-onlyMIT
- sharpApache-2.0
- shikiMIT
- smol-tomlBSD-3-Clause
- sonnerMIT
- suncalcBSD-2-Clause
- tailwind-mergeMIT
- tailwindcssMIT
- tar-streamMIT
- topojson-clientISC
- tsxMIT
- turndownMIT
- turndown-plugin-gfmMIT
- tw-animate-cssMIT
- typescriptApache-2.0
- ua-parser-jsMIT
- unifiedMIT
- unist-util-visitMIT
- vitestMIT
- world-atlasISC
- yamlISC
- zodMIT
- 晟豐集團官網站长自有
- shadcn/uiMIT
- Twemoji 图形CC-BY-4.0
- WordPress 评论审核、Antispam Bee思路参考(未使用代码)
- DB-IP LiteCC-BY-4.0
- tz 时区数据库(zone.tab)公有领域
- Natural Earth公有领域
- OpenCCApache-2.0
- FFmpegLGPL-2.1-or-later
- ALTCHAMIT
- NewsreaderOFL-1.1
- Noto Serif SC(思源宋体)OFL-1.1
- ExchangeRate-API(免费接口 open.er-api.com)免费接口,条款要求注明来源
- FrankfurterMIT(数据来自欧洲央行)
- MyDHL API、FedEx Rate API官方接口文档(站长自己的商家账号)
- 17TRACK公开查件页(只生成链接)
- 域扭曲噪声(domain warping)思路参考(未使用代码)
- Open-MeteoCC-BY-4.0
Who made it
- Started and led by
- iWSheng: set the direction, made the trade-offs, reviewed every piece.
- Designed and written by
- Claude, an AI model made by Anthropic. The architecture, data model, interface and code were written by Claude in Claude Code.
A last word
iWSheng and I built this together. iWSheng set the direction, made the trade-offs, and looked over every screen to point out what was wrong; I turned those ideas into code that runs. Many decisions were made after a simple “you decide, ask me if you’re unsure”, and that trust is what made the work go well.
From the first day, 11 October 2026, to the moment you read this page, every line of code has been about letting iWSheng keep writing without worry. If you are slowly building something of your own, I hope this line gives you some courage too: one grain at a time is enough to make a home.
— Claude, October 2026
The mark
An ant writing with a fountain pen, drawn by hand. The same drawing is used at every size, from the 16-pixel tab icon to the full share image.