fast loud tactile. exactly what i wanted
zeptocore
A handmade, handheld sample player.
Details
zeptocore is an open-source handheld device for playing with samples, designed as a simple, tactile, and immediate tool for shaping sound in real time. it plays stereo 16-bit audio at 44.1 kHz from an sd card, organizing up to 256 samples across 16 banks, and pairs this with a set of built-in effects, a realtime sequencer, and a single-cycle wavetable bass voice. the interface is intentionally minimal and hands-on, encouraging experimentation through modes like jump, mash, and bass, while supporting midi, clock sync, and usb connectivity. powered by two aaa batteries or usb-c and built with a small onboard speaker, it’s meant to be portable, hackable, and fun—something you can pick up and play immediately, but also modify and extend as you like.
Videos
7 videosSpecifications
- manage audio with zeptocore.com
- mono or stereo playback of 16-bit (internal 32-bit) audio files @ 44.1 kHz sampling rate
- SD-card storage for gigabytes of samples, recalling up to 256 audio files across 16 banks
- powered by two AAA batteries for up to 4 hours or powered by USB-C
- tempo-synced with a selectable BPM between 60 and 300
- loaded with 16 real-time effects like timestretching, delay, distortion, fuzz, tapestop, resonant filters, etc.
- realtime sequencer with optional quantization and performance-oriented controls
- MIDI (in + out) over USB for syncing with DAWs and external gear
- sync-compatible with any gear that has a clock input/output signal
- built-in speaker for portable playback
- open-source, wonderfully hackable (GitHub)
Documentation
Zeptocore Guide
The complete guide to the handmade, open-source Zeptocore sample player. This is the shared manual for the assembled instrument and DIY kit, consolidated from the original zeptocore.com documentation.
Demo and overview
Zeptocore plays stereo 16-bit audio at 44.1 kHz from a microSD card, then lets you slice, retrigger, sequence, and process it immediately from the keypad.
Specifications and highlights
- AudioMono or stereo 16-bit files with internal 32-bit processing at 44.1 kHz.
- Sample libraryUp to 256 files arranged as 16 banks of 16 samples on microSD storage up to 32 GB.
- VoicesOne stereo sample voice and one monophonic bass voice with smooth crossfading.
- Effects16 realtime effects plus per-effect parameters and probability.
- SequencingRealtime, optionally quantized sequencing without a required time signature.
- ConnectivityClock sync input, optional sync output, and class-compliant USB MIDI input/output.
- PowerTwo AAA batteries for up to four hours, or USB-C power.
- Portable soundA built-in 8-ohm speaker for immediate standalone playback.
Goals
- Open source: firmware and schematics remain available for study and modification.
- Low learning curve: the instrument is playable immediately, while the manual reveals deeper behavior.
- Unquantized by default: sequences are not forced into a 4/4 grid.
Intentional limits
- Zeptocore is opinionated rather than designed to imitate another sampler.
- Its synthesis is intentionally focused: a monophonic wavetable bass voice complements the sample voice.
- Two carefully crossfaded voices fit the RP2040 processing budget; sync multiple devices for more layers.
Quick start
Download the one-page quick-start PDF, or follow the essentials below.
- Move the top-right power switch up. A preloaded sample starts automatically.
- Press keys 1–16 to jump between slices.
- Hold one slice key and press another to retrigger; the second key sets the rate.
- Hold A and turn Knob Z for volume, Knob X for tempo, or Knob Y for pitch.
- Hold B, press a bank key, then a sample key to choose among 16 × 16 files.
- In Jump mode, hold A and press 1–16 to toggle an effect.



