Teacher · self-hoster · builder of learning systems
Everything on this page runs on infrastructure I built and operate myself: a private cloud, a local AI stack, and the apps that grew out of them.
01 · Foundations
A home server, Docker Compose and Caddy in front. Then one useful service at a time, each one a small lesson in running things properly: backups, updates, access control, monitoring.
My own drive, and a notes vault synced across every device.
Film and music libraries, with an automatic subtitle and translation pipeline.
Passwords, private access and DNS under my control.
My own mail server and push notifications.
Workflows, local models and one gateway in front of many providers.
Monitoring, a start page and a whiteboard, all self-hosted.
An LMS to experiment with, and offline reference libraries.
Automatic HTTPS, and one convention for every stack.
One stack file includes every app. One command, stack update, keeps all of it current. Each service is a small tool; together they became the platform the next layer is built on.
02 · Intelligence
I turned the whole elementary curriculum into a structured, reviewed knowledge base, then put retrieval and local models on top. It began as a daily planner for my own class and became the seed of Rooznegar.
62 textbooks and 37 teacher guides across grades 1 to 6, 13,000+ pages.
Scrambled text layers, so pages are rendered and read by vision models, in resumable batches.
One linked note per lesson in an Obsidian vault, versioned in git.
One model drafts, a different one fact-checks against the sources.
Local embeddings, ChromaDB and Odysseus, my own FastAPI assistant.
Content packs and question banks that feed Rooznegar and Masirak.
Agentic tool loops proved unreliable, so the pipeline is deterministic: one file in, one completion, one file out.
Free tiers first, quotas respected, every model given the one job it is good at, and a reviewer that is never the author.
Student names, attendance and scores never reach a model. The assistant sees lessons, not children.
03 · Flagship
A free digital daybook for elementary teachers: attendance, assessments, timetable, notes and official report cards, with each grade's book content as an optional paid layer.
Classes, students, attendance, descriptive assessments, weekly timetable, notes, to-dos and reminders, with Jalali dates throughout.
Per term and subject, built on the ministry's descriptive evaluation guide, with tap-to-insert level descriptions.
Reviewed content packs from the curriculum wiki, unlocked per grade, with question banks on the way.
One codebase wrapped for Android, Windows and the web. Built-in RSend moves files between phones and PCs, no internet needed.
How it's protected
Security here is a design constraint from day one. Every layer below is named, and every one is live.
Names, attendance, scores and notes live in a local database. PIN and fingerprint lock the app.
Email, name, grades taught and subscription state. Nothing about a single student.
Locked content is never in the app package. It downloads after the server confirms access, marked for that account, then sealed on the device.
Six-digit email codes that are single-use, hashed, expiring and rate-limited per address and per IP. Google tokens are verified by the server itself. No teacher ever sets a password.
Paid packs are fetched on demand after the server confirms the subscription, with a per-account download limit. A lapsed plan locks content, never the teacher's own data.
Books are stored AES-GCM encrypted, with the key wrapped by the Android Keystore. App data is excluded from cloud backup, and desktop builds use OS-protected storage.
Every pack carries an invisible mark unique to the account that downloaded it, plus a visible mark on desktop. A copied page can be traced back to its source.
PIN and fingerprint with automatic re-lock, screenshots and screen capture blocked, no copy or print of books, obfuscated release builds and a hardened desktop shell.
After every release, hashes of the code and every content pack are timestamped on the Bitcoin chain with OpenTimestamps, so who wrote what, and when, can be proven.
A nightly GPG AES-256 encrypted off-site backup, checksum-verified, and an hourly-synced hot-standby replica of the backend that apps fall back to.
Non-root, read-only containers with no extra capabilities, strict CSP and HSTS, an admin panel behind scrypt with lockouts, SSH keys only, and a security checkpoint after every phase.
04 · Companion
The student side. A study path for children to follow at home, with a little guide beside them and rewards that make learning worth choosing, without hooks that keep them hooked.
Android · Windows · web. Persian interface.
Pooneh or Pouya walks the screen, shares a fact when touched, and leads a guided tour of the app.
Instant feedback, treasure chests and short games. No streaks, leaderboards or pushy notifications.
Self-study from day one, then a free link to the teacher's Rooznegar class.
Minimal child data, profiles stay on the device, and beta error reports are anonymous. Content inherits Rooznegar's protection.
05 · Also shipped
Products that came out of the same stack and the same standards, each solving one problem well.
Send files and text between phones and computers over the local network. No account, no internet, no ads.
It began as a feature inside Rooznegar and grew into its own app after people asked for it. A hotspot and QR code handshake, an interoperable protocol, and a sandboxed desktop core with its own test suite.
A self-hosted appointment panel for a coordinator and a team of consultants, with a Jalali calendar and push notifications.
Role-based access so each consultant sees only their own schedule, no cloud AI and no third-party providers. The server is AGPL with a phase-by-phase spec and a tested codebase, and Nobat Mobile is a native Android client.
06 · What's next
Rooznegar serves the teacher, Masirak serves the child. They are built in parallel and meant to meet as one connected virtual institution.
How I work
Real commands and real output before any claim of "done".
AI coding agents take tasks from a repo inbox. Nothing merges until a scripted check passes and I have read the diff.
Solve the problem in front of me, park the extras.
Data stays with its owner unless there is a reason it can't.
Everything is tested on a live class and its teachers.
Contact