個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證The Penopta web app.
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗A Vercel-ready Next.js (App Router) app. Authentication is Better Auth (Google + GitHub + Passkey). Organizations and product data live in Postgres.
Hosted: app.penopta.com · License: MIT
See docs/architecture.md for the schema and env split;
docs/opensource-safety.md for public-repo and
production safety (mandatory);
AGENTS.md for agent-facing rules;
CONTRIBUTING.md to run or patch the project locally.
| Repo | Purpose |
|---|---|
| penopta-claude-plugin | Claude plugin (public mirror) |
| penopta-linux-sync | Linux host sync CLI |
The macOS app (Penopta Sync) lives in a private repo. Publish from there with
bash scripts/publish.sh: that uploads Penopta-Sync.dmg and
Penopta-Sync.json as GitHub Release assets on this repo (versioned tag
macos-sync-<version>.<build> plus a floating macos-sync current pointer).
The site fetches that JSON and keeps serving /downloads/Penopta-Sync.json
so installed Mac apps do not need a new URL. Do not commit the DMG or JSON.
You can self-host this app or use the hosted product. Self-hosting requires your
own Postgres, OAuth apps, and env secrets — see .env.example.
pg locally, Neon serverless on Vercel)npm install
cp .env.example .env.local # then fill in the values
npm run db:up # start local Postgres (Docker, port 5434)
npm run db:migrate
npm run db:seed
npm run dev -- -p 3200
Open http://localhost:3200 — you’ll see Google / GitHub / Passkey sign-in until you authenticate.
| Variable | Required | Description |
|---|---|---|
BETTER_AUTH_SECRET | yes | Better Auth secret (openssl rand -base64 32). |
APP_URL | yes (prod) | Public app origin, e.g. http://localhost:3200. Auth, links, and OAuth use this. |
GOOGLE_CLIENT_ID / GOOGLE_CLIENT_SECRET | yes (for Google) | Google OAuth web client. Redirect: {APP_URL}/api/auth/callback/google. Use a separate app for local vs production. |
GITHUB_CLIENT_ID / GITHUB_CLIENT_SECRET | yes (for GitHub) | GitHub OAuth App. Callback: {APP_URL}/api/auth/callback/github. Use a separate app for local vs production. |
DATABASE_URL | yes | Postgres URL. Local Docker or Neon. |
BETTER_AUTH_URL | no | Override auth origin only if it must differ from APP_URL. |
PASSKEY_RP_ID | no | WebAuthn rpID (defaults to hostname of APP_URL). |
APP_REVIEW_DEMO_EMAIL | no | Enables the one restricted email/password account used by App Store Review. Email signup stays disabled. |
DB_DRIVER | no | Force pg or neon. Normally inferred from the host. |
/ calls Better Auth (/api/auth/*) for Sign in with Apple, Google, GitHub, or Passkey. Sign in with Apple is the first option.getSession() reads them on the server.GET|POST /api/auth/logout signs out and returns to /.The Mac app signs in with Apple inside the app. Sign in with Google and
Sign in with GitHub each open that provider directly. Holding Option
shows Sign in for App Review, the reviewer email and password screen.
Better Auth rejects email sign-in for every address except
APP_REVIEW_DEMO_EMAIL, and public email signup is disabled.
Create or rotate the production reviewer account with:
npm run app-review:provision:prod
Set APP_REVIEW_DEMO_EMAIL and APP_REVIEW_DEMO_PASSWORD in the local,
gitignored .env.production before running it. Only
APP_REVIEW_DEMO_EMAIL belongs in the deployed Vercel environment; the password
is stored as a Better Auth hash in Postgres. Keep the credentials stable and
include the Option-click instruction in App Store Connect review notes.
src/
app/
api/auth/[...all]/route.ts # Better Auth handler
api/auth/logout/route.ts # sign-out convenience
page.tsx # sign-in / logged-in workspace
integrations/page.tsx
projects/[id]/page.tsx
components/ # SignInCard, WorkspaceEmpty, …
lib/auth/ # Better Auth server + client + session
lib/db/ # Drizzle client, schema (incl. auth tables), seed
docker-compose.yml
drizzle/
docs/architecture.md
Projects are Postgres rows (project). Reads in src/lib/projects/data.ts
return rows the signed-in viewer may see. Seed with npm run db:seed.
To re-test first-run with the same Google/GitHub account, wipe local data
(npm run db:wipe -- --yes) then sign in again. That script only targets
Docker Postgres on localhost:5434 and will refuse Neon.