~/projects/cyclix ▸ Personal Project · 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 key never leaves the device.
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 key never leaves the device 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.