Sound Layer, Microinteractions
Polser
I.
Kindly used native haptics and system sounds for feedback (iOS, Android, Windows).
It worked, but it carried no product identity.
The same interaction sounded different on each platform.
Sound design had no owner. I stepped into that gap and built a small sound library through vibe-coding: fast iteration, tight constraints, and system-first semantics.
II.
Landscape
Microinteraction feedback was platform-owned.
iOS, Android, and Windows each used different sound and haptic defaults.
Polser inherited them, so the same state signaled differently by platform.
Sound had no model.
No semantic roles.
No intensity scale.
No rule for when sound plays, stays silent, or pairs with haptics.
Extension was ad hoc.
New sounds were added as one-off assets, tied to screens or components, with no system placement and no parity across surfaces.
III.
Decisions
— Define a small semantic sound set for microinteractions (roles, not screens).
— Keep scope tight: state and intent, not ambience.
— Use the LLM as a sound-design partner to cover the skill gap.
— Work from primitives, not samples: basic waveforms shaped with filters.
— Iterate by contrast: test the same source through lowpass, highpass, and bandpass to find the right click band.
— Treat envelopes as first-class: explicit attack and decay, with exponential decay over linear fades.
— Make sound tunable through parameters: waveform, filter, envelope (attack/decay), and gain, so identity is reproducible.
IV.
Model
A shared semantic set drives output.
Each token resolves to a small synthesis contract:
source → filter → envelope → gain
— Sound is never the only signal.
— User settings gate playback.
— Reduced sensory modes resolve to None or Subtle, while keeping the same role.
— Intensity changes gain and decay, not role or timing.
The library stabilised when sound shape was constrained.
Triangle became the default oscillator.
It avoided brittle high-end edges.
Short exponential decays replaced hard stops, so clicks and toggles stayed percussive without sounding cut.
Roles were tuned through frequency movement, not new assets.
Toggle uses a small pitch ramp (up for on, down for off).
Confirm and error use two-tone sequences.
Warning stays sparse and repetitive.
VI.
Reach
Microinteraction sound stopped being a per-platform accident.
One library replaced native defaults across Kindly surfaces, so the same intent carries the same audible signature on iOS, Android, and Windows.
New sounds stopped entering as one-offs.
Extension moved through the same semantic set and parameter rules, without component-level decisions.
VIII.
Form
The work on Kindly triggered a side project.
IX.
Notes
Sound exposed the same pattern as the rest of the system work: defaults scale, but they do not converge.
Native haptics and OS sounds were useful, but they could not carry product identity or cross-platform consistency.
By keeping sound role-driven and parameter-based, the library stayed small, editable, and stable — not an asset catalogue.