The AI workspace
that actually works.
Break free from the limitations of traditional IDEs and unleash your creativity with Relectric, the AI-powered workspace designed for builders, creators, and tinkerers. Seamlessly integrate your tools, automate workflows, and let your ideas take shape like never before.
class DJTool(RelectricTool):
@RelectricTool.function
def start_remixing(self, genre):
relectric.automation.queueJob(
lambda: relectric.chatagent
.sendMessage(f"remix {genre}"),
interval=1800
)
class FluxKlein(RelectricTool):
def build_ui(self):
with ui.Column():
self.prompt = ui.Textbox()
self.img = ui.Image()
self.btn = ui.Button("Generate")
self.btn.click(self.run)
class GodotPlaytest(RelectricTool):
@RelectricTool.function
def run_playtest(self, path):
relectric.terminal.execute(
f"godot --path {path}")
shot = relectric.workspace.readFile(
"screenshot.png")
class MobileAutomation(RelectricTool):
@RelectricTool.function
def run_task(self, instruction):
relectric.terminal.execute(
"adb shell screencap")
relectric.chatagent.sendMessage(
instruction, images=[img])
class ACEStepCover(RelectricTool):
@RelectricTool.function
def generate_cover(self, audio):
result = self.pipeline(
audio, lyrics=self.lyrics,
strength=0.85,
variants=3)
class WebSearch(RelectricTool):
@RelectricTool.function
def search(self, query):
results = relectric.browser.search(
query, max_results=10)
return [{"title": r.title,
"url": r.url} for r in results]
class DJTool(RelectricTool):
@RelectricTool.function
def start_remixing(self, genre):
relectric.automation.queueJob(
lambda: relectric.chatagent
.sendMessage(f"remix {genre}"),
interval=1800
)
class FluxKlein(RelectricTool):
def build_ui(self):
with ui.Column():
self.prompt = ui.Textbox()
self.img = ui.Image()
self.btn = ui.Button("Generate")
self.btn.click(self.run)
class GodotPlaytest(RelectricTool):
@RelectricTool.function
def run_playtest(self, path):
relectric.terminal.execute(
f"godot --path {path}")
shot = relectric.workspace.readFile(
"screenshot.png")
class MobileAutomation(RelectricTool):
@RelectricTool.function
def run_task(self, instruction):
relectric.terminal.execute(
"adb shell screencap")
relectric.chatagent.sendMessage(
instruction, images=[img])
class ACEStepCover(RelectricTool):
@RelectricTool.function
def generate_cover(self, audio):
result = self.pipeline(
audio, lyrics=self.lyrics,
strength=0.85,
variants=3)
class WebSearch(RelectricTool):
@RelectricTool.function
def search(self, query):
results = relectric.browser.search(
query, max_results=10)
return [{"title": r.title,
"url": r.url} for r in results]
class GodotProject(RelectricTool):
@RelectricTool.function
def create_project(self, name):
relectric.workspace.writeFile(
f"{name}/project.godot",
self._template(name))
return f"Created {name}"
class LyricsEditor(RelectricTool):
@RelectricTool.function
def rewrite(self, lyrics, theme):
prompt = f"Rewrite as {theme}"
result = relectric.llamacpp.prompt(
prompt + "\n" + lyrics,
temperature=0.9)
return result
class GPUMonitor(RelectricTool):
def build_ui(self):
with ui.Column():
self.info = ui.JSON()
self.btn = ui.Button("Refresh")
@RelectricTool.function
def get_gpu_info(self):
return execute("nvidia-smi")
class ScreenshotTool(RelectricTool):
@RelectricTool.function
def capture(self, region=None):
img = pyautogui.screenshot(
region=region)
path = "capture.png"
img.save(path)
return path
class YTDLPTool(RelectricTool):
@RelectricTool.function
def download(self, url):
out = relectric.terminal.execute(
f"yt-dlp -x --audio-format "
f"mp3 -o out.mp3 {url}")
return out["stdout"]
class ParodyGenerator(RelectricTool):
@RelectricTool.function
def generate(self, song, theme):
relectric.chatagent.sendMessage(
f"Download '{song}'")
relectric.chatagent.sendMessage(
f"Rewrite lyrics: {theme}")
relectric.chatagent.sendMessage(
"Generate the cover")
class GodotProject(RelectricTool):
@RelectricTool.function
def create_project(self, name):
relectric.workspace.writeFile(
f"{name}/project.godot",
self._template(name))
return f"Created {name}"
class LyricsEditor(RelectricTool):
@RelectricTool.function
def rewrite(self, lyrics, theme):
prompt = f"Rewrite as {theme}"
result = relectric.llamacpp.prompt(
prompt + "\n" + lyrics,
temperature=0.9)
return result
class GPUMonitor(RelectricTool):
def build_ui(self):
with ui.Column():
self.info = ui.JSON()
self.btn = ui.Button("Refresh")
@RelectricTool.function
def get_gpu_info(self):
return execute("nvidia-smi")
class ScreenshotTool(RelectricTool):
@RelectricTool.function
def capture(self, region=None):
img = pyautogui.screenshot(
region=region)
path = "capture.png"
img.save(path)
return path
class YTDLPTool(RelectricTool):
@RelectricTool.function
def download(self, url):
out = relectric.terminal.execute(
f"yt-dlp -x --audio-format "
f"mp3 -o out.mp3 {url}")
return out["stdout"]
class ParodyGenerator(RelectricTool):
@RelectricTool.function
def generate(self, song, theme):
relectric.chatagent.sendMessage(
f"Download '{song}'")
relectric.chatagent.sendMessage(
f"Rewrite lyrics: {theme}")
relectric.chatagent.sendMessage(
"Generate the cover")
Tool-First Architecture
A dual-interface system: every tool has a UI and agent-callable functions.
Dual Interface
Every tool exposes both a human-facing UI and agent-callable functions. Use it manually or let the AI orchestrate.
Agent Orchestration
The chat agent chains tools into multi-step workflows — build a game, playtest it, fix bugs, all autonomously.
Self-Hosted & Local
Runs on your hardware with local LLM inference via llama.cpp. Full control over data, GPU, and execution.
How It Works
Three layers working together
Electron Desktop
The Electron shell manages windows, the local LLM server, terminal sessions, browser proxies, file system access, and managing conversations.
Python Runtime
A FastAPI WebSocket server auto-loads tools from .tools/,
manages job queues, watches for hot-reload, and streams stdout to connected clients.
SDK & Tools
Tools are Python classes with a Gradio-like UI and @RelectricTool.function
decorated methods. The host bridge proxies calls between Python tools and the desktop.
What You Can Build
Real tools built by the community, not toy demos
Game Development
Full Godot game pipeline: project scaffolding, scene building, asset management, automated playtesting with VLM visual assertions, and iterative bug fixing.
Music Production
AI music covers with ACE-Step, lyrics editing via LLM, YouTube downloads, audio playback, and automated DJ job queuing for continuous remix generation.
Mobile Automation
ADB device control, automated UI testing with VLM-based visual assertions, screen capture & analysis, and natural-language task execution on Android.
Image Generation
Text-to-image with FLUX.2 Klein, img2img support, configurable inference steps and guidance, and workspace-relative output management.
The Relectric SDK
Everything your tool needs, built in
relectric.workspace
Read, write, search, list, rename, copy, and delete files across the workspace.
relectric.terminal
Execute shell commands with stdout/stderr capture and working directory control.
relectric.browser
Web search via DuckDuckGo with configurable result limits and timeouts.
relectric.chatagent
Send messages (with images) to the AI agent, manage conversations programmatically.
relectric.llamacpp
Start/stop/query the local llama.cpp server, send prompts with temperature control.
relectric.automation
FIFO job queue with blocking semaphore, interval repeats, persistence, and job management.
relectric.settings
Get and set layout configuration and workspace settings programmatically.
Hot Reload
Edit tool source — the runtime auto-reloads and broadcasts UI updates to all clients.
Platform Tools
Tools available on the platform
Web Search
DuckDuckGo search with result extraction
Chat Agent
Multimodal LLM with tool calling & context
ACE-Step Cover
AI music cover generation with lyrics
FLUX.2 Klein
Text-to-image & img2img generation
Godot Suite
Full game dev: scaffold, build, test, iterate
Android Automation
ADB control with VLM visual testing
GPU Monitor
NVIDIA/AMD VRAM & utilisation tracking
Automation
FIFO job queue with blocking & repeats