<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>sonodrill, branch HEAD</title>
<subtitle>Sonodrill, app iOS/Android d’entraînement musical (repères, boucles, vitesse), Kotlin Multiplatform + Compose
</subtitle>
<entry>
<id>7312359f39bdb00542f5580353554ed97b440465</id>
<published>2026-10-17T20:10:38Z</published>
<updated>2026-10-17T20:10:38Z</updated>
<title>Version 1.3: the library shows the number of marks of each track</title>
<link rel="alternate" type="text/html" href="https://git.schurger.org/sonodrill/commit/7312359f39bdb00542f5580353554ed97b440465.html" />
<author>
<name>Jean Schurger</name>
<email>jean@schurger.org</email>
</author>
<content>commit 7312359f39bdb00542f5580353554ed97b440465
parent a83a25e5eb94a7dcfaa36a5e49311d3d1bf782c0
Author: Jean Schurger &lt;jean@schurger.org&gt;
Date:   Sat, 17 Oct 2026 16:10:38 -0400

Version 1.3: the library shows the number of marks of each track

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_0141Zm4UQq8PATQAG98MdNCc

</content>
</entry>
<entry>
<id>a83a25e5eb94a7dcfaa36a5e49311d3d1bf782c0</id>
<published>2026-10-17T18:50:56Z</published>
<updated>2026-10-17T18:50:56Z</updated>
<title>Android: application id org.schurger.sonodrill, FileProvider authority derived from it</title>
<link rel="alternate" type="text/html" href="https://git.schurger.org/sonodrill/commit/a83a25e5eb94a7dcfaa36a5e49311d3d1bf782c0.html" />
<author>
<name>Jean Schurger</name>
<email>jean@schurger.org</email>
</author>
<content>commit a83a25e5eb94a7dcfaa36a5e49311d3d1bf782c0
parent 7bf470770ca62e0e6be71cba1d468016358cac4a
Author: Jean Schurger &lt;jean@schurger.org&gt;
Date:   Sat, 17 Oct 2026 14:50:56 -0400

Android: application id org.schurger.sonodrill, FileProvider authority derived from it

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_0141Zm4UQq8PATQAG98MdNCc

</content>
</entry>
<entry>
<id>7bf470770ca62e0e6be71cba1d468016358cac4a</id>
<published>2026-10-17T18:36:00Z</published>
<updated>2026-10-17T18:36:00Z</updated>
<title>fastlane: get_certificates takes the keychain password (KEYCHAIN_PASSWORD) to allow codesign on the new key</title>
<link rel="alternate" type="text/html" href="https://git.schurger.org/sonodrill/commit/7bf470770ca62e0e6be71cba1d468016358cac4a.html" />
<author>
<name>Jean Schurger</name>
<email>jean@schurger.org</email>
</author>
<content>commit 7bf470770ca62e0e6be71cba1d468016358cac4a
parent 6e47399444fc9dae2bc2182e966157a7b0fb8b3d
Author: Jean Schurger &lt;jean@schurger.org&gt;
Date:   Sat, 17 Oct 2026 14:36:00 -0400

fastlane: get_certificates takes the keychain password (KEYCHAIN_PASSWORD) to allow codesign on the new key

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_0141Zm4UQq8PATQAG98MdNCc

</content>
</entry>
<entry>
<id>6e47399444fc9dae2bc2182e966157a7b0fb8b3d</id>
<published>2026-10-17T18:03:17Z</published>
<updated>2026-10-17T18:03:17Z</updated>
<title>iOS: move to Jean&#39;s personal developer account (team CM5RQKJH56, org.schurger.sonodrill)</title>
<link rel="alternate" type="text/html" href="https://git.schurger.org/sonodrill/commit/6e47399444fc9dae2bc2182e966157a7b0fb8b3d.html" />
<author>
<name>Jean Schurger</name>
<email>jean@schurger.org</email>
</author>
<content>commit 6e47399444fc9dae2bc2182e966157a7b0fb8b3d
parent 86b25df8a6d800c1abd2df80b268759739a38215
Author: Jean Schurger &lt;jean@schurger.org&gt;
Date:   Sat, 17 Oct 2026 14:03:17 -0400

