Case study · Offline attendance app for Android
Atmark
An Android app for class attendance and team work hours that works fully offline, published on Google Play. Records stay on the device: no account, no server, no ads.
By Arpan Patra · Updated

The problem
Taking attendance is a small task that repeats every day. Most attendance apps I tried were slow, did far more than a teacher needs, or wanted students’ details stored on someone else’s server.
Atmark goes the other way: it opens quickly, works with no internet connection, and keeps every record on the phone. It is intended for teachers and other adults who record attendance, and, through the Work Hours addon, for small teams that need simple time records.
What it does
- Unlimited classes and students, with present or absent marking in a single tap for today or any past date.
- Roster import from CSV or Excel: map the relevant columns, preview the students found, and fix rows before anything is added.
- Attendance percentage for each student with a calendar history, plus insights for spotting attendance patterns.
- Monthly PDF reports that can be shared straight from the phone.
- Search, class archiving and local backups.
- Work Hours (a separate addon that requires activation): multiple work sessions per person, checks for missing times, summaries from daily to yearly, and PDF or CSV exports, all with no location tracking.
Architecture and data
Screens are Expo Router routes defined by the file structure. They never query the database directly: all SQL lives behind typed repositories for classes, students, attendance, archives, insights and the Work Hours tables. Keeping data access in one layer makes the logic testable without a device.
Records are stored in SQLite (expo-sqlite) inside the app’s private storage; AsyncStorage holds only lightweight preferences. A migration that runs once moves data from the app’s earlier storage format into SQLite, so existing installs keep their records. Data leaves the device only when the user exports, shares or backs up a file.
Engineering decisions
- Offline only by design. An earlier version of Atmark, still public on GitHub, was built with React Native CLI, WatermelonDB and Supabase sync so records could be shared across devices. The current app, rebuilt in 2026, removes accounts and cloud sync entirely, so there is no server that can hold student data.
- Safe over the air (OTA) updates. Fixes that only change JavaScript ship through EAS Update, while anything that touches native code gets a new store build. The runtime version follows the app version, and the version is bumped whenever native code changes, so an OTA update only reaches installs it is compatible with.
- Edge to edge on modern Android. Edge to edge display is mandatory from Android 16, so version 1.5.1 moved system bar styling to runtime: the status and navigation bars now follow the theme chosen in the app instead of the device theme.
Testing and quality
The codebase runs TypeScript in strict mode and has a Jest suite covering the repositories, attendance logic, CSV and Excel import, PDF generation, backups, data migrations and Work Hours calculations, along with a performance suite. Database tests run against SQLite in Node, so the data layer is exercised without an emulator.
Privacy and permissions
Atmark needs no account and shows no ads. It does not request location, camera, microphone or contacts access; internet access is used for app updates and when the user chooses to share a file. Files are read only when the user picks a roster to import.
Distribution and source code
Atmark is published on Google Play under my developer account, and atmark.app is its official website with features, support and the privacy policy. Releases are built with EAS Build: an APK for testing and an Android App Bundle for the Play Store.
The current Play Store version is developed in a private repository. The earlier React Native CLI version is public on GitHub (ARPANPATRA111/AtMark) and is no longer maintained.