← All work
Product · 2026

Native iOS Reader for a Daily Family Newsletter

A daily family newsletter

Overview

A native iOS build that turns a parent-written daily newsletter (a quote of the day plus a handful of short stories, each with a “pro” and “con” take) into a polished reading app for the family. Issues are fetched live from the newsletter’s public RSS feed and parsed into cards; there is no backend and no account.

Why It Exists

The newsletter is published through a standard email/web platform, which is a poor fit for the intended readers: kids at the breakfast table. We wanted to see how far a small, dependency-free SwiftUI app could go in making the content feel like a real daily paper, with offline access, saved stories, a reading streak and a morning reminder, while being quick to restyle by a non-engineer.

What We Built

A single-target SwiftUI app generated from project.yml with XcodeGen, organized as:

  • App/: entry point, a RootView handling tabs, routes and in-app Safari, and AppConfig for publication name, tagline and feed URL.
  • Models/: plain Codable structs for Issue, Story, Quote, Category and DigestDay.
  • Parsing/: a three-pass pipeline (HTMLLines flattens HTML into lines, DigestParser segments bold labels and sources, then a small state machine classifies and assembles quote and stories). Posts without pro/con takes become long-form essays.
  • Services/: FeedService (network), IssueStore (an @Observable, @MainActor store that loads the disk cache instantly and merges new issues from the feed), ReaderState (read, saved, votes and streak persisted to UserDefaults) and ReminderScheduler for the breakfast notification.
  • DesignSystem/: theme tokens (palette with light/dark variants, fonts, spacing, radii, stroke and hard-shadow offsets), per-section colors and icons, and reusable “sticker” components.
  • Features/: Today, Issue, Story, Archive (by date or by section), Saved, Special and Settings screens.

Supporting pieces include a parser test suite against a 20-post snapshot of the real feed, bundled sample issues for a no-network first launch, debug launch arguments that deep-link to any screen, a screenshot script, an icon generator and a testflight.sh script that tests, archives and uploads to App Store Connect.

Technologies & Approach

Swift 6 language mode and SwiftUI on iOS 17+, with zero third-party dependencies. The feed’s RSS already contains the full HTML of recent posts, so the app avoids any platform API or login. Because the source content is hand-written and structurally inconsistent, parsing was treated as the core engineering problem and covered with fixture-based unit tests, with the rule that any odd future issue gets its HTML added to the fixtures and a test written first. All visual decisions are centralized in design-system tokens so the look can be changed without touching feature code. Custom fonts are bundled under OFL licenses.

Outcome / Impact

The build delivered a working, installable reader with Today, Story, Archive, Saved and Special screens, dark mode, offline caching, streaks and reminders, and a TestFlight path with automatic signing. It validated that a content-only product can be shipped natively with a very small surface area, and that defensive parsing plus a real-feed test corpus is enough to handle free-form editorial HTML. Documented next steps include syncing readers’ votes back to the author, a home-screen widget, per-reader profiles and fetching older issues beyond the RSS window.

Capabilities Demonstrated

  • Native iOS app design and build in SwiftUI with Swift 6 and no external dependencies
  • Resilient parsing of inconsistent, hand-written HTML into structured content, backed by fixture tests
  • Offline-first data flow with disk caching and bundled fallback content
  • Token-based design system enabling non-engineer restyling
  • Local notifications, reading streaks and saved-item state without a backend
  • Reproducible project generation (XcodeGen) and scripted TestFlight delivery
More work See all work