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, aRootViewhandling tabs, routes and in-app Safari, andAppConfigfor publication name, tagline and feed URL.Models/: plainCodablestructs for Issue, Story, Quote, Category and DigestDay.Parsing/: a three-pass pipeline (HTMLLinesflattens HTML into lines,DigestParsersegments 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,@MainActorstore that loads the disk cache instantly and merges new issues from the feed),ReaderState(read, saved, votes and streak persisted toUserDefaults) andReminderSchedulerfor 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