Visual agent IDE for the Firefly Agentic framework.
Firefly Studio is a browser-based development environment for building, testing, and debugging GenAI agent pipelines. It provides a visual canvas where you drag and connect agent nodes, configure them through a side panel, and see generated Python code update in real time. An integrated AI assistant helps you build pipelines through natural language.
- Installation
- Quick Start
- CLI Reference
- Configuration
- Settings & Provider Credentials
- Architecture
- The Canvas
- Node Types
- Code Generation
- AI Assistant
- Project Management
- Pipeline Execution
- Checkpoints & Time-Travel Debugging
- Evaluation Lab
- Experiments
- File Browser
- Deploy
- Keyboard Shortcuts
- Input/Output Boundary Nodes
- Project Runtime
- Per-Project API
- Tunnel Exposure (Share)
- REST API Reference
- WebSocket API Reference
- Desktop App
- Programmatic Usage
- Frontend Development
Firefly Studio is included in the [studio] extra:
# Install with Studio support
pip install "fireflyframework-agentic[studio]"
# Or with UV
uv add "fireflyframework-agentic[studio]"
# Or install everything
pip install "fireflyframework-agentic[all]"The [studio] extra installs:
| Dependency | Purpose |
|---|---|
fastapi |
REST API and WebSocket server |
uvicorn[standard] |
ASGI server |
httpx |
HTTP client for internal API calls |
The Studio frontend is pre-built and bundled inside the published wheel, so no Node.js is required when installing from PyPI.
Running from a source checkout? The git repository does not ship the built frontend. After cloning, build it once with:
uv run python scripts/build_studio.pyWithout this step,
firefly studiowill return{"detail":"Not Found"}for every page. See Frontend Development for details and the Contributing guide for full setup.
# Launch Studio (opens browser automatically)
firefly studio
# Or from Python
python -c "from fireflyframework_agentic_studio import launch_studio; launch_studio()"Studio starts at http://127.0.0.1:8470 by default and opens your browser.
On first launch, a Setup Wizard guides you through configuring your
AI provider credentials (OpenAI, Anthropic, Google, etc.) and default model
settings. You can skip the wizard and configure providers later via the
Settings modal (Cmd/Ctrl + ,).
After setup, you'll see a dark-themed IDE with a visual canvas, a component palette on the left, a configuration panel on the right, and a bottom panel with code generation, console, timeline, and AI assistant tabs.
The firefly command is installed as a console script entry point.
firefly studio [OPTIONS]
firefly [OPTIONS] # "studio" is the default subcommand
firefly expose [OPTIONS] # expose Studio via Cloudflare Tunnel
| Flag | Default | Description |
|---|---|---|
--port PORT |
8470 |
Port the Studio server listens on |
--host HOST |
127.0.0.1 |
Address the server binds to |
--no-browser |
false |
Do not open the browser automatically |
--dev |
false |
Enable development mode (verbose logging) |
# Default launch
firefly studio
# Custom port, no browser
firefly studio --port 9000 --no-browser
# Bind to all interfaces (for remote access)
firefly studio --host 0.0.0.0
# Shorthand (omit "studio")
firefly --port 9000Studio uses Pydantic Settings with the FIREFLY_STUDIO_ prefix for
environment variable overrides.
| Field | Type | Default | Env Variable |
|---|---|---|---|
host |
str |
"127.0.0.1" |
FIREFLY_STUDIO_HOST |
port |
int |
8470 |
FIREFLY_STUDIO_PORT |
open_browser |
bool |
True |
FIREFLY_STUDIO_OPEN_BROWSER |
dev_mode |
bool |
False |
FIREFLY_STUDIO_DEV_MODE |
projects_dir |
Path |
~/.firefly-studio/projects |
FIREFLY_STUDIO_PROJECTS_DIR |
log_level |
str |
"info" |
FIREFLY_STUDIO_LOG_LEVEL |
export FIREFLY_STUDIO_PORT=9000
export FIREFLY_STUDIO_PROJECTS_DIR=/data/studio/projects
export FIREFLY_STUDIO_DEV_MODE=true
firefly studioStudio provides a built-in Settings system for managing AI provider credentials and model defaults directly from the UI — no manual environment variables required.
Settings are persisted at ~/.firefly-studio/settings.json with 0600
(owner-only) file permissions. On startup, saved API keys are injected
into os.environ so that PydanticAI picks them up via its standard
provider env vars. Existing environment variables always take
precedence over saved settings.
On first launch (no settings.json found), a 5-step wizard appears:
- Welcome — Introduction to Studio
- Select Providers — Choose which providers to configure (OpenAI pre-selected)
- Enter Keys — Password inputs for selected providers only
- Default Model — Set default model string, temperature, and retries
- Done — Confirmation and "Open Studio" button
You can skip the wizard at any time — Studio works without credentials if you've set API keys as environment variables.
Open the Settings modal anytime via:
- Gear icon in the top bar
- Keyboard shortcut:
Cmd/Ctrl + , - Command palette: type "Settings"
The modal has two tabs:
| Tab | Contents |
|---|---|
| Provider Credentials | API key inputs for each provider, "Configured" badge for active keys |
| Model Defaults | Default model string, temperature slider (0–2), retries count |
| Provider | Credential Fields | Env Variable(s) |
|---|---|---|
| OpenAI | API Key | OPENAI_API_KEY |
| Anthropic | API Key | ANTHROPIC_API_KEY |
| Google Gemini | API Key | GOOGLE_API_KEY |
| Groq | API Key | GROQ_API_KEY |
| Mistral | API Key | MISTRAL_API_KEY |
| DeepSeek | API Key | DEEPSEEK_API_KEY |
| Cohere | API Key | CO_API_KEY |
| Azure OpenAI | API Key + Endpoint URL | AZURE_OPENAI_API_KEY, AZURE_OPENAI_ENDPOINT |
| Amazon Bedrock | Access Key + Secret + Region | AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_DEFAULT_REGION |
| Ollama | Base URL (no key needed) | OLLAMA_BASE_URL |
| Endpoint | Method | Description |
|---|---|---|
/api/settings |
GET |
Current settings (API keys masked) |
/api/settings |
POST |
Save/merge settings |
/api/settings/status |
GET |
Check first-start and setup status |
API keys in GET responses are always masked (e.g., ****abc1). The
POST endpoint uses merge semantics: null credential fields preserve
existing values; non-null values overwrite.
Studio is composed of a Python backend (FastAPI) and a SvelteKit 5 frontend that compiles to a static SPA and is bundled inside the Python package.
Browser
|
+---------+---------+
| SvelteKit SPA | (bundled in studio/static/)
| @xyflow/svelte |
| Svelte 5 runes |
+---------+---------+
|
REST + WebSocket
|
+---------+---------+
| FastAPI Backend |
| |
| /api/settings | Provider credentials & model defaults
| /api/projects | Project CRUD
| /api/registry | Agent/tool/pattern discovery
| /api/codegen | Python code generation
| /api/monitoring | Usage metrics
| /api/checkpoints | Checkpoint management
| /api/evaluate | Evaluation lab
| /api/experiments | A/B experiments
| /api/files | Project file browsing
| /ws/execution | Pipeline execution (WebSocket)
| /ws/assistant | AI assistant chat (WebSocket)
+---------+---------+
|
+---------+---------+
| Framework Core |
| Agents, Tools, |
| Pipelines, etc. |
+--------------------+
| Decision | Choice | Rationale |
|---|---|---|
| Frontend framework | SvelteKit 5 | Runes reactivity, small bundles, excellent DX |
| Canvas library | @xyflow/svelte | Mature node graph library with drag/drop, zoom |
| Backend | FastAPI | Async, WebSocket support, Pydantic integration |
| Delivery | Bundled SPA | Single pip install, no Node.js in production |
| Real-time | WebSocket | Bidirectional execution events and AI chat |
The canvas is the central workspace. Nodes represent pipeline components and edges represent data flow between them.
- Add nodes -- Drag from the left palette, or press
Cmd+Kand type - Connect -- Drag from a source handle to a target handle
- Select -- Click a node to open its configuration in the right panel
- Delete -- Select a node and press
DeleteorBackspace - Pan -- Click and drag on empty canvas space
- Zoom -- Scroll wheel or pinch gesture
- Minimap -- Bottom-right corner for overview navigation
When the canvas has no nodes, an overlay displays a call-to-action prompting you to drag components or use the command palette.
During pipeline execution, nodes show real-time state:
| State | Visual |
|---|---|
| Idle | Default appearance |
| Running | Rotating conic-gradient border |
| Complete | Green checkmark badge |
| Error | Red error indicator |
Studio supports ten node types that map to framework components:
| Node Type | Framework Class | Description |
|---|---|---|
| Agent | FireflyAgent / AgentStep |
An LLM-powered agent with model, instructions, and tools |
| Tool | BaseTool / CallableStep |
A tool that an agent can invoke |
| Reasoning | ReasoningPattern / ReasoningStep |
A reasoning pattern (ReAct, CoT, etc.) |
| Pipeline Step | CallableStep |
A generic pass-through step |
| Fan Out | FanOutStep |
Split input into parallel branches |
| Fan In | FanInStep |
Merge parallel branches back together |
| Condition | BranchStep |
A branching condition in the pipeline |
| Memory | CallableStep |
Store, retrieve, or clear values in context memory |
| Validator | CallableStep |
Validate input against rules (not_empty, is_string, etc.) |
| Custom Code | CallableStep |
Execute user-authored async Python code |
| Input | CallableStep |
Pipeline entry point (triggers: manual, HTTP, queue, schedule, file_upload) |
| Output | CallableStep |
Pipeline exit point (destinations: response, queue, webhook, store, multi) |
Click a node to open the configuration panel on the right. Available fields depend on the node type:
- Label -- Display name
- Model -- LLM model string (e.g.,
openai:gpt-4o) - Instructions -- System prompt / instructions
- Additional fields -- Type-specific configuration
The Code tab in the bottom panel shows Python code generated from the current canvas graph. Code updates automatically when nodes or edges change (debounced by 800ms).
- Auto-sync -- Toggle on/off with the Auto button
- Manual regenerate -- Click the refresh button
- Copy to clipboard -- Click the copy button
- Syntax highlighting -- Python-aware syntax coloring (One Dark theme)
- Line numbers -- Numbered lines for easy reference
from fireflyframework_agentic.agents import FireflyAgent
# Agent definitions
agent_1 = FireflyAgent(
name="agent-1",
model="openai:gpt-4o",
instructions="...",
)
# Pipeline (when edges exist)
from fireflyframework_agentic.pipeline.builder import PipelineBuilder
pipeline = (
PipelineBuilder("studio-pipeline")
.add_node("agent-1", AgentStep(agent_1))
.add_node("agent-2", AgentStep(agent_2))
.chain("agent-1", "agent-2")
.build()
)The Chat tab in the bottom panel provides an AI-powered assistant that can help you build pipelines through natural language conversation.
The assistant can:
- Add, remove, and configure nodes on the canvas
- Connect nodes with edges
- List current nodes and edges
- Explain pipeline concepts
- Suggest pipeline architectures
The AI assistant requires a configured LLM provider. You can configure
credentials through the Settings modal (Cmd/Ctrl + ,) or via
environment variables:
OPENAI_API_KEY=sk-...
ANTHROPIC_API_KEY=sk-ant-...
GOOGLE_API_KEY=...The assistant uses the framework's default model (FIREFLY_AGENTIC_DEFAULT_MODEL).
The assistant has access to six canvas manipulation tools:
| Tool | Description |
|---|---|
add_node |
Add a node (agent, tool, reasoning, condition) |
connect_nodes |
Create an edge between two nodes |
configure_node |
Update a node's model, instructions, or label |
remove_node |
Remove a node from the canvas |
list_nodes |
List all current nodes |
list_edges |
List all current edges |
Studio persists projects as directories on disk under the configured
projects_dir (default: ~/.firefly-studio/projects/).
~/.firefly-studio/projects/
my-project/
project.json # name, description, created_at
pipelines/
main-pipeline.json # saved graph (nodes + edges)
backup.json
another-project/
project.json
pipelines/
| Action | API | Description |
|---|---|---|
| List | GET /api/projects |
List all projects |
| Create | POST /api/projects |
Create a new project |
| Delete | DELETE /api/projects/{name} |
Delete a project |
| Save pipeline | POST /api/projects/{project}/pipelines/{name} |
Save graph |
| Load pipeline | GET /api/projects/{project}/pipelines/{name} |
Load graph |
The execution system uses a WebSocket connection at /ws/execution for
real-time pipeline execution with event streaming.
| Event | Fields | Description |
|---|---|---|
node_start |
node_id, pipeline_name |
Node began executing |
node_complete |
node_id, pipeline_name, latency_ms |
Node finished |
node_error |
node_id, pipeline_name, error |
Node failed |
node_skip |
node_id, pipeline_name, reason |
Node skipped |
pipeline_complete |
pipeline_name, success, duration_ms |
Pipeline finished |
- The frontend sends the current canvas graph (nodes + edges + metadata) via WebSocket.
- The backend compiles the graph into a
PipelineEngineusing the graph-to-engine compiler. - The engine runs asynchronously, and the
StudioEventHandlercollects events. - Events are streamed back to the frontend in real time for node state visualization.
- On completion, a
pipeline_resultmessage includes success status, output, and duration.
In debug mode, checkpoints are automatically created at each node completion for time-travel debugging via the Timeline tab.
The checkpoint system captures pipeline state at each node for debugging and replay.
| Endpoint | Description |
|---|---|
GET /api/checkpoints |
List all checkpoints |
GET /api/checkpoints/{index} |
Get a specific checkpoint |
POST /api/checkpoints/fork |
Fork execution from a checkpoint |
POST /api/checkpoints/diff |
Diff two checkpoints |
DELETE /api/checkpoints |
Clear all checkpoints |
Each checkpoint captures:
index-- Sequential checkpoint numbernode_id-- Node that created itstate-- Captured pipeline stateinputs-- Node inputs at that pointtimestamp-- ISO 8601 timestampbranch_id-- Branch identifier (for forked executions)parent_index-- Parent checkpoint (for forks)
The Evaluation Lab lets you test your pipeline against JSONL datasets to measure quality.
- Upload a dataset -- JSONL file where each line has
"input"and optionally"expected_output"fields - Select a dataset from the project's dataset list
- Run evaluation -- Compiles the current canvas graph and runs each test case through the pipeline
- View results -- Pass/fail rate, individual test results with input/expected/actual comparisons
| Endpoint | Description |
|---|---|
POST /api/projects/{name}/datasets/upload |
Upload a JSONL dataset |
GET /api/projects/{name}/datasets |
List datasets for a project |
POST /api/evaluate/run |
Run a pipeline against a dataset |
Experiments let you define A/B comparisons between pipeline variants.
- Create experiments with named variants and traffic allocation
- Run variants manually against the current canvas pipeline
- View results per variant
Advanced features (automatic traffic splitting, statistical significance) are planned for a future release.
| Endpoint | Description |
|---|---|
GET /api/projects/{name}/experiments |
List experiments |
POST /api/projects/{name}/experiments |
Create an experiment |
GET /api/projects/{name}/experiments/{id} |
Get experiment details |
DELETE /api/projects/{name}/experiments/{id} |
Delete an experiment |
POST /api/projects/{name}/experiments/{id}/run |
Run a variant |
The Files page provides a read-only file explorer for project directories.
- Recursive file listing with directory tree
- File content preview for text files
- Security: path traversal protection, binary file rejection, 2 MiB size limit
| Endpoint | Description |
|---|---|
GET /api/projects/{name}/files |
Recursive file listing |
GET /api/projects/{name}/files/{path} |
Read file content |
The Deploy page helps you export your pipeline:
- Python Script -- Generate a standalone Python script from the current canvas graph using the codegen API
- Docker Container -- Coming soon
- REST API -- Coming soon
- Cloud Function -- Coming soon
| Shortcut | Action |
|---|---|
Cmd/Ctrl + K |
Open command palette |
Cmd/Ctrl + , |
Open settings |
? |
Toggle keyboard shortcuts help |
Cmd/Ctrl + / |
Toggle AI assistant panel |
| Shortcut | Action |
|---|---|
Cmd/Ctrl + Enter |
Run pipeline |
Cmd/Ctrl + Shift + D |
Debug pipeline |
| Shortcut | Action |
|---|---|
Delete / Backspace |
Delete selected node |
Cmd/Ctrl + D |
Duplicate selected node |
Cmd/Ctrl + + |
Zoom in |
Cmd/Ctrl + - |
Zoom out |
The command palette (Cmd+K) provides fuzzy search across commands
in five categories: Navigation, Add Node, Settings, Pipeline Actions,
and View.
Input and Output nodes define pipeline entry and exit points, inspired by BPM start/end events. They enable auto-generated REST APIs, queue consumers, scheduled triggers, and structured schema validation.
- Input node -- Configure a trigger type (
manual,http,queue,schedule,file_upload) and an optional JSON Schema for input validation. - Output node -- Configure a destination type (
response,queue,webhook,store,multi) and an optional response schema.
A pipeline must have exactly one Input node and at least one Output node when boundary nodes are used.
See the Input/Output Nodes Guide for full configuration reference.
The runtime manages background processes for a project: queue consumers (Kafka, RabbitMQ, Redis), cron schedulers (APScheduler), and the tunnel. Control it from the top bar:
- Play button -- Start the runtime
(
POST /api/projects/{name}/runtime/start) - Stop button -- Stop the runtime
(
POST /api/projects/{name}/runtime/stop) - Status indicator shows
running/stopped
When started, the runtime reads the Input node configuration and automatically starts the appropriate consumers or scheduler.
Every project exposes auto-generated REST endpoints:
| Endpoint | Description |
|---|---|
POST /api/projects/{name}/run |
Synchronous pipeline execution |
POST /api/projects/{name}/run/async |
Async execution |
GET /api/projects/{name}/runs/{id} |
Poll async result |
POST /api/projects/{name}/upload |
File upload trigger |
GET /api/projects/{name}/schema |
Input/output schema |
A GraphQL endpoint is also available at /api/graphql (requires
strawberry-graphql).
See the Project API Guide for curl examples and client code in Python and TypeScript.
The Share button in the top bar creates a Cloudflare Quick Tunnel, giving your local Studio a public HTTPS URL without configuration or a Cloudflare account.
- Click Share to start the tunnel
- The public URL appears and is copied to your clipboard
- Click again to stop the tunnel
Requires cloudflared to be installed. Also available via CLI:
firefly expose --port 8470See the Tunnel Exposure Guide for installation and security details.
All REST endpoints are prefixed with /api/.
GET /api/health
Returns {"status": "ok", "version": "26.02.07"}.
GET /api/settings # Current settings (keys masked)
POST /api/settings # Save / merge settings
GET /api/settings/status # First-start and setup status check
{
"credentials": {"openai_api_key": "sk-...", "anthropic_api_key": null},
"model_defaults": {"default_model": "openai:gpt-4o", "temperature": 0.7, "retries": 3},
"setup_complete": true
}Fields set to null are preserved from existing settings. Non-null
values overwrite.
{"first_start": false, "setup_complete": true}GET /api/registry/agents # List registered agents
GET /api/registry/tools # List registered tools
GET /api/registry/patterns # List registered reasoning patterns
GET /api/projects # List all
POST /api/projects # Create
DELETE /api/projects/{name} # Delete
POST /api/projects/{project}/pipelines/{pipeline} # Save pipeline
GET /api/projects/{project}/pipelines/{pipeline} # Load pipeline
{"name": "my-project", "description": "Optional description"}{"graph": {"nodes": [...], "edges": [...]}}POST /api/codegen/to-code
{
"nodes": [
{"id": "agent-1", "type": "agent", "label": "Classifier", "data": {"model": "openai:gpt-4o"}}
],
"edges": [
{"id": "e1", "source": "agent-1", "target": "agent-2"}
]
}{"code": "from fireflyframework_agentic.agents import FireflyAgent\n..."}GET /api/projects/{name}/files # List all files
GET /api/projects/{name}/files/{path} # Read file content
POST /api/projects/{name}/datasets/upload # Upload JSONL dataset
GET /api/projects/{name}/datasets # List datasets
POST /api/evaluate/run # Run pipeline against dataset
{"project": "my-project", "dataset": "tests.jsonl", "graph": {"nodes": [...], "edges": [...]}}GET /api/projects/{name}/experiments # List experiments
POST /api/projects/{name}/experiments # Create experiment
GET /api/projects/{name}/experiments/{id} # Get experiment
DELETE /api/projects/{name}/experiments/{id} # Delete experiment
POST /api/projects/{name}/experiments/{id}/run # Run variant
GET /api/monitoring/usage # Token usage, costs, latency summary
GET /api/checkpoints # List all
GET /api/checkpoints/{index} # Get by index
POST /api/checkpoints/fork # Fork from checkpoint
POST /api/checkpoints/diff # Diff two checkpoints
DELETE /api/checkpoints # Clear all
WS /ws/execution
{"action": "run", "graph": {"nodes": [...], "edges": [...], "metadata": {...}}, "inputs": "optional user input"}
{"action": "debug", "graph": {"nodes": [...], "edges": [...]}, "inputs": "optional"}{"type": "node_start", "node_id": "agent-1", "pipeline_name": "my-pipeline"}
{"type": "node_complete", "node_id": "agent-1", "pipeline_name": "my-pipeline", "latency_ms": 1234.5}
{"type": "node_error", "node_id": "agent-1", "pipeline_name": "my-pipeline", "error": "..."}
{"type": "pipeline_complete", "pipeline_name": "my-pipeline", "success": true, "duration_ms": 5678.9}
{"type": "pipeline_result", "success": true, "output": "...", "duration_ms": 5678.9, "pipeline_name": "my-pipeline"}WS /ws/assistant
{"action": "chat", "message": "Add an agent node for classification"}
{"action": "clear_history"}{"type": "token", "content": "I'll"}
{"type": "token", "content": " add"}
{"type": "tool_call", "tool": "add_node", "args": {"type": "agent", "label": "Classifier"}}
{"type": "tool_result", "tool": "add_node", "result": "Added node agent-1"}
{"type": "done"}Firefly Studio can be packaged as a standalone desktop application using Tauri 2 + PyInstaller. The desktop app bundles the Python server as a sidecar binary.
Tauri (Rust + WebView)
|
spawn sidecar
|
PyInstaller bundle
(FastAPI + Studio)
|
http://127.0.0.1:<port>
- Tauri finds a free port, spawns the PyInstaller sidecar
- Polls
/api/healthuntil the server is ready (30s timeout) - Navigates the webview to
http://127.0.0.1:<port> - On window close, kills the sidecar process
# Build the PyInstaller sidecar
uv run pyinstaller studio-desktop/pyinstaller/firefly_studio.spec --noconfirm
# Build the Tauri desktop app (requires Rust toolchain)
cd studio-desktop && cargo tauri buildThe desktop build is automated via .github/workflows/desktop.yml:
- Triggered by
desktop-v*tags - Builds for macOS (arm64 + x86), Linux, and Windows
- Produces
.dmg,.AppImage,.deb,.msi,.exeinstallers
from fireflyframework_agentic_studio import launch_studio
# Starts the server and opens the browser
launch_studio()from fireflyframework_agentic_studio.config import StudioConfig
from fireflyframework_agentic_studio.server import create_studio_app
# Create a configured app instance
config = StudioConfig(port=9000, open_browser=False)
app = create_studio_app(config=config)
# Use with any ASGI server
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=9000)from fireflyframework_agentic_studio.config import StudioConfig
from fireflyframework_agentic_studio.server import create_studio_app
config = StudioConfig(projects_dir="/data/my-studio-projects")
app = create_studio_app(config=config)from pathlib import Path
from fireflyframework_agentic_studio.projects import ProjectManager
manager = ProjectManager(Path("/data/projects"))
# Create a project
info = manager.create("my-project", description="A new project")
# Save a pipeline
graph = {"nodes": [...], "edges": [...]}
manager.save_pipeline("my-project", "main", graph)
# Load it back
loaded = manager.load_pipeline("my-project", "main")The frontend source lives in studio-frontend/ and is a SvelteKit 5 SPA.
- Node.js 20+
- npm or pnpm
cd studio-frontend
npm installnpm run devThis starts the Vite dev server at http://localhost:5173 with hot module
replacement. The backend CORS middleware allows this origin.
uv run python scripts/build_studio.pyRuns npm install (if needed), builds the SPA, and copies the output
into the Python package's static/ directory.
| Technology | Version | Purpose |
|---|---|---|
| SvelteKit | 2.x | Application framework |
| Svelte | 5.x | UI components (runes syntax) |
| @xyflow/svelte | 1.x | Node graph canvas |
| Tailwind CSS | 4.x | Utility-first styling |
| Lucide Svelte | Latest | Icon library |
| Vite | 7.x | Build tool |
studio-frontend/
src/
routes/
+page.svelte # Redirect to /build
+layout.svelte # App shell wrapper
build/+page.svelte # Visual canvas (main workspace)
evaluate/+page.svelte # Evaluation page
experiments/+page.svelte
deploy/+page.svelte
monitor/+page.svelte
files/+page.svelte
lib/
components/
layout/ # AppShell, Sidebar, TopBar, CommandPalette,
# SettingsModal, FirstStartWizard
canvas/ # Canvas, NodePalette, node components
panels/ # BottomPanel, ConfigPanel, ChatTab, CodeTab
stores/ # Svelte stores (pipeline, execution, ui, chat, settings)
api/ # REST client, WebSocket client
execution/ # Execution bridge
types/ # TypeScript type definitions
app.css # Global styles and CSS custom properties
Studio uses a dark, premium developer-tool aesthetic:
- Background:
#0f0f17(deep blue-black) - Surface:
#16161e(card backgrounds) - Accent:
#ff6b35(warm orange) - Font: JetBrains Mono (monospace), Inter (UI)
- Icons: Lucide (no emojis)
- Borders:
1px solid #2a2a3a - Reduced motion: Respects
prefers-reduced-motion
Copyright 2026 Firefly Software Solutions Inc. Licensed under the Apache License 2.0.