1. Introduction
The .OTRN format was created to provide a universal way of exchanging timecode-related notes and markers for media files. It is particularly useful for film and audio editing, visual effects, and other post-production workflows.
The intention is to create a simple format that is both human- and machine-readable, covers all the important attributes of such a file, and is easy to implement in any language for web and standalone applications. It should also resolve common issues with other formats, such as CSV, XML and OTIO.
Definition of a Note: A note is defined as a comment, annotation, marker, subtitle, or message associated with a specific timecode or a timecode range. Each note can have one or more replies and tags.
We provide various resources to help you understand the format more quickly and thoroughly.
The project and format have been released under the MIT licence as part of an initiative from EditingTools.io. We invite anyone to incorporate the format into their software to enable easy sharing of notes with other applications.
2. Use Cases
OTRN integrates the processes and platforms of reviewing and taking notes with those of video and audio post-production. This format has a variety of use cases.
- Post-Production Feedback: A client reviews a video or audio file and adds frame-accurate comments, such as "Cut here" or "Color is off." The editor imports the OTRN file, which instantly places all notes as timeline markers.
- Live Event Logging: During a concert, documentary shoot, game show, sporting event, reality TV show, or live-on-tape recording, a logger quickly notes or tags key moments ("Goal," "Highlight," etc.) with timecodes to create a highlight reel later.
- Protocols of meetings and calls: Notes can be taken during a meeting and reviewed later.
- Network Tests: Testing can be recorded and reviewed later more quickly.
- Caption/Subtitle Creation: Notes can be taken to be used as help reference for later captioning of the recorded content.
3. Supporting Apps
Applications that already support .otrn format.
| Icon | App | Platform | Category | Description |
|---|---|---|---|---|
| OTRN Editor | macOS | Developer Tool | Basic editor to create, edit or preview simple OTRN files. | |
| Live Timecode Notes | iOS/macOS | Logging | App for note taking with real-time timecode and collaboration features. Specifically designed for shows, events, streams and live-on-tape productions. | |
| Video Timecode Notes | macOS | Review Tool | A tool designed to review local stored video files and create timecode-related notes and markers. | |
| Marker Tool & Converter (iOS/macOS) | iOS/macOS | Converter | Standalone offline tool to convert and modify different marker formats. | |
| Marker Converter in next update | Web | Converter | Free online tool to convert and modify different marker formats. | |
| EDL Tool & Converter (iOS/macOS) | iOS/macOS | Converter | Standalone offline tool to convert and modify EDL files. | |
| # | Plugin for Premiere Pro announced | Windows/macOS | NLE | Free Plugin/Extension to import and export OTRN files in older Premiere Pro versions 2022, 2023, 2024, 2025. |
| # | Extension for DaVinci Resolve announced | Windows/macOS/Linux | NLE | Free Plugin/Extension to import and export OTRN files in older versions of DaVinci Resolve. |
Potential Supporters
| Icon | App | Category | Description |
|---|---|---|---|
| # | EdiMarker | Converter | An application for sound editors, sound supervisors and music producers to load markers into Pro Tools. |
| # | CuePilot | Live Production | Software to build rundowns of acts including camera coverage and special effects. |
| # | Frame.io | Review Tool | A cloud-based platform for organizing, sharing, and collaborating media files. Also offering reviewing with frame-accurate commenting, version control, and approval workflows. |
| # | Webgate.io | Review Tool | A platform for dailies, post-production feedback, and media distribution in the film and media industry. |
| # | Krock.io | Review Tool | A media review and project management platform built for video, animation, and design teams to give timecode-based feedback. |
| # | Flow Production Tracking | Review Tool | A creative production management and video review tool. |
| # | FTRACK (Media Review) | Review Tool | Tracking of film projects and media review tool. |
| # | Vimeo Review | Review Tool | A feature within Vimeo that allows commenters to share videos via customizable review links to gather precise, time-coded feedback and manage versions. |
| # | NoteTracks.com | Review Tool | A review online tool for audio files. |
| # | Dropbox Replay | Review Tool | A media review and approval tool that lets collaborators mark up, comment on, and finalize video, image, and audio projects with frame-accurate feedback. |
| # | Premiere Pro | Non-Linear Editor (NLE) | Industry-leading video editing software for film, TV, and web. It supports advanced editing, color correction, and audio mixing, with marker import for review notes. |
| # | DaVinci Resolve | Non-Linear Editor (NLE) | A comprehensive post-production suite known for its world-class color correction tools, as well as powerful editing, audio post (Fairlight), and visual effects (Fusion) capabilities. |
| # | Avid Media Composer | Non-Linear Editor (NLE) | A long-standing industry-standard professional video editing software, particularly dominant in film and broadcast television, known for its robust media management. |
| # | Final Cut Pro | Non-Linear Editor (NLE) | A professional video editing application from Apple, known for its Magnetic Timeline and speed, used by a wide range of creators from YouTubers to feature filmmakers. |
| # | Riverside | Audio Recording | A platform to record and edit audio podcasts. |
| # | Reaper | Audio Editing | A software for audio editing. |
4. OTRN Format Structure
The Open Timecode-Related Notes (.OTRN) format uses a standardized JSON structure. It is organized into three primary sections. The first (optional) section is a metadata object that defines basic information about the file and its origin. The second section is a sequence object containing the notes array with all the time-stamped notes. The third, optional primary section is a files array that allows users to attach additional notes to files and clips outside the sequence range.
Root Structure
{
"metadata":
{
/* Basic metadata about the file */
},
"sequence":
{
/* Definition of the sequence */
"notes": [
{
/* Notes, markers and replies */
}
]
},
"files": [
{
/* Optional files array for clip notes */
}
]
}
5. Metadata Object Definition
The metadata object contains optional informations about the file and where it comes from.
OTRN uses attributes written in Camel Case for readability.
| Attribute | Type | Required | Description | Example |
|---|---|---|---|---|
project |
string |
optional | The name of the overall project. This could be the name of the show, episode, or event, for example. | "The Dark Night" |
fileName |
string |
optional | The name of the video or audio file to which these notes are related to. | "Episode_23_edit01.mp4" |
fileUrl |
string |
optional | The URL or path of the video or audio file to which these notes are related. | "https://..." or "Volumes/drive/..." |
software |
string |
optional | The software name that generated the OTRN file. | "OTRN Editor" |
author |
string |
optional | The name of the person creating the file. | "John Doe" |
otrnVersion |
int |
optional | The version of the OTRN file format (for future compatibility). Set to 1. | 1 |
otrnInfo |
string |
optional | A short information for someone opening the file. Can be set to the optional example text. | "This is an OTRN (Open Timecode-Related Notes) notes file. Learn more about the specification on https://otrn.editingtools.io" |
timestamp |
string |
optional | ISO 8601 timestamp for when the file was created. | "2025-10-27T14:30:00Z" |
An example with all attributes.
{
"metadata": {
"project": "The Dark Night",
"fileName": "Episode_23_edit01.mp4",
"fileUrl": "https://editingtools.io/project/thedarknight/Episode_23_edit01.mp4",
"software": "Live Timecode Notes",
"otrnVersion": 1,
"otrnInfo": "This is an OTRN (Open Timecode-Related Notes) notes file. Learn more about the specification on https://otrn.editingtools.io",
"timestamp": "2025-11-15T11:56:00Z"
},
/* other objects below... */
}
6. Sequence Object Definition
The sequence object contains metadata necessary to correctly interpret the timecodes and the notes array.
| Attribute | Type | Required | Description | Example |
|---|---|---|---|---|
name |
string |
optional (recommended) |
The name of the sequence. This can be the same like the filename, if the sequence has no other name. | "Project_Cut_V05" |
frameRate |
float |
optional (recommended) |
The frame rate of the video. Common values: 8.0, 12.0, 16.0, 23.976, 24.0, 25.0, 29.96, 30.0, 48.0, 50.0, 59.94, 60.0, 72.0, 75.0, 90.0, 100.0, 120.0, 240.0 |
29.97 |
dropFrame |
boolean |
optional (recommended) |
false on default. If the timecode uses drop frame use true (use semicolon as last separator for the timecodes). Can only be set to true for 29.96 and 59.94. |
true |
startTime |
float |
optional | The starting time of the file or sequence in seconds. 0.0 is used by default which defines the start of the file. | 0.0 |
startTimecode |
string |
optional | The starting timecode of the file or sequence. "00:00:00:00" by default. Set it, if the sequence starts with another timecode. For example Media Composer often uses 01:00:00:00. | "01:00:00:00" |
startFrame |
int |
optional | The starting frame of the file or sequence in seconds. 0 is used by default which defines the start of the file. | 0 |
notes |
array |
required | The array containing all notes. | [] |
An example with all attributes.
{
"metadata":{
/* metadata object */
},
"sequence": {
"name": "Final_Edit_V03",
"frameRate": 23.976,
"dropFrame": false,
"startTime": 0.0,
"startTimecode": "01:00:00:00",
"startFrame": 0,
"notes": []
}
}
7. Note Object Definition
The notes array contains a list of individual note objects. Each note is a comprehensive entry detailing the comment, its position, and its status.
| Attribute | Type | Required | Description | Example |
|---|---|---|---|---|
time |
float |
Required | The relative time in seconds of the note counted from the start of the file or sequence. | 135.432 |
timecode |
string |
optional (recommended) |
The absolute timecode of the note in the format: HH:MM:SS:FF (or HH:MM:SS;FF for drop frame timecodes). |
"01:02:15:10" |
frame |
int |
optional | The relative frame number of the note counted from the start of the file or sequence. | 0 |
comment |
string |
Required | The main body of the note. Contains the message/marker/not/annotation. | "The shot 3A needs a placeholder plate added to the timeline." |
name |
string |
optional | An optional attribute used by some tools to provide additional information. Since this attribute does not exist in all software applications, it should be left blank if not used. It should never contain the same text that is also in the comment. | "VFX" |
commenter |
string |
optional | The name of the commenter/user who created the note. | "John Smith" |
color |
string |
optional (recommended) |
The color name of the note (see list of supported colors). Use lowercase. | "blue" |
colorHex |
string |
optional | An optional hex color code for visual redefinition of colors. For example for platforms that use individual defined colors. | "#FFC107" |
category |
string |
optional | A workflow category to classify the note (e.g., "Color", "VFX", "Audio"). Its mostly used for lists and sheets. Most NLE softwares do not support category attributes. | "VFX" |
track |
string |
optional | Track (name) where the note should be placed. Only needed for software that have multiple video or audio tracks. For example used in Media Composer. Common values: TC,V1, V2, ... , A1, A2, ... Video tracks are defined with "V," and audio tracks are defined with "A." TC defines the general sequence. |
"V1" |
complete |
boolean |
optional | Status flag to mark if the task associated with the note is complete/checked off. Used for checklists. | false |
timestamp |
string |
optional | ISO 8601 timestamp for when the note was created or updated. | "2025-10-27T14:30:00Z" |
noteId |
string |
optional | This is a way to give a note a unique ID. This can be used to track notes across multiple versions or compare when using export and import from a software. It can also contain an internal ID of an application. | "11bf233e15374..." |
Here is an example using the most commonly used attributes:
{
"metadata":{
/* metadata object */
},
"sequence": {
"name": "another_video_edit01",
"frameRate": 25.0,
"dropFrame": false,
"startTime": 0.0,
"startTimecode": "10:00:00:00",
"notes": [
{
"time": 61.0
"timecode": "10:01:01:00",
"comment": "The transition effect here feels a little too abrupt."
"commenter": "Jane Doe",
"timestamp": "2025-11-13T11:00:10Z"
},
{
"time": 63.0
"timecode": "10:01:03:00",
"comment": "Change this picture."
"commenter": "Jane Doe",
"timestamp": "2025-11-13T11:01:18Z"
}
]
}
}
Range Marker
There are additional attributes to define a range marker/note, also known as a spanned marker. It can be used to mark a longer scene or take for example.
| Attribute | Type | Required | Description | Example |
|---|---|---|---|---|
range |
Bool |
optional | false by default. If true, this note is part of a time range (end frame/time should be defined in a separate optional field). |
false |
timeOut |
float |
Required | The out point of the range marker. | 135.432 |
timecodeOut |
string |
optional (recommended) |
The out point of the range marker. | "01:02:15:23" |
frameOut |
int |
optional | The out point of the range marker. | 5 |
Here is an example using a timecode range:
{
"metadata":{
/* metadata object */
},
"sequence": {
/* sequence data */
"notes": [
{
"time": 61.0
"timecode": "10:01:01:00",
"comment": "The transition effect here feels a little too abrupt."
"commenter": "Jane Doe",
"timestamp": "2025-11-13T11:00:10Z",
"range": true,
"timeOut": 63.0,
"timecodeOut": "10:01:03:00"
}
]
}
}
Replies & Tags
The following arrays can be added to a note to add replies and tags.
| Attribute | Type | Required | Description | Example |
|---|---|---|---|---|
replies |
array |
optional | An array of reply objects for threaded discussion. Can be empty. | (see 8. Reply Object Section) |
tags |
array |
optional | An array of tag objects for advanced tagging. Can be empty. | (see 9. Tags Object Section) |
8. Reply Object Definition
The replies array within a note contains simple objects detailing responses to the main note. Replies are designed to be lean, as the main note holds the structural metadata.
| Attribute | Type | Required | Description | Example |
|---|---|---|---|---|
comment |
string |
Required | The content of the reply. | "Good catch, Jane." |
commenter |
string |
optional | The name of the commenter/user who created the reply. | "Sam K." |
timestamp |
string |
optional | ISO 8601 timestamp for when the reply was created or modified. | "2025-10-27T14:30:00Z" |
replyId |
string |
optional | This is a way to give a reply a unique ID. This can be used to track replies across multiple versions or compare when using export and import from a software. It can also contain an internal ID of an application. | "11bf233e15374..." |
Example: Reply structure usually happens below a comment and is often used in collaboration review tools.
Example Code:
{
"metadata":{
/* metadata object */
},
"sequence": {
/* sequence data */
"notes": [
{
"time": 61.0
"timecode": "10:01:01:00",
"comment": "The transition effect here feels a little too abrupt."
"commenter": "Jane Doe",
"timestamp": "2025-11-13T11:00:10Z",
"replies": [
{
"commenter": "Sam K.",
"comment": "Good catch, Jane.",
"timestamp": "2025-11-13T11:31:00Z"
},{
"commenter": "Mark T.",
"comment": "I was also thinking the sound design should reflect this change.",
"timestamp": "2025-11-13T11:3:21Z"
}
]
}
]
}
}
10. File Object Definition
In addition to notes in a sequence, some programs use file notes/marker in addition. The files array can be added to implement file specific notes.
| Attribute | Type | Required | Description | Example |
|---|---|---|---|---|
fileName |
string |
Required | The filename. | "SHOT_001_A003_C005.mov" |
filePath |
string |
Required | The URL or path of the video or audio file to which these notes are related. | https://... or "/Volumes/projectmedia/rushes/SHOT_001_A003_C005.mov" |
clipName |
string |
optional | Can be used if the clip has another naming within an software. | "Interview Take 5" |
frameRate |
float |
optional (recommended) |
The frame rate of the video. Common values: 8.0, 12.0, 16.0, 23.976, 24.0, 25.0, 29.96, 30.0, 48.0, 50.0, 59.94, 60.0, 72.0, 75.0, 90.0, 100.0, 120.0, 240.0 |
29.97 |
dropFrame |
boolean |
optional (recommended) |
false on default. If the timecode uses Drop Frame format use true (use Semicolon as last separator) |
true |
startTime |
float |
optional | The starting time of the sequence in seconds. 0.0 by default. | 0.0 |
startTimecode |
string |
optional | The starting timecode of the video sequence. "00:00:00:00" by default. Set if the sequence starts with anoter timecode. | "01:00:00:00" |
startFrame |
int |
optional | The starting frame of the sequence in seconds. 0 by default. | 0 |
notes |
array |
required | The array containing all notes. | [] |
The notes array and note object is identical to the note object in the sequence.
Example Code: File Object with Clip Notes
{
"metadata": {
"project": "File Note Demo"
},
"sequence": {
"name": "Main Sequence",
"notes": []
},
"files": [
{
"fileName": "SHOT_001_A003_C005.mov",
"filePath": "/Volumes/projectmedia/rushes/SHOT_001_A003_C005.mov",
"clipName": "Interview Take 5",
"frameRate": 25.0,
"startTime": 0,
"startTimecode": "14:24:10:00",
"notes": [
{
"time": 10.0,
"timecode": "14:24:20:00",
"comment": "Camera operator mentioned this take has a minor lens flare issue.",
"commenter": "Data Manager"
},
{
"time": 55.5,
"timecode": "14:25:05:12",
"comment": "Best moment of the interview - very emotional.",
"color": "green"
}
]
}
]
}
11. Color Definition
Most applications support 8, 16, or 32 colors for notes and markers. Some applications use hex or rgb codes to define colors. OTRN uses color names instead of hex codes, because different software uses different color schemes to display note and marker colors. In order to make it possible to use color-coded notes across different platforms and software, color names are used to define the colors instead of a hex code.
When importing a file with more colors than the software supports, it should either change the colors to a base color that's close, or apply a default color.
When exporting notes from a software that works only with hex or rgb codes, the nearest color should be chosen to be added into an OTRN file. See more examples bellow.
| 16 Base Colors (Primary) | 16 Additional Variations | ||
|---|---|---|---|
| Name | Hex (Example) | Name | Hex (Example) |
| red | #FF0000 | bordeaux | #6D002C |
| orange | #FFA500 | gold | #FFD700 |
| yellow | #FFFF00 | lemon | #FFFACD |
| lime | #00FF00 | mint | #98FF98 |
| green | #008000 | olive | #808000 |
| teal | #008080 | aqua | #008B8B |
| cyan | #00FFFF | sky | #87CEEB |
| blue | #0000FF | navy | #000080 |
| indigo | #4B0082 | lavender | #E6E6FA |
| purple | #800080 | violet | #EE82EE |
| magenta | #FF00FF | fuchsia | #B13B6E |
| pink | #FFC0CB | rose | #FF007F |
| brown | #856545 | cocoa | #643D21 |
| white | #FFFFFF | sand | #E4D9B6 |
| gray | #808080 | silver | #C0C0C0 |
| black | #000000 | charcoal | #36454F |
Applications with only eight colors may need to consolidate the 32 possible colors into eight. Below is one example of how this could be done.
| 8 color palette | 32 colors palette |
|---|---|
| Red | red (#FF0000) bordeaux (#6D002C) brown (#856545) cocoa (#643D21) |
| Yellow | yellow (#FFFF00) lemon (#FFFACD) orange (#FFA500) gold (#FFD700) |
| Green | lime (#00FF00) green (#008000) mint (#98FF98) olive (#808000) |
| Cyan | cyan (#00FFFF) teal (#008080) aqua (#008B8B) sky (#87CEEB) |
| Blue | blue (#0000FF) navy (#000080) |
| Purple | purple (#800080) indigo (#4B0082) lavender (#E6E6FA) pink (#FFC0CB) |
| Magenta | magenta (#FF00FF) fuchsia (#B13B6E) violet (#EE82EE) rose (#FF007F) | White | white (#FFFFFF) sand (#E4D9B6) gray (#808080) silver (#C0C0C0) black (#000000) charcoal (#36454F) |
HEX to Color Name Resolver
Enter any hex color code (e.g., `#856545`) to find its closest match from the OTRN list of named colors.
Original Input Color
HEX Code:
—
Nearest Named Match
Color Name:
—
Named HEX:
—
12. Complete Examples
Minimal .otrn
The simplest example has only the basic elements required. It could be used for simple podcasts or audio file logging, for example.
{
"metadata" : {
},
"sequence" : {
"notes" : [
{
"comment" : "The crossfade at the end of the scene feels too abrupt. Can we extend the music cue by 1.5 seconds?",
"time" : 462.0
},
{
"comment" : "The sky replacement in this shot is looking too green compared to the previous scene. Needs to match 'Look B' better.",
"time" : 610.0
}
]
}
}
Recommended Minimal .otrn
Some metadata should be added. Also information about framerate and timecode should be provided if the application provides it (e.g., for logging on videos).
{
"metadata": {
"project": "My Film project",
"software": "Live Timecode Notes",
"otrnVersion": 1,
"otrnInfo": "This is an OTRN (Open Timecode-Related Notes) notes file. Learn more about the specification on https://otrn.editingtools.io",
"timestamp": "2025-11-15T11:56:00Z"
},
"sequence": {
"framerate": 23.976,
"dropFrame": false,
"notes": [
{
"time": 462.333,
"timecode": "10:05:42:08",
"comment": "The crossfade at the end of the scene feels too abrupt. Can we extend the music cue by 1.5 seconds?"
},
{
"time": 610.625,
"timecode": "10:08:10:15",
"comment": "The sky replacement in this shot is looking too green compared to the previous scene. Needs to match 'Look B' better."
}
]
}
}
Standard .otrn
Here is an example of an OTRN file with most of its attributes.
{
"metadata": {
"project": "My Film Project",
"fileName": "MyFilm.mp4",
"fileUrl": "https://editingtools.io/project/myfilm/MyFilm.mp4",
"software": "Live Timecode Notes",
"otrnVersion": 1,
"otrnInfo": "This is an OTRN (Open Timecode-Related Notes) notes file. Learn more about the specification on https://otrn.editingtools.io",
"timestamp": "2025-11-15T11:56:00Z"
},
"sequence": {
"frameRate": 23.976,
"dropFrame": false,
"startTime": 0.0,
"startTimecode": "10:00:00:00",
"notes": [
{
"timecode": "10:05:42:08",
"time": 462.333,
"commenter": "editor_alice",
"name": "Music Edit Fix",
"comment": "The crossfade at the end of the scene feels too abrupt. Can we extend the music cue by 1.5 seconds?",
"color": "red",
"category": "Audio Mix",
"completed": false,
"replies": [
{
"commenter": "audio_bob",
"comment": "Got it. Will adjust the pre-lap and soften the cut. Thanks!",
"timestamp": "2025-11-12T10:05:00Z"
}
]
},
{
"timecode": "10:08:10:15",
"time": 610.625,
"commenter": "director_charlie",
"name": "Color Grade - Look B",
"comment": "The sky replacement in this shot is looking too green compared to the previous scene. Needs to match 'Look B' better.",
"color": "blue",
"category": "Color Correction",
"completed": true
}
]
}
}
13. Example Files
| Example | Description | Download |
|---|---|---|
| Example 1 | The simplest example has only the basic elements required. It could be used for simple podcasts or audio file logging, for example. | example_file_1.otrn |
| Example 2 | Example with more than the basic metadata. | example_file_2.otrn |
| Example 3 | Example of an OTRN file with most of its attributes. | example_file_3.otrn |
| Example 4 | More complex example with multiple notes and replies. | example_file_4.otrn |
| Example 5 | Example with File Object (File Marker) | example_file_5.otrn |
14. Python
We have a Python library for OTRN, as well as example code for reading and writing.
Download: example-python-writer-reader.zip
What's Inside & How to Use It
The example-python-writer-reader.zip provides a complete, runnable demonstration of OTRN integration in Python. It's designed to show you exactly how to transform data into the OTRN format and how to safely read it back.
The ZIP contains three Python files:
-
otrn_lib.py: This is the core library. It holds all the necessary Python dataclasses (likeOTRNDocument,Note, andTag) and the two primary functions,read_otrn()andwrite_otrn(). -
example_writer.py: This script demonstrates how to construct a complex OTRNDocument object in memory and then useswrite_otrn()to save it as a JSON file namedexample_data_to_read.otrn. -
example_reader.py: This script shows how to load the OTRN file usingread_otrn()and then iterate through the nested data structure to print all the notes and metadata.
Quick Start
- Extract all three files into a single, dedicated directory.
-
Run the writer first to create the OTRN data file:
python writer_example.py -
Run the reader to load notes from the OTRN file:
python reader_example.py
15. Swift
We provide a full Swift Package for OTRN, allowing you to easily read and write OTRN files in iOS, macOS, and command-line applications using native Swift Codable structs.
Download Examples + Package: example-swift-writer-reader.zip
Download Package: OtrnLibrary.zip
What's Inside & How to Use It
The example-swift-writer-reader.zip provides a complete, runnable demonstration of OTRN integration designed for a Swift Package or Xcode Command Line Tool project.
The ZIP contains the core library and a test XCODE project with multiple files:
-
Example OTRN Cli.xcodeproj: Demo Project for Xcode. -
OtrnLibrary.swift: This is the core library file. It contains all the necessary public Swift structs (likeOTRNDocument,Note, andTag) which conform toCodable, along with the file I/O utilitiesread(from:)andwrite(to:). -
write_example_simple.swift: Demonstrates how to write a minimal OTRN file using only required attributes. -
write_example_advanced.swift: Shows how to **construct a complex OTRNDocument** object by setting all available optional properties, including nestedReplyandFileobjects. -
read_example.swift: Shows how to **load an OTRN file** usingOTRNDocument.read(from:)and how to safely access and print all nested note details. -
main.swift: This is the execution entry point. It calls the write and read functions sequentially to run the full demonstration.
Quick Start
Open the Xcode project Example OTRN Cli.xcodeproj and start it. It will create a write and read a test file and show the results in command line.
- Extract all files.
- Build and Run the main target. The
main.swiftfile will automatically handle the workflow. - The script will create two demo files in your system's temporary directory and then read the advanced file back to print all its details to the console.
Implement the OTRN Package into an existing project
If you have an existing project, you can add the OtrnLibrary Package to your app.
- Download the example-swift-writer-reader.zip
- Open your Xcode project.
- Right Click in Project navigator, choose Add Package Dependencies.
- Click the button Add local... (at the bottom of the window) and select the
OtrnLibrarym Package. - Add
import OtrnLibraryto every Swift file in your app, where you want to access the library. - Copy and modify the needed code from read_example.swift or write_example... into your app.
16. Javascript
We provide a Javascript Package for OTRN, allowing you to easily read and write OTRN files within the browser or javascript applications.
Download Examples + Package: examples-javascript-writer-reader.zip
The examples-javascript-writer-reader.zip provides 3 runnable demonstrations of OTRN integration designed for Javascript (and HTML).
17. PHP
Examples for PHP integration coming soon.
18. OTRN Editor
A simple editor to create, open or edit simple OTRN files is available for macOS. The code is open source and everyone is invited to improve it.
Download OTRN Editor from the AppStore.
The full source code will be available soon on Github for collaboration.
The Editor can currently not display Replies and Tags along some other attributes.
19. OTRN File Validator
Coming soon.
20. OTRN File Converter
Coming soon.
21. Latest Updates
Nov. 2025: Release of first version of OTRN
22. Help & Support
Contact [email protected] for any questions or cooperation requests.
23. License
The MIT License (MIT) Copyright (c) 2025 EditingTools.io Permission is hereby granted, free of charge, to any person obtaining a copy of this software/file format and associated documentation files (the "Software"), to deal in the Software/File format without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software/File Format, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.