iOS: move to Jean&#39;s personal developer account (team CM5RQKJH56, org.schurger.sonodrill)

Fastlane reads the PERSO_ASC_* API key and creates the team&#39;s distribution
certificate when missing.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_0141Zm4UQq8PATQAG98MdNCc

</content>
</entry>
<entry>
<id>86b25df8a6d800c1abd2df80b268759739a38215</id>
<published>2026-10-17T15:50:39Z</published>
<updated>2026-10-17T15:50:39Z</updated>
<title>fastlane: SIGH_FORCE=1 regenerates the App Store profile (iCloud added to the App ID)</title>
<link rel="alternate" type="text/html" href="https://git.schurger.org/sonodrill/commit/86b25df8a6d800c1abd2df80b268759739a38215.html" />
<author>
<name>Jean Schurger</name>
<email>jean@schurger.org</email>
</author>
<content>commit 86b25df8a6d800c1abd2df80b268759739a38215
parent 3c25b70f3308f0fc5daa8b5527336d4bca0dc472
Author: Jean Schurger &lt;jean@schurger.org&gt;
Date:   Sat, 17 Oct 2026 11:50:39 -0400

fastlane: SIGH_FORCE=1 regenerates the App Store profile (iCloud added to the App ID)

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_0141Zm4UQq8PATQAG98MdNCc

</content>
</entry>
<entry>
<id>3c25b70f3308f0fc5daa8b5527336d4bca0dc472</id>
<published>2026-10-17T15:38:06Z</published>
<updated>2026-10-17T15:38:06Z</updated>
<title>Version 1.2: practice options, sound settings, shared and synced marks, French UI</title>
<link rel="alternate" type="text/html" href="https://git.schurger.org/sonodrill/commit/3c25b70f3308f0fc5daa8b5527336d4bca0dc472.html" />
<author>
<name>Jean Schurger</name>
<email>jean@schurger.org</email>
</author>
<content>commit 3c25b70f3308f0fc5daa8b5527336d4bca0dc472
parent c11498b838af7782187c1dbb8cf6fa02b0467c2c
Author: Jean Schurger &lt;jean@schurger.org&gt;
Date:   Sat, 17 Oct 2026 11:38:06 -0400

Version 1.2: practice options, sound settings, shared and synced marks, French UI

- Practice sheet: delay, metronome count-in (before playing and each pass),
  pause between passes, repetitions, progressive speed
- Sound sheet: pitch in semitones, left/right channel, no center, bass cut
  (SoundFilter; iOS player now schedules filtered chunks, Android uses an
  ExoPlayer AudioProcessor)
- Marks: drag a label to move a mark, fine adjust and delete in its dialog;
  zones and the active loop follow
- Share marks as .sonodrill files and import them on a track; audio and marks
  can be opened from other apps
- Marks and zones synced through iCloud key-value storage (iOS)
- Interface in French or English, following the system
- Schema v3: sound settings per file, marks time, preferences
- Tests: sound filter, marks file, loop passes, mark moves, iCloud merge

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_0141Zm4UQq8PATQAG98MdNCc

</content>
</entry>
<entry>
<id>c11498b838af7782187c1dbb8cf6fa02b0467c2c</id>
<published>2026-10-16T19:56:09Z</published>
<updated>2026-10-16T19:56:09Z</updated>
<title>Launch argument -open-file &lt;id&gt; opens a file in the player (App Store screenshots)</title>
<link rel="alternate" type="text/html" href="https://git.schurger.org/sonodrill/commit/c11498b838af7782187c1dbb8cf6fa02b0467c2c.html" />
<author>
<name>Jean Schurger</name>
<email>jean@schurger.org</email>
</author>
<content>commit c11498b838af7782187c1dbb8cf6fa02b0467c2c
parent 57eec87cd4e91b34ced9c0dcf39061ddcba8e47a
Author: Jean Schurger &lt;jean@schurger.org&gt;
Date:   Fri, 16 Oct 2026 15:56:09 -0400

