TreeMap
무료 오픈소스 디스크 사용량 시각화 도구로, 사각형 트리맵·중복 파일 탐색·디스크 가득 예측·정리 시 파일을 휴지통으로만 이동한다
그룹 Gmail 초대장을 받아 회원이 앱·계정 없이 한 번에 응답하고 실시간 참석자를 확인합니다. 튀니지 그룹 무료
Meeting invites from your group's own Gmail. Members answer in one tap, with no app and no account, and you see who's coming as it happens. Free for groups in Tunisia.
생산성TypeScript · PLpgSQLGitHub @DalyChouikh온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기A platform for things to confirm, like meetings, and other stuff
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Know who's coming before the meeting starts. TapNShow sends meeting invites from a group's own Gmail. Members answer in one tap, with no app and no account. Organizers see who's going, who's running late and who can't make it, as it happens.
Live at https://www.tapnshow.tn. It's free for groups in Tunisia that meet regularly: student clubs, associations, volunteer teams and communities.
gmail.send) and
to keep the one sheet it creates (drive.file). It never reads the inbox.The product is in English. French and Arabic are planned (#375).
| Part | What we use |
|---|---|
| App | Next.js 16 (App Router) and React 19, TypeScript in strict mode, run with Bun |
| Data | Supabase: Postgres 17 with row-level security on every table, Auth (email codes and Google), Cron |
| Client data | TanStack Query against the app's own API routes, with Zod schemas shared by both sides |
| UI | Tailwind CSS 4, Radix primitives restyled as "Soft Neobrutalism", Phosphor icons, motion |
| Text | next-intl (messages/en.json) |
| React Email templates, sent with the Gmail API (meeting emails) or SMTP (system emails such as sign-in codes) | |
| Phone app | A web app manifest and a Serwist service worker, with Web Push for reminders |
| Operations | Vercel (hosting, Analytics, Speed Insights), Sentry (errors, logs, uptime), GitHub Actions |
A few rules shape the whole codebase:
src/app/api/**/route.ts). There are no
Server Actions, and server components don't read data. Pages are client components that call the
API through TanStack Query.SECURITY DEFINER functions live only in the private schema, behind thin public wrappers.
SQL lives only in supabase/migrations/ and src/server/queries/.after()). On production, Supabase Cron also calls it every minute.The full product and architecture spec is
docs/superpowers/specs/2026-10-04-tapnshow-design.md.
src/
app/ Pages, layouts and API routes (App Router)
components/ UI, by feature; restyled primitives in components/ui
config/ Constants and environment parsing (one place for every value)
design/ Theme tokens (colours, shapes, motion)
emails/ React Email templates
hooks/ React hooks (data hooks wrap TanStack Query)
lib/ Code shared by client and server
server/ Server-only code: queries, workers (dispatch, sheets, push), auth, crypto
shared/ Zod schemas shared by the API and its clients
content/ Legal pages as typed content
supabase/ Local stack config, migrations, auth email templates
messages/ UI text (next-intl)
e2e/ Playwright tests, with fake Google and push servers
scripts/ Repo scripts (local Supabase wrapper, auth config, admin and ops tools)
docs/ Spec and plans (superpowers/), spike reports, runbooks
package.json (packageManager; CI installs the same one).git clone https://github.com/DalyChouikh/TapNShow.git
cd TapNShow
bun install
supabase start # starts Postgres, Auth, Studio and Mailpit in Docker, applies the migrations
cp .env.example .env.local
Then fill in the three secrets that sending needs, in .env.local:
# GOOGLE_TOKEN_ENCRYPTION_KEY: 32 bytes, base64
node -e "console.log(require('crypto').randomBytes(32).toString('base64'))"
# INVITE_TOKEN_SECRET and DISPATCH_SECRET: 32 bytes each, base64url
node -e "console.log(require('crypto').randomBytes(32).toString('base64url'))"
Start the app against the local stack:
bun scripts/with-local-supabase.ts bun run dev
The wrapper reads supabase status and passes the local Supabase URL and keys, and Mailpit as the
mail server, to the command it runs. Those values win over anything in .env.local.
Open http://localhost:3000 and sign in with any address. The 8-digit code arrives in Mailpit at http://127.0.0.1:44324. Choose a name, then create a workspace. Studio, the database UI, is at http://127.0.0.1:44323.
http://localhost:3000/api/integrations/google/callback. Set
GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET and NEXT_PUBLIC_GMAIL_CONNECT_ENABLED=true in
.env.local. You don't need this for most work: the e2e suite runs the Gmail and Google Sheets
flows against a fake Google (e2e/helpers/fake-google.ts).supabase/config.toml has no Google
provider), so the wrapper turns it off. Sign in with email codes locally.bunx web-push generate-vapid-keys and set all three of
NEXT_PUBLIC_VAPID_PUBLIC_KEY, VAPID_PRIVATE_KEY and VAPID_SUBJECT (a mailto: or
https: contact). Without them the reminder settings stay hidden.bun scripts/set-platform-owner.ts --email [email protected] --project local.| Command | What it does |
|---|---|
bun run dev | Development server |
bun run lint / bun run format / bun run format:check | ESLint, Prettier |
bun run typecheck | Route types, then tsc for the app and the service worker |
bun run test | Unit and component tests (Vitest; add -- --run for a single run) |
supabase db reset --local then bun run test:db | Database tests (RLS, functions, plans) against a fresh local database |
bunx playwright install chromium once, then TZ=UTC bun run test:e2e | Builds the app and runs Playwright against it |
bun run db:types | Regenerates src/server/db/database.types.ts from the local database |
bun run tokens | Regenerates the theme's CSS variables from src/design/tokens.ts |
Before opening a pull request, run the whole chain:
bun run format:check && bun run lint && bun run typecheck && bun run test -- --run
supabase db reset --local && bun run db:types && bun run test:db && supabase db advisors --local # database changes
TZ=UTC bun run test:e2e && bun scripts/check-build-log.ts .e2e-build.log # flow changes
CI runs the same steps. The quality job runs lint, format, typecheck and unit tests. The db
job runs the advisors, the database tests and the e2e suite on a fresh Supabase stack. A change to
documentation only (files under docs/ and *.md files, scripts/docs-only.sh) runs only the
format check, and Vercel skips its build. A pull request runs only the database tests its change
can reach (scripts/db-test-scope.ts: Vitest's related follows the imports), and all of them when
it touches supabase/, the dependencies, the tests' config or the workflows; main always runs them
all.
About .env.local and e2e: Playwright sets the variables the tests need (playwright.config.ts,
webServer.env). Anything it doesn't set falls back to .env.local on your machine, and CI has no
.env.local. A story that needs a new flag or URL must set it in playwright.config.ts.
supabase migration new <name>, then write the SQL. When you change an existing function, start
from its newest definition:
grep -ln "function private.<name>" supabase/migrations/* | sort | tail -1.supabase db reset --local applies every migration from scratch.bun run db:types, then the tests, then supabase db advisors --local (no new warnings).Migrations reach the hosted projects after the pull request merges.
.github/ISSUE_TEMPLATE/..github/pull_request_template.md and are squash-merged once CI is green.AGENTS.md and .agents/01-core-rules.md.
In short: strict types (no any, no unknown), JSDoc on every export, no console.*, no
hardcoded values, every user-facing string in messages/en.json, and no emojis anywhere in the
product.| Environment | App | Database |
|---|---|---|
| Local | http://localhost:3000 | Local Supabase (Docker) |
| Preview | A Vercel preview per pull request | Hosted Supabase project "preview" |
| Production | https://www.tapnshow.tn (Vercel) | Hosted Supabase project "production" |
GitHub Actions also runs a keep-alive (the free Supabase plan pauses idle projects), nightly encrypted backups, and deploy notices.
docs/superpowers/specs/: the product spec and design documents.docs/superpowers/plans/: implementation plans, one per milestone.docs/runbooks/: monitoring, restore, platform admin, domain and search, Google
verification, and the data-protection declaration.docs/spikes/: the reports of the early technical spikes.Made by Mohamed Ali Chouikh.