Eric Harris Back to portfolio

Native Android application · Complete v1.0.0

ApplyWindow

An execution cockpit for staging and submitting time-sensitive job applications from a phone - for roles that open at a scheduled moment and fill within minutes.

Platform: Android 8.0+ Language: Kotlin License: MIT Status: Shipped v1.0.0
Kotlin Jetpack Compose Material 3 Room AlarmManager WebView

Overview

Calm execution under a closing window

ApplyWindow turns the scramble of applying to a competitive, time-boxed job posting into a calm, staged routine. Built with Jetpack Compose and Material 3 on a local-first Room database, it schedules exact-alarm reminders, then presents a one-handed execution cockpit that pairs a WebView of the real application portal with instant access to prepared answers, salary figures, résumé attachments, and a readiness checklist.

An optional Gemini screenshot import extracts posting details for review. It is deliberately not a bot: no auto-submission, no autofill, no CAPTCHA handling, no password storage - the user presses the real submit button, on time.

What it does

Highlights

Local-first, no backend

Room plus Kotlin Flow - no account, no server, no analytics. Every piece of data stays on the device.

Exact-alarm reliability

Schedules T‑15 / T‑5 / T‑0 alerts, detects when Android downgrades alarm precision, and surfaces an exact/fallback indicator with a reboot-aware rescheduler.

Split-screen execution mode

A live application-portal WebView over an always-visible cockpit - answers, documents, and checklist - built for one-handed submission under time pressure.

Human-in-the-loop by design

Explicit safety boundaries: no auto-submit, no autofill, no CAPTCHA bypass, no password storage, no scraping.

Optional AI import

Gemini Vision extracts job-posting fields from a screenshot into a reviewable draft (never auto-applied). The user supplies their own API key, stored encrypted on device.

Spec-driven, reproducible

Developed from a detailed written specification through a sequenced, multi-model process, with GitHub Actions building and publishing the release.

Where the line is drawn

Deliberately not a bot

The hard part of a time-boxed application isn’t clicking - it’s being ready and on time. ApplyWindow removes the scramble without ever removing the human. It stages, reminds, and organizes; the person still reads, decides, and submits. By design, it does not:

  • auto-submit
  • autofill forms
  • bypass CAPTCHAs
  • store passwords
  • scrape portals

How it was built

Specification-first, multi-model

ApplyWindow was built spec-first: a detailed written specification defined the behavior, acceptance criteria, and test checklist up front, and the app was implemented through a sequenced, multi-model process with that checklist as the definition of done. It exercises the harder edges of Android on purpose - the exact-alarm permission model, the Storage Access Framework with persistable URI permissions, edge-to-edge insets, and orientation-lock to protect an in-progress WebView session.

Every push runs GitHub Actions CI, and tagging a version builds and publishes a downloadable release - so the build is reproducible rather than a one-off on my machine.

Under the hood

Build facts

Platform
Android 8.0+ (API 26+)
Language
Kotlin - 23 source files, single-activity Compose architecture
Toolchain
AGP 8.6.1 · Gradle 8.7 · Kotlin 2.0.20 · Compose BOM 2024.09.01 · Room 2.6.1
SDK
minSdk 26 · target SDK 35
Network
WebView (application portals) and the optional screenshot-import call only - no backend, no analytics
Distribution
v1.0.0 release · debug APK (~18 MB), SHA-256 published in the repo’s build-verification doc
License
MIT

Take a look

The full source, docs, and a downloadable build are public.