Launch argument -open-file &lt;id&gt; opens a file in the player (App Store screenshots)

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_0141Zm4UQq8PATQAG98MdNCc

</content>
</entry>
<entry>
<id>57eec87cd4e91b34ced9c0dcf39061ddcba8e47a</id>
<published>2026-10-16T19:28:04Z</published>
<updated>2026-10-16T19:28:04Z</updated>
<title>A loop next to a skip zone extends over it</title>
<link rel="alternate" type="text/html" href="https://git.schurger.org/sonodrill/commit/57eec87cd4e91b34ced9c0dcf39061ddcba8e47a.html" />
<author>
<name>Jean Schurger</name>
<email>jean@schurger.org</email>
</author>
<content>commit 57eec87cd4e91b34ced9c0dcf39061ddcba8e47a
parent de3476b54d273df9aaa78c7941b3d739f8b3f14f
Author: Jean Schurger &lt;jean@schurger.org&gt;
Date:   Fri, 16 Oct 2026 15:28:04 -0400

A loop next to a skip zone extends over it

Marks A B C D with B..C skipped: looping from C..D loops A..D, honoring the
skip, instead of C..D. Moving to the next loop region steps over skipped spans.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_0141Zm4UQq8PATQAG98MdNCc

</content>
</entry>
<entry>
<id>de3476b54d273df9aaa78c7941b3d739f8b3f14f</id>
<published>2026-10-16T19:14:10Z</published>
<updated>2026-10-16T19:14:10Z</updated>
<title>Skip zones inside a loop are honored</title>
<link rel="alternate" type="text/html" href="https://git.schurger.org/sonodrill/commit/de3476b54d273df9aaa78c7941b3d739f8b3f14f.html" />
<author>
<name>Jean Schurger</name>
<email>jean@schurger.org</email>
</author>
<content>commit de3476b54d273df9aaa78c7941b3d739f8b3f14f
parent 9266199620d9d85efa5e252deffd3e83c7cbe831
Author: Jean Schurger &lt;jean@schurger.org&gt;
Date:   Fri, 16 Oct 2026 15:14:10 -0400

Skip zones inside a loop are honored

Skip and loop monitors now resolve one target: past the skip zones, and back
to the loop start when that reaches the loop end (skipping again if the loop
start is itself skipped). No more playing past the loop end or into a skipped
span at the loop start.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_0141Zm4UQq8PATQAG98MdNCc

</content>
</entry>
<entry>
<id>9266199620d9d85efa5e252deffd3e83c7cbe831</id>
<published>2026-10-16T19:11:09Z</published>
<updated>2026-10-16T19:11:09Z</updated>
<title>Skip and loop over the same span no longer conflict</title>
<link rel="alternate" type="text/html" href="https://git.schurger.org/sonodrill/commit/9266199620d9d85efa5e252deffd3e83c7cbe831.html" />
<author>
<name>Jean Schurger</name>
<email>jean@schurger.org</email>
</author>
<content>commit 9266199620d9d85efa5e252deffd3e83c7cbe831
parent ef05a889587ef3989b1f43ad82707ea46db49165
Author: Jean Schurger &lt;jean@schurger.org&gt;
Date:   Fri, 16 Oct 2026 15:11:09 -0400

Skip and loop over the same span no longer conflict

Adding a skip zone over a loop zone&#39;s span removes that loop (stopping it if
active); looping between marks removes a skip zone over the same span.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_0141Zm4UQq8PATQAG98MdNCc

