Repository navigation
Releases: LOM-instruments/zvukopis
Release list
Zvukopis 2026-11-02-f449d9e
Firmware 2026-11-02-f449d9e, built from commit f449d9e.
- Zvukopis with a capital Z in the screen header too
Install: the web flasher (Chrome or Edge, over USB), or with esptool and the attached files:
esptool.py --chip esp32s3 --port /dev/cu.usbmodem1101 --baud 921600 --after no_reset write_flash 0x0 bootloader.bin 0x8000 partitions.bin 0xe000 boot_app0.bin 0x10000 zvukopis.bin
Settings and the moments on the card are kept. Settings on the device shows the version it runs.
zvukopis 2026-11-02-ea599cf
Firmware 2026-11-02-ea599cf, built from commit ea599cf.
- Web interface: the record cell white, the facts in a strip under the wordmark, the calendar set apart
The Record cell is white like every cell control and goes black only while it records, so it no longer merges with the active tab above it. The clock, battery and firmware facts sit in a 3 rem strip of three cells under the wordmark instead of tall header cells with empty space. The calendar is separated from the moments by a heavier rule, with lighter lines inside its lattice. The hidden audio element moved out of the list cell, where it counted as a sibling and gave the table a second top rule. - Playback reader: a read that outlives its playback counts for nothing; a stop waits for the file
Review findings on the reader ring. The reader publishes a block only if the playback it read for is still the current one (the sequence number is checked after the read), it resets the window itself when it opens a moment, and it keeps its own copy of the moment, so a delete that shifts the list can't hand it another file's offsets. Stopping playback waits until the reader has closed the file, since formatting or the card reader unmount the card right after. The speed glide starts at a 48 kHz moment's real step (no chirp on its first chunk); a tap in hold mode goes back to the speed the rocker was pressed at before gliding to normal; and the screen samples position and speed afresh when the playing moment changes. - Playback never waits on the card; letting go of the rocker can keep the speed; the web interface on one grid
Playback of a moment on the card goes through a 4 s ring in PSRAM that a reader task on core 1 keeps loaded around the playhead, half a second per card read, two seconds ahead in the direction of travel: the audio task only ever reads the ring, so a slow seek or another task's card access can't stall it any more (the 48 KB window it used to read itself, in the middle of a chunk, is gone, and 48 KB of internal RAM with it). A chunk that still finds nothing loaded is counted and reported when playback stops. The speed glides from one chunk's value to the next across the chunk, so a ramp has no steps. The screen refreshes once a second while playing instead of back to back. - Categories without a fixed count, calendar warnings, the clock set from the flasher, the web interface on the grid
Categories: 1 to 12 instead of 5, kept in NVS as a blob whose length is the count (the old 85-byte blob reads as five), added or removed (the last one) on the web interface; a removed category's moments lose the tag through the audio task, which renames their files. The device's long-press menu scrolls when the tags don't fit, with marks for more above or below. A moment's tag is a slot number, TAG_NONE for none; the old enum names are gone. - Project page: the photos, new versions (2000 and 800 px)
Install: the web flasher (Chrome or Edge, over USB), or with esptool and the attached files:
esptool.py --chip esp32s3 --port /dev/cu.usbmodem1101 --baud 921600 --after no_reset write_flash 0x0 bootloader.bin 0x8000 partitions.bin 0xe000 boot_app0.bin 0x10000 zvukopis.bin
Settings and the moments on the card are kept. Settings on the device shows the version it runs.
zvukopis 2026-11-02-bfd4ab2
Firmware 2026-11-02-bfd4ab2, built from commit bfd4ab2.
- The release script publishes GitHub Releases; the flasher says which version
scripts/make_release.py --publish commits the flasher files, pushes, tags the version and creates a GitHub Release with the binaries attached and notes made from the commits since the previous release. The project page shows the version its Install button flashes, from the manifest.
Install: the web flasher (Chrome or Edge, over USB), or with esptool and the attached files:
esptool.py --chip esp32s3 --port /dev/cu.usbmodem1101 --baud 921600 --after no_reset write_flash 0x0 bootloader.bin 0x8000 partitions.bin 0xe000 boot_app0.bin 0x10000 zvukopis.bin
Settings and the moments on the card are kept. Settings on the device shows the version it runs.
zvukopis 2026-11-02-92e22f1
Firmware 2026-11-02-92e22f1, built from commit 92e22f1.
- Project page: wording
- Project page: the four points as a band of cells; a notice when the browser can't flash
- Project page: the gist in four points, less repetition
- LOM house style for the site and the web interface; Firmware update in Settings
The project page, the guide and the specification follow the language of space.lom.audio and library.lom.audio: a grey page, Helvetica, one-pixel rules, bands of cells, a cell navigation on phones, one accent colour; the wordmark is zvukopis's own, letters drawn in outline. The device's web interface is restyled the same way. The warning about experimental firmware replaces the slogan, on the page and in the README, which also credits the idea and concept to Jonáš Gruska and the programming to Claude. - Create CNAME
Install: the web flasher (Chrome or Edge, over USB), or with esptool and the attached files:
esptool.py --chip esp32s3 --port /dev/cu.usbmodem1101 --baud 921600 --after no_reset write_flash 0x0 bootloader.bin 0x8000 partitions.bin 0xe000 boot_app0.bin 0x10000 zvukopis.bin
Settings and the moments on the card are kept. Settings on the device shows the version it runs.
zvukopis 2026-11-02-8c6f250
Firmware 2026-11-02-8c6f250, built from commit 8c6f250.
- Auto gain eases its steps up; the web interface holds its Wi-Fi link
A step up after a lull is hidden by the codec's fine ADC volume (0.5 dB steps) set the same amount down and walked back over about 0.4 s, so the rise isn't heard; a step down stays instant to stop clipping. Each eased step is logged. - Project page: the opening cell white on black; a lighter photo file
- Project page: the photo on grey
- Project page: the second feature cell keeps its padding on narrow screens
- Guide: how Auto gain works
- Project page: one accent, the house yellow; the features' squares alike
- Project page: the banner, as asked
- Project page: the new photo
- Project page: a colour per feature, lines from the grid, a black band on having no distractions, the Install button says so
- Project page: the product photo beside the opening text, and as the share preview
- Project page: the four points two by two on a desktop, four across only when wide; tagline tag order
Install: the web flasher (Chrome or Edge, over USB), or with esptool and the attached files:
esptool.py --chip esp32s3 --port /dev/cu.usbmodem1101 --baud 921600 --after no_reset write_flash 0x0 bootloader.bin 0x8000 partitions.bin 0xe000 boot_app0.bin 0x10000 zvukopis.bin
Settings and the moments on the card are kept. Settings on the device shows the version it runs.
Zvukopis 2026-11-02-75ad78f
Firmware 2026-11-02-75ad78f, built from commit 75ad78f.
- Web interface: byte ranges for the moment files, so phones play them; the server's output gathered into full segments, the page seven times faster
Phone browsers ask for a byte range before they play anything and give up on a server that answers with the whole file. The moment handler now answers 206 with Content-Range (416 past the end), from the card or from memory, in 8 KB pieces with Nagle off. The vendored WebServer gathers its writes into one TCP segment's worth before sending, so the index page goes out in forty packets instead of 256 chunk writes: 0.3 s instead of 2.5 s. On the site, the last link in the phone nav spans both columns when the count is odd, so it has its right rule. - Project page: the hero, opinionated
- Project page: the hero rewritten
Install: the web flasher (Chrome or Edge, over USB), or with esptool and the attached files:
esptool.py --chip esp32s3 --port /dev/cu.usbmodem1101 --baud 921600 --after no_reset write_flash 0x0 bootloader.bin 0x8000 partitions.bin 0xe000 boot_app0.bin 0x10000 zvukopis.bin
Settings and the moments on the card are kept. Settings on the device shows the version it runs.
zvukopis 2026-11-02-60ff939
Firmware 2026-11-02-60ff939, built from commit 60ff939.
- Project page: the photo, new version
The 2000 px Photoshop export placed in docs/ at 14:28, sized to 1600 and 800 px for the page and stripped of its metadata (the export carried the camera's GPS coordinates). - Auto gain climbs steadily through the codec's own volume fade: no steps
The release used to move the coarse gain registers 6 dB at a time and hide the jump behind the fine ADC volume, walked back in 0.5 dB register writes every 32 ms: each write was a small jump, and the coarse step and its compensation were two writes with a burst between them. Now the coarse registers (analog preamp, digital gain) move only on an attack, at once, and a lull points the fine volume at the top with the ES8311's fade on (REG15): the gain glides up sample by sample, about 3 dB per second as measured on a tone (half the rate the codec header claims), until a sound holds it. The firmware keeps an estimate of where the fade has got to, so an attack cuts from the right place. The guide and the specification say so.
Install: the web flasher (Chrome or Edge, over USB), or with esptool and the attached files:
esptool.py --chip esp32s3 --port /dev/cu.usbmodem1101 --baud 921600 --after no_reset write_flash 0x0 bootloader.bin 0x8000 partitions.bin 0xe000 boot_app0.bin 0x10000 zvukopis.bin
Settings and the moments on the card are kept. Settings on the device shows the version it runs.
Zvukopis 2026-11-02-2a2498e
Firmware 2026-11-02-2a2498e, built from commit 2a2498e.
- Project page: the hero subtitle unwrapped, the black band on two lines
- Project page: What is Zvukopis? in place of In use
- Zvukopis with a capital Z on the device's screens, its web interface, the card reader's name and the WAV originator
The wordmark on the screen and in the web interface's header, the hotspot and host names, the serial banner and file names stay lowercase. The GitHub release title gets the capital too. - Zvukopis with a capital Z in the prose; the 3D view white on black without a caption; the footer unwrapped
The name is capitalised as a name in the pages, the README, the guide and the specification; the wordmark, URLs, file names and code stay lowercase. The 3D cell is black with white outlines and no caption; a message appears only if the view cannot load. The footer paragraphs have no width limit. - Build band: the case list back under the title, the drawing and the 3D view stacked beside it, a true silhouette in the 3D view; the hero text runs free
The 3D view draws the body once more in black, back faces only, pushed out along smoothed normals, so the rounded corners get their outline at every angle; the crease lines stay at 20 degrees. The display text no longer has a width limit. - Project page: the hero note says what zvukopis is
- Build band: columns of cells, the case list under the drawing, the case in outline 3D in a small cell by the manual
A column of cells stretches its last cell, so the lattice stays whole whatever the band's height: the version list fills under the square drawing, a caption cell under the 3D view. The 3D view loads when it scrolls near and draws the case as black edges over a white body in parallel projection, like the diagram. - Build guide: the case in 3D on the page, a square drawing cell, the steps as the case is really put together
A button under the exploded view loads three.js from unpkg and turns the STL in the cell; the drawing cell is square, the drawing padded back to square. The STL is linked in the parts list. The speaker sticks on with its own tape, the battery cable is checked for reach before the battery is taped down, and the case bolts to the board's standoffs rather than the board going into the case. The black band gets its second sentence. - Build guide: What you need, the board sourced by the builder, the case in docs/case/ with a version per file
The Waveshare board comes from Waveshare or a distributor, the version with the battery (the speaker is in every box); the case list by the title grows a row per version, docs/case/README.md lists them. Steps say where the grille is, that the plugs fit one way, how the board sits in the case and how tight the bolts go. New render with the screen drawn. - The case: STL and exploded view on the site and in the repository; Building the Zvukopis from scratch before Install
zvukopis is the Waveshare board with its speaker and battery in a 3D-printed case, held by four countersunk M2.5x6 bolts. The STL and the render go in docs/, a build section with the steps sits before Install on the project page (Build in the nav of all three pages), the README gets a section on the case and the specification a row.
Install: the web flasher (Chrome or Edge, over USB), or with esptool and the attached files:
esptool.py --chip esp32s3 --port /dev/cu.usbmodem1101 --baud 921600 --after no_reset write_flash 0x0 bootloader.bin 0x8000 partitions.bin 0xe000 boot_app0.bin 0x10000 zvukopis.bin
Settings and the moments on the card are kept. Settings on the device shows the version it runs.