Selected Work · 2026
CYCLIX
Mobile SaaS app for industrial maintenance. Manage machines, maintenance cycles and spare parts digitally - with AI-powered nameplate recognition via Claude API, role-based team management and automatic push notifications.
Indie SaaS
fully self-built
3 Roles
Admin · Planner · Technician
Claude Haiku
AI nameplate recognition
iOS & Android
Cross-Platform with Expo
Screenshots

Features
AI Nameplate Recognition
Take a photo of a machine nameplate - Claude Haiku analyses it and automatically fills in name, manufacturer, model and serial number. The AI runs as an Edge Function; the API call runs on the server.
Maintenance Management
Create maintenance cycles with intervals, automatically calculate due dates and record logs - including spare parts, quantities, costs and PDF uploads.
Dashboard & Status Overview
KPI cards for overdue, this week's and this month's maintenance. Colour-coded indicators and a filterable list of all upcoming appointments at a glance.
Role-Based Team Management
Three roles with graduated permissions: Admin (full access), Planner (CRUD assets & maintenance), Technician (read & log). Team invitations via generated codes with expiry dates.
Asset Register
Create, edit and archive machines by department. Full maintenance history per asset - including photos, documents and spare part usage.
Push Notifications
pg_cron sends a daily request at 07:00 UTC to the Edge Function, which identifies all due maintenance tasks and notifies organisation members via the Expo Push API.
Tech Stack
Architecture Highlights
FOR UPDATE Lock in the Invite Flow
Redeeming invitation codes uses a PostgreSQL row lock to prevent race conditions under concurrent access - correct concurrency handling in a multi-user environment.
AI as a Serverless Edge Function
Nameplate recognition runs as a Supabase Edge Function: image and prompt are sent server-side to Claude Haiku, the API call runs on the server and costs remain controllable.
Multi-Tenant Isolation via Row Level Security
Every database query is restricted to organisation level by RLS policies - users only see data from their own organisation, without any filter logic in the app code.
Client-Side Status Calculation
Overdue, this week, this month - status classification happens entirely in lib/utils.ts based on next_due_at, without additional database queries.
pg_cron for Push Notifications
A database cron job sends a daily HTTP POST at 07:00 UTC to the notify-maintenance Edge Function, which identifies due maintenance tasks and notifies users via the Expo Push API.