</content>
</entry>
<entry>
<id>ef05a889587ef3989b1f43ad82707ea46db49165</id>
<published>2026-10-16T19:03:32Z</published>
<updated>2026-10-16T19:03:32Z</updated>
<title>Declare no non-exempt encryption (TestFlight builds were stuck on export compliance)</title>
<link rel="alternate" type="text/html" href="https://git.schurger.org/sonodrill/commit/ef05a889587ef3989b1f43ad82707ea46db49165.html" />
<author>
<name>Jean Schurger</name>
<email>jean@schurger.org</email>
</author>
<content>commit ef05a889587ef3989b1f43ad82707ea46db49165
parent 3e45ff5fdaa3a59f04e0ff65767dcdb23f61a55d
Author: Jean Schurger &lt;jean@schurger.org&gt;
Date:   Fri, 16 Oct 2026 15:03:32 -0400

Declare no non-exempt encryption (TestFlight builds were stuck on export compliance)

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_0141Zm4UQq8PATQAG98MdNCc

</content>
</entry>
<entry>
<id>3e45ff5fdaa3a59f04e0ff65767dcdb23f61a55d</id>
<published>2026-10-16T18:48:33Z</published>
<updated>2026-10-16T18:48:33Z</updated>
<title>Version 1.1</title>
<link rel="alternate" type="text/html" href="https://git.schurger.org/sonodrill/commit/3e45ff5fdaa3a59f04e0ff65767dcdb23f61a55d.html" />
<author>
<name>Jean Schurger</name>
<email>jean@schurger.org</email>
</author>
<content>commit 3e45ff5fdaa3a59f04e0ff65767dcdb23f61a55d
parent 201b1d6c9724ecc75ffb4e7e042fcab277a9fb22
Author: Jean Schurger &lt;jean@schurger.org&gt;
Date:   Fri, 16 Oct 2026 14:48:33 -0400

Version 1.1

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_0141Zm4UQq8PATQAG98MdNCc

</content>
</entry>
<entry>
<id>201b1d6c9724ecc75ffb4e7e042fcab277a9fb22</id>
<published>2026-10-16T18:44:59Z</published>
<updated>2026-10-16T18:44:59Z</updated>
<title>Release: download the profile outside the sources, regenerate the project</title>
<link rel="alternate" type="text/html" href="https://git.schurger.org/sonodrill/commit/201b1d6c9724ecc75ffb4e7e042fcab277a9fb22.html" />
<author>
<name>Jean Schurger</name>
<email>jean@schurger.org</email>
</author>
<content>commit 201b1d6c9724ecc75ffb4e7e042fcab277a9fb22
parent 509502b8cead846507608b82a0cb424f6bd9f744
Author: Jean Schurger &lt;jean@schurger.org&gt;
Date:   Fri, 16 Oct 2026 14:44:59 -0400

Release: download the profile outside the sources, regenerate the project

sigh used to save the profile in iosApp/, which xcodegen then bundled as a
resource (ExportOptions.plist was bundled the same way). Project regenerated
by xcodegen from project.yml.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_0141Zm4UQq8PATQAG98MdNCc

</content>
</entry>
<entry>
<id>509502b8cead846507608b82a0cb424f6bd9f744</id>
<published>2026-10-16T18:42:51Z</published>
<updated>2026-10-16T18:42:51Z</updated>
<title>xcodegen: keep the export options and output out of the app sources</title>
<link rel="alternate" type="text/html" href="https://git.schurger.org/sonodrill/commit/509502b8cead846507608b82a0cb424f6bd9f744.html" />
<author>
<name>Jean Schurger</name>
<email>jean@schurger.org</email>
</author>
<content>commit 509502b8cead846507608b82a0cb424f6bd9f744
parent adf102655176e1484c1f36bdada5522c41a8da62
Author: Jean Schurger &lt;jean@schurger.org&gt;
Date:   Fri, 16 Oct 2026 14:42:51 -0400

xcodegen: keep the export options and output out of the app sources

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_0141Zm4UQq8PATQAG98MdNCc

