AI-powered automation for your entire computer. SARM connects mouse, keyboard, browser, files, Excel, PDF, email, databases, APIs, and AI into a single visual workflow builder — so your whole desktop can run itself.
Two deployable units:
| Unit | Location | Purpose |
|---|---|---|
| Orchestrator | backend/ + frontend/ |
SaaS web app: users, orgs, billing, workflow definitions, scheduling, dashboards |
| Automation Agent | agent/ |
Lightweight process running on the target machine; executes mouse/keyboard/window actions received over WebSocket |
sarm-platform/
├── backend/ # FastAPI app: API, DB models, services, Celery tasks
├── frontend/ # Reflex app: pages, components, state management
├── agent/ # Desktop automation agent (Phase 6)
├── infra/ # Docker, Nginx, CI/CD configurations
├── docker-compose.yml
├── Makefile
└── ...
| Layer | Technology |
|---|---|
| Frontend | Reflex (Python → React/Next.js) |
| Backend | FastAPI + Uvicorn |
| Database | PostgreSQL 16 (async via asyncpg) |
| Migrations | Alembic |
| Task Queue | Celery + Redis (broker/backend) |
| Auth | JWT (access + refresh), OAuth2 (Google/GitHub), TOTP 2FA |
| Billing | Stripe |
| AI | OpenAI, Anthropic, Ollama |
| Monitoring | Flower (Celery), Sentry, structlog |
| Infrastructure | Docker Compose, Nginx |
- Python 3.12+
- Docker & Docker Compose (recommended)
- PostgreSQL 16 + Redis 7 (for local-only dev)
cp .env.example .env
# Edit .env — set SECRET_KEY, JWT_SECRET_KEY, POSTGRES_PASSWORD
make dev
# or: docker compose up --build| Service | URL |
|---|---|
| Frontend | http://localhost:3000 |
| API | http://localhost/api/v1/health |
| API Docs | http://localhost/api/v1/docs |
| Flower | http://localhost:5555 |
Backend:
cd backend
python -m venv .venv && source .venv/bin/activate # or .venv\Scripts\activate on Windows
pip install -r requirements.txt
alembic upgrade head
make backend
# or: uvicorn app.main:api --reload --host 0.0.0.0 --port 8000Frontend:
cd frontend
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
reflex init
make frontend
# or: reflex run --frontend-port 3000 --backend-port 8000make test # Run tests with coverage
make lint # Lint with ruff
make format # Format with ruff
make typecheck # Type-check with mypy
make check # All of the above
make clean # Clean cache files| Phase | Deliverable | Status |
|---|---|---|
| 1 | Architecture, folder structure, ERD, tech decisions | ✅ Done |
| 2 | Project scaffold: Docker, config, logging, DB, bootable apps | ✅ Done |
| 3 | Database layer: full SQLAlchemy models + Alembic migration | 🔜 Next |
| 4 | Auth module: register/login/JWT/OAuth/2FA/RBAC | ⏳ Pending |
| 5 | Workflow engine: cloud-side action execution | ⏳ Pending |
| 6 | Automation Agent: desktop action executor | ⏳ Pending |
| 7 | Frontend: dashboard, workflow builder UI, auth pages | ⏳ Pending |
| 8 | Billing + RBAC + admin panel | ⏳ Pending |
| 9 | Template library + notification integrations | ⏳ Pending |
| 10 | Tests, CI/CD, production deployment guide | ⏳ Pending |
- Each bounded context (
identity,billing,automation,execution,collaboration,notification,admin) followsmodels/ → repository/ → service/ → api/. API routes never touch the DB directly. - All new SQLAlchemy models must be imported in
backend/alembic/env.pyor Alembic autogenerate will silently ignore them. - Config only ever comes from
app.core.config.settings— never reados.environdirectly in application code. - Frontend components follow Reflex best practices with stateless presentational components and state classes for logic.