STHREELABS  //  INDEPENDENT SOFTWARE STUDIO  //  OHIO, USA
Tallies

A quiet tally app & counter Built to read aloud, scale up, and stay legible.

Tallies counts things. One tap adds a mark, one tap takes it back. The whole app is built around that single quiet motion. For people who use assistive technology, that motion needs to work without sight, without fine motor control, and without dependence on color or animation.

Accessibility for Tallies is load-bearing, not a checkbox. Counters can be read and incremented entirely by VoiceOver. The tap-to-magnify sheet defends the layout at any Dynamic Type size. Below is a complete, honest list of what's supported and what we still owe.

i.VoiceOver

The counter screen reads as a single coherent statement of state — "Push-ups, 12 tallies, all time." The item name, the current count, and the active time-range filter are combined into one focusable element so a screen-reader user gets the whole picture in one read, not three fragments.

The primary "add a tally" affordance on the canvas is a vertical swipe gesture, which isn't discoverable without sight. To keep parity, the canvas exposes a standard VoiceOver accessibility action named "Add tally" — invoked the usual way (rotor → Actions → Add tally). Undo is a separate toolbar button labeled "Undo last tally."

Journals list, settings rows, and the paywall sheet all read as well: "Appearance: follow system," "Keep screen awake while counting: off." The paywall headline, body, four bullets, and the Unlock and Restore buttons are each individually focusable.

Verified on iPhone and iPad.

ii.Voice Control

Standard SwiftUI controls throughout. "Show numbers" overlays every interactive element. "Tap undo," "Tap settings," "Tap unlock," and the per-item rows in the journals list all respond to numbered overlays. The canvas's "Add tally" accessibility action is also invocable by name from Voice Control. Swipe actions on item rows (rename, archive, delete) surface through the standard show-numbers overlay.

Verified on iPhone.

iii.Larger Text

Tallies's counter screen uses a geometry-anchored layout: the large count numeric and the time-range filter chip sit at fixed positions above the tally grid, so the rhythm of repeated swiping stays predictable. Geometry-anchored layouts can't always reflow at iOS's largest accessibility text sizes (AX3–AX5) without breaking that rhythm.

Instead, the counter honors a tap-to-magnify gesture: tap the big count number and a sheet opens showing the item name, the current count, the word "tallies," and the active time-range filter — all rendered at the user's actual Dynamic Type size, including the AX scale. Standard list views (the journals list, settings, the paywall) reflow normally at Dynamic Type sizes through Large. VoiceOver describes the counter correctly at every size.

This is the same pattern used in Visible Hour and is verified on iPhone and iPad at every Dynamic Type and Accessibility Text size from XS through AX5.

iv.Dark Interface

Tallies ships with three appearance options — Light, Dark, and Follow System — selectable from Settings → Appearance. The Dark register isn't a tinted Light register; it's a separately-designed paperback layer with its own ink, amber, and rule values calibrated for low-light reading. Tally numerics, item names, and the tap-to-magnify sheet all use Dark-mode-appropriate weights and contrasts.

v.Reduced Motion

Honored. When the time-range filter changes (today / week / month / all time), the large count transitions with a brief numeric content transition — with Reduce Motion enabled, this becomes instant. The tap-to-magnify sheet uses the system's default sheet transition, which iOS already adapts under Reduce Motion. The tally marks themselves don't animate when added.

vi.Differentiate Without Color Alone

Tally marks, item rows, and section headers are distinguishable without color via typography weight, position, and shape. Archived items are visually distinct from active items via italicization and a small-caps "archived" label, not via tint alone. The amber accent used for values and chevrons always pairs with the value or affordance it identifies, so removing the color (via iOS Color Filters → Grayscale) still preserves the information hierarchy. Verified by viewing the app under iOS Color Filters set to Grayscale.

vii.What we don't yet support

Honesty matters more than a clean checklist. As of v1.2.1:

Switch Control. Standard SwiftUI controls and the canvas's explicit "Add tally" accessibility action should work with Switch Control's two-level scan in principle, but we haven't validated the full flow on a real switch configuration. Adding switch-verified support is on the v1.3 list.

Sufficient Contrast (WCAG AA). The paperback design family uses a warm amber-on-cream register in Light mode that's deliberately quiet — accent text and small chevrons measure below WCAG AA's 4.5:1 threshold for normal-size text. The Dark register exceeds AA throughout. Until we've audited every element in Light mode against AA, we don't declare contrast support.

viii.How to enable accessibility features

VoiceOver. Settings → Accessibility → VoiceOver. Or set the Accessibility Shortcut once and triple-press the side button to toggle.

Voice Control. Settings → Accessibility → Voice Control.

Larger Text. Settings → Accessibility → Display & Text Size → Larger Text. Drag the slider all the way right and toggle "Larger Accessibility Sizes" for the AX scale.

Reduced Motion. Settings → Accessibility → Motion → Reduce Motion.

Color Filters / Grayscale. Settings → Accessibility → Display & Text Size → Color Filters → Grayscale.

Dark Interface inside Tallies. Settings → Appearance → Dark.

ix.Feedback

Accessibility issues, gaps, or "the counter doesn't read right with my screen reader" reports go to hello [at] sthreelabs [dot] com. We read every email. If something doesn't work for you — that's a bug, not a feature flag, and we'll fix it.

Made quietly by sthreelabs.