</content>
</entry>
<entry>
<id>adf102655176e1484c1f36bdada5522c41a8da62</id>
<published>2026-10-16T18:42:31Z</published>
<updated>2026-10-16T18:42:31Z</updated>
<title>TestFlight: App Store profile via sigh, manual export signing, upload; opaque icon</title>
<link rel="alternate" type="text/html" href="https://git.schurger.org/sonodrill/commit/adf102655176e1484c1f36bdada5522c41a8da62.html" />
<author>
<name>Jean Schurger</name>
<email>jean@schurger.org</email>
</author>
<content>commit adf102655176e1484c1f36bdada5522c41a8da62
parent 7861fcb3b0c26bb05b074591069bf1cbce45d93c
Author: Jean Schurger &lt;jean@schurger.org&gt;
Date:   Fri, 16 Oct 2026 14:42:31 -0400

TestFlight: App Store profile via sigh, manual export signing, upload; opaque icon

- The release lane gets (or creates) the App Store profile with the ASC API
  key and exports with manual signing: the key can&#39;t use cloud signing
- It now uploads the IPA to TestFlight (it only exported it before)
- App Store Connect rejects an app icon with an alpha channel: the 1024
  icon is flattened, its semi-transparent shapes composited over the gradient

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_0141Zm4UQq8PATQAG98MdNCc

</content>
</entry>
<entry>
<id>7861fcb3b0c26bb05b074591069bf1cbce45d93c</id>
<published>2026-10-16T18:34:11Z</published>
<updated>2026-10-16T18:34:11Z</updated>
<title>Remove tip, fix data loss on iOS updates, persist zones, background audio, Android</title>
<link rel="alternate" type="text/html" href="https://git.schurger.org/sonodrill/commit/7861fcb3b0c26bb05b074591069bf1cbce45d93c.html" />
<author>
<name>Jean Schurger</name>
<email>jean@schurger.org</email>
</author>
<content>commit 7861fcb3b0c26bb05b074591069bf1cbce45d93c
parent 4dcca08530ea4e8be46ddfd5417a81bfa2560efe
Author: Jean Schurger &lt;jean@schurger.org&gt;
Date:   Fri, 16 Oct 2026 14:34:11 -0400

Remove tip, fix data loss on iOS updates, persist zones, background audio, Android

- Remove the tip (StoreKit IAP, dialog, heart icon)
- Store audio paths relative to the app storage (iOS changes the container
  path on updates); migration 1 -&gt; 2 rewrites existing absolute paths
- Never delete library entries automatically: missing files are flagged,
  stored files without an entry are re-added
- Re-importing the same file keeps its entry and marks; a different file
  with the same name gets a numbered name; deleting removes the stored copy
  (with a confirmation)
- Persist skip and loop zones (new zone table); store the track duration
- iOS: background audio, Now Playing + lock screen controls, handle
  interruptions, route changes and engine configuration changes (no more
  position running on in silence); play at the end restarts the track
- Loops ending at the end of the track keep looping
- Loop and skip monitors run on the main thread
- Waveform downsampled per row before drawing; timeline taps use the
  current zoom; tapping inside the active loop zone moves within it
- Play delay countdown can be cancelled; rename uses UPDATE
- Android: copy imports into app storage, display names, multiple
  selection, refresh after import, back handler, keep screen on, waveform,
  player reusable after leaving the player screen, JVM target 17
- Remove dead code and unused dependencies (sync, koin, navigation,
  compose resources, media3-ui), ignore AppleDouble files

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_0141Zm4UQq8PATQAG98MdNCc

</content>
</entry>
<entry>
<id>4dcca08530ea4e8be46ddfd5417a81bfa2560efe</id>
<published>2026-04-06T21:53:06Z</published>
<updated>2026-04-06T21:53:06Z</updated>
<title>Fix ghost progression, player reuse after release, and loop zone seek</title>
<link rel="alternate" type="text/html" href="https://git.schurger.org/sonodrill/commit/4dcca08530ea4e8be46ddfd5417a81bfa2560efe.html" />
<author>
<name>Jean Schurger</name>
<email>jean@schurger.org</email>
</author>
<content>commit 4dcca08530ea4e8be46ddfd5417a81bfa2560efe
parent 2bee00465c559bda184ee24260b26af75b3d2c6f
Author: Jean Schurger &lt;jean@schurger.org&gt;
Date:   Mon,  6 Apr 2026 17:53:06 -0400

