Shioaji Pro
에이전트를 위한 거래 터미널: 코딩 에이전트가 전부 구축, UI 100% 오픈소스, 데스크톱에 AI 에이전트와 전문 주문 패널 내장
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Household expense sharing on Next.js, PostgreSQL and Vercel. Built for a small co-habiting group rather than a general-purpose ledger: a few people, one household, shared bills.
A mobile-first installable PWA. Anyone can register with Google and create a household, becoming its admin; admins invite people (or track someone who will never sign up), everyone splits expenses, and balances settle themselves.
BIGINT. The only place a float appears is the final division for
display.SUPERUSER_EMAILS, or promoted with the ops CLI)
see and manage every household and user from /admin: suspend accounts and
households, change the limits globally or per admin/household, and edit the
role matrix. Every such change is written to an append-only platform audit log.A deactivated household is hidden from its members and read-only; its admin can restore it for 30 days, after which it is permanently deleted.
Each person has one net balance, and the settle-up plan uses the fewest transfers.
Between two people, the pairwise ledger shows who owes whom across all
expenses; when each owes the other, one tap proposes cancelling the overlap and
the other person accepts. Payments are applied to the payer's oldest unpaid
shares (recorded in payment_allocations), so expenses reach PAID on their own.
Editing or deleting an expense is a reversal plus a replacement, in one transaction.
Next.js 16 (App Router) · React 19 · TypeScript (strict) · Tailwind CSS 4 ·
Prisma 7 with the pg driver adapter · PostgreSQL 16 (self-hosted in production) ·
Auth.js v5 · Zod 4 · Vitest · Playwright
| Piece | Choice |
|---|---|
| App | Vercel, functions pinned to Singapore (sin1) |
| Database | Postgres 16 in Docker on a VPS in Jakarta, TLS with a pinned certificate (DATABASE_CA_CERT) |
| Deploys | GitHub Actions: gates → migrate → deploy → wait for /api/health → smoke |
| Scheduled jobs | GitHub Actions (hourly purge + reminders) through the Python ops CLI |
Host and database are swappable by configuration; keep the function region next to the database, since query round-trips dominate page load time.
Requires Node 24 and pnpm 12.
pnpm install
cp .env.example .env # then fill it in
pnpm prisma:generate
pnpm prisma:deploy # applies migrations, including the triggers and views
pnpm db:seed # optional: a household with realistic balances
pnpm dev
.env.example documents every variable. DATABASE_URL is the pooled
connection used at runtime; DIRECT_URL is the unpooled one used for DDL,
since migrations must not go through a transaction pooler.
| Command | Does |
|---|---|
pnpm dev / pnpm build | Run / build the app |
pnpm lint · pnpm typecheck · pnpm test | The CI gate |
pnpm test:coverage | Enforces 100% coverage on the split engine |
pnpm test:e2e | Playwright at phone viewports (needs E2E_DATABASE_URL, a throwaway database that is wiped) |
pnpm prisma:migrate · pnpm prisma:deploy · pnpm db:reset | Schema |
pnpm db:seed | Seed a development household |
pnpm format | Prettier |
pnpm test
Unit tests need nothing but Node. The database tests assert the triggers and
views directly and skip cleanly when no database is reachable, so a fresh
clone stays green — set TEST_DATABASE_URL and apply migrations to it to run
them:
DATABASE_URL=$TEST_DATABASE_URL DIRECT_URL=$TEST_DATABASE_URL pnpm prisma:deploy
pnpm test
CI runs them against a real Postgres and fails if it sees them skip, so a broken trigger cannot pass silently.
app/ routes only, no business logic
src/lib/ business logic — splits, expenses, auth, audit, money
src/actions/ server actions
src/components/ UI, grouped by feature
prisma/ schema and migrations (the triggers are hand-written SQL)
tests/ vitest; tests/e2e is playwright
scripts/ops/ Python operations CLI (super users, limits, purge, smoke checks)
scripts/deploy/ one script per hosting target
.github/workflows/ CI, deploy, scheduled maintenance
src/lib/db/* and src/lib/auth/* are server-only: a client component that
imports them fails the build rather than leaking a connection string.
python -m venv scripts/ops/.venv && scripts/ops/.venv/bin/pip install -r scripts/ops/requirements.txt
scripts/ops/.venv/bin/python scripts/ops/cli.py status
scripts/ops/.venv/bin/python scripts/ops/cli.py promote [email protected] # first super user
scripts/ops/.venv/bin/python scripts/ops/cli.py purge --dry-run # archived > 30 days
scripts/ops/.venv/bin/python scripts/ops/cli.py backfill-allocations # dry run; --apply to write
Reads DIRECT_URL/DATABASE_URL from the environment, then .env. Day-to-day
management happens in the app's /admin console; the CLI is for bootstrap and
for scheduled jobs that must not depend on one hosting platform.
Every push to main runs the gates (lint, format, typecheck, unit and database
tests against a real Postgres, Python tests, and the phone-viewport E2E suite),
then applies migrations, deploys, waits until /api/health reports the new
commit, and smoke-tests it. The target is chosen by the repo variable
DEPLOY_TARGET (vercel-hook by default; vercel and cloudflare also
exist) — see scripts/README.md for the one-time setup. A scheduled workflow
runs the 30-day purge and the reminders job, so neither depends on a platform cron.
Required GitHub secrets include DATABASE_URL, DIRECT_URL, DATABASE_CA_CERT (the
database's PEM certificate, when it is self-signed), CRON_SECRET (must equal the
value in the host's environment) and AUTH_SECRET.