Skip to main content
image

Logo made with PowerRP. Open it in PowerRP to edit it (source: assets/doc.json).

dtab

Delta Tab. Config files made of tab-separated paths. One line is one path into a tree, and later lines are deltas on top of earlier ones. Try it in your browser: dtab on the left, JSON on the right.

objects	l1,l2 light
deltas	l1	position	x 1	y .5
	z -2
import dtab
dtab.parse(open("scene.dtab").read())
# {'objects': {'l1': 'light', 'l2': 'light'},
#  'deltas': {'l1': {'position': {'x': '1', 'y': '.5', 'z': '-2'}}}}

Why

  • Less to look at. No braces, quotes, or commas between values. A file with its tabs aligned reads like pseudocode, and is easy to write by hand, even on paper.

  • Simple. Six rules, one pass, about 70 lines per implementation.

  • Everything is addressable. There are no lists, so every value has a path: config.deltas.l1.position.x with EasyDict in Python or plain property access in JavaScript, brackets for keys like file.json.

  • You choose the shape. Lines stack, and c,d writes one value under several keys, so the same tree can be written wide, deep, or on one line, trading horizontal space for vertical. These are the same file:

    a	b	c x
    a	b	d x
    
    a
    	b
    		c x
    		d x
    
    a	b	c,d x
    

Rules

  • Tabs separate the steps of a path. deltas l1 position walks three keys down. Several tabs in a row count as one, so you can align columns.
  • An entry with a space is key value. It sets the key and stays at the same level, so x 1 y .5 sets two keys.
  • An indented line continues the path of the line above it.
  • Writing a key again replaces it. Writing into an object merges.
  • a,b writes the same value under a and under b.
  • An entry that starts with a space is a comment.
  • A leaf with lines indented under it is a multiline string. See below.

Every value is a string. Cast the ones you need. A key is any run of letters, digits, _, ., - and /, so file.json, 2026-09-07, assets/logo and 0 are keys. Keys that happen to be identifiers work as attributes (config.deltas.l1 with EasyDict and friends); the rest are reached with brackets (config["file.json"]).

Multiline strings

A leaf with lines indented under it is a multiline string. The lines under it are the value: each starts one tab deeper than the key's line and is taken verbatim from there, so tabs and deeper indentation inside are part of the value. This is the only way to put a tab in a value. Blank lines inside are kept, trailing ones dropped.

query sql	 a comment may follow the tag
	SELECT name, age
	FROM users
	WHERE age > 30

The leaf's own text is a tag that tells editors which language to highlight, and it is not part of the value. Any text will do, txt or nothing at all (prompt with a trailing space) for plain text. Unknown tags are plain text, never an error. A line indented under a line of several leaves is an error, since no leaf can claim it.

Tag Also
sql
python py
javascript js
typescript ts
html, css, json, yaml, markdown yml, md
bash sh, shell, zsh
c, cpp, rust, go, java, swift
dtab

Install

  • Python: pip install dtab then import dtab
  • JavaScript: npm install deltatab then const dtab = require('deltatab'), or <script src="https://cdn.jsdelivr.net/npm/deltatab/dtab.js"> for window.dtab
  • Vim: Plugin 'RyannDaGreat/dtab' (Vundle) or Plug 'RyannDaGreat/dtab' (vim-plug), or paste dtab.vim into your vimrc. Highlights *.dtab, flags bad keys and trailing tabs, gives the file a Δ icon in NERDTree if vim-devicons is installed, :DtabPreview opens a split showing the tree as JSON that follows your edits (needs +python3), and J joins the line below with a tab (deep form to wide form) whenever that keeps the tree the same.
  • VS Code: search "dtab" in Extensions, or code --install-extension RyannDaGreat.dtab. Highlighting, a Δ file icon, and a live JSON preview of the file beside it (the preview button in the title bar, or Cmd+K V).

API

  • parse(text) returns nested dicts (Python) or plain objects (JavaScript). Raises on an invalid key, with the line number.
  • stringify(tree) writes the tree back out, one key per line.
  • Command line: dtab scene.dtab prints the tree as JSON.

Metadata

Release files for dtab 0.4.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for dtab 0.4.1
File Size Uploaded Provenance Actions
dtab-0.4.1.tar.gz 12.4 kB Without provenance Details for dtab-0.4.1.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for dtab 0.4.1
File Interpreter ABI Platform Actions
dtab-0.4.1-py3-none-any.whl Python 3 none any Details for dtab-0.4.1-py3-none-any.whl

Total release size: 19.9 kB

Release files / dtab-0.4.1.tar.gz

Download URL dtab-0.4.1.tar.gz
Size 12.4 kB
Tags Source
SHA-256 checksum
How to use checksums
56ed5cf5cc1761e76996136508654bcef924e3228c1564898da2a279068f94c5
BLAKE2b-256 checksum
How to use checksums
c84b8af6be2c6a39c4f2173d1239d30b44c693b9619992879ffd6804b24f4ebd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.6

Release files / dtab-0.4.1-py3-none-any.whl

Download URL dtab-0.4.1-py3-none-any.whl
Size 7.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
6656fa40806b9a68fdff676c2aec2334d28d9b81d63e2c207b892b378977b1d3
BLAKE2b-256 checksum
How to use checksums
a3ba882a831774aec20a178643fc94aef0ba353bc0c19393ada3f129663d30fa
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.6

Security for dtab 0.4.1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page