-
-
Notifications
You must be signed in to change notification settings - Fork 1
.cstudio
How Conky Studio saves, opens, and shares portable project packages.
A .cstudio file is the preferred way to keep a full, re-editable HUD design — the node graph plus the images, fonts, and scripts it depends on, in one archive. Built themes (start.sh + conky.conf + render.lua) are for running on the desktop. .cstudio packages are for editing and remixing in Studio.
| Format | A normal ZIP archive with a fixed internal layout |
| Extension |
.cstudio (also accepted if renamed to .zip as long as the contents are valid) |
| Purpose | Portable, self-contained source project for the Studio canvas |
| Runtime | Not used by Conky at runtime, only by Conky Studio |
Studio still builds standard Conky theme folders from the graph. The package is the authoring document, not the shipped HUD.
When you Save as .cstudio, Studio writes a zip that typically looks like this:
MyHUD.cstudio
├── project.json # Full node graph (nodes, edges, windows, groups, labels, canvas)
├── manifest.json # Human metadata (name, author, description, format version)
└── assets/
├── images/ # PNG/SVG and other image paths referenced by nodes
├── fonts/ # Optional bundled .ttf/.otf/.ttc when packaging non-common fonts
└── scripts/ # Custom/companion scripts referenced by path props
| Entry | Role |
|---|---|
project.json |
Schema-versioned Project model: name, author, description, canvas, windows[], nodes[], edges[], optional groups[] and labels[]
|
manifest.json |
Package identity for humans and tools (format, format_version, schema_version, name, author, description, notes) |
assets/ |
Files that used to live as absolute paths on disk; copied in and referenced with package-relative paths |
Older bare .json project files still open. The next Save to a .cstudio path upgrades them into a full package (assets collected and paths rewritten).
This is the same structure Studio uses in memory. Important fields:
| Field | Meaning |
|---|---|
schema_version |
1 = early canvas-only; ≥2 = explicit windows[]; ≥3 = package-aware projects with relative assets |
name / author / description
|
Project identity (folder-safe names: prefer hyphens, not spaces) |
canvas |
Legacy / primary size, FPS, alignment, gaps, window type (mirrored from the primary window) |
windows |
Multi-monitor list: id, name, monitor (auto / primary / output name), size, alignment, optional visible_node_ids
|
nodes |
Each node: id, type, x/y, label, props, z, visible, locked, optional click region |
edges |
Wires: src_node → dst_node + dst_prop
|
groups |
Editor-only frames (collapse, title, member ids) — not emitted into Conky |
labels |
Free-form canvas notes; not drawn by Conky |
Canvas node: every project has a synthetic canvas.root node (id typically canvas) so window settings edit through the same property panel as other nodes.
File props: image paths (path, swap paths, fallbacks), script_path, and list props like asset_paths are rewritten to forms such as:
assets/images/logo.png
assets/scripts/my_poller.sh
so, the package works on another machine without your original absolute paths.
Example shape:
{
"format": "conky-studio-package",
"format_version": 1,
"schema_version": 3,
"name": "Minimal-HUD",
"author": "you",
"description": "Starter from Theme Wizard",
"notes": "",
"generic": false
}| Field | Notes |
|---|---|
format |
Always conky-studio-package for Studio packages |
format_version |
Package container version (currently 1) |
schema_version |
Matches the project graph schema |
generic |
If true, a minimal default manifest (optional “generic package” save path) |
Manifest fields can stay in sync with project.json name/author/description when you fill them on Save.
-
You choose a path ending in
.cstudio(or Save uses the current package path). -
Studio stages a temporary tree:
- Copies existing
assets/from an already-open package, if any. - Walks node props that reference files (images, scripts, optional fonts).
- Copies each external file under
assets/images,assets/fonts, orassets/scripts. - Rewrites props to relative paths inside the package.
- Copies existing
-
Writes
project.jsonandmanifest.json. -
Zips the tree (atomic write via temp file + replace).
-
Extracts a working copy under:
~/.cache/conky-studio/packages/<hash-of-abspath>/so further edits resolve relative assets without re-reading the zip every keystroke.
Warnings: missing assets are reported (path left as-is or noted) rather than silently dropping the node.
Legacy JSON Save: writing a plain .json path still works (graph only, no asset bundling). Prefer .cstudio when sharing or moving machines.
| Input | Behaviour |
|---|---|
*.cstudio |
Treat as zip; extract to package work dir; load project.json
|
*.zip containing project.json
|
Same as package (renamed packages still open) |
Bare *.json / Hud.json
|
Load graph only; package_root is empty until first asset import or package Save |
On package load:
- Validate zip.
- Extract to
~/.cache/conky-studio/packages/.... - Prefer root
project.json; if missing, first root-level*.jsonis tried. - Set
package_rootandsource_pathon the Project so relative paths resolve against the extracted tree.
While a package is open, Studio resolves a path by checking, in order:
- Absolute path that already exists on disk
- Under
package_rootand common subfolders (assets/,assets/images,assets/fonts,assets/scripts, legacyimages/,fonts/,scripts/) - Path as given relative to the current working directory
Import asset into package: when you pick an image or script for a node, Studio can copy it into assets/... and store the relative path in props so the next Save stays self-contained.
Fonts: common families (Sans, DejaVu, Liberation, Noto, Ubuntu, etc.) are not forced into the package. Uncommon families can be listed for optional bundling when packaging.
windows[] is part of project.json. Each entry can include:
- Monitor pin (
auto,primary, or a concrete output name from xrandr/discovery) - Size, alignment, gaps, FPS
- Optional
visible_node_idsso one window only draws a subset of visuals
The primary window stays mirrored onto legacy canvas fields so older tools and single-window paths still read a coherent size/FPS. Schema is bumped to at least 2 when more than one window is stored, and 3 when packaging with assets.
These are stored in the package for editor UX only:
- Groups — frames around nodes; collapse/expand; do not change generated Lua
- Labels — free-form notes on the canvas; not drawn by Conky
They round-trip in project.json so collaborators keep the same graph layout annotations.
| Not stored | Why |
|---|---|
Generated conky.conf / render.lua / start.sh
|
Produced by Build; recipients who only run the HUD get a theme folder, not the package |
| Installed plugin Lua from disk (except as graph type ids) | Plugins must be installed on the machine that opens the graph, or nodes appear as missing |
| System-wide fonts by default | Only optionally bundled uncommon font files |
| Live Preview scratch dirs | Temporary under the system temp area |
| Goal | Share |
|---|---|
| Someone only wants to run the HUD | Built theme folder (or zip of that folder) under ~/.config/conky/<Name>/
|
| Someone wants to edit/remix in Studio |
.cstudio package (or project JSON + assets + note required plugins) |
| Public release | Prefer built theme for end users; optionally attach .cstudio for remixers |
Plugin friction: if the graph uses community node types, document the plugin pack ids. Missing plugins do not unpack the zip; they show as missing/placeholder nodes until the pack is installed.
Names: use hyphenated project names (Minimal-HUD). Spaces break install paths and lock files when you Build & Install.
| Version | Meaning |
|---|---|
| 1 | Early projects; canvas-centric |
| 2 | Explicit windows[] multi-monitor support |
| 3 | Package format with relative assets/ paths |
Load always migrates older files into a coherent in-memory Project (e.g., synthesizing windows[0] from canvas when needed). Save writes the current schema so re-open is lossless.
| Symptom | Check |
|---|---|
| Package won’t open | Valid zip? Contains project.json (or a single root JSON)? |
| Images blank after open on another PC | Were they absolute paths never packaged? Re-open original, re-pick assets, Save as .cstudio
|
| “Missing: visual.plugin…” | Install the plugin pack that registered that type |
| Huge package size | Large PNGs/scripts under assets/; compress images before import |
| Edits not in the zip on disk | Save again; work tree is under ~/.cache/...; Save rewrites the .cstudio file |
- Sharing Projects — JSON vs built folder vs package
- Features — portable packages, multi-window, plugins
- Theme Compatibility — running installed themes without Studio
- Plugins — packs required by some graphs