Products
Experimental

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.

PartStatusWhat that means
Eight factory apps as read-only panels and embedded full UIs in Loams DesktopExperimentalShipped 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 pageAvailableEncrypted 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 errorExperimentalStudio shows a draft card; you copy it into a thread's composer
Forgejo pull requests from a Studio thread's branchExperimentalloams-agentd opens the PR with the Forgejo factory credential
The factory in the browser consolePlannedWaits for SF1, the embed plugin and loams.collab.v1 (D922). SF1 has its spike done
Platform agents over A2A, one per app (SF2)PlannedDesigned, not built
Loams Bot, one chat that drives the agents (SF3)PlannedDesigned, not built
The loop, factory.run (SF4)PlannedDesigned, not built
Phase-2 observability wiring: collector, GlitchTip signals, Langfuse and OpenObserve trace links (SF5)PlannedThe apps themselves already have panels on the desktop
A packaged, installable factory (Helm chart, catalog patch)PlannedNot 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

Solid: what ships in Loams 0.1.0 (experimental, desktop only). Dashed: designed in §39 and plans SF1 to SF5, not built. The apps are yours; Loams does not run them for you.
PieceWhereWhat it does
Factory pluginweb/plugins/factoryThe Factory hub, one page of panels per app, the configure page, the hand-off cards into Studio
Factory hostapps/desktop-electron/src/main/factoryThe app registry, the vault, the read-only op allowlist (ops.ts), the isolated app views
Adaptersplugins/packages/plugin-*-adapterOne HTTP client per app: Forgejo, Zulip, ItsAPlan, GlitchTip, OpenPanel, Matomo, Langfuse
loams-agentdcrates/loams-agentd-sessionsOpens 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.

AppJob in the factoryLicencePanels in Loams Desktop
ForgejoGit hosting, pull requests, Forgejo Actions CIGPL-3.0-or-later (since v9)Repositories, open pull requests, open issues
ZulipTeam chat, organised by topicApache-2.0Streams and the latest messages per stream
Plane, through the ItsAPlan adapterIssues and planningPlane: AGPL-3.0Open issues by state
GlitchTipError tracking, Sentry SDK compatibleMITUnresolved issues with counts
OpenPanelProduct analyticsAGPL-3.0Metric tiles
MatomoWeb analyticsGPL-3.0-or-laterMetric tiles
LangfuseLLM and agent traces, costMIT, except its ee/ foldersRecent traces, daily cost and tokens
OpenObserveLogs, metrics and distributed tracesAGPL-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 titled WIP: ….

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 planned loop (SF4). The accent step is the review gate: no merge and no deploy without a person's approval, by default.

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, glitchtip and analytics. 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:

AppFields
ForgejoAccess token
ZulipEmail, API key
Plane (ItsAPlan)API key, project key
GlitchTipAPI token
OpenPanelClient ID, client secret, project ID
MatomoAPI token, site ID
LangfusePublic key, secret key
OpenObserveURL 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 FactoryGitHub + Linear + Sentry + SlackGitLab (self-managed)
Who runs itYou, on your hostsThe vendorsYou
PiecesEight separate open-source appsFour or more SaaS productsOne application
LicencesGPL, AGPL, Apache-2.0, MITProprietary (Sentry: FSL source-available)Open core
Agents that take an issue to a PRPlanned (SF2 to SF4); Studio drives your agent CLIs todayGitHub's Copilot coding agent, and othersVendor features
One window over all of itLoams DesktopNoMostly, 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

On this page