Studio

The Studio is Hologram's integrated development environment for creating, deploying, and managing TELA applications. It provides tools for local development, batch deployment, and version control. For testing with real blockchain state, use Simulator Mode.
Complete Development Workflow: Develop locally with hot reload, deploy to blockchain, and manage versions—all from one integrated environment.
Overview
Studio consists of four main sections:
| Section | Purpose |
|---|---|
| Serve | Local development server with hot reload |
| Deploy | Batch deployment of TELA applications |
| My Content | Manage your deployed TELA applications |
| Actions | Version control and content management |
Serve (Local Dev Server)
The Serve tab provides a local development server for testing TELA apps before deployment.
Starting the Server
- Navigate to Studio > Serve
- Click "Choose Directory"
- Select a folder containing your TELA app (must have
index.html) - Server starts automatically on an available port (default: 8080)
Features
| Feature | Description |
|---|---|
| Hot Reload | Automatic browser refresh on file changes |
| telaHost API | Full telaHost API available during development |
| CORS Support | Proper headers for local development |
| MIME Types | Correct content types for all web files |
| Cache Busting | Fresh content on every reload |
Supported File Types
- Web files:
.html,.htm,.css,.js,.mjs,.json - Images:
.svg,.png,.jpg,.jpeg,.gif,.webp,.ico - Fonts:
.woff,.woff2,.ttf
Hot Reload Behavior
- File changes detected automatically (300ms debounce)
- Only reloads when Browser tab is viewing local content
- Recent changes displayed in Studio tab
- XSWD connection maintained during reload
API Reference
StartLocalDevServer(directory string) -> {
success: true,
url: "http://127.0.0.1:8080",
port: 8080
}
StopLocalDevServer() -> { success: true }
GetLocalDevServerStatus() -> {
running: true,
url: "http://127.0.0.1:8080",
port: 8080,
directory: "/path/to/app",
watcherActive: true
}Deploy
The Deploy tab provides tools for deploying both complete TELA applications and raw DVM-BASIC smart contracts to the blockchain.
Upload Smart Contract (Raw SC)
For developers building standalone smart contracts or testing backend logic, Hologram provides a direct SC deployment interface:
- Select "Upload SC" — Toggle to the raw smart contract deployment mode
- Paste Code — Paste your DVM-BASIC smart contract code into the editor
- Deploy — Hologram automatically estimates gas and deploys the contract
Simulator Safe: When deploying raw smart contracts in Simulator Mode, Hologram uses a specialized connect/disconnect pattern that temporarily pauses the Gnomon indexer to prevent the simulator daemon from crashing due to its single-WebSocket limitation.
Batch Deployment Process (TELA Apps)
- Choose Directory — Select your app folder
- Configure — Set name, description, dURL, and content type
- Review — See all files to be deployed
- Deploy — Watch progress as files are uploaded
Configuration Options
| Option | Description |
|---|---|
| Application Name | Display name for your app |
| Description | Brief description (shown in Discover) |
| dURL | Optional memorable URL (e.g., myapp.tela) |
| Icon URL | Optional icon (HTTPS, HTTP, SCID, or IPFS) |
| Content Type | Updateable (Ring 2) or Immutable (Ring > 2) |
| MODs | Optional smart contract functionality |
Icon URL Validation
Hologram validates icon URLs in real-time as you type:
- HTTPS URLs — Validated for proper format
- HTTP URLs — Accepted with warning (HTTPS recommended)
- SCID — 64-character hex string (on-chain image reference)
- IPFS —
ipfs://protocol URLs
Visual feedback indicators:
- ✓ Green checkmark for valid HTTPS/SCID/IPFS
- ⚠ Yellow warning for HTTP URLs
- ✗ Red X for invalid formats
dURL Tag Detection
Hologram automatically detects special dURL suffixes and shows contextual descriptions:
| Suffix | Description |
|---|---|
.lib | Library — A collection of reusable DOCs that can be embedded in other apps |
.shard | DocShard — A shard DOC (part of a larger file split across multiple contracts) |
.shards | DocShards — An INDEX containing DocShards that require reconstruction |
.bootstrap | Bootstrap — A collection of TELA apps/content for bootstrapping |
When you enter a dURL with one of these suffixes, Hologram displays a badge with the appropriate description.
MODs (Modification Operations)
MODs add smart contract functionality to your INDEX. MODs require Ring 2 (updateable content).
Variable Store MOD
Select one Variable Store MOD to add on-chain key-value storage:
vs1,vs2, etc. — Different variable store implementations- Single selection only — Choose the storage system that fits your needs
- Automatically enforces Ring 2 — MODs require updateable content
Transfer MODs
Select multiple Transfer MODs to enable different transfer capabilities:
tx1,tx2, etc. — Various transfer and deposit functionalities- Multiple selection — Combine different transfer types
- Automatically enforces Ring 2 — MODs require updateable content
MOD Picker Modal
When you enable MODs, a modal opens with:
- Variable Store section — Select one storage system
- Transfer section — Select multiple transfer types
- Selected MODs summary — Shows combined tags (e.g.,
vs1,tx1,tx2) - Clear all — Reset selections
The selected MOD tags are included in the INDEX contract's mods field.
Library Installation Flow
When installing a library (dURL ending in .lib), Hologram provides an "Embed in INDEX" workflow:
- View library contents — See all DOCs in the library
- Click "Embed in INDEX" — Adds library DOC references to your INDEX
- Automatic DOC reference addition — Library DOCs are automatically included in your INDEX's
DOC1,DOC2, etc. variables
This makes it easy to reuse library components across multiple TELA apps.
Password Confirmation Modal
For mainnet deployments, Hologram shows a password confirmation modal with enhanced safety:
- Password required — Must enter wallet password to proceed
- Acknowledgement checkbox — Must confirm you understand this is a mainnet deployment
- Gas estimate display — Shows estimated gas cost before deployment
- Network indicator — Clearly shows "Mainnet" or "Testnet"
Mainnet deployments are permanent and cost real DERO. Always test in Simulator Mode first.
Content Types
| Type | Ring Size | Description |
|---|---|---|
| Updateable | 2 | Owner can update the INDEX contract |
| Immutable | > 2 | Content is permanently fixed |
Updateable content allows you to push updates to your app. Immutable content provides stronger guarantees that the app won't change.
File Processing
During deployment, Hologram:
- Scans directory — Finds all web files
- Compresses large files — Gzip for files over threshold
- Deploys DOCs — Each file becomes a TELA-DOC-1 contract
- Creates INDEX — Links all DOCs together
- Registers dURL — If specified
File Size Limits
| Limit | Value |
|---|---|
| Max file size | 18KB (TELA specification) |
| Compression | Automatic gzip for large files |
| DocShards | Available for files exceeding limit |
Deployment Result
DeployTELABatch(config) -> {
success: true,
indexSCID: "abc123...",
durl: "myapp.tela",
files: [
{ name: "index.html", scid: "...", size: 4096 },
{ name: "styles.css", scid: "...", size: 2048 },
...
],
gasCost: 150000 // or "FREE" in simulator
}My Content
The My Content tab displays all TELA applications you've deployed, making it easy to manage your on-chain content.
Your Deployed Apps
View all INDEX contracts owned by your connected wallet:
| Column | Description |
|---|---|
| Name | Application name from INDEX metadata |
| dURL | Registered dURL (if any) |
| SCID | Smart contract ID (click to copy) |
| Versions | Number of updates deployed |
| Rating | Community approval percentage |
Quick Actions
Each app in your content list has quick action buttons:
| Action | Description |
|---|---|
| View | Open the app in Browser |
| Update | Deploy a new version (Ring 2 only) |
| Clone | Download current files to local directory |
| History | Open Version History modal |
Stats Overview
The My Content header shows aggregate statistics:
- Total Apps — Number of INDEX contracts you own
- Total Views — Combined view count across all apps
- Total Likes — Combined approval count
My Content only shows apps where your wallet address is the contract owner. Apps deployed by other wallets won't appear here.
Actions (Version Control)
The Actions tab provides Git-like version control for TELA applications. Every update to an INDEX creates a new "commit" that can be viewed, compared, or reverted to.
Blockchain-Native Version Control: Unlike traditional version control, TELA commits are immutable and permanently stored on-chain. Every version of your app is preserved forever.
Version History Modal
Click the Version History button (clock icon) in the Browser toolbar or use Actions > View History to open the Version History modal for any TELA app.
Timeline View
The left panel shows a chronological timeline of all commits:
| Element | Description |
|---|---|
| Version number | v1, v2, v3... (deployment order) |
| Semantic label | Describes what changed (e.g., "Updated styles.css, app.js") |
| Block height | When this version was deployed |
| TXID | Transaction hash (click to view in Explorer) |
| Current badge | Green badge on the latest version |
Semantic Labels
Hologram automatically generates descriptive labels by analyzing file changes between versions:
| Label Example | Meaning |
|---|---|
| "Initial deployment" | First version (v1) |
| "Updated index.html" | Single file modified |
| "Updated styles.css, app.js" | Multiple files modified |
| "Added favicon.svg" | New file added |
| "Removed old-script.js" | File removed |
| "Updated 5 files" | Many files changed (truncated) |
Semantic labels are generated by comparing consecutive versions. For the last 5 commits, Hologram fetches actual file content to determine what changed.
Detail View
Click any version to see its details in the right panel:
- Block height — When deployed
- Transaction ID — Full TXID (click to copy)
- dURL — Registered URL at this version
- File count — Number of files in this version
- File browser — Tabs to view each file's content
- DOC SCIDs — List of DOC contract IDs
Compare Mode
Toggle Compare Versions to diff two versions:
- Click Compare Versions button
- Select first version (older)
- Select second version (newer)
- View file-by-file diff
File Diff Display
The diff view shows changes organized by file:
| Status | Color | Meaning |
|---|---|---|
| Added | Green | File exists in newer version only |
| Removed | Red | File exists in older version only |
| Modified | Yellow | File changed between versions |
For modified files, Hologram shows line-by-line changes:
- Lines with
-prefix (red) — Removed content - Lines with
+prefix (green) — Added content
Cloning
Clone TELA content to your local filesystem:
scid → Clone latest version
scid@txid → Clone specific commitUse the Clone button in the Version History modal or Actions tab to download files.
Version Pinning
Access specific historical versions using the scid@txid format:
- Open Version History for an INDEX
- Find the commit you want
- Copy its TXID
- Navigate to
scid@txidin the Browser address bar
This allows bookmarking or sharing links to specific versions of an app.
Revert and Clone Actions
From the Version History detail view:
| Action | Description |
|---|---|
| Revert to this version | Re-deploy this version as the current version (requires wallet) |
| Clone this version | Download files from this specific version |
API Reference
// Get commit history with semantic labels
GetCommitHistoryWithLabels(scid string) -> {
success: true,
scid: "abc123...",
commits: [
{
number: 1,
height: 123456,
txid: "def789...",
label: "Initial deployment",
isCurrent: false
},
{
number: 2,
height: 123500,
txid: "ghi012...",
label: "Updated styles.css, app.js",
isCurrent: true
}
],
count: 2
}
// Get basic commit history (faster, generic labels)
GetCommitHistory(scid string) -> {
success: true,
commits: [...],
count: 2
}
// Get content at a specific commit
GetCommitContent(scid string, commitNum int) -> {
success: true,
files: {
"index.html": "<html>...",
"styles.css": "body {...}",
"app.js": "console.log..."
},
docs: ["doc1scid...", "doc2scid..."],
durl: "myapp.tela",
message: "Content retrieved successfully"
}
// Compare two commits
DiffCommits(scid string, fromCommit int, toCommit int) -> {
success: true,
fromCommit: 1,
toCommit: 2,
fileDiffs: [
{
fileName: "styles.css",
status: "modified",
lineDiffs: [
{ line: 5, type: "modified", oldContent: "color: red;", newContent: "color: blue;" }
]
},
{
fileName: "new-file.js",
status: "added",
lineDiffs: []
}
],
summary: "1 file modified, 1 file added",
hasChanges: true
}Performance Notes
- TXID Caching — Transaction IDs are cached after first retrieval to speed up subsequent history loads
- Semantic Labels — Only generated for the last 5 commits to balance detail vs. performance
- Content Fetching — File content is loaded on-demand when you select a commit
Workflow Examples
New App Development
-
Create project directory
mkdir my-tela-app cd my-tela-app -
Create files
<!-- index.html --> <!DOCTYPE html> <html> <head> <link rel="stylesheet" href="styles.css"> </head> <body> <h1>My TELA App</h1> <script src="app.js"></script> </body> </html> -
Start local dev server
- Studio > Serve > Choose Directory
-
Develop with hot reload
- Edit files, see changes instantly
-
Deploy when ready
- Studio > Deploy > Choose Directory > Deploy
Updating Existing App
-
Clone current version
- Actions > Clone > Enter SCID
-
Make changes locally
- Edit files in cloned directory
-
Test with local dev server
- Serve > Choose cloned directory
-
Deploy update
- Deploy > Choose directory
- Use same dURL as before
Updates only work for Updateable content (Ring 2). Immutable content cannot be changed.
Best Practices
- Test locally first — Use Serve before deploying
- Use meaningful names — Help users find your app
- Write good descriptions — Shown in Discover tab
- Choose dURL carefully — Can't be changed after deployment
- Consider immutability — For apps that should never change
- Check file sizes — Keep under 18KB per file
- Avoid
*/in code — Breaks TELA's comment wrapper
Troubleshooting
| Issue | Cause | Solution |
|---|---|---|
| Hot reload not working | File type not watched | Check supported file types |
| Deployment fails | File too large | Enable compression or use shards |
| "Expecting declaration" error | Code contains */ | Use '*' + '/' instead |
| dURL not resolving | Gnomon not synced | Wait for indexing to complete |