Cached at:
11/01/26, 06:24 AM
# oTAPE · The open digital cassette format
Source: [https://www.otape.org/](https://www.otape.org/)
oTAPE 1\.0 · open specification · release candidate
## Press record\. *Mean it\.*
oTAPE is an open file format for digital cassettes\. One`\.otape`file holds a whole tape: two sides of fixed length, each one continuous recording, plus the label, the J\-card and the record tabs\. It's self\-contained and works offline\.
Extension\.otapeContainerZIP \+ JSONLicense[CC BY 4\.0](https://creativecommons.org/licenses/by/4.0/)
Drawn in your browser from a few lines of`appearance`JSON\. The reels follow the spec's tape\-pack model\.
01The idea
## The slow way, *on purpose\.*
Making a mixtape used to take an evening\. You picked every song, sat through the recording and wrote the titles by hand\. oTAPE is a file format that keeps those constraints\. It isn't a new codec or a music player: it describes a whole cassette\.
1. 01### A cassette, not a playlist\. Each side is one continuous take\. The silence between songs, a spoken intro, the clunk of the pause button: it's all part of the recording\. Track markers can name the songs without splitting the side\.
2. 02### It behaves like tape\. A fixed length, two sides on one tape, and a position you reach by winding, not jumping\. Play side A to the end, flip the cassette, and you're at the start of side B\.
3. 03### The file is the object\. Audio, label, J\-card, booklet and history all live inside one`\.otape`\. It never links back to the MP3s it was recorded from, or to anything online\.
4. 04### Listening is read\-only\. Playing a tape never changes the file\. The player remembers your place separately, the way a real tape stays wound where you left it\.
5. 05### Open and simple\. A ZIP archive, one JSON manifest, AAC audio, PNG or JPEG artwork\. Every part is a standard format you can open with existing tools\.
6. 06### Each tape has its own look\. Supply artwork at exact physical proportions, or describe the shell and label in a few lines of JSON that any player can draw\.
02Try it
## Put a tape in the*deck\.*
This is the oTAPE Web Deck: about 1,200 lines of plain JavaScript, no libraries\. It comes loaded with*Gitsem*, a C10 single that Mirat Can Bayrak wrote at 24 and recorded again at 42, and plays any`\.otape`you drop here\. Files stay in your browser and are never uploaded\.
*Gitsem*by Mirat Can Bayrak, licensed under[CC BY 4\.0](https://creativecommons.org/licenses/by/4.0/)\.[Source](https://github.com/otape-studio/otape-spec/blob/main/examples/files/gitsem.otape)\.
*o*TAPEWeb cassette deck OT\-WRECTAPE RUN
**Insert cassette**
[Download](https://www.otape.org/spec/examples/files/gitsem.otape)Open \.otape…
or drop a file anywhere on the deck
Time**\-:\-\-**
Remain**\-:\-\-**
Tape**\-\-\-**
NO CASSETTE
Now—
Tape mapclick to wind
0:00
Output
Spaceplay / stop←→rewind / fast forwardFflipEeject
03Tape sound
## Same tape\. *Another machine\.*
A cassette never sounded the same in two players\. oTAPE players can now play a tape the way a machine of the era would have: a studio deck, a car stereo, a portable stereo that has seen better days\. The sound changes on its way to your speakers\. The file stays exactly as it was recorded\.
*o*TAPETape sound selector TS\-6
Pitch over the last five seconds
### How it's done
1. **Wobble**No motor turns perfectly evenly\. A slow drift in speed bends the pitch \(wow\), a fast shiver roughens it \(flutter\)\. The player reads the music a hair early or late, moment by moment, so the pitch wanders just as much as it did on that machine\.
2. **Hiss**Every tape has its own bed of noise\. It runs while the tape runs, between songs and over blank tape too, and stops the moment you press stop\.
3. **Warmth**Record a tape hot and it rounds off the peaks, the treble first\. That gentle squeeze is a big part of why cassettes sound warm\.
4. **Wear**Old tape loses its top end, drops out for a split second where the coating has worn thin, and a head knocked out of line smears the stereo picture\.
**Nothing is baked in\.**The machine is applied while you listen\. Your`\.otape`file isn't touched, recordings stay clean, and you can switch machines in the middle of a song\.
**Machines are files\.**Each one is a small open preset, an`\.otsound`file, written in real\-world units: percent of speed, decibels, hertz\. So a portable stereo sounds the same in every oTAPE player\. Six come built in; make your own and share it\.
04Inside the file
## Unzip a *cassette\.*
An`\.otape`file is an ordinary ZIP archive with a fixed layout: a`mimetype`entry first, so tools can identify the file without unzipping it, then the manifest, one audio file per recorded side, and optional artwork and documents\.
night\-drive\.otapeZIP
```
mimetype application/vnd.otape.cassette
manifest.json the cassette, sides A and B, the look
audio/
side-a.m4a AAC-LC, one continuous take
side-b.m4a omitted while the side is blank
artwork/ optional, fixed physical sizes
cassette-face-a.png
label-a.png
jcard-front.jpg jcard-spine.png
booklet-01.png …
docs/ booklet.html, notes.md
```
manifest\.json · a blank C60
```
{
"format": "oTAPE",
"format_version": "1.0",
"cassette": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"title": "Night Drive",
"type": "C60",
"side_length_seconds": 1800,
"created_at": "2026-10-28T22:00:00Z"
},
"sides": {
"A": { "write_protect": "intact", "audio": null },
"B": { "write_protect": "intact", "audio": null }
}
}
```
Media type`application/vnd\.otape\.cassette`Apple UTI`org\.otape\.cassette`AudioAAC\-LC in M4A, which every player must support\. ALAC, FLAC and PCM are optional\.TimelineInteger frames at 44\.1 or 48 kHz, exact to the sampleMagic`PK\\x03\\x04`at offset 0, the media type at byte 38Versions`MAJOR\.MINOR`\. Minor versions only add optional fields, and unknown data is preserved\.
05The medium
## Fixed length\. *Breakable tabs\.*
A cassette's limits shape what goes on it, so oTAPE keeps them\. You choose a length before you record, and each side has a record tab you can break off\.
### Pick a length
- **C46**23 min / side · 65\.7 m · 18 µm
- **C60**30 min / side · 85\.7 m · 18 µm
- **C90**45 min / side · 128\.5 m · 12 µm
- **C120**60 min / side · 171\.4 m · 9 µm
- **C74**
Custom: minutes per side
A custom tape is named like a real one: C plus its total length in minutes\. Tape length and thickness follow the reel model in Appendix B\.3 of the spec\.
### Snap the tab
AB``Recording allowed:
This isn't DRM\. Like the tab on a real cassette, it protects a finished tape from being recorded over by accident, and anyone can tape over the hole\.
06The paper
## Artwork, to the*millimeter\.*
Shell and label artwork, the J\-card's front, spine and back flap, a fold\-out booklet, liner notes and a dedication\. Every image slot has a fixed size in millimeters, so artwork made in one app fits correctly in any other\.
flap 25\.4spine 12\.7front 63\.5 mmSlotmmRecommended pxCassette face A / B100\.4 × 63\.82410 × 1531Label A / B89\.0 × 42\.02136 × 1008J\-card front63\.5 × 101\.61524 × 2438J\-card spine12\.7 × 101\.6305 × 2438J\-card back flap25\.4 × 101\.6610 × 2438Booklet panel63\.5 × 101\.61524 × 2438Thumbnailsquare1024 × 102424 px/mm recommended, 12 px/mm minimum, aspect ratio within ±1%\. Shell and label images must be transparent over the window and hub holes, so the player's reels show through\.
07The reference app
## oTAPE*Studio\.*
A three\-piece hi\-fi for your Mac: the SP\-2 CD/MP3 source player and the TU\-01 internet radio tuner, both wired into the OT\-1 cassette deck\. Load your music or tune in a station, press REC, and the tape records in real time\. Pause the player and the deck records silence\. Save, and you have an`\.otape`file\. New in 1\.2:[tape sound](https://www.otape.org/#sound), so any tape can play through a machine of the era\.
- **Records in real time**The head overwrites the tape in place at 44\.1 kHz\. Blank tape stays blank, and nothing is recorded faster than it plays\.
- **Radio on the dial**The TU\-01 tunes about 50,000 stations from the Radio Browser directory\. Song titles become track markers on the tape and lines on the J\-card\.
- **Blanks and a designer**C46 to C120 blanks with working tape counters and reels\. The designer covers the shell, label, lettering, J\-card, artwork and record tabs, starting from eight presets\.
- **Careful with your files**Saves AAC at 256 kb/s and re\-encodes only the sides you changed\. Data written by other oTAPE apps is left intact\.
08In your browser
## Studio, *on the web\.*
oTAPE Studio Web is a cassette deck that runs in your browser, on any computer\. Open a tape or start a blank one, then record onto it in real time from a playlist of your own songs, an internet radio station or any audio input\. Save, and you have an`\.otape`file\. Nothing to install, no account, and your cassettes and songs never leave your device\.
- **Three sources**A player for your MP3, AAC, WAV and FLAC files, the Radio Browser directory of internet stations, and line in from any audio input of the computer\.
- **A real transport**Play, wind at speed, flip and stop at the ends\. Reels and counter follow the tape\-pack model, and the record tab protects finished sides\.
- **Checks every tape**Opens any oTAPE 1\.0 cassette, validates it fully and names every problem with its section of the spec\. Blanks from C46 to C120, or any custom length\.
- **Installable**Add it as an app and it opens`\.otape`files from your system\. Deck keys and media keys work, and it saves AAC at 256 kb/s\.
09For developers
## Write a player in an*afternoon\.*
The spec is open: anyone can implement it in free or commercial software, with no royalties and no permission needed\. A basic player comes down to the five steps below\.
1. **Open the ZIP**and read`manifest\.json`\. Check`format == "oTAPE"`and that the major version is 1\.
2. **For each side,**decode`audio\.file`and treat it as exactly`recorded\_frames`long\. The rest of the side is blank tape\.
3. **Play from the head position\.**Use FF and REW to wind instead of jumping\. Flipping maps position*p*to*L − p*\.
4. **Draw the cassette**from`appearance`, or from the`artwork`images if there are any\.
5. **Remember the head position**locally, per`cassette\.id`\. Playing never modifies the file\.
Validate a cassette
```
# optional: enables the JSON Schema check
pip install -r tools/requirements.txt
python3 tools/otape_validate.py my-mixtape.otape
```
```
VALID my-mixtape.otape
```
### Implementations
NamePlatformRoleoTAPE StudiomacOS 14\+Reference recorder and player, by Jan Osio\.[Download \.dmg](https://www.otape.org/assets/download/oTape%20Studio.dmg)[oTAPE Studio Web](https://studio.otape.org/)Chrome, Edge, SafariRecorder and player in the browser, by Jan Osio[oTAPE Web Deck](https://www.otape.org/#deck)Any modern browserPlayer, on this pageBuilt something that reads or writes oTAPE?[Open a pull request](https://github.com/otape-studio/otape-spec/blob/main/CONTRIBUTING.md)to add it to the list\.
## Own the tape\. *Not the platform\.*
No feed decides what plays next\. No account, server or subscription sits between you and a tape someone made for you\. oTAPE is open so your cassettes can outlive any app that plays them, including ours\.
No cloud · no accounts · just tapes