projects2026 · Mobile · Live
Arkhime
AniList Tracker
Arkhime is an AniList tracker that groups whole series together, edits a list in batches and pushes an alert the moment something is announced, airs or finishes. A native Android app does the tracking; a Next.js site handles sign-in, a web editor and the app's own updates.

- Role
- Design, Android, full-stack
- App
- Kotlin · Material 3 · AniList GraphQL
- Site
- Next.js 16 · React 19 · Tailwind 4 · Vercel
- Status
- Live, v1.0.1 on GitHub Releases
- 2
- Apps: Android and web
- 9
- Kinds of release alert
- 30/min
- AniList rate limit, respected
- 1 tag
- From commit to installed update
01 · Overview
A list that keeps up with you.
AniList lists every season, movie and OVA as its own title, so a long list turns into scattered entries. Arkhime joins them back into series using AniList's own relations, oldest first, and shows the related entries that are not on the list yet.
Keeping a list current means many small edits. The list screen has an edit mode: change progress, status and score on as many entries as needed, see each change outlined, and save them in one batch that paces itself to AniList's rate limit and retries anything rate-limited.
Tracking also means knowing when something happens. A background check reads AniList's airing schedule and newest titles for the whole site, plus the user's own media notifications, and turns them into an Updates feed and alerts with artwork and list buttons.
- Series, not scattered titles
- Union-find over AniList relations groups sequels, prequels, side stories and spin-offs into one row with a completion bar.
- Batch editing
- Pending changes are kept as minimal diffs with AniList's own rules: the first episode starts a show, the last one completes it.
- Release alerts
- New anime and manga, premieres, episodes and finales, with cover art and Planning, Watching or Completed on the notification.
- Updates feed
- Everything that happened, newest first, filterable by type: 100 at a time, then 50 more on demand.
- Updates itself
- A version tag builds signed APKs on GitHub Actions; the app finds the release, downloads the right APK and hands it to the installer.
- Built for real phones
- Shortcuts to autostart and battery settings, so background checks survive Xiaomi, Oppo, Vivo and Huawei power managers.
02 · Two front doors
One account, two screens.
Both sign in with the same AniList client and write straight to AniList. The phone does the day-to-day tracking; the browser is for big clean-ups.
On the phone · Kotlin
The full tracker
Lists grouped by series with an edit mode, info pages, profiles, the Updates feed, widgets and alerts with artwork.
- Series grouping and batch edit on the list screen
- Alerts with Planning, Watching and Completed buttons
- Updates feed: 100 items, then 50 more
- In-app updates from GitHub Releases
In the browser · Next.js 16
The site and the web editor
A black, high-contrast landing page with a link to the latest APK, and a web app for editing a whole collection on a big screen.
- /download redirects to the newest release APK
- Web app: series rows, filters and mass edit
- OAuth redirect for the Android app
- Social preview image on every page
Shared by both
- AniList client 36103 · implicit grant
- graphql.anilist.co
- SaveMediaListEntry
- MediaListCollection
- series grouping by relations
- arkhime:// deep link
- /api/updates/stable · beta
- GitHub Releases
03 · Under the hood
Three pipelines, one list.
Group, save, alert. Each is a short chain of steps that keeps the list in step with AniList without fighting its limits.
GroupFrom scattered titles to series rowsshowhide
- 01Fetch the list with bare relation links. Only ids and relation types ride along with the collection, so a 1,600-entry list stays about the size of a plain one.
- 02Union-find over same-series relations. Sequels, prequels, side stories, spin-offs, summaries and parents join one set; adaptations and characters do not.
- 03Fill in what is missing. Related titles that are not on the list are fetched afterwards in pages of 50 and joined to their series.
- 04Order and measure. Each series is sorted by start date and gets a completion bar from progress across its entries.
Pieces
- AniList GraphQL
- union-find
- relations.edges
- id_in batches of 50
- kotlinx.serialization
- RecyclerView
SaveFrom pending edits to AniListshowhide
- 01Record a minimal diff. Only changed fields are kept; nudging a value back drops the change.
- 02Apply AniList's rules. The first episode moves Planning to Watching, the last one completes the entry, and dates are stamped when missing.
- 03Save one entry at a time. Fast while AniList reports headroom, then about one save every two seconds.
- 04Wait out a rate limit. A 429 is waited out and retried; anything else stays pending for another try.
Details
- SaveMediaListEntry
- X-RateLimit-Remaining
- Retry-After
- failed entries stay pending
- discard guard on back
AlertFrom AniList to a notificationshowhide
- 01Read the whole site. Every episode that aired since the last check, and the newest titles added to AniList, anime and manga.
- 02Read the user's changes. Related additions, data changes, merges and deletions come from the user's AniList notifications.
- 03Store, never duplicate. Each event has a stable key and lands once in an on-device feed capped at 3,000 entries.
- 04Push what was asked for. Nine switchable types, all of AniList or only the user's list, at most 15 per check with a summary for the rest.
Pieces
- WorkManager
- AlarmManager fallback
- airingSchedules
- BigPictureStyle
- BroadcastReceiver actions
- Glide
04 · In the pocket
Real screens, real list.
05 · Stack and operations
What it runs on, and how it ships.
Android
- Kotlin
- Material 3
- ViewBinding
- Coroutines
- WorkManager
- OkHttp
- kotlinx.serialization
- Glide
- R8
Web
- Next.js 16
- React 19
- TypeScript
- Tailwind CSS 4
- Vercel
- Neon Postgres
Operations
- A v*.*.* tag builds signed APKs per CPU and a universal one
- GitHub Releases is the update feed; the site mirrors it
- /download always serves the newest universal APK
- Test builds post to Telegram with their commit log
Scope
- A tracker: it hosts and streams no media
- Data from the AniList API
- Open source under the UPL (GPLv3)

