No description
Find a file
triage-runner b7216bd6d8
Some checks failed
CI / ci (push) Has been cancelled
CI / security-scan (push) Has been cancelled
docs(readme): correct false NodeHub deploy-on-push claim (fixes #17)
The Deployment section claimed planish 'Deploys to NodeHub via Forgejo
webhook on push to main' but no such pipeline exists: zero webhooks are
configured on this repo (GET /api/v1/repos/AuWoMe/planish/hooks = []),
no planish app is registered on Node Hub, and no .forgejo/workflows/
deploy.yml is present. Replace the claim with an accurate description
of the current state and a manual-deploy recipe so downstream readers
are not misled.

Refs: forgejo.tail018ac4.ts.net/AuWoMe/planish/issues/17
2026-09-18 16:20:32 -07:00
.forgejo/workflows ci: collapse lint+tsc+test into single ci job (was 4-job matrix) 2026-09-11 04:39:09 -07:00
.gsd/gates fix(api): validate lat/lng and item type, owner-only member/share authz, timezone-aware shared day plans, sanitize share secrets 2026-08-11 20:46:23 -07:00
.kilo/plans security: mark generated content and verify #9 suppressions 2026-08-09 11:37:34 -07:00
.qwen Initial commit: Next.js trip planning app with Drizzle ORM, Clerk auth, and Stripe billing 2026-04-08 19:00:20 -07:00
drizzle Fix bugs, wire components, enforce subscription limits, add CI + pre-commit 2026-05-02 08:44:55 -07:00
scripts Apply changes from kilo-gsd.py run for AuWoMe/planish#10 2026-08-09 11:37:34 -07:00
src fix(ts): bump Stripe apiVersion to 2026-08-26.dahlia (stripe@22.6.2 default) 2026-09-14 16:12:06 -07:00
.bearerignore fix(security): clean scanner sentinel for #9 2026-08-09 11:37:34 -07:00
.gitattributes security: mark generated content and verify #9 suppressions 2026-08-09 11:37:34 -07:00
.gitignore Apply changes from kilo-gsd.py run for AuWoMe/planish#15 2026-08-13 16:21:36 -07:00
.gitleaks.toml Apply changes from kilo-gsd.py run for AuWoMe/planish#9 2026-08-09 11:37:34 -07:00
.semgrepignore fix(security): drop to non-root user in container; ignore build output (#10) 2026-08-09 11:37:34 -07:00
components.json Initial commit: Next.js trip planning app with Drizzle ORM, Clerk auth, and Stripe billing 2026-04-08 19:00:20 -07:00
Dockerfile Apply changes from kilo-gsd.py run for AuWoMe/planish#9 2026-08-09 11:37:34 -07:00
drizzle.config.ts Initial commit: Next.js trip planning app with Drizzle ORM, Clerk auth, and Stripe billing 2026-04-08 19:00:20 -07:00
eslint.config.mjs Apply changes from kilo-gsd.py run for AuWoMe/planish#8 2026-09-14 08:44:47 -07:00
next.config.mjs Apply changes from kilo-gsd.py run for AuWoMe/planish#10 2026-08-09 11:37:34 -07:00
package-lock.json fix(ci): pin esbuild ^0.28.0 in devDependencies to satisfy vite 8 peer 2026-09-14 16:07:22 -07:00
package.json fix(ci): pin esbuild ^0.28.0 in devDependencies to satisfy vite 8 peer 2026-09-14 16:07:22 -07:00
postcss.config.mjs Initial commit: Next.js trip planning app with Drizzle ORM, Clerk auth, and Stripe billing 2026-04-08 19:00:20 -07:00
README.md docs(readme): correct false NodeHub deploy-on-push claim (fixes #17) 2026-09-18 16:20:32 -07:00
tailwind.config.ts Initial commit: Next.js trip planning app with Drizzle ORM, Clerk auth, and Stripe billing 2026-04-08 19:00:20 -07:00
tsconfig.json Fix bugs, wire components, enforce subscription limits, add CI + pre-commit 2026-05-02 08:44:55 -07:00
vitest.config.ts feat: domain layer, trip services, vitest config 2026-04-23 21:07:44 -07:00

Planish

The missing end-to-end travel planner. Forward bookings into one timeline, auto-build a map + day-by-day itinerary, and share a clean link for your group—without spreadsheets or 6 different apps.

Features

  • Email Forwarding — Forward confirmation emails to your trip's unique address; itinerary items are auto-created
  • Day-by-Day Timeline — See your trip organized by day with local times
  • Interactive Map — Visualize all your stops on a Mapbox-powered map
  • Trip Sharing — One clean link for your group, with optional password protection
  • Collaboration — Invite others as editors or viewers
  • Comments — Discuss individual itinerary items
  • Billing — Stripe-powered subscription management (Free + Plus tiers)

Tech Stack

  • Framework: Next.js 14 (App Router)
  • Auth: Clerk
  • Database: PostgreSQL + Drizzle ORM
  • Payments: Stripe
  • Maps: Mapbox GL JS
  • Styling: Tailwind CSS + shadcn/ui
  • Testing: Vitest (165 tests)
  • CI: Forgejo Actions (lint, typecheck, test)

Environment Variables

Copy .env.local and fill in:

# Database
# Supply credentials via the URL userinfo section (before the host) or, preferably,
# via the standard PGUSER / PGPASSWORD environment variables.
DATABASE_URL=postgresql://localhost:5432/planish

# Clerk Auth
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=pk_test_...
CLERK_SECRET_KEY=sk_test_...

# Stripe
STRIPE_SECRET_KEY=sk_test_...
STRIPE_WEBHOOK_SECRET=whsec_...
STRIPE_PLUS_PRICE_ID=price_...
NEXT_PUBLIC_APP_URL=http://localhost:3000

# Resend (email forwarding)
RESEND_API_KEY=re_...

# Mapbox
NEXT_PUBLIC_MAPBOX_TOKEN=pk....

Getting Started

npm install
npm run dev

Open http://localhost:3000

Database

npm run db:push    # Push schema to database
npm run db:studio  # Open Drizzle Studio

Schema Overview

Table Description
users Clerk-synced user records
trips Trip metadata (dates, timezone, share settings)
trip_members Trip collaboration (owner/editor/viewer roles)
itinerary_items Flights, hotels, activities, restaurants, notes
inbound_emails Forwarded confirmation emails pending parsing
comments Comments on trips or individual items
subscriptions Stripe subscription status (free/plus)

API Routes

Route Description
GET/POST /api/trips List or create trips
GET/PATCH/DELETE /api/trips/[tripId] Trip CRUD
POST /api/trips/[tripId]/items Add itinerary item
POST /api/trips/[tripId]/invite Invite trip member
POST /api/trips/[tripId]/share Configure sharing
POST /api/trips/[tripId]/inbound Process forwarded email
GET/POST /api/trips/[tripId]/comments List or add comments
POST /api/billing Create Stripe checkout/portal session
POST /api/billing/webhook Stripe webhook handler
POST /api/inbound/resend Resend inbound email webhook
GET /api/s/[shareSlug] Public trip sharing endpoint

Scripts

Command Description
npm run dev Start dev server (0.0.0.0:3000)
npm run next-build Build for production
npm run build Build with logging (used by NodeHub)
npm test Run tests
npm run lint Lint with Next.js ESLint config

CI

Forgejo Actions runs on push/PR to main:

  • lint — ESLint
  • typecheck — TypeScript (tsc --noEmit)
  • test — Vitest

Deployment

No live deploy target is currently configured. The repository has no .forgejo/workflows/deploy.yml, no NodeHub app registered for planish, and no webhook configured on this repo (verified 2026-09-18 via GET /api/v1/repos/AuWoMe/planish/hooks returning [], see issue #17). Merged fixes to main ship through CI (lint / typecheck / test) but are not automatically deployed. To deploy manually, build the production image (docker build -t planish .) and run it with the same environment variables CI uses, or stand up a NodeHub app with a push webhook — see Dockerfile and .forgejo/workflows/ci.yml for the build inputs that any future deploy pipeline will need.