Fix ghost progression, player reuse after release, and loop zone seek

- Don&#39;t cancel player scope on release (allows reuse)
- Guard position updates with playing check (no ghost progress)
- Seek to zone start when changing loop zone, tap position when same zone

Co-Authored-By: Claude Opus 4.6 (1M context) &lt;noreply@anthropic.com&gt;

</content>
</entry>
<entry>
<id>2bee00465c559bda184ee24260b26af75b3d2c6f</id>
<published>2026-04-06T20:41:46Z</published>
<updated>2026-04-06T20:41:46Z</updated>
<title>Add loop zones, Bluetooth fix, delay options, and UI tweaks</title>
<link rel="alternate" type="text/html" href="https://git.schurger.org/sonodrill/commit/2bee00465c559bda184ee24260b26af75b3d2c6f.html" />
<author>
<name>Jean Schurger</name>
<email>jean@schurger.org</email>
</author>
<content>commit 2bee00465c559bda184ee24260b26af75b3d2c6f
parent bed2e8104f7aafb7fb1e216e38fb5230b7cb7fae
Author: Jean Schurger &lt;jean@schurger.org&gt;
Date:   Mon,  6 Apr 2026 16:41:46 -0400

Add loop zones, Bluetooth fix, delay options, and UI tweaks

- Multiple loop zones (like skip zones), tap to activate/deactivate
- Loop zones shown as blue tint on timeline
- Fix position tracking over Bluetooth (use monotonic clock)
- Restart position monitoring on seek
- Delay picker options: 2, 5, 15, 30 seconds
- Prev button goes to start if no previous mark
- Next button disabled when no next mark

Co-Authored-By: Claude Opus 4.6 (1M context) &lt;noreply@anthropic.com&gt;

</content>
</entry>
<entry>
<id>bed2e8104f7aafb7fb1e216e38fb5230b7cb7fae</id>
<published>2026-04-01T18:41:10Z</published>
<updated>2026-04-01T18:41:10Z</updated>
<title>Add mark labels, quick loop, idle timer, and UI polish</title>
<link rel="alternate" type="text/html" href="https://git.schurger.org/sonodrill/commit/bed2e8104f7aafb7fb1e216e38fb5230b7cb7fae.html" />
<author>
<name>Jean Schurger</name>
<email>jean@schurger.org</email>
</author>
<content>commit bed2e8104f7aafb7fb1e216e38fb5230b7cb7fae
parent d127d7e444890535ce2229821e55b166d168ecbc
Author: Jean Schurger &lt;jean@schurger.org&gt;
Date:   Wed,  1 Apr 2026 14:41:10 -0400

Add mark labels, quick loop, idle timer, and UI polish

- Tap mark time label to name it (shown below the time)
- Mark loop button: 3 states (active/normal/add-mark-and-loop)
- Mark loop no longer seeks to start, continues playback
- Prevent device sleep during playback (idleTimerDisabled)
- Mark labels centered with edge clamping
- Tighter padding on mark labels

Co-Authored-By: Claude Opus 4.6 (1M context) &lt;noreply@anthropic.com&gt;

</content>
</entry>
<entry>
<id>d127d7e444890535ce2229821e55b166d168ecbc</id>
<published>2026-04-01T18:22:23Z</published>
<updated>2026-04-01T18:22:23Z</updated>
<title>Add IAP tip, skip zones, delay timer, rename, mark labels, and Fastlane fixes</title>
<link rel="alternate" type="text/html" href="https://git.schurger.org/sonodrill/commit/d127d7e444890535ce2229821e55b166d168ecbc.html" />
<author>
<name>Jean Schurger</name>
<email>jean@schurger.org</email>
</author>
<content>commit d127d7e444890535ce2229821e55b166d168ecbc
parent ea0bf38748c9ee3cb79d6494ff52015129539483
Author: Jean Schurger &lt;jean@schurger.org&gt;
Date:   Wed,  1 Apr 2026 14:22:23 -0400

