A workspace brings a group and its apps into one collaborative environment. Members use the same software over synchronized data.
Osvauld is the protocol underneath. It provides identity, permissions, synchronization, and an app runtime—so your AI can create and modify apps directly inside the workspace.
Permission is cryptographic proof.
Permits work like UCAN-style tokens: signed capability grants that say exactly what an identity can do—access, write, synchronize, or delegate. Authorization is based on capabilities and can be verified offline.
Shared data is the native environment.
Local state remains useful offline. Changes synchronize through the workspace’s sovereign node and merge safely when participants reconnect.
Ask for the workflow, get a collaborative app.
AI can write a small Lua app directly inside the workspace. Identity, permissions, storage, synchronization, and UI are already provided—the new app begins as part of the group’s environment.
AI can program the workspace.
Agents can call Lua functions, perform actions, change application logic, and create new apps directly instead of pretending to be a person clicking pixels.
Authority, under your control.
Each workspace has a sovereign node that keeps the group reachable and coordinates synchronization. It can be a Raspberry Pi, phone, laptop, or server—with no static IP, domain, or cloud platform required.
Maintain your own software.
The group owns and evolves its Lua source instead of renting a fixed application. Changes synchronize to participants and hot reload without a traditional server release pipeline.
THE SHIFT
No app stack to stitch.
No cloud stack to deploy.
Describe the workflow.
Run the app.
ONE SHARED SUBSTRATE
Shared data. Lua logic. That’s the app.
Your AI gets a programmable Lua layer where it can call functions, perform actions, modify code, and create new apps. Those apps run inside the workspace and work directly with its synchronized data.
local chat = doc:open("chat")
local functionsend(text)
chat:insert({ "messages" }, doc.map({
id = uuid(), text = text
})) -- synchronizedendreturn function()
local rows = {}
for i = 1, #chat.messages do
rows[#rows + 1] = message_view(chat.messages[i])
endreturn ui.col({ rows, composer(send) })
end
LUA APP→UI TREE→LAYOUT→VECTOR PIXELS
THE SYSTEM
WORKSPACE APPS
Collaborative Lua apps created and changed around the group’s workflows
APP RUNTIME
Runs sandboxed apps and turns their UI descriptions into interactive software
SHARED STATE
Workspace data synchronized between members of the group
IDENTITY + PERMITS
Your keys, encrypted storage, and offline-verifiable access under your control