What it does
I built Quartz360, a time-tracking and workspace app for freelancers and teams. Staff clock in and out, log breaks and travel time, and book hours to projects. Owners and managers plan shifts, approve absences and read monthly reports.
- Clock in on web or phone, with breaks, travel time and a project per session
- Shift schedules, absence requests with approval, and monthly reports
- Projects with tasks, rich-text documents and spreadsheets
- File storage with per-person access and public share links
- In beta: German e-invoices (ZUGFeRD) and an AI assistant
Worth mentioning
The server owns the clock.
The apps only display time calculated from server timestamps, so closing or reloading never loses or double-counts time.
Files upload straight from the browser to storage.
The server then re-checks the real size, so storage limits can't be bypassed.
The AI assistant works with each user's own key.
The Anthropic key is stored encrypted, and the assistant can only read files that user is allowed to open.
Tech stack
- Frontend
- React, TypeScript, Vite, HeroUI, Tailwind CSS, Jotai, TipTap, Univer, Astro (marketing site)
- Backend
- Node.js, Express, TypeScript
- Database
- PostgreSQL
- Mobile
- Expo, React Native
- Auth
- JWT, bcrypt
- Payments
- Stripe
- AI
- Anthropic Claude API
- Testing
- Jest, Supertest, Playwright
Infrastructure
- Docker and Coolify
- One image per service, deployed with Coolify on a Hetzner server.
- CI/CD pipeline
- Builds and deploys each service automatically.
- Hetzner Object Storage
- Private file storage (S3-compatible, EU), reached through short-lived signed links.
- Brevo
- Transactional email for verification, password reset, invitations and notifications.
- Stripe
- Per-seat subscriptions with checkout, customer portal and webhooks.
- KoSIT validator
- A separate Java service that checks e-invoices against the EN 16931 standard.