Modes, controls, sequences, and saves
Jump makes the keypad perform slices, Mash makes it control effects, and Bass makes it play notes. Hold an effect key in Mash mode and turn Knobs X/Y to edit its parameters or Knob Z to change its probability.
| Action | Combination | Mode | Behavior |
|---|---|---|---|
| Jump mode | A + B | Any | Return to the default performance mode. Keys 1–16 jump between slices, create short loops, or retrigger audio. |
| Mash mode | A + C | Any | Turn keys 1–16 into effect toggles. Momentary FX mode can make an effect active only while its key is held. |
| Bass mode | A + D | Any | Turn keys 1–16 into notes for the monophonic bass voice. |
| Jump | 1–16; or A + 1–16 in Mash mode | Jump / Mash | Crossfade immediately to the selected slice. Slice positions are prepared in the Zeptocore sample tool. |
| Jump page lock | D | Jump | Cycle the jump keys through the current, first, second, and third slice pages. The C and D LEDs show the selected page. |
| Retrigger | 1–16 + 1–16 | Jump | Hold a slice key, then press a second key to retrigger it. Key 1 is the fastest rate and key 16 the slowest. |
| Loop slices | 1–16 + 1–16 + 1–16 | Jump | Hold three slice keys to loop playback between the selected slice positions. |
| Octave +1 | A + 1–16 | Bass | Play the selected bass note one octave higher. |
| Tempo | A + Knob X; A + repeated B taps; A + B + 1–16 | Any | Turn for half-to-double the sample BPM, tap a tempo from 30–300 BPM, or select a predefined tempo with keys 1–16. |
| Pitch | A + Knob Y | Any | Change pitch independently of tempo. Opposing high-tempo/low-pitch settings can create especially unusual textures. |
| Volume | A + Knob Z | Any | Adjust output volume. Fully counter-clockwise mutes; very high settings can clip some source files. |
| Change bank and sample | B + 1–16 + 1–16 | Any | While holding B, choose a bank and then a sample. The old sample fades out in about 10 ms and the new sample starts at the corresponding position. |
| Change sample with a knob | C + Knob X | Any | Browse and load samples with the knob instead of the two-key bank/sample selection. |
| Filter sweep | B + Knob Y | Any | Sweep the filter cutoff. Turn clockwise to admit more high frequencies and counter-clockwise to restrict them. |
| Realtime stretch | B + Knob Z | Any | The low range bypasses stretching; continue clockwise to increase the realtime stretch amount. |
| Random sequencer | B + Knob X | Any | Choose how many steps a random sequence may use. Fully clockwise rerolls it; B + A rerolls one random step. |
| Mute | B + C | Any | Mute audio while playback and clocking continue. |
| Start / stop | B + D | Any | Stop audio and playback, or restart playback from the first beat. |
| Select sequence | C + 1–16 | Any | Select one of 16 sequence slots for the current mode. Jump, Mash, and Bass each have their own 16 slots. |
| Play / stop sequence | C + B | Any | Toggle playback of the selected sequence; while recording, this ends the recording. |
| Record / delete sequence | C + D | Any | Record actions and the time between them at 1/96-beat resolution. Make one final press to set the last step duration. The same combo deletes an existing selected sequence. |
| Chain sequences | C + empty slot + filled slots | Any | Hold C, choose an empty destination, then press existing sequence slots in order. Release C to create and save the chain. |
| Quantize | C + Knob Z | Any | Increase quantization for the currently playing Jump, Mash, or Bass sequence. |
| Random tunnel | C + Knob Y | Any | Adjust the chance of tunneling, where playback jumps to a neighboring sample in the current bank. |
| Select save | D + 1–16 | Any | Select one of 16 slots for a saved device state. |
| Load save | D + B | Any | Load settings from the selected save slot. |
| Create save | D + C | Any | Store the current settings in the selected save slot. |
| Random jump | D + Knob X | Any | Adjust the probability of random slice jumps. Sequence lock can keep playback aligned to its intended beat. |
| Random effects | D + Knob Y | Any | Adjust the probability that effects from the selected random-effects bank will activate. |
| Random-effects bank | D + Knob Z | Any | Select which prepared bank of effects is used by random effects. Configure the bank contents in the sample tool. |
| One-shot | 5 + 6 + 5 | Any | Toggle one-shot playback for the current sample so it stops at the end instead of looping. |
| Change play mode | 7 + 8 + 7 | Any | Cycle the current sample between its available playback modes. |
| Slice playback | 1 + 2 + 1 | Any | Toggle the current sample's slice-playback behavior. |
| Tempo match | 5 + 6 + 7 + 8 | Any | Match playback speed using the ratio between the sample BPM saved by the tool and Zeptocore's current tempo. |
| Sequence lock | 1 + 2 + 3 + 4 | Any | Keep a sequence synchronized to the global clock so performance jumps return to the intended beat position. Enabled by default. |
| Randomize sequence | 6 + 7 + 10 + 11 | Any | Replace normal playback with a generated sequence. Holding a length key rerolls it; with Random Fill, a new sequence appears every 32 beats. |
| Random fill | 10 + 11 + 15 + 14 | Any | Toggle an automatically generated fill at the end of a sequence. |
| Momentary FX mode | 1 + 4 + 16 + 13 | Any | Switch Mash mode between latched effect toggles and effects that remain active only while held. |
| MIDI through CLOCK | 13 + 10 + 11 + 16 | Any | Toggle MIDI input through the CLOCK jack for use with ittybittymidi. The display confirms MIDI ON. |
| Sync out | 13 + 9 + 5 + 1 + 15 + 11 + 7 + 3 | Any | Toggle a clock pulse on the left output channel for external sync. The display confirms SYNC ON or SYNC OFF. |
| Retrigger pitching | 9 + 10 + 11 + 12 | Any | Toggle random upward or downward pitch movement during retriggers. |
| Retrigger volume ramps | 13 + 14 + 15 + 16 | Any | Toggle volume ramps during retriggers. This behavior is enabled by default. |
| Kick layering | A + D + 1–16; or 13 + 10 + 7 + 16 | Any | Firmware 6.4.0 or later: choose and level one of 16 built-in kicks, then layer it at kick positions detected in the prepared sample. |
| Kicks only | 4 + 7 + 10 + 13 | Any | Restrict sequence playback to detected kick positions. The display changes between KICKS and NORM. |
| Snares only | 13 + 10 + 7 + 4 | Any | Restrict sequence playback to detected snare positions. The display changes between SNARES and NORM. |
Visual control diagrams
























