Member workspace
The company account is the workspace. The admin (the company’s owner) sets how members sign in and what they
can create on their own. Each member gets a simple portal at /app for their own agents.
There is no desktop app to install. The portal installs as an app (PWA) on Windows, macOS, Linux, Android and iPhone, and it can show decision requests as device notifications. The member’s own AI (Claude, ChatGPT, Codex, Cursor, Gemini, VS Code, OpenCode) keeps connecting through the platform MCP, exactly as before.
What the member sees
Section titled “What the member sees”The portal shows only what belongs to the person, even when that person is an admin:
- The menu has eight items: Início, Minhas issues, Meus agentes, Organograma, Decisões, Caixa de entrada, Conectar minha IA, Meus acessos. Each person sees their own issues; the company’s board is in the console, read-only (issues.md).
- Everything else (building agents, catalog, plugins, queues, budgets, teams, governance…) is in the console (
/ui), for admins. - In the portal, other addresses go back to Início. Projects, agents, Digital employees and tasks open only as a detail page, from a link.
- The global search returns agents, Digital employees, tasks, issues and projects: what opens in the portal.
- “Primeiros passos” are the person’s own: connect your AI, create a personal agent, create the first issue, choose where you get decisions.
| Page | What it does |
|---|---|
| Início | Shows decisions waiting for you, your agents working right now (and on what), the tasks you asked for, and this month’s cost. |
| Meus agentes | Lists your personal Digital employees and the team ones you manage. Each one shows its model, harness, level and specialists. A third section, Agents I created or maintain, lists your regular agents (not Digital employees): your personal ones, those of teams you maintain, and those you created, in the portal or through your AI over MCP. Each shows its avatar, status, version, team, next scheduled run and cost over 30 days. From here you create a personal agent, ask your AI to create one, or ask to promote one to the team. |
| Organograma | Your own structure: you at the top (CEO if you are the company admin, Staff otherwise) and, below, your agents: the personal Digital employees, the ones you manage or own, and your regular agents (the same list as Agents I created or maintain, shown as links that can’t be dragged). Each card shows model, harness, level, status and the current task, and who reports to whom is kept. Drag an agent onto another to change who it reports to; drop it on your own card to have it report directly to you. The company-wide org chart, with every team, is in the console. |
| Decisões | Unchanged. |
| Caixa de entrada | Unchanged. |
| Conectar minha IA | Generates a personal key and gives the ready-made config for Claude Code, Claude Desktop, Codex, Cursor, Gemini CLI, VS Code and OpenCode (copy or download). Claude.ai and ChatGPT use OAuth, with no key. |
| Meus acessos | Shows where your account is signed in (browser and system, how you signed in, last use, IP). You can end one sign-in or all the others. Also: an activation code for another browser, installing the app, and turning notifications on. |
Dragging on the org chart:
- If you manage the agent, the change is saved.
- If you don’t, it becomes an
org_changeproposal. The agent’s manager decides it in Decisões.
Signing in
Section titled “Signing in”A member signs in with one of:
- SSO: Microsoft Entra ID, Google, GitHub or generic OAuth2 (see access.md).
- Username and password, for a local account.
- Activation code (the “virtual key”):
XXXX-XXXX-XXXX, single use, valid for 24 hours. Only its hash is stored. It comes from:- the admin’s invite (Membros, in the console), valid for 7 days;
- the member (Meus acessos), to open another browser. This creates a link like
/app/#/login?code=….
- Personal token on the sign-in screen.
The workspace policy turns each method on or off. At least one method always stays on. The policy covers signing in to the portal only: the MCP keeps accepting personal keys and OAuth tokens.
Each sign-in records how it happened, the browser and system, the IP and the last use. The admin sees every open sign-in in the workspace and can end one, or all of a member’s.
Personal agents
Section titled “Personal agents”A personal agent is a Digital employee that belongs to one member:
- Only its owner sees and manages it. Admins and auditors also see it; the rest of the team does not.
- Its manager is the owner, and it lives in the owner’s team.
- It follows the workspace rules. The admin sets in the policy:
- who may create one (any member, or developers and maintainers);
- how many each member may have;
- which LLM connections they may use;
- a monthly budget per member. When it’s reached, the member’s personal agents stop with the scope agentes pessoais do membro.
- Authority, the company floor, audit and shadow mode are the same as for any Digital employee.
Promotion to the team:
- The owner asks (Promover para o time).
- Another maintainer of the team decides. The owner can’t approve their own request.
- On approval, the agent stops being personal and takes the company’s default visibility.
From your AI, through the platform MCP:
hire_employeewithpersonal=truecreates a personal agent;promote_personal_agentasks for the promotion;my_workspacereturns the summary from Início.
App and notifications (PWA + Web Push)
Section titled “App and notifications (PWA + Web Push)”The portal has:
- a manifest;
- icons;
- a service worker scoped to
/app/. It shows notifications and, offline, a simple page. It caches no API data.
To install it:
- in Chrome or Edge, use the install icon in the address bar;
- on iPhone, use Share → Add to Home Screen. iOS only delivers notifications to the installed app.
Notifications:
- The member turns them on in Meus acessos.
- The browser subscribes, and the subscription is stored per member. The browser’s auth key is encrypted.
- Every new, escalated or expiring decision request goes to all of the member’s subscribed browsers. This is in addition to Slack, Teams or e-mail.
- Clicking the notification opens the decision.
- A subscription the push service reports as gone (404/410) is deleted.
How it’s built:
- Web Push uses VAPID (RFC 8292) and the
aes128gcmcontent encoding (RFC 8291), implemented withcryptography. There is no new dependency. - The VAPID key pair belongs to the installation. It is generated on first use and stored encrypted with
HANGAR_SECRET_KEY. You can set it instead withWEBPUSH_VAPID_PRIVATE_KEY(PEM). WEBPUSH_SUBJECT(amailto:) identifies the sender to the push services.- Browsers only allow service workers and notifications over HTTPS.
localhostalso works, for testing.
Admin: members
Section titled “Admin: members”Only the admin manages members, in the console (/ui/#/members). The portal shows each member only what belongs to
their own account. Membros has three tabs:
- Pessoas:
- Convidar um membro: e-mail, name, company role, team and team role. The person gets an e-mail with the link to
/app. The link signs in once, without a password, and is valid for 7 days. After that they sign in with SSO, or with a code from Meus acessos. - Without SMTP configured, the invite is still created and the admin gets the link to send. Reenviar issues a new link, and the old one stops working.
- Below the invite form are the pending invites and the company’s people: role, teams, last sign-in, local account, deactivate. This replaces the former Usuários page.
- Convidar um membro: e-mail, name, company role, team and team role. The person gets an e-mail with the link to
- Acessos abertos: every open sign-in in the workspace, with Encerrar and Todos deste membro.
- Como entram: the sign-in methods and the personal-agent rules. When activation codes are turned off, invite links go to the sign-in page (SSO).
E-mail goes out through the installation’s SMTP (SMTP_HOST, SMTP_FROM…; see digital-employee.md).
| Method | Path | Description |
|---|---|---|
| POST | /api/auth/activate |
{code} → session cookie (activation code, single use) |
| GET / PUT | /api/workspace/policy |
{login: {password, sso, activation, key}, personal_agents: {enabled, who, max_per_member, llm_connections, monthly_budget_usd}}. PUT is admin only |
| GET | /api/workspace/sessions?user_id= |
Open sign-ins in the workspace (admin, auditor) |
| DELETE | /api/workspace/sessions/{id} |
Ends one sign-in (admin) |
| POST | /api/workspace/users/{id}/sessions/revoke |
Ends all of a member’s sign-ins (admin) |
| POST | /api/workspace/activation-codes |
{email} → {code, user, expires_at} (admin) |
| POST | /api/workspace/invites |
{email, name, team, role, org_role} → creates the member (and the team membership) and e-mails the link to /app; returns {link, sent, email_ready, expires_at} (admin) |
| GET | /api/workspace/invites |
Invites waiting for the person to sign in (admin, auditor) |
| POST | /api/workspace/invites/{user_id}/resend |
A new link (the previous one stops working) |
| GET | /api/me/workspace |
The member’s home: to_decide, agents (with personal, working_on), my_tasks, month_cost_usd, personal-agent counters and caps |
| GET | /api/me/sessions |
My sign-ins (device, method, ip, last_seen_at, current) |
| DELETE | /api/me/sessions/{id} |
Ends one of my sign-ins |
| POST | /api/me/sessions/revoke-others |
Ends all my sign-ins except this one |
| POST | /api/me/activation-code |
A code for another browser of mine |
| POST | /api/employees |
With personal: true: a personal agent (manager optional, the owner) |
| POST | /api/employees/{slug}/promote-to-team |
{note} → a promote_personal request for another maintainer |
| POST | /api/employees/{slug}/propose-reports-to |
{to, why} → an org_change proposal (for whoever doesn’t manage the agent) |
| GET | /api/org-chart |
Each node also has model, connection, harness, specialists, personal, owner, can_manage, working_on |
| GET | /api/me/push |
{public_key, subscriptions} |
| POST | /api/me/push |
The browser’s PushSubscription.toJSON() |
| POST | /api/me/push/remove |
{endpoint} |
| POST | /api/me/push/test |
Sends a test notification to my browsers |
| GET | /app/manifest.webmanifest, /app/sw.js, /app/icon-192.png, /app/icon-512.png |
The PWA |