尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證attempt at site generation with prompts
翻譯準備中
取自儲存庫 README
正在載入完整 README。 以下為已儲存的摘錄。
Describe an idea. Get a live, hosted website in about a minute.
Top Banana is a "vibe coding" hosting platform: you write a paragraph in plain
English, an LLM agent builds a self-contained static site, and it goes live on
its own subdomain — no code editor, no build step, no hosting to set up.檢視完整 README ↗Top Banana is a "vibe coding" hosting platform: you write a paragraph in plain English, an LLM agent builds a self-contained static site, and it goes live on its own subdomain — no code editor, no build step, no hosting to set up.
The gap between "I have an idea" and "I have a URL I can send to a friend" should be a minute, not an afternoon. Top Banana is built for the people who live in that gap — hobbyists, small-business owners, event organizers, club leaders, instructors — and for developers who want a fast sketchpad for static sites. You describe it; you get a real site; you share its address.
Type what you want and pick a starter template. The agent writes the HTML, inlines the CSS and JS, lints the result, and streams its progress live — you watch the build move from Starting → Designing → Polishing → Ready instead of staring at a spinner.
The generated site is the demo. Every build lands on its own subdomain, served straight from object storage, fully self-contained — no CDNs, no frameworks, no external dependencies. A book club, a bistro, a portfolio, a link-in-bio page — same prompt-to-URL path, wildly different results.
A site is never a dead end. The Workspace pairs your pages with a live preview and an "ask for a change" box — describe an edit and the agent makes it. Theme Studio restyles the whole site with one click across 30+ themes.
Your apps list shows everything you've built, last-edited at a glance. Each site opens on three tabs: Edit to change it, Inbox for whatever visitors sent (form submissions you can download as CSV or JSON, plus the photo-wall queue), and Settings for custom domains with copy-paste DNS, a private toggle, exports, and a completeness checklist.
Top Banana is multi-tenant from the ground up: passkey sign-in, per-user app quotas, one-time invite links, and a super-admin Admin section — People for accounts and invites, Connections for MCP clients, and Instance for storage, build success rates, and recent activity.
.html files — CSS and JS inlined — using S3-backed
write_file / read_file / list_files tools.{slug}.{domain} via subdomain routing.*.localhost (or your configured domain)
are proxied to the S3 prefix matching the subdomain slug.tailwindcss on PATH, or npx @tailwindcss/cli) for the per-site CSS
compilehttp://localhost:1234/v1# Start Minio and run the server against LM Studio
task local
The server starts on port 8080. The first time, enroll the super admin (see
below) — after that you land on the build form and can start shipping sites.
Authentication is passkey-based — there is no admin password. On every startup
the server seeds a user record for --super-admin-email (defaults to
admin@local in task local) and issues a one-shot bootstrap invite the first
time that account has no registered credentials. The invite URL is logged as:
auth.bootstrap.invite_pending email=admin@local url=https://lvh.me/register?invite=<token> expires=...
For local HTTP dev, rewrite the scheme and add the port — turn that into
http://lvh.me:8080/register?invite=<token> and open it in a browser. The
/register page binds a passkey to the super-admin account; subsequent visits
to /login use that passkey. The invite is reused on every restart until you
finish enrolling, then it stops appearing in the logs.
If you ever lose the passkey, delete the user from Minio
(rm -rf /tmp/topbanana-minio/topbanana/_auth/users/) and restart — bootstrap
fires again.
All options are available as CLI flags or environment variables.
| Flag | Env Var | Default | Description |
|---|---|---|---|
--port | PORT | 8080 | HTTP listen port |
--domain | DOMAIN | localhost | Base domain for subdomain routing |
--super-admin-email | SUPER_ADMIN_EMAIL | (required) | Email of the seeded super admin; bootstrap invite is logged at startup until enrolled |
--insecure-cookies | INSECURE_COOKIES | off | Allow non-Secure cookies; required for the session flow over plain HTTP locally |
--s3-bucket | S3_BUCKET | (required) | S3 bucket name |
--s3-endpoint-url | AWS_ENDPOINT_URL | Override S3 endpoint (e.g. Minio) | |
--llm-model | LLM_MODEL | LLM model string | |
--llm-base-url | LLM_BASE_URL | LLM provider base URL | |
--llm-api-key | LLM_API_KEY | LLM provider API key | |
--tailwind-cli | TAILWIND_CLI | Path to the Tailwind standalone binary (else PATH / npx) | |
--cache-size | 1024 | ARC cache entry limit |
task fmt # Format, lint, and test
task local # Start app with Minio + LM Studio
task css # Recompile the embedded admin stylesheet
task minio:start # Start Minio in background
task minio:stop # Stop Minio
task minio:ready # Start Minio if not running
task test:llm # Opt-in real-model integration tests (see below)
Every other test stubs the agent. task test:llm instead drives the real
agent loop (prompt → tools → lint/retry → CSS → describe) against a local model,
catching prompt/tool/lint-loop regressions the stubs can't. It requires LM Studio
running plus Minio, is opt-in (gated by TOPBANANA_LLM_E2E=1), is slow
(minutes), and is excluded from the default go test/task fmt run.
Assertions are structural invariants (build completes, index.html non-empty,
lint clean, a write_file call happened), not exact model output.
task lmstudio:ready loads a model with a 16K context — this matters: the
build agent's system prompt is several thousand tokens, so the default 4096
context starves the model (it never gets room to call write_file). If you load
a model by hand, give it at least a 16K context.
A Top Banana site can be served on any external domain (e.g. myblog.com) by
attaching the hostname under Settings → Custom web address and pointing DNS at
your origin. Putting Cloudflare in front gives you free TLS and a global cache;
Top Banana already emits the right cache headers, so the Cloudflare config is
small.
Open Settings for the site and add the hostnames you'll be using — one per line:
myblog.com
www.myblog.com
Save. The server rebuilds its host → slug index immediately; requests carrying
those Host headers now resolve to that site.
In the Cloudflare dashboard for the zone:
myblog.com) — CNAME record to your origin hostname (e.g.
origin.example.com). Cloudflare flattens CNAMEs at the apex automatically.www.myblog.com — CNAME to the same origin hostname.If you're running Top Banana behind a bare IP, use A records instead of
CNAME — same idea.
Top Banana listens on plain HTTP. Terminate TLS at Cloudflare (or with a Caddy/nginx reverse proxy on the origin):
Full (or Full (strict)) if you put a TLS-terminating proxy in front of
Top Banana.Flexible if Top Banana is exposed over plain HTTP — Cloudflare ↔ visitor
is HTTPS, Cloudflare ↔ origin is HTTP. Easier to set up; weaker than Full.Top Banana sends explicit cache directives:
| Path on a custom domain | Cache-Control |
|---|---|
| HTML / CSS / JS / images | public, max-age=300, s-maxage=3600 (+ Vary: Accept-Encoding, ETag) |
/api/* (dynamic state) | no-store, private (+ Pragma: no-cache, Vary: *) |
Cloudflare's default cache only stores certain file extensions, so
extensionless URLs like / won't be cached unless you say so. Create one
Cache Rule:
Top Banana — respect origin headersHostname equals myblog.com (add a second
or for www.myblog.com)That single rule is enough: Cloudflare obeys the no-store on /api/* and the
public TTL on static content.
Site edits propagate within the 5-minute max-age window. If you need a change
live immediately, purge from Caching → Configuration → Purge cache
(single-file purge by URL is enough).
The LLM agent operates under strict rules (defined in internal/agent/agent_prompt.md):
.html files — CSS and JS must be inlinedindex.html entry point/app.css (Tailwind + daisyUI),
injected per-site after the buildcmd/topbanana/ CLI entry point and configuration (Kong)
internal/server/ HTTP server, subdomain routing, admin UI, SSE build events
internal/build/ Build service, agent orchestration, per-site CSS compile
internal/agent/ LLM agent prompt and file tools
internal/auth/ Passkey auth, users, invites, S3-backed sessions
internal/store/ S3 storage abstraction with ARC cache
internal/state/ Per-site key/value state for form submissions
internal/sandbox/ Server-function (JS) execution
internal/snapshot/ Version history + export/import archives
internal/editrec/ Build transcripts (the /debug surface)
internal/lint/ HTML validation and link checking
internal/model/ LLM provider resolution (Claude, OpenAI, LM Studio)
internal/assets/ Embedded admin stylesheet + vendored daisyUI
internal/templates/ Starter site templates (prompt + skeleton + examples)
New sites can be bootstrapped from a template: blank, birthday, case-study, contact-form, email-capture, event, guestbook, landing-page, link-in-bio, portfolio, pricing, restaurant, resume, tiny-shop, and waitlist.