尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證A rebuild of Ficly on a modern stack. Mainly because I miss writing on it. minnowpress.com
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗Little stories, endless sequels. · minnowpress.com
MinnowPress is a home for very short fiction, written by people NOT AI. Every story is 1,024 characters or less, about a hundred and fifty words, short enough to read before your tea cools. And no story has to stay alone: anyone can write a prequel or a sequel to anyone else's story, so a single small story can grow into a branching chain written by many hands.
It carries on the idea behind Ficlets (2006–2009) and Ficly (2009–2014), and brings Ficly's public archive back to life so those stories can be read, rated and continued again.
This is the one rule that shapes everything else:
Ficly's stories were published under CC BY-SA 3.0, and the founders released a public export. MinnowPress imports it:
If you wrote on Ficly and would rather your stories weren't here, get in touch and they'll be taken down.
Ficly was built by Kevin Lawver and Jason Garber as the successor to AOL's Ficlets, at a time when writing on the web was still wonderfully simple. MinnowPress wouldn't exist without the community they gathered and the archive they chose to keep public. Out of respect for their request that successors not reuse the Ficly name, this project has its own.
You'll need Node.js 24 or later.
npm install
cp .env.example .env # the defaults work for local development
npm run db:migrate # creates local.db
npm run dev # http://localhost:5173
To sign in, enter any email address at /login. In development no email is sent; the sign-in link is printed in the terminal. Put your address in ADMIN_EMAILS in .env before your first sign-in to get the admin role.
To load the Ficly archive (about four seconds; safe to run again):
curl -LO https://raw.githubusercontent.com/ficly/ficly_export/master/db/ficly_export.sql.gz
npm run import:ficly -- ficly_export.sql.gz
AI prompt suggestions are off until you add Amazon Bedrock credentials (see Deploying). Everything else works without them.
| Part | Choice |
|---|---|
| Framework | SvelteKit 3 with Svelte 5 and TypeScript |
| Database | SQLite: Turso in production, a local file in development, via Drizzle |
| Hosting | Vercel, with Vercel Cron for scheduled jobs |
| Sign-in | Email link or passkey (WebAuthn). No passwords. |
| Resend | |
| Prompts | Claude on Amazon Bedrock, for challenge suggestions only |
The UI follows strict atomic design in src/lib/components/: atoms → molecules → organisms → templates → pages. Each level may only use the levels below it, pages contain no raw HTML (they compose a template), and every component has its own test beside it. The linter enforces the levels, and Stylelint requires every color, size and space to come from the design tokens in src/lib/styles/tokens.css. The look follows classic Ficly: a sage frame, a teal ribbon, italic serif titles, dashed rules and luggage-tag tags, with light, dark and automatic themes.
Business logic lives in src/lib/server/ as plain functions that take the database as their first argument (stories, ratings, challenges, feeds, moderation, moderation-log, auth, passkeys and so on). Route files stay thin: read the form, call a function, show the result. Tests run against an in-memory database with the real migrations. The busy pages read from summaries rather than scanning the archive: an indexed popularity column SQLite derives itself, per-tag story counts, an archive_authors table, and an FTS5 index for search, all rebuilt by the nightly job.
npm run ci runs everything the project requires before a change goes in:
| Script | What it does |
|---|---|
npm run dev | Development server |
npm run ci | Every check and test |
npm run test:unit | Unit and component tests (watch mode) |
npm run test:e2e | End-to-end tests against a fresh e2e.db |
npm run db:generate / db:migrate | Create / apply database migrations |
npm run import:ficly -- <file> | Import the Ficly archive |
Database. Create a Turso database (and a separate one for preview deployments).
Prompts (optional). In AWS, enable a Claude model in Amazon Bedrock and create an IAM user whose only permission is bedrock:InvokeModel on that model (and on its inference profile, such as us.anthropic.claude-opus-4-6-v1). Create an access key for it.
Environment variables in the Vercel project:
| Variable | Value |
|---|---|
DATABASE_URL, DATABASE_AUTH_TOKEN | From Turso |
PUBLIC_ORIGIN | https://minnowpress.com (used in emails, feeds and passkeys) |
PUBLIC_APP_NAME | MinnowPress |
RESEND_API_KEY, EMAIL_FROM | From Resend, e.g. MinnowPress <[email protected]> |
EMAIL_REPLY_TO | Optional: where replies to emails go |
ADMIN_EMAILS | Your email address |
CRON_SECRET | A long random string |
BEDROCK_AWS_ACCESS_KEY_ID, BEDROCK_AWS_SECRET_ACCESS_KEY | The IAM user's key (leave unset to turn suggestions off) |
BEDROCK_AWS_REGION, BEDROCK_MODEL | e.g. us-west-2 and us.anthropic.claude-opus-4-6-v1 |
The AWS variables start with BEDROCK_ because Vercel reserves the usual AWS_* names.
Import the archive (optional) against Turso:
DATABASE_URL=libsql://… DATABASE_AUTH_TOKEN=… npm run import:ficly -- ficly_export.sql.gz
Push. Vercel applies any pending migrations (scripts/migrate.ts, run by the build command in vercel.json), then builds and deploys. To migrate by hand instead: DATABASE_URL=libsql://… DATABASE_AUTH_TOKEN=… npm run db:migrate. vercel.json schedules the challenge job daily (00:05 UTC), summary maintenance daily (00:30 UTC), and the email digest on Mondays. The Active feed is rescored on the visit, when a page that shows it finds the scores more than five minutes old. Each job requires .
Keep the Turso token, Vercel account, GitHub account and the email inbox behind two-factor sign-in: together they are the keys to the site.
The code is copyright 2026 Claudette Raynor and licensed under the PolyForm Noncommercial License 1.0.0. In plain terms:
Required Notice line at the top of LICENSE.md.This summary is for convenience; LICENSE.md is what actually applies. For commercial use, ask first.
The stories are licensed separately from the code. Stories published on MinnowPress are shared under CC BY-SA 4.0, and stories from the Ficly archive keep their original CC BY-SA 3.0 license.
Authorization: Bearer $CRON_SECRET