Synaplan
Open-source AI platform for companies: self-hosted AI agents, GDPR-compliant chatbot widget, RAG knowledge base, WhatsApp and Outlook AI, MCP, multi-model routing. Docker, Kubernetes or hosted in Germ
翻訳待ち
No updates detected yet. GitHub releases will appear here.
Loading the full README. The saved excerpt is shown below.
Attendance and payroll for small businesses, workshops and daily-wage / contract staff.
Employees clock in and out with a 4-digit PIN; the owner sees who is in today, looks back at
each employee's week, month or year, and prints salary slips. Runs entirely on free tiers: Next.js on Vercel and
Supabase.
• Next.js 16 (App Router, TypeScript), Tailwind CSS v4, shadcn/ui (new-york), Lucide icons
• Supabase: Postgres, Auth (owners only), Row Level Security, Realtime
• PWA: src/app/manifest.ts, public/sw.js (offline screen only) and Apple web-app meta tags; installs full screenRead the full README ↗Attendance and payroll for small businesses, workshops and daily-wage / contract staff. Employees clock in and out with a 4-digit PIN; the owner sees who is in today, looks back at each employee's week, month or year, and prints salary slips. Runs entirely on free tiers: Next.js on Vercel and Supabase.
src/app/manifest.ts, public/sw.js (offline screen only) and Apple web-app meta tags; installs full screensupabase/migrations/ in order, pasting its contents into the SQL editor
(or supabase db push with the CLI).cp .env.example .env.local and fill in the project URL and anon key.npm install && npm run dev, then open http://localhost:3000.Screens say "employee" everywhere. The database and code still use worker in table, column and
function names (workers, worker_id, worker_login, …), so no migration was needed for the
rename.
supabase/
migrations/01_schema.sql tables, enums, triggers, RLS, RPCs (step 1)
migrations/02_admin.sql business name on sign-up, worker-photos bucket (step 2)
migrations/03_function_grants.sql owner-only functions not callable by anon
migrations/04_gps.sql work location + radius, location stored on each punch
migrations/05_timings_selfies.sql optional work timings, off days, punch selfies
tests/ plain-Postgres behaviour tests for the migration
src/
proxy.ts refreshes the owner's session, guards /admin
app/
manifest.ts PWA manifest: opens on /start, full screen, shortcuts
login/ owner sign-in and sign-up (step 2)
auth/confirm/ sign-up email confirmation link
admin/ owner dashboard: live board (step 2)
employees/ add / edit employees, set PINs
attendance/ one employee's week / month / year (?e=&view=&d=); add, edit, delete days
selfie/[id]/ a punch selfie as a JPEG (owner only, by RLS)
settings/ punch link, work timings, location check, selfie
payroll/ salary report, ?from=&to= (default: this month)
payroll/[workerId]/ printable A4 / phone salary slip
punch/ worker kiosk + personal phone mode (step 3)
punch/login/ one-time phone + PIN login on a worker's own phone
components/
ui/ shadcn/ui primitives
admin/ punch/ payroll/ feature components
lib/
supabase/ browser, server and proxy clients
worker-session.ts httpOnly cookie for personal-mode worker sessions
format.ts minutes, rupees, month ranges
admin/period.ts pay period from ?from=&to=
admin/calendar.ts week / month / year ranges for the attendance page
timing.ts work timings, off days, owner-time-zone conversions
types/database.ts typed schema + RPC result shapes
Open the link from the owner's dashboard (/punch?k=CODE) once on each device. The code is
remembered in a cookie and removed from the address bar, so "Add to Home Screen" opens straight
to the punch screen.
Off by default. On the Settings page (gear icon), the owner stands at the workplace, taps "Use my current location" (or pastes coordinates from Google Maps), picks an allowed distance (200 m is a good start) and ticks "Check location when employees punch".
do_punch refuses it when it is farther than the allowed distance
plus the fix's accuracy (counted up to 100 m), and refuses a punch with no location.clock_in_lat, clock_in_distance_m, …). The Today
board shows "In 44 m", linking to the spot on Google Maps, in red when outside the distance.Both optional, on the Settings page.
Changing a timing applies to punches from then on; past days keep their status.
This is the beginning of the README. Read the rest at the original. Read the full README ↗