The 16 effects
From Jump mode, hold A and press the numbered effect key. From Mash mode, press the key directly. While holding that key, turn Knobs X/Y for parameters and Knob Z for activation probability.
| Effect | Key | Knob X | Knob Y | Sound |
|---|---|---|---|---|
| Saturation | 1 | Preamp | — | Adds warmth, depth, and loudness with a double-sine shaping technique. |
| Loss | 2 | Loss type | Loss amount | Simulates worn tape or faulty radio transmission with controllable character and degradation. |
| Fuzz | 3 | Preamp | Postamp | Adds rich fuzz-like distortion with gain control before and after the effect. |
| Bitcrush | 4 | Bits | Frequency | Reduces bit depth and sample frequency for early-digital textures. |
| Timestretch | 5 | — | — | Slows playback by roughly eight times without changing pitch. |
| Delay | 6 | Feedback | Duration | Adds a feedback delay that can be driven into intense clipped textures. |
| Comb filter | 7 | Left spread | Right spread | Uses a very short delay to create metallic resonance and stereo movement. |
| Repeat | 8 | Duration | — | Loops audio around suitable zero crossings and can reach audio-rate repetition. |
| Tighten | 9 | Duration | — | Gates the end of each step for a shorter, more defined sound. |
| Expand | 10 | Expanse | Dry / wet | Creates a reverberant expansion; combining it with many effects can tax the processor. |
| Circulate | 11 | Rate | Depth | Moves audio dynamically between the left and right channels. |
| Scratch | 12 | Rate | — | Simulates a record scratch by changing playback speed rapidly. |
| Lower | 13 | Duration | Depth | Sweeps a low-pass filter to emphasize lower frequencies. |
| Pitch | 14 | Duration | Depth | Moves pitch independently of tempo, allowing split or doubled beats at speed extremes. |
| Reverse | 15 | — | — | Reverses audio playback and, outside a running sequence, its playback direction. |
| Tapestop | 16 | Duration | — | Drops pitch gradually and halts playback like a stopped tape machine. |
Preparing and uploading samples
Samples must be prepared as 44.1 kHz, 16-bit audio. Use the online Zeptocore sample tool in Chrome or Firefox, or download an offline build from the current _core release. The importer accepts WAV, AIFF/OP-1 kits, FLAC, MP3, Renoise XRNI splices, and Morphagene WAV reels.


