MeridianDesign system

Meridian

How long until your next episode, in your time zone, and where it’s on. Meridian answers that at a glance, on the Lock Screen, in widgets and in the Dynamic Island.

This is its design system: the colours, type, components and surfaces, read from the app’s code. Meridian was formerly called Airstamp.

The night takes its hue from the show’s art

Night base #1C1B1A. The phone is the app’s Upcoming hero at real size, counting down in your time zone.

Silo
2:10:07
Expected today at 23:00 Lagos time
S4E1 · Apple TV
The app’s Upcoming hero at real size, timed in your time zone

Where to look

  1. FoundationsColour, contrast, type, space and motion
  2. Countdown and voiceEvery countdown state and the words that say how sure a time is
  3. ComponentsEach view at real size, with specs and a SwiftUI call
  4. Widgets and Live ActivityThe app’s own renders of every family and presentation
  5. Accessibility and resourcesWhat the app does for access, downloads and the rename

Principles

Show, don’t describe

The countdown is the picture and the show’s own art is the colour. No legends, no keys, no screens that need explaining.

Certainty in words

“Out”, “Expected”, “Airs in Japan”, “time not announced”. The verb says how sure a time is. No dots, traffic lights or chips to learn.

One moment, one star

Each surface has one hero: the next episode and its large serif countdown. Everything else is quieter. The logo’s single star is the same idea.

Restraint

Near-black, three strengths of white, a serif for titles and numerals and a sans for the rest. No colour outside the artwork except one gold for the logo’s star and “Out now”, and warm art never turns the page brown.

Brand

The name, logo and icon are in the app. The brand colour is Meridian Gold, on the logo’s star and “Out now”.

A meridian is the line that sets your local time. Noon is the moment the sun crosses yours.

It is also the line a star crosses at its highest point. Meridian tells you the moment your episode crosses your line, on your clock.

Longitudes: a globe drawn only by its meridians, spaced as on a sphere. Yours is at full strength and rises past the globe to a single star. In colour the star is Meridian Gold; the one-colour version, star included, works in every tint.

PartConstruction, on a 100-unit grid
GlobeCircle r 30 at (50, 56). Not drawn: it clips the other meridians.
Other meridiansx = 50 + 30·sin(k·22.5°) for k = ±1, ±2, ±3, so 38.52 / 61.48, 28.79 / 71.21 and 22.28 / 77.72. Stroke 2.5, round caps, 32% opacity.
Your meridianx = 50, from y 86 (the globe’s foot) to y 20 (above the rim at 26). Stroke 3.5, round caps, full strength.
StarCircle r 3.5 at (50, 12).

Sizes

16
24
32
64
128

The smallest size is 16 px. Below 24 px the faint meridians read as texture, and the bright meridian and star carry the mark. Keep 12 units of clear space on every side: the distance from the star’s centre to the top of the grid.

App icon

The mark on neutral night: a radial gradient from #1C1C1C to #0D0D0E, the app’s night and Live Activity bases. The glyph is starlight #F4EFE4, its 100-unit grid scaled 6.2 times to 620 px, about 60% of the 1024 px canvas, placed at (202, 219) so it sits optically centred, with the star in Meridian Gold. The app ships the default for both light and dark mode, plus the tinted source; scripts/make-app-icon.swift draws all three.

Default
Tinted: the mono source
Tinted, example tint
Light (not shipped)
Default on a light wallpaper

Wordmark

“Meridian” in New York Regular, the face of show titles. The mark is about 1.7 times the cap height, and the gap is about 0.3 times the mark’s width.

Meridian
Meridian
Meridian

Using the mark

Do keep the lines starlight and only the star gold. Don’t recolour the lines: colour codes are what the app removed.
Do keep it flat. Don’t add a glow: there are no glows or shadows anywhere in the system.
Do set it on night or on the art’s faded part. Don’t set it on busy art: the art belongs to the show.
Do keep its proportions. Don’t stretch it: the spacing is a sphere’s, and stretched it is only stripes.
Do keep it upright. Don’t rotate it: a meridian runs pole to pole.

Brand colour: Meridian Gold

The night and its starlight, plus one gold, #E9C46A, kept for exactly two things: the logo’s star and the “Out now” moment. One moment, one star. Gold never says how sure a time is; the words still do that. Everything else keeps its colour from the show’s art, and controls stay white.

Out now
Released today at 21:00

Where gold goes

The star on the logo and the app icon. The words “Out now” in the countdown, on the Live Activity and in the Dynamic Island, from the drop until an hour after.

