A dead-simple web app to publish HTML pages built by Claude — paste, slug, done.
- Publish any HTML — paste Claude's output and give it a URL slug
- Instant public links — every page is live at
/p/your-slug - View counter — per-page view tracking (iframe traffic excluded)
- In-page AI assistant — drop-in widget that uses the visitor's own LLM key (key stays in the browser; only transcripts are persisted)
- Authentication — password + Google OAuth login
- Access control — public/publisher pages with permission management
- S3 backed — pages, metadata and users are synced to S3
- Delete pages — clean up old pages anytime
npm i -g vercel
cd ShipFast
vercelFollow the prompts. Done — you'll get a *.vercel.app URL.
- Push this folder to a GitHub repo
- Go to vercel.com → New Project
- Import the repo — Vercel auto-detects the config
- Hit Deploy
ShipFast depends on Redis (sessions), S3 (storage) and optionally Postgres (AI assistant chat). The docker-compose.yml ships local stand-ins for all three (Redis, MinIO, Postgres).
npm install
npm run services:up # start redis + minio + postgres
npm run dev # → http://localhost:3000
npm run services:down # stop them when you're donemigrations/ is auto-applied to the Postgres container on first boot.
Create .env (or .env.local for local overrides) — see .env.example.
# Required
SESSION_SECRET=your-secure-session-secret-here
REDIS_URL=redis://127.0.0.1:6379
S3_BUCKET=your-bucket-name
# S3 / S3-compatible storage
S3_REGION=us-east-1
AWS_ACCESS_KEY_ID=...
AWS_SECRET_ACCESS_KEY=...
# AWS_ENDPOINT_URL_S3=... # set for MinIO or other S3-compatibles
# Auth
PUBLISHER_PASSWORD=shipfast
GOOGLE_CLIENT_ID=your-google-client-id-here
GOOGLE_CLIENT_SECRET=your-google-client-secret-here
# AI assistant (optional — feature is off unless DATABASE_URL is set)
DATABASE_URL=postgres://shipfast:shipfast@localhost:5432/shipfastSESSION_SECRET,REDIS_URL, andS3_BUCKETare required — the server fails fast on startup if any are missing.REDIS_URLworks with Upstash Redis as-is.- Google login activates when
GOOGLE_CLIENT_ID+GOOGLE_CLIENT_SECRETare set. - The AI assistant activates when
DATABASE_URLis set. The visitor's LLM API key never touches the server — only chat transcripts are persisted.
- Ask Claude to build any HTML page
- Copy the full HTML
- Open your app → paste HTML → enter a slug → Publish
- Share
/p/your-slugwith anyone
ShipFast/
├── server.js # Express entry point
├── config.js # Environment & config management
├── docker-compose.yml # Redis + MinIO + Postgres for local dev
├── vercel.json # Vercel routing config
├── package.json
│
├── services/ # Business logic (reusable, testable)
│ ├── s3.js # S3 operations abstraction
│ ├── user.js # User management
│ ├── page.js # Page metadata & listing
│ ├── content.js # Content type detection
│ ├── views.js # View counter
│ ├── chat-db.js # Postgres access for assistant chats
│ └── chat-store.js # Chat transcript persistence
│
├── routes/ # API endpoints
│ ├── auth.js # Auth endpoints (/login, /api/login)
│ ├── api.js # Page API routes (/api/pages/*)
│ ├── pages.js # Page serving (/p/:slug)
│ ├── assistant.js # AI assistant widget + chat API
│ └── settings.js # User settings
│
├── middleware/
│ └── auth.js # Authentication & authorization
│
├── templates/ # HTML generation
│ ├── auth.js # Login page
│ ├── pages.js # 404 page
│ ├── dashboard.js # Dashboard + CSS + JS
│ └── assistant.js # AI assistant widget
│
├── migrations/ # Postgres schema (auto-applied locally)
├── tests/ # node:test suite (`npm test`)
└── REFACTORING_SUMMARY.md # Detailed architecture guide
See REFACTORING_SUMMARY.md for detailed architecture documentation.
- Pages, metadata, users — synced to S3 (
S3_BUCKET). MinIO works as a drop-in viaAWS_ENDPOINT_URL_S3. - Sessions — Redis (
REDIS_URL). - AI assistant chats — Postgres (
DATABASE_URL). - Vercel note — serverless functions have ephemeral filesystems, so S3 is the source of truth for page content in production.
npm test