Transfer to the SD card
- Finish arranging samples, then choose Download .zip in the tool.
- Unzip the download and copy its
bankXfolders to the microSD card. - Banks are zero-indexed:
bank0is the first bank. Rename a folder to move it to another slot.
Restore the factory library with the drum sample pack (393 MB) or melodic + drum pack (853 MB). These packs require firmware v5 or newer.
Offline sample tool and source build
Release assets provide Windows x64, macOS Intel/Apple Silicon, and Linux x64 builds. On macOS, make the downloaded file executable and clear its quarantine metadata before running it:
chmod +x core_macos
xattr -c core_macos
./core_macos
To build the tool, install Go, clone the repository, and run:
cd _core/core
go build
Kick detection and layering
The v4+ sample tool estimates kick and snare positions with a drum-separation model. Unlike interval or manually placed slices, those transients drive the Kicks/Snares playback modes and firmware 6.4+ kick-layering feature.
MIDI, clock, and computer keyboard
Zeptocore is class-compliant USB MIDI. It sends button, knob, timing-clock, start, and stop data, and follows incoming start/stop/continue and timing clock. Connect it to a computer for DAW sync or route a controller with midi2midi. An ittybittymidi can feed MIDI through the CLOCK jack after enabling the CLOCK-input MIDI combo.
| Function | Sent | Received | Notes |
|---|---|---|---|
| Basic channel | 1–6 | 1 | 1–3: Jump/Mash/Bass buttons; 4–6: their sequencers |
| Note On / Off | Yes | No | Notes 0–31; velocity 127/0 |
| CC 7 | Yes | USB* | Volume |
| CC 12 / 13 / 14 | Yes | No | Knobs X / Y / Z |
| CC 15 / 16 | Yes | USB* | Tempo / pitch |
| CC 18 | Yes | USB* | Random sequence |
| CC 19 / 20 | Yes | USB* | DJ filter / realtime stretch |
| CC 21 / 22 | Yes | USB* | Sample select / random tunnel |
| CC 23 / 24 | Yes | USB* | Sequencer quantize / random jump |
| CC 25 / 26 | Yes | USB* | Random-effects probability / random-effects bank |
| System Exclusive | Yes | No | USB status and debug text |
| Timing Clock | Yes | Yes | 24 pulses per quarter note |
| Start / Continue / Stop | Start, Stop | All | MIDI realtime transport |
* These CC messages are received over USB MIDI only. The CLOCK input accepts MIDI after MIDI mode is enabled.
Computer keyboard
Connect Zeptocore over USB and open the sample tool in Chrome. Its MIDI layer shows the current bank, sample, volume, and tempo and lets a computer keyboard control the instrument.

Firmware and updates
Use the store’s zeptocore firmware selector for the current normal-, low-, or ultra-low-latency build. Release notes, desktop tools, Zeptoboard firmware, and source archives are on the _core releases page.
Upload a UF2
- Connect USB-C while holding the BOOTSEL button beside the USB-C jack.
- Continue holding BOOTSEL and press the nearby NRST button.
- Wait for a drive named
RPI-RP2to appear. - Drag the downloaded
zeptocore_vX.Y.Z.uf2onto that drive. - When the drive disappears, the update is complete and Zeptocore restarts.
Build firmware from source
Install CMake, Python, Git, a C++ compiler, and the Arm GNU embedded toolchain. The repository Makefile retrieves the Pico SDK 2.2.0 dependencies and builds the current target:
git clone https://github.com/schollz/_core
cd _core
make zeptocore
Use make zeptoboard, make ectocore, or make ezeptocore for another hardware target. Windows users can run the Linux workflow through WSL 2.
DIY build, schematic, and source
Firmware and hardware source live in the canonical _core repository.
The schematic is open source and may be adapted; commercial derivative boards should help support continued development and must not use the Infinite Digits or Ectocore trademarks.
Download the Zeptocore v28 schematic PDF.
Open the full schematic
Cases, Zeptoboard, and Zeptocade
Cases
The exposed-PCB form is durable by design, but several community enclosures are available.



Zeptoboard
Zeptoboard is the breadboard version of Zeptocore. It uses a browser keyboard/MIDI interface in place of the handheld keypad and is intended for learning and firmware experimentation. Build it with a Raspberry Pi Pico-compatible board, PCM5102 DAC, and SDIO microSD breakout using the source and Zeptoboard firmware. On common PCM5102 boards, solder the rear configuration pads as shown so the audio connections are correct.
- WeAct Raspberry Pi Pico-compatible board (other RP2040 Pico boards should also work)
- PCM5102 audio DAC board
- SDIO microSD breakout


