尚未检测到更新。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.