Add IAP tip, skip zones, delay timer, rename, mark labels, and Fastlane fixes

- In-app purchase tip ($5) via StoreKit 2 with heart icon toggle
- Skip zones: mark a region to auto-skip during playback (red tint)
- Play delay timer (1-10s countdown before playback starts)
- Rename file by tapping the title
- Mark time labels at centisecond precision on the timeline
- Cleanup skip zones when marks are deleted
- Speed/delay buttons moved to transport row
- Fastlane updated for Xcode 26 compatibility
- IAP setup documentation in IAP_SETUP.md

Co-Authored-By: Claude Opus 4.6 (1M context) &lt;noreply@anthropic.com&gt;

</content>
</entry>
<entry>
<id>ea0bf38748c9ee3cb79d6494ff52015129539483</id>
<published>2026-04-01T13:23:57Z</published>
<updated>2026-04-01T13:23:57Z</updated>
<title>Add end-of-track detection, Ko-fi gating, zoom, waveform res, and Fastlane</title>
<link rel="alternate" type="text/html" href="https://git.schurger.org/sonodrill/commit/ea0bf38748c9ee3cb79d6494ff52015129539483.html" />
<author>
<name>Jean Schurger</name>
<email>jean@schurger.org</email>
</author>
<content>commit ea0bf38748c9ee3cb79d6494ff52015129539483
parent 41e4af5e47028a3544d69dbaea5ebaa276666daa
Author: Jean Schurger &lt;jean@schurger.org&gt;
Date:   Wed,  1 Apr 2026 09:23:57 -0400

Add end-of-track detection, Ko-fi gating, zoom, waveform res, and Fastlane

- Playback stops at end of song instead of continuing
- Ko-fi button only appears after 5+ plays (NSUserDefaults counter)
- Pinch-to-zoom on waveform timeline with auto-scroll
- Waveform resolution at 1 sample per 20ms (1/50th second)
- Time label with background for contrast on played sections
- Fix first bar highlight bug
- Fastlane setup for App Store release via ASC API key

Co-Authored-By: Claude Opus 4.6 (1M context) &lt;noreply@anthropic.com&gt;

</content>
</entry>
<entry>
<id>41e4af5e47028a3544d69dbaea5ebaa276666daa</id>
<published>2026-04-01T13:08:53Z</published>
<updated>2026-04-01T13:08:53Z</updated>
<title>Set waveform resolution to 1 sample per 100ms of audio</title>
<link rel="alternate" type="text/html" href="https://git.schurger.org/sonodrill/commit/41e4af5e47028a3544d69dbaea5ebaa276666daa.html" />
<author>
<name>Jean Schurger</name>
<email>jean@schurger.org</email>
</author>
<content>commit 41e4af5e47028a3544d69dbaea5ebaa276666daa
parent ebd7c8b9e33ca96f47ad30c8f58cfab44e3e6b9d
Author: Jean Schurger &lt;jean@schurger.org&gt;
Date:   Wed,  1 Apr 2026 09:08:53 -0400

Set waveform resolution to 1 sample per 100ms of audio

Each bar in the waveform now represents exactly 0.1 second of music,
scaling with track duration instead of a fixed 600 samples.

Co-Authored-By: Claude Opus 4.6 (1M context) &lt;noreply@anthropic.com&gt;

</content>
</entry>
<entry>
<id>ebd7c8b9e33ca96f47ad30c8f58cfab44e3e6b9d</id>
<published>2026-04-01T13:01:57Z</published>
<updated>2026-04-01T13:01:57Z</updated>
<title>Add waveform display via Swift-Kotlin bridge</title>
<link rel="alternate" type="text/html" href="https://git.schurger.org/sonodrill/commit/ebd7c8b9e33ca96f47ad30c8f58cfab44e3e6b9d.html" />
<author>
<name>Jean Schurger</name>
<email>jean@schurger.org</email>
</author>
<content>commit ebd7c8b9e33ca96f47ad30c8f58cfab44e3e6b9d
parent 636d1dbfcf4c4016720b27e5a17e055a98648f1a
Author: Jean Schurger &lt;jean@schurger.org&gt;
Date:   Wed,  1 Apr 2026 09:01:57 -0400