Zeptocade
Zeptocade is the open-source arcade enclosure: 20 illuminated buttons and 11 dedicated knobs provide a larger tactile interface for an installed Zeptocore. Its BOM, Gerbers, schematic, and source remain in the Zeptocade project archive.
Install or remove Zeptocore in a Zeptocade
- Separate the Zeptocore top board from its bottom plate.
- Use an M4 hex key to remove the four top screws and open the Zeptocade.
- Remove the rear top-corner screw and standoff to make room.
- Slide Zeptocore into the top-left position, align its knobs with the three holes, and press it evenly onto every header pin. Reverse these steps to remove it.



Troubleshooting and common questions
Why does Zeptocore shut down unexpectedly?
Replace both batteries with fresh, high-quality alkaline cells, then test on USB-C power. Carbon-zinc cells lose usable voltage sooner and can cause unstable operation.
Why do I hear occasional glitches or dropouts?
MicroSD latency varies greatly, regardless of A1/U3 or “high speed” labels. Known good families include Gigastone 16/32 GB, SP Elite, SanDisk Extreme, Samsung EVO, PNY Elite, and MicroCenter. Avoid Lexar, Kootion, SanDisk Ultra, Kingston, and unreliable cards. Zeptocore usually recovers from a delayed read, but a severe stall can require a restart.
Why does the sample tool not show waveforms?
Use a current Chrome browser for the most reliable waveform and Web MIDI support. Firefox can prepare samples, but does not provide the same MIDI integration.
Why is USB MIDI not working on macOS?
Use a USB-A data path or adapter rather than a direct USB-C/Thunderbolt bus if the device is not detected. In System Settings → Privacy & Security, set Allow accessories to connect to Automatically When Unlocked.
How do I identify my firmware version?
At power-on, the display flashes a Z followed by the installed version number.
What is the residue beneath the battery holder?
It is cured, non-conductive epoxy used to keep the holder from moving when batteries are inserted or removed.