#1C1C1C#F4EFE4#E9C46A

2:10:07
Expected Wed at 23:00

Where it never goes

A ticking countdown, buttons, links, backgrounds, or anything that would read as a status colour. Gold only sits on the night bases, where it reads at about 10:1; never on light surfaces or over art.

Contrast for gold is in Foundations, Contrast. The two options not chosen are in the archive.

Foundations

The values every screen is built from, grouped by what you are choosing. Every hex, Swift name and CSS variable copies with a click.

Colour

Night Sky: a near-black base that takes a hint of the show’s art, three strengths of white for text, and no colour outside the artwork. Alpha colours are previewed on the base they are used on. The CSS variable names are this site’s own; the Swift names are the app’s.

Text

The same three strengths on every surface. The app’s muted is the system secondary label; widgets and the Live Activity use white at 55%. Each sample sits on the base it is used on.

Bases

    Night from the art

    Each show’s night base is computed from its art. Warm hues (under 75° or over 320°) keep saturation at 0.08 or less and brightness 0.11, so the page is charcoal, never brown. Cool hues keep saturation at 0.32 or less and brightness 0.14. White text on any of them is 15.6 to 17.5:1. The two named samples are the bases this site works out from Wednesday’s and Severance’s key art for its mockups.

      Controls and overlays

      Raw values in views, not yet named tokens.

        Live Activity parts

          Contrast

          Computed live in this page with the WCAG 2.x formula. Each alpha ink is composited over its base first. AA needs 4.5:1 for text and 3:1 for large text; AAA needs 7:1. Pairs the app never draws say “not used”.

          Computing…

          Fixed pairs and the brand colour

          Type

          New York for show titles, headers and every countdown numeral. SF Pro for everything else. Numerals are always tabular, so a ticking timer never jitters. The app bundles no fonts.

          This site sets New York in Newsreader, a close web serif, so it looks the same in every browser. The app uses New York.

          2:10:07

          New York

          Titles, headers and countdowns. Countdowns use the Light weight.

          Expected Wed at 23:00

          SF Pro

          Out lines, meta, labels, buttons and lists. Dynamic Type text styles in the app; fixed sizes in widgets.

          Every size in the app

          From the 64 pt hero countdown down to the 10 pt unit in the circular widget, at 1 pt to 1 px. Type your own text to try it at every size.

          Space and shape

          Spacing

          Six steps on a 4 pt base, drawn at twice their size.

          xxs 4
          xs 8
          s 12
          m 16
          l 24
          xl 32
          Layout ruleValueWhere
          Page marginl 24Upcoming, Show detail, the show page, Welcome
          Page margin on Searchm 16Search
          Content overlaps the art−64Upcoming hero, Show detail, the show page
          Upcoming: page, sections, rows40 · xl 32 · l 24Upcoming
          Poster grid3 columns, column gap s 12, row gap m 16Search, Nothing scheduled
          Back buttonplaced by the system’s navigation barShow detail, the show page
          Values outside the scale1, 2, 3, 6, 7, 10, 14, 40, 58, 64, 110, 120, 240Used directly in views

          Radius

          8 · poster
          10 · row art, Welcome tiles
          12 · island art
          5 · logo tile
          h / 6 · thumb
          size / 4 · mark
          capsule · chips, Follow
          circle · (+), back

          The named radius tokens (card 14, sheet 20, widget 22) are not used by any live view.

          Materials

          No shadows anywhere. Depth comes from art fading into night, two scrims (black at the top of the art header, and the page colour under the status bar once a page scrolls past its art), Welcome’s wall of art (dimmed with night, masked away and faded under the status bar), and one material: Liquid Glass on the back button. iOS also draws the tab bar, search field and Dynamic Island.

          Liquid Glass. Regular, interactive, a circle. The only control on the art. Approximated here with a backdrop blur.
          Art fade and top scrim. Base at 0 from 40% to full base at 100%; black at 0.4 to clear by 25%.
          Widget fade. Clear at 25%, base at 0.7 at 50%, full base at 75%.
          Lock Screen art edge. Art on the right 44%, fading leftwards: 1, then 0.75 at 30%, 0.15 at 75%, clear.
          Status-bar shade. The page colour, solid through the status bar (62 pt here), then a 40 pt fade to clear. It fades in over 60 pt of scroll as the text under the art reaches the bar, on Upcoming and the three show pages.
          Welcome wall. Night at 0.18 over the rows; a mask from full to 0.35 at 68% to clear at 90% of the rows’ height; night at 0.7 to clear over the top 96 pt.

          Motion

          Artwork arrives with withAnimation(.easeOut(duration: 0.35)). System motion does most of the work (push, pop, the edge swipe, pull to refresh). The app adds a few short moves, each with one job: that art fade, and Welcome’s wall fading in and drifting; one press style; “Out now” arriving in place at the drop; the still count rolling on the hour; Follow’s + turning into ✓; the filter chips and their grid; and Welcome handing over to the tabs. None of them is a spring. Under Reduce Motion the drift stops and the drop’s scale becomes a plain fade; the fades stay, because a fade moves nothing and a cut would flash bright art onto the night. This site still drops its own transitions under Reduce Motion.

          TimingValue
          Countdown redraw in the appTimelineView(.countdown): every second, on the whole second
          Search grid refresh.everyMinute
          Press (PressStyle)Instant on press, .easeOut(duration: 0.16) on release. Hero: opacity 0.8. Rows and the quiet grid: scale 0.98. Posters, chips, Follow, the (+), “Find a show”: scale 0.97. Show detail’s card rows: white 0.08 more fill
          “Out now” at the drop (CountdownSlot)The slot keeps the digits’ height; opacity with scale 0.97 from the leading edge (trailing in rows), .timingCurve(0.23, 1, 0.32, 1, duration: 0.4); opacity only under Reduce Motion. App screens only: widgets and the Live Activity cut
          Still count’s hourly step.contentTransition(.numericText(countsDown: true)) with .smooth(duration: 0.35), keyed on the countdown’s state, so the ticking seconds never animate; the 24 h hand-off crossfades
          Follow + to ✓.contentTransition(.symbolEffect(.replace)), .snappy(duration: 0.25); the success haptic stays
          Filter chips and grid.snappy(duration: 0.2); the grid crossfades to the new filter
          Stream delay and Live Activity switchThe bindings animate with .snappy(duration: 0.25), so the delay’s words roll and the status line follows the switch
          Welcome to the tabsA crossfade, .smooth(duration: 0.4)
          Search pause before it runs400 ms
          Live Activity ringSystem ProgressView(timerInterval:), which moves with no app running
          Welcome wall drift9 pt a second, linear, alternate rows in opposite directions, each starting part-way into its run (0, 0.42, 0.18); still under Reduce Motion
          Widget timelineEntries at least 5 minutes apart: now; one at each of the next 5 drops and one an hour after each, when “Out now” ends; one exactly 24 hours before a drop, where the timer starts; while it counts down, one every hour (1 s after the hour while the count stands still in days and hours, so it never reads the hour that just ended) and one every 5 minutes in the last hour; one at midnight after a date-only day. Reloads .after(nextDrop), at most 48 hours ahead

          Icons

          SF Symbols only. Each sits beside a word or has an accessibility label. The glyphs here are approximations.

          • clockUpcoming tab
          • magnifyingglassSearch tab
          • gearshapeSettings tab
          • chevron.leftBack button
          • plusFollow (+) and the Follow button
          • checkmarkFollowing
          • tvPoster placeholder; circular and rectangular widgets
          • calendarCircular widget, date only

          Countdown and voice

          The countdown is the product. Only the last day ticks: under 24 hours it is live to the second, stops at 0:00 and never counts up. Further out it reads 2d 4h, whole days and hours, and holds still.

          Every state

          Live in this page. The ticking times are worked out in your own time zone, as the app does.

          Under 24 hours ticking

          2:10:07

          Out today at 22:10

          More than a day, still coarse

          2d 4h

          Expected Wed at 23:00

          At 24 hours it starts to tick, from 24:00:00

          1d 0h

          Airs in Japan Thu at 01:24

          From the drop to an hour after outNow

          Out now

          Released today at 21:00

          More than an hour after released

          Released

          Released today at 19:00

          No time announced dateOnly

          Thu 19 Nov

          Out Thu 19 Nov, time not announced

          Sizes: the word “Out now” is 0.7 times the countdown’s size, “Released” and a date are 0.6 times, and the unit letters “d” and “h” are 0.5 times in the secondary ink.

          Try it

          0:10

          Ten seconds to the drop. Watch it reach zero and turn into “Out now”, without counting up.

          Only the last day ticks. Further out it reads 2d 4h, and the hour steps down without a timer. A ticking countdown keeps room for its widest value from now on (“0:00”, “00:00”, “0:00:00”, then “00:00:00”), so it never takes all the width a widget offers. VoiceOver reads “2 days 4 hours”, never “2 d 4 h”.

          Certainty words

          How sure a time is, said in the time itself. The verb is the whole system.

          WordWhenIn the appIn widgets and the Live Activity
          OutAn exact time: a broadcast, or a confirmed correction“Out today at 22:10”“Out Wed at 02:00” on the Home Screen; “Out Wed 02:00” in the short lines; the band says “Out in”
          ReleasedAn exact time that has passed. Only exact times say it.“Released today at 21:00”“Released today 18:40”
          ExpectedAn estimate: a service’s usual time, an unconfirmed correction, or your own offset. It stays “Expected” after the time.“Expected Wed at 23:00”“Expected Mon at 09:00” on the Home Screen; “Expected Mon 09:00” in the short lines; the band says “Expected in”
          Airs in Japan, then Aired in JapanThe Japanese TV time for an anime“Airs in Japan tomorrow at 01:24”“Airs in Japan Fri 01:00”; VoiceOver says “just aired in Japan”
          time not announcedOnly a date is listed. Never a timer.“Out Thu 19 Nov, time not announced”“Time not announced”, with the day in the countdown’s place
          Out nowFrom the drop until an hour afterIn the countdown’s place“Silo · Out now”; the Live Activity band and compact view
          Nothing scheduledA followed show with no next episodeA section title, with a reason such as “Between seasons · last episode Fri 4 Sep”A widget row label, or the headline when nothing is scheduled
          +3 more this weekEpisodes due within 7 days that a widget can’t fit—Top right of medium and large widgets
          … Lagos timeThe hero names whose clock it is, once a screen“Expected Wed at 23:00 Lagos time”—

          The small, medium and large widgets’ out line is the app’s own, with “at” (“Out Wed at 02:00”). The short lines, with no “at”, are the rectangular Lock Screen widget’s top line, the rows in the medium widget, and the Live Activity’s time line.

          Reasons for a show with nothing scheduled: “Ended”, “Between seasons”, “On hiatus”, “Waiting for news”, “Not out yet”, “No new episode announced”.

          Voice

          Write what is true, in the viewer’s clock and the app’s words.

          WriteNotWhy
          Expected Wed at 23:00~23:00 (est.) ●Certainty lives in the verb. No dots or codes to learn.
          Out today at 21:00Releases at 9 PM ESTYour clock, 24-hour, with the relative day first.
          HBO · USOn HBOA viewer in Lagos can’t watch on HBO. Say where it’s from.
          No official stream in your country⚠︎ (a red icon alone)Words, and only when the rules file says so.
          Out Thu 19 Nov, time not announcedThu 19 Nov · 12:00Noon is the data source’s placeholder. Never count down to a made-up time.
          Starts in 2 hours · 02:00 · Apple TVStarts in 2 hours, for a Netflix estimateOnly a sure time “starts”. An estimate is “Expected in 2 hours”.
          … checks again each time you open it.Updates every 6 hoursiOS doesn’t promise background refresh, so never promise an interval.
          Lagos timeGMT+1 / WATName zones by place.
          Between seasonsRUNNINGSentence case, in the app’s words, not the API’s.
          +3 more this week… (cut-off rows)An honest count instead of shrinking everything.

          Components

          Every reusable view, rebuilt in HTML and CSS from its SwiftUI code and shown at real size, 1 pt to 1 px. Countdowns tick. Each lists its specs, what VoiceOver says, its accessibility ID and a SwiftUI call.

          Glyphs approximate the SF Symbols named. Service logos are a plain letter tile; the app loads freely licensed logos while it runs. Art is drawn in CSS, so no show art appears here.

          Which component?

          1. When the next episode is, big. The headline of a screen.

            ReleaseHeadline

          2. A countdown anywhere: app, widget or row.

            CountdownText, or LiveActivityCountdown in the Live Activity

          3. A time in a sentence, such as “Expected Wed at 23:00”.

            ReleaseWording.outLine. Never a chip or a dot.

          4. The episode and where it’s on, under a title.

            ReleaseMeta

          5. The show’s art at the top of a page.

            NightArtHeader, plus the system back button if the page can go back

          6. A list of followed episodes.

            Upcoming row under a section header

          7. Shows with nothing scheduled.

            Quiet grid cell; in widgets, a quiet row

          8. Browsing, or search results.

            Poster grid cell with the Follow (+) button

          9. Narrowing a grid, one choice at a time.

            Filter chip or service chip; between two catalogues, the kind switch

          10. The one main action on a page.

            Follow capsule, or the white primary button on Welcome

          11. A preference.

            System list rows; for one show, the Live Activity toggle

          12. Nothing to show.

            Empty states: say what is true and what to do. Never promise when it will update.

          13. How sure a time is, as a colour or icon.

            Don’t. Say it in words. The old source chip is archived.

          Navigation

          Tab bar

          The app’s top level after Welcome: Upcoming, Search in the middle as a plain tab, and Settings. The iOS 26 search role would float Search to the trailing edge.

          UpcomingSearchSettings
          Upcoming selected, over art
          UpcomingSearchSettings
          Search selected, on night
          Look
          The system iOS 26 floating Liquid Glass tab bar, forced dark, .tint(.white)
          Symbols
          clock, magnifyingglass, gearshape
          Copy
          “Upcoming” · “Search” · “Settings”
          VoiceOver
          “Upcoming, tab, 1 of 3” (system)
          Hit target
          System, at least 44 pt
          Source
          App/RootView.swift:61-75
          TabView(selection: $tab) {
              Tab("Upcoming", systemImage: "clock", value: .upcoming) {
                  UpcomingTab(model: model, onFind: { tab = .search })
              }
              // Search sits in the middle (Chime). A `.search` role tab always floats on the trailing edge on iOS 26,
              // so this is a plain tab.
              Tab("Search", systemImage: "magnifyingglass", value: .search) {
                  SearchView(client: client, anilist: anilist, rules: model.rules)
              }
              Tab("Settings", systemImage: "gearshape", value: .settings) {
                  SettingsView(scheduler: scheduler, model: model)
              }
          }
          .tint(.white)
          .environment(\.colorScheme, .dark)

          Back button

          The system’s own back button, the only control over the art on Show detail and the show page. The navigation bar stays, invisible, so the edge swipe goes back as in every iOS app (2 Nov: a drawn button with the bar hidden switched the swipe off).

          On art: iOS 26 Liquid Glass, tinted by what’s under it
          What
          The navigation bar’s back button, placed and drawn by the system; long-press lists the way back
          Bar
          Inline title mode, background hidden, no scroll-edge effect at the top, so the art runs under it
          Gesture
          Swipe from the left edge goes back (NavigationTests)
          VoiceOver
          “Back, button”
          Source
          Features/ShowDetail/ShowDetailView.swift; Features/Search/ShowPreviewView.swift
          .navigationBarTitleDisplayMode(.inline)
          .toolbarBackgroundVisibility(.hidden, for: .navigationBar)
          .scrollEdgeEffectHidden(true, for: .top)

          Widgets and Live Activity

          The countdown away from the app. These are the app’s own views, rendered by its tests at their real point size, with each show’s art loaded from TVmaze and AniList.

          Widgets

          One widget, “Next episode”: how long until your next episode, in your time zone, and where it’s on. It comes in six families.

          Large: the next show over its art, then three more
          Medium and small, beside the app
          Home Screen
          Night base #1C1C1C with the show’s art across the top (all of it on small and medium, 62% on large), fading clear, then to 0.7, then to the base. The service is tagged top left (“HBO · US”; a long one shortens before its country, “Paramount+… · US”), and “+N more this week” top right when shows don’t fit. Small shows one show, medium three, large four. The large widget’s hero title takes up to two lines; the small widget’s stays on one.
          Lock Screen
          System inks, because iOS tints them. Inline: “Silo · 2d 4h”; a long name shortens and the count, “Out now” or the day after it stays (“Frieren: Beyond Jour… · 3d 6h”). Circular: an open ring that fills over the last 7 days, a tv glyph, and “2d”, “4h” or “38m” in the gap. Rectangular: “Expected Wed 23:00” (“today” and “tomorrow” close by, the weekday within the week, then the date, “Out Wed 11 Nov 22:00”, with the year when it differs), then the name, then the countdown and service. A long service shortens before its country: “Paramount… · US”.
          Quiet rows
          Followed shows with nothing scheduled fill spare rows: poster, name, “Nothing scheduled”; the large widget adds why. Empty: “Follow a show” with “Its countdown shows up here.”, “Nothing scheduled” with “Meridian checks again each time you open it.”, or “Silo returns Fri 9 Jul 2027” with “Nothing else is scheduled.”
          Tinted and Always-On
          When tinted, the countdown takes the tint, and so does the headline when there’s nothing to count down (“Follow a show”, “Nothing scheduled”, “Silo returns …”). On the Lock Screen so do the inline line, the rectangular widget’s title, and the circular widget’s ring fill, value and date-only day number. Everything else keeps its ink, “Out now” loses its gold, and posters lose their colour. Always-On hides the art and dims every ink to 0.85 except the countdown and that empty headline, so muted text stays above 4.5:1 (it was 0.7, 3.45:1: UX audit #21).
          VoiceOver
          One full phrase a show: “House of the Dragon, in 3 hours, HBO US, no official stream in your country”; “Silo, expected in 2 days 4 hours, Apple TV”; “Nothing scheduled for your shows”. The episode title is left out, so nothing is spoiled.
          IDs
          widget-inline · widget-circular-ring, -value · widget-rect-meta, -title, -countdown, -provider · widget-small-provider, -title, -countdown, -out · widget-medium-row-1 to -3, widget-large-row-1 to -4, widget-more, widget-medium-empty, widget-large-empty

          The renders are the app’s own views. Each show’s key art and posters load from TVmaze and AniList behind them, cropped as the phone crops them; if an image can’t load, a neutral placeholder shows instead.

          In these renders the medium widget shortens a long title in a lower row. The certainty word stays.

          Live Activity

          On release night, for the shows you choose, from the lead time (2 hours by default). Night base #0D0D0E, the show’s art on the right edge, and a plain-words label over a serif countdown. At the drop the content goes stale and every view says “Out now”, with no app running.

          Two hours before Silo: the Live Activity on the Lock Screen
          Compact, in the Dynamic Island
          Expanded, when you touch and hold the island
          Rules
          The timer has no pauseTime: with one, it was drawn frozen. The Lock Screen banner is at most 160 pt tall at 360 wide, even with the longest name. The minimal view fits 28 pt when the island is limited. The payload stays well under 4 KB, with no art: the drop IDs, show name, episode label (“S2E5”), a short service name, the certainty verb, a no-official-stream flag, the show ID that finds its art in the App Group and the window start; the content state is the phase, the drop date and the time it was delayed from. At most 3 are scheduled at once.
          Copy
          Title “Silo” or “Silo + 1 more”. Details “S2E5 · Apple TV · US”. Band “Out in”, “Expected in” or “Airs in Japan in”, then “Out now”. Time “Expected Fri 02:00”; after a delay the Lock Screen strikes the old time through and the expanded island says “Delayed from 01:00” (D-57). Alert “Starts in 2 hours · 02:00 · Apple TV” for an exact time, or “Expected in 2 hours · …”.
          VoiceOver and IDs
          “Silo, expected in 2 hours, delayed from Fri 01:00, Apple TV”. IDs: la-title, la-more, la-details, la-countdown, la-time, la-previous, la-compact-poster, la-compact-timer, la-minimal, la-expanded-title, -art, -time, -moved, -countdown, la-small-title, la-small-countdown
          PresentationSpec
          Lock Screen bannerPadding 16 × 12. 112 pt kept clear on the right for the art (44% of the width, fading leftwards) or a faint initial (a title’s first letter, or its first character when it has none, “💍”). Title New York Medium 19 on up to two lines, one when the time moved (with “+ 1 more” in 13 semibold) · details 13, muted, shortening before the country (“S12E104 · Paramount+ with… · US”) · countdown Light 36, 10 above, which a gold “Out now” in New York Light 25 takes the place of at the drop, on its baseline and in its line’s height · time line 13 medium, secondary (“Expected Mon 21:00”, “Released …” after the drop) and “Delayed from 21:00”, muted, when it moved: the expanded island’s words (UX audit #30), so “Expected” isn’t said twice and no time is struck through
          CompactLeading: a 24 poster mark, radius 6, or the initial on a white disc at 0.16. Trailing: the timer in New York Medium 15, at most 60 wide, shrinking to 0.7 rather than being cut past 10 hours (“26:00:00” when a running activity is delayed a day); “Out now” in SF semibold 14
          MinimalA 24 pt ring (stroke 2.5, track white at 0.18, fill white) that fills from the start to the drop, around a circular poster mark; full at “Out now”
          ExpandedLeading: title New York Medium 18 over details 13 · trailing: art 50 × 50, radius 12 · bottom, laid out like an Upcoming row: the time in words (15 medium, “Expected Mon 21:00”, by weekday so it never goes stale) and the countdown Light 24 on its baseline at the right; “Delayed from 21:00” (13 medium, muted) under the words when the time moved; a gold “Out now” in the numbers’ place at the drop. No progress bar (D-57). Every region is inset 4 pt from the island’s edge, so the bottom line’s words sit under the title and its countdown under the art
          Small (Watch, Mac, CarPlay)An 18 poster mark and title Medium 15, shortening before “+ 4 more” (11 semibold) · label 11 semibold · countdown Light 24 · time line 11 medium; padding 12

          The renders are the app’s own views. Each show’s art loads from TVmaze and AniList behind them, cropped as the phone crops it; if an image can’t load, a neutral placeholder shows instead.

          Accessibility and resources

          What the app does so everyone can read it, the files to take away, and where the old name still appears.

          Accessibility

          AreaWhat the app doesStatus
          Meaning without colourCertainty is a word: “Out”, “Expected”, “Airs in Japan”. No status colour is left in the live screens.Done
          VoiceOver phrasesWidgets and the Live Activity read one full phrase built from the service (“Silo, expected in 2 days 4 hours, Apple TV”); in a widget’s last day it speaks the release time instead (“House of the Dragon, out today at 22:10, HBO US”), which can’t lag the ticking timer (D-61). “HBO · US” is read “HBO US”, and “2d” is read “2 days”.Done
          HeadingsShow titles and section headers are marked as headings.Done
          Hit targetsFilter chips are 34 tall with a 44 tall tap area. The Follow (+) is 32 inside 44 × 44. The back button is 44, Follow 50 tall, “Not now” 44.At least 44
          ContrastSee the contrast matrix.See matrix
          Dynamic TypeEverything in the app grows with the text size. Serif titles keep their designed size (32, 34, 28, 22, 20) and grow like large titles (.serif(_:relativeTo:)); countdowns grow like a large title too, 1.76 times at the largest size. At the accessibility sizes: a row’s countdown goes under its title, the service line and titles are never cut, Show detail’s episodes stack, the art header is 280 tall, Search shows one poster a row, Welcome scrolls and drops the poster wall. Widgets and the Live Activity keep fixed sizes on their fixed canvas. Checked at AX5 on every main screen (2 Nov).Done
          Reduce MotionWelcome’s drifting rows stay still and “Out now” arrives with a fade and no scale. The art fades stay: a fade moves nothing, and a cut would flash bright art onto the night.Done
          Tinted and Always-OnThe countdown and the empty headline take a widget’s tint; on the Lock Screen so do the inline line, the rectangular title and the circular ring, value and day number. Always-On hides the art and dims every other ink to 0.85 (was 0.7), so muted text stays legible.Done
          Decorative imagesArt, posters, logos, the Welcome wall and the poster mark are hidden from VoiceOver. Only one picture is labelled: the key art on the show page that Search opens (ShowPreviewView), read “Silo artwork, image”. Show detail’s and Upcoming’s art stay hidden.Done

          Downloads

          Renamed to Meridian

          Done on 2 November 2026. Every place below now says Meridian, and so do the targets and folders, the bundle ID (dev.chime.meridian), the App Group and the GitHub repo (ChimeXXD/meridian). The app icon is the Longitudes mark.

          • DISPLAY_NAME = MeridianConfig/Base.xcconfig:5 (PRODUCT_NAME in project.yml is internal)

          • “Meridian”Meridian/Features/Welcome/WelcomeView.swift:81

          • “Live Activities are off in Settings › Meridian”Meridian/Features/Settings/SettingsView.swift:60

          • “Meridian is open source under the MIT licence”Meridian/Features/Settings/SettingsView.swift:95

          • “Meridian collects no data. Nothing leaves your phone except requests to TVmaze, AniList and Wikimedia.”Meridian/Features/Settings/SettingsView.swift:97

          • “Nothing scheduled for your shows yet. Meridian checks again each time you open it.”Meridian/Features/Upcoming/UpcomingSections.swift:81

          • “Meridian checks again each time you open it.”Shared/Widgets/WidgetText.swift:54

          • The Debug status “Live Activities are off in Settings › Meridian.”, and the setup-check titleMeridian/Features/Debug/DebugMenuView.swift:77 · Meridian/App/PlaceholderView.swift:12

          • User-Agent “Meridian/1.0 (https://github.com/ChimeXXD/meridian)”Meridian/Services/Artwork/ArtworkLoader.swift:31

          The widget’s name in the gallery stays “Next episode”, which describes what it shows.

          Archive

          Kept for reference. Nothing here is drawn by a live screen. Source paths on this site start inside the app’s folder or at Shared/.

          Legacy components

          SourceChip

          A glyph and word capsule for a time’s source. Replaced by the certainty words, because its colours needed a legend.

          ✓ Broadcast ◷ Netflix rule ✓ Confirmed ⚙ Adjusted ✓ JP broadcast ▦ Date only
          Every source, dark inks
          Spec
          Caption semibold, 8 × 4 padding, ink at 14% fill; ID source-chip; VoiceOver “Source: Broadcast”
          Source
          Deleted on 5 Nov (was Shared/Design/SourceChip.swift). Its words live on in Shared/Design/SourceChipContent.swift.
          // Don't: SourceChip(source: drop.source, confidence: drop.confidence)
          // Do:    Text(ReleaseWording.outLine(drop, now: now, formatter: formatter))

          DropRow, ProviderLabelView and SectionHeader

          The card row from before Night Sky. It showed a delay as a badge with the old time struck through; the live screens now say “Delayed from 01:00” in words (D-58).

          This week
          3 shows
          Stranger Things
          S5E5 · Sat 02:00
          ↻ Delayed 01:00
          ◷ Netflix ruleNetflix
          3d 2:00:00
          A delayed row, under a header with a count
          Spec
          Card #1C1C1E, radius 14, padding 16 · countdown 28 SF Heavy · the no-stream line in red with exclamationmark.circle
          IDs
          drop-row-<n>, provider-label, section-header-<id>
          Source
          Deleted on 5 Nov (was Shared/Design/DropRow.swift). Shared/Design/ProviderLabelView.swift and Shared/Design/SectionHeader.swift remain.
          // Deleted:  DropRow(drop: drop, index: 1, now: now)
          // Live:     UpcomingView.row(_:index:now:)
          Legacy status colours

          Only the archived source chip, card row and service label use these. Light and dark values are listed.

            Numeral study

            Four directions were tried for countdown numerals. Night won. The others are still in the code, drawn only by an old preview. The environment default is still the system style, so each live countdown sets Night itself.

            2:10:07

            Night, in use. New York Light, tabular, white.

            2:10:07

            A · System. SF Pro Heavy, tabular.

            2:10:07

            B · Mono. SF Mono Medium, lime #C6F432.

            2:10:07

            C · Serif. New York Semibold, warm yellow #FFC940.

            Brand colours not chosen
            2:10:07
            Expected Wed at 23:00

            A · Night and Starlight (not chosen)

            The app as it is: neutral night, with a warm white for the brand, on the icon and wordmark only. Nothing new to maintain, and every screen already matches.

            #1C1C1C#0D0D0E#F4EFE4

            2:10:07
            Expected Wed at 23:00

            C · Night Indigo (not chosen)

            A navy sky, #1D2547 to #0C0F1D, from the first logo drafts. It would mean moving the app off its neutral night, and it sits close to cool show art.

            #1D2547#0C0F1D#F4EFE4

            Rejected logo directions
            The Cut
            The Cut. Reads as the Greek letter Φ.
            Transit
            Transit. The small dots vanish at icon sizes.
            Lowercase m
            Lowercase m. Reads as a trident.
            Dial
            Dial. A generic stopwatch: it could be any timer app.
            Terminator
            Terminator. Looks like the iOS dark-mode symbol.
            First draft: CulminationFirst draft: Local HourFirst draft: monogram
            First drafts. Gradients, glow and too many parts.
            Debug menu, in debug builds only

            A fake episode to watch a countdown reach zero, a Live Activity for it, a simulated delay, and the widgets’ data as text.

            Fake drop
            Fake drop in 2 minutes
            Fake drop in 10 minutes
            Fake drop in 60 minutes
            Remove fake drop
            Adds “Debug Show” to Upcoming and the widgets until the app is relaunched.
            Live Activity
            Live Activity for fake drop in 3 min (lead 1 min)
            Simulate delay +1 h
            Dump snapshot›
            Last action
            Fake drop at 21:42, in Upcoming and the widgets.
            After an action
            IDs
            debug-fake-2, -10, -60, debug-fake-remove, debug-activity, debug-delay, debug-snapshot, debug-status; the snapshot view debug-snapshot-text, debug-snapshot-copy
            Status copy
            “Requested: it appears at 21:41, drop at 21:42.” · “Skipped: 3 Live Activities are already pending.” · “Moved 1 Live Activity 1 hour later.”
            Source
            Features/Debug/DebugMenuView.swift
            #if DEBUG
            NavigationLink("Debug") { DebugMenuView(model: model, scheduler: scheduler) }
            #endif
            ↑ ↓ to move↵ to openesc to close