Add waveform display via Swift-Kotlin bridge

AVAudioPCMBuffer float pointer APIs aren&#39;t exposed in Kotlin/Native
cinterop, so waveform extraction is done in Swift (WaveformExtractor)
and passed to Kotlin via a WaveformProvider interface.

Co-Authored-By: Claude Opus 4.6 (1M context) &lt;noreply@anthropic.com&gt;

</content>
</entry>
<entry>
<id>636d1dbfcf4c4016720b27e5a17e055a98648f1a</id>
<published>2026-04-01T12:55:18Z</published>
<updated>2026-04-01T12:55:18Z</updated>
<title>Add Ko-fi support link to library screen</title>
<link rel="alternate" type="text/html" href="https://git.schurger.org/sonodrill/commit/636d1dbfcf4c4016720b27e5a17e055a98648f1a.html" />
<author>
<name>Jean Schurger</name>
<email>jean@schurger.org</email>
</author>
<content>commit 636d1dbfcf4c4016720b27e5a17e055a98648f1a
parent 2f76dfe373c5ff81e9ed0fcab5f818dab46599bf
Author: Jean Schurger &lt;jean@schurger.org&gt;
Date:   Wed,  1 Apr 2026 08:55:18 -0400

Add Ko-fi support link to library screen

Heart icon in the top bar opens ko-fi.com/jeanschurger.

Co-Authored-By: Claude Opus 4.6 (1M context) &lt;noreply@anthropic.com&gt;

</content>
</entry>
<entry>
<id>2f76dfe373c5ff81e9ed0fcab5f818dab46599bf</id>
<published>2026-04-01T12:46:14Z</published>
<updated>2026-04-01T12:46:14Z</updated>
<title>Move loop toggles into transport row, remove skip ±15s buttons</title>
<link rel="alternate" type="text/html" href="https://git.schurger.org/sonodrill/commit/2f76dfe373c5ff81e9ed0fcab5f818dab46599bf.html" />
<author>
<name>Jean Schurger</name>
<email>jean@schurger.org</email>
</author>
<content>commit 2f76dfe373c5ff81e9ed0fcab5f818dab46599bf
parent d09cebe4d01159eb5288734e1c7fc31065b1940b
Author: Jean Schurger &lt;jean@schurger.org&gt;
Date:   Wed,  1 Apr 2026 08:46:14 -0400

Move loop toggles into transport row, remove skip ±15s buttons

Loop buttons (mark loop, full loop) now sit alongside prev/next/play
in the main transport row for quicker access.

Co-Authored-By: Claude Opus 4.6 (1M context) &lt;noreply@anthropic.com&gt;

</content>
</entry>
<entry>
<id>d09cebe4d01159eb5288734e1c7fc31065b1940b</id>
<published>2026-04-01T12:42:45Z</published>
<updated>2026-04-01T12:42:45Z</updated>
<title>Initial commit: Sonodrill audio practice app</title>
<link rel="alternate" type="text/html" href="https://git.schurger.org/sonodrill/commit/d09cebe4d01159eb5288734e1c7fc31065b1940b.html" />
<author>
<name>Jean Schurger</name>
<email>jean@schurger.org</email>
</author>
<content>commit d09cebe4d01159eb5288734e1c7fc31065b1940b
Author: Jean Schurger &lt;jean@schurger.org&gt;
Date:   Wed,  1 Apr 2026 08:42:45 -0400

Initial commit: Sonodrill audio practice app

Kotlin Multiplatform + Compose Multiplatform app for music practice with
mark-based looping, speed control, and multi-row progress timeline.
Targets iOS (AVAudioEngine) and Android (ExoPlayer).

Co-Authored-By: Claude Opus 4.6 (1M context) &lt;noreply@anthropic.com&gt;

</content>
</entry>
</feed>