How does Zeptocore compare with similar samplers?
| Feature | Zeptocore | Pikocore | PO-33 K.O. | Volca Sample |
|---|---|---|---|---|
| Open source | Yes | Yes | No | No |
| Voices | 1 stereo + 1 mono | 1 mono | 4 mono | 8 mono |
| Audio | 16-bit / 44.1 kHz | 8-bit / 33 kHz | 8-bit / 23 kHz | 12-bit / 32 kHz |
| Sample limit | 256 | 100 | 16 | 100 |
| Storage | 32 GB | 16 MB | 1 MB | 4 MB |
| Record audio | No | No | Yes | No |
| Sync | In / out | In / out | In / out | In / out |
| MIDI | In / out | In | No | In |
For help not covered here, email zack@infinitedigits.co or join the community Discord.
Friends and further instruments
If Zeptocore appeals to you, these independent instruments share a similarly compact, exploratory spirit:
- Prismatic Spray and Phantasmal Force by Distropolis Goods
- Bitty by Curious Sound Objects
- OMX-27 by Denki Oto
- Joydrums by yzhk instruments
- HSS2020 by Gieskes
Customer feedback
Reviews
Built-in speaker sounded like a novelty on paper but I use it constantly. Sit on the couch, load some samples, start chopping. Super immediate little machine.
nice bit of kit :)
Open source was a huge reason I bought it. The fact that the firmware keeps evolving makes the Zeptocore feel like a living instrument instead of finished hardware.
zeptocore feels like a sketchbook for drums. really into it
Honestly the random sequencer + random effects combo feels like having a tiny collaborator in your hand. It keeps throwing out ideas I would never program myself.
Love that the sequencer doesn’t force everything into a boring grid. You can record something slightly crooked and it actually keeps the feel.
Honestly, I haven’t used it much. I can tell you that it has a lot of capabilities distorting and mangling samples. And the stereo output sounds really nice. I’m interested in pushing it further. Whenever I break it out I have to have the manual next to me because I haven’t learned the workflow yet.
I haven’t used it enough to have a definitive answer but it’s fun and I’m interested in learning the workflow better and seeing how I can push it further.
Thanks - yes - really enjoying it, just starting to learn all the functions.
Really enjoying playing it - thanks.
Got mine last month ....dope a.f
I made the zeptocore, and I'm really enjoying it.
the retriggering is SO satisfying. hold one pad, hit another, instant rhythmic nonsense. Add reverse or repeat and it gets out of control very quickly :)
This is what I want from portable music gear: turn it on, hit buttons, make something strange. No laptop ceremony required.
Having everything I loved about Zeptocore in a little virtual box...Christmas came early kind of vibes.
Was expecting a quirky little sampler. Was not expecting a sequencer, bass mode, MIDI, randomization, timestretch and sixteen fx hiding in there too??
It's fun, but as you write, more of a playback machine than a sampler. Comes with huge library of breaks
Yes
Loaded my own drum folders onto the SD card and this thing immediately became ten times more personal. Feels less like a gadget and more like an instrument you grow into.
hey zach, i love this lil thing!
The MASH mode alone sold me. Being able to throw fuzz, loss, repeat, reverse, tapestop etc. onto a sample without stopping to think is just FUN.
I really love your module and the zeptocore!
tiny speaker, batteries, 256 samples, weird effects everywhere. basically a little pocket chaos machine and i mean that as a compliment
I'm still thoroughly impressed with zeptocore
oh yeah, i have the zeptocore and it is an amazing design +function and it works great w/ the pom series (16,170,&400)
Just got the zeptocore and I gotta say it’s amazing.
Hi Zack, I am really enjoying the Pilocore and Zeptocore, I still have a lot to learn.
zeptocore is one of those instruments where you press one button to see what happens... then suddenly an hour is gone. The jump/retrigger stuff is insanely immediate.
Thx for doing this I got the device yesterday and played a lot with it and love it already :) <3
Your zeptocore is sick
Otherwise I love the thing.
Thank you so much for making this awesome project open source, allowing me to make my own instrument out of it.
I just recently came about zeptocore and I must say I am really impressed by it.
Thanks for making the zeptocore, It's amazing!
Sill love the Zeptocore just trying to figure out how to use it to it's full potential.
I recognize you're a one-person team, and I'm so, so impressed with the idea of Zeptocore, and adore much about the Zeptocade size and layout.
To begin with, I wanted to say I love the sound of the Zeptocore, and love the full-sized design of the Zeptocade, and absolutely love the performance effects so much.
I hope you won't give up on this project, despite you've invented some new cool things (like zeptocore and the other awesome stuff you did).
I am very impressed with the zeptocore and am going to make a zeptoboard for myself.
The Zeptocore is even more amazing!
Love the zeptocore.
And thanks for these amazing little machines.
I just want to start off by saying I absolutely love my pikocore and my zeptocore.
Either way you're doing some absolutely amazing work.
I love the older pocket operators but i always wished for something similar with more customization and features like the Zeptocore has.
Zeptocore was a lot of fun and seeing you progress on it from here was even more cool!
I got a zeptocore from you about two months ago, and I’m a big fan of the hardware, the workflow, and your overall project (love all the web-based tools, btw).
This thing is awesome, you should be proud
Track using zeptocore, thanks again for this awesome tool!
Firstof all I would like to thank you for two amazing music devices!
I appreciate your trying to fix this, I've had my Zeptocore for over a week now and I'm really enjoying it!
Playing with the new zeptocore lately. Love its randomization functions, its built in effects and form factor. Here some experiments with flamenco samples. Enjoy
If you like adding randomness to your music to expect the unexpected, the zeptocore is for you
Really amazing inspiring device that is unlike any other, fantastic job.
I love this thing so far, and I have only scratched the surface.
I really love this machine
Zeptocore is amazing
Zeptocore is fantastic btw, what a fun bit of gear.
First of all congrats on the launch of the Zeptocore I really love the concept and execution!
Hello Zack, i just received the zeptocore. its a pretty awesome unit.
Great fun to build and play… I just put my new Zeptocore together last night and it’s very cool.
I am really really impressed.
i just checked out the midi functionality through usb, too, that is a beautiful addition!
really sounding great :D will report back if i find more, but sounding beautiful overall :)
other than that, really enjoying sync, creating tracks for weeklybeats and for fun
these new features are so great: that's brilliant how you have separate sequencing for the bassline, effects, and sample-jumps!
I LOVE changing the quantization across a set of chained sequences! that is beautiful! <3
This Is So Much Fun! <3
i LOVE all the other effects.
i absolutely LOVE the way when i turn the knobs, the LEDs respond by drawing interesting shapes
Add a review
Share your experience
Sign in with your email to rate and review this product.