Loams Software Factory
The self-hosted development toolchain that Loams Desktop and Studio bring into one window: Forgejo, Zulip, Plane, GlitchTip, OpenPanel, Matomo, Langfuse and OpenObserve, and the planned loop in which agents take an issue to a reviewed pull request.
What it is
Loams Software Factory is two things, and only the first one ships.
The first is a toolchain you run yourself, seen from one place. A team that builds software needs a code host with CI, a chat, an issue tracker, error tracking, analytics, LLM traces and logs. The factory picks open-source apps for each of those jobs and puts them inside Loams Desktop: each app gets read-only native panels (open pull requests, unresolved errors, recent traces) and its own full web UI in an isolated view, under the Factory group of Loams Studio. Loams does not fork, patch or host these apps. You run them, and you give Loams Desktop a URL and a token for each.
The second is the factory loop: a durable workflow in which a signal (an error, an analytics anomaly, a request in chat) becomes a triage thread, an issue, a branch, a pull request with green CI, a merge a person approves, a deploy and an observation window, with agents doing the work between the gates. That loop is designed (§39) and planned (SF2 to SF5). It is not built.
Use the factory today if you already run some of these apps, or want to, and would like them next to your coding agents in Studio: a Plane issue or a GlitchTip error becomes the starting draft of a Studio thread, and a thread's branch links to its Forgejo pull request. Do not use it as an autonomous agent platform yet. Every factory panel only reads, the hand-off from an issue to a thread is copy and paste, and nothing in Loams 0.1.0 merges or deploys on its own.
Status
The factory is experimental in Loams 0.1.0 and lives on the desktop only. It ships inside Loams Desktop, in Studio mode, which is itself experimental.
| Part | Status | What that means |
|---|---|---|
| Eight factory apps as read-only panels and embedded full UIs in Loams Desktop | Experimental | Shipped in 0.1.0-preview.1 (2026-10-12), moved under Studio in 0.1.0 (D916) |
| Credentials held by the desktop, never sent to the page | Available | Encrypted at rest, decrypted only in the desktop's main process (D659); moving to the daemon's OS keyring (D794, D795, proposed) |
| Studio threads started from a Plane issue or a GlitchTip error | Experimental | Studio shows a draft card; you copy it into a thread's composer |
| Forgejo pull requests from a Studio thread's branch | Experimental | loams-agentd opens the PR with the Forgejo factory credential |
| The factory in the browser console | Planned | Waits for SF1, the embed plugin and loams.collab.v1 (D922). SF1 has its spike done |
| Platform agents over A2A, one per app (SF2) | Planned | Designed, not built |
| Loams Bot, one chat that drives the agents (SF3) | Planned | Designed, not built |
The loop, factory.run (SF4) | Planned | Designed, not built |
| Phase-2 observability wiring: collector, GlitchTip signals, Langfuse and OpenObserve trace links (SF5) | Planned | The apps themselves already have panels on the desktop |
| A packaged, installable factory (Helm chart, catalog patch) | Planned | Not in the repository yet; you deploy the apps yourself |
The decisions behind the loop (D-SF-1 to D-SF-20) are recorded as proposed in the decision log. The desktop's factory rulings (D653, D659, D660, D678) are approved.
Architecture
| Piece | Where | What it does |
|---|---|---|
| Factory plugin | web/plugins/factory | The Factory hub, one page of panels per app, the configure page, the hand-off cards into Studio |
| Factory host | apps/desktop-electron/src/main/factory | The app registry, the vault, the read-only op allowlist (ops.ts), the isolated app views |
| Adapters | plugins/packages/plugin-*-adapter | One HTTP client per app: Forgejo, Zulip, ItsAPlan, GlitchTip, OpenPanel, Matomo, Langfuse |
loams-agentd | crates/loams-agentd-sessions | Opens Forgejo pull requests for Studio threads (CreateChangeRequest) |
How it works
The apps
The factory follows a "buy, not build" rule from the design: each job goes to an existing open-source app, run unmodified from its official image. Loams adds panels and, later, agents. It never adds a feature to the app itself.
| App | Job in the factory | Licence | Panels in Loams Desktop |
|---|---|---|---|
| Forgejo | Git hosting, pull requests, Forgejo Actions CI | GPL-3.0-or-later (since v9) | Repositories, open pull requests, open issues |
| Zulip | Team chat, organised by topic | Apache-2.0 | Streams and the latest messages per stream |
| Plane, through the ItsAPlan adapter | Issues and planning | Plane: AGPL-3.0 | Open issues by state |
| GlitchTip | Error tracking, Sentry SDK compatible | MIT | Unresolved issues with counts |
| OpenPanel | Product analytics | AGPL-3.0 | Metric tiles |
| Matomo | Web analytics | GPL-3.0-or-later | Metric tiles |
| Langfuse | LLM and agent traces, cost | MIT, except its ee/ folders | Recent traces, daily cost and tokens |
| OpenObserve | Logs, metrics and distributed traces | AGPL-3.0 (open-source edition) | None: full UI only |
Two names need a note. The desktop labels the planning app "Plane (ItsAPlan)": the owner ruled that the Plane-compatible product the factory means is ItsAPlan (Q622), and its adapter is what the panels call. And Matomo was not in the owner's original list; it came in with the desktop's showcase and stays in the Factory group by default (Q813).
Panels read; full UIs are isolated
Every panel is backed by one adapter method, and the desktop's main process only accepts operations whose names start with get, list, search, health, fetch or query, each with a strict parameter schema and a cap of 50 rows. There is no write operation in the factory panels in 0.1.0 (D660). Writes are meant to arrive with the platform agents and their approvals.
Each app also has a health state on its tile: unconfigured, ok, auth_failed or unreachable.
An app's own web UI opens inside the main window as a separate Electron view, with its own storage partition, no preload script, a sandbox and navigation locked to the app's origin; other origins open in your system browser (D678). Up to four app views stay alive for quick switching. You sign in to the app inside that view, with the app's own login, so its cookies never mix with the console's session.
Credentials stay out of the page
The tokens you enter are encrypted on your computer and decrypted only in the desktop's main process. They are never part of a reply to the page, and the agent transcript scrubber masks factory secrets. Where the system has no keyring backend (some Linux setups), credentials are kept for the session only, and the configure page says so. Changing an app's URL to a different origin asks for the secret again rather than sending the old token to a new host.
From an issue to a thread to a pull request
The factory is wired into Studio in three places:
- Plane: Start thread. On an issue, Studio's home shows a "New thread from Plane" card with the issue's key, title and priority, and a branch named after the key.
- GlitchTip: Fix this error. The card carries the latest event's stack trace (innermost frame first, up to 40 frames and 4,000 characters) and the release.
- Pull requests. When a thread's branch has an open pull request on Forgejo, Studio's git toolbar links to it, and Studio can open one for a pushed branch through
loams-agentd. Forgejo has no draft flag, so a draft is titledWIP: ….
The card does not fill the composer yet: you copy the draft into a project's New thread. Posting a result back to Zulip is not built, because it is a write that needs an approval.
The loop (planned)
The design turns those hand-offs into one durable workflow per signal, factory.run, on Loams' durable execution engine. It has eight stages:
The parts that matter, from §39:
- One agent per app, each an A2A server with its own principal and a signed Agent Card:
zulip,plane,forgejo,glitchtipandanalytics. Coding is a skill of the Forgejo agent (propose_patch), which runs a sandboxed session on a workspace branch and turns the patch into a branch and a pull request. - Agents never hold app credentials. A credential broker makes the app call; a destructive call must carry a settled approval that matches its hash, so an agent that has been talked out of waiting still cannot get the credential.
- Safety rails in the engine, not the prompt. Per-run and per-organisation budgets (the owner set $5 per run and $50 per organisation per day as defaults, Q471), at most three CI attempts, a kill switch per run, agent or organisation, a cap on regression generations and a cooldown per fingerprint.
- No auto-merge and no auto-deploy by default. A policy can allow them only for listed repositories or services in unprotected environments.
- Every step traced twice. Spans with model content go to Langfuse through a masking collector that fails closed; every span, log and metric without content goes to OpenObserve and to Loams' own ingest.
- A run is a record: a Live table of runs, a stream of factory events and console pages for runs, approvals, agents, budgets and the kill switch.
Set it up
You need Loams Desktop 0.1.0 and the apps you want, already running somewhere the desktop can reach (your tailnet is a good place). Loams does not deploy the apps for you yet. Each project publishes its own self-hosting guide; start with the Forgejo installation docs, Zulip's self-hosting guide and Plane's Docker Compose guide.
Install Loams Desktop
Follow Loams Desktop and the loams CLI. The desktop opens in Studio.
Open the Factory group
In Studio's navigation, open Factory. Every app shows as unconfigured.
Configure an app
Open an app's Configure page and enter its base URL (for example https://git.example.com) and the credentials it asks for:
| App | Fields |
|---|---|
| Forgejo | Access token |
| Zulip | Email, API key |
| Plane (ItsAPlan) | API key, project key |
| GlitchTip | API token |
| OpenPanel | Client ID, client secret, project ID |
| Matomo | API token, site ID |
| Langfuse | Public key, secret key |
| OpenObserve | URL only (full UI, sign in inside the view) |
Every app also takes an optional SSO origin, for an app that signs you in through a separate identity provider.
Save and test
Save and test calls the app's health operation. "Connected. The credentials work." means the panels will load; otherwise the page tells you whether the app rejected the credentials or could not be reached.
Use it from Studio
Open a Plane issue or a GlitchTip error and choose Start thread or Fix this error, then paste the draft into a project's new thread. When the thread's branch is pushed, open its pull request on Forgejo from the git toolbar.
Give each token the least it needs. The panels only read, so a read-only token is enough for every app except Forgejo, where Studio's pull requests need a token that can open them.
Limits
- Desktop only. The browser console has no Factory group until SF1 lands (D922); phones have nothing yet.
- Read-only panels. No comment, create, resolve or merge from a panel.
- No loop, no agents, no Loams Bot chat over the apps. The hand-off from an issue to a thread is manual.
- You operate the apps. Their upgrades, backups, sign-in and security are yours; Loams pins nothing for them yet.
- One app, one account. The desktop holds one credential per app, so the panels show what that account can see.
Compared with
| Loams Software Factory | GitHub + Linear + Sentry + Slack | GitLab (self-managed) | |
|---|---|---|---|
| Who runs it | You, on your hosts | The vendors | You |
| Pieces | Eight separate open-source apps | Four or more SaaS products | One application |
| Licences | GPL, AGPL, Apache-2.0, MIT | Proprietary (Sentry: FSL source-available) | Open core |
| Agents that take an issue to a PR | Planned (SF2 to SF4); Studio drives your agent CLIs today | GitHub's Copilot coding agent, and others | Vendor features |
| One window over all of it | Loams Desktop | No | Mostly, inside GitLab |
GitLab is the honest alternative for a team that wants one self-hosted application instead of eight; its own docs set a baseline of 8 vCPU and 16 GB of memory for a single node. The factory's bet is that several smaller, single-purpose apps, each the best open-source option for its job, are easier to swap and to run in pieces, with Loams as the glue. The cost is more services to operate, which the planned Helm package is meant to reduce.
Decisions
- D-SF-1 (proposed): two products, one loop. The factory is the loop; Loams Bot is the chat that drives it. Phase 1 is Zulip, Plane and Forgejo; phase 2 adds GlitchTip, OpenPanel, Langfuse and OpenObserve.
- D-SF-14 (proposed): rails in the engine. Budgets, a kill switch, loop limits and no auto-merge or auto-deploy by default.
- D-SF-16 (proposed, superseded in part by D1119): all open source. The agents, plugins, the loop and a single-organisation factory you can self-host are open source, and since D1119 (2026-10-19) so is the hosted multi-tenant factory; Loams has no open core.
- D-SF-17 (proposed): unmodified apps from official images, pinned by digest.
- D653, D660, D678 (approved): the desktop's factory. Eight apps as read-only panels and embedded full UIs, with OpenObserve full-UI only.
- D916 and D922 (proposed, built as amended): the factory moves under Studio, and stays desktop-only until SF1.
Further reading
- Design: §39 Loams Software Factory and Loams Bot, §37 §19 Loams Desktop on Electron, §53 Loams Studio
- Plans: SF1 collaboration UIs, SF4 the factory loop, SF5 observability UIs
- Guide: The factory in Studio
- Related: Loams Studio, Loams Git, Loams Desktop and the loams CLI
- Blog: A software factory you own
Loams Git
Git repositories stored on the bucket as a write-ahead log of create-only segments, with checkpoints, O(1) forks and a remote helper that needs no server.
Loams Desktop and the loams CLI
The Electron desktop app that runs the console, a local engine and the agent daemon on your machine, and the one loams binary that runs, upgrades and administers a Loams stack.