Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 31 additions & 12 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,25 @@
[![Latest release](https://img.shields.io/github/v/release/Threadlines/threadlines)](https://github.com/Threadlines/threadlines/releases/latest)
[![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](./LICENSE)

Threadlines is a local-first desktop workspace for Codex and Claude Code.

It brings agent threads, terminals, diffs, branches, source-control workflows,
and session recovery into one focused app so coding agents stay manageable under
real project load.

The maintained provider paths are Codex and Claude. Other inherited provider
surfaces may remain while Threadlines narrows toward a smaller native desktop
surface.
**[Website](https://www.threadlines.dev/) · [Download](https://www.threadlines.dev/download/) · [What's new in v0.3](https://www.threadlines.dev/changelog/v0.3.0) · [Latest release](https://github.com/Threadlines/threadlines/releases/latest)**

Threadlines is an open-source desktop workspace for Codex and Claude Code. Keep
the agent conversation, a live browser, project files, terminal, and source
control open together so you can see, steer, and recover agent work without
reconstructing context across tools.

## Why Threadlines

- **A browser beside every thread.** Review visual changes and send the exact
page state back to the agent without leaving the workspace.
- **Source control you can act on.** Inspect per-file changes and the commit
graph, then commit, push, and open a pull request from the same app.
- **Exact context instead of repeated prompts.** Attach selected reply, code,
or terminal lines directly to the next message.
- **Nothing runs invisibly.** Track tasks, subagents, and background processes,
including their live state and stop controls.
- **Durable, provider-flexible sessions.** Resume work after restarts and switch
between Codex and Claude Code without losing the thread or working tree.

## Installation

Expand All @@ -29,13 +39,16 @@ surface.

### Desktop app

Install the latest desktop alpha from
[GitHub Releases](https://github.com/Threadlines/threadlines/releases).
Install the latest stable desktop app from the
[download page](https://www.threadlines.dev/download/) or
[GitHub Releases](https://github.com/Threadlines/threadlines/releases/latest).

Signed Windows and macOS builds and a Linux x64 AppImage are published through
the desktop release workflow. Linux builds are unsigned; integrity for
auto-updates is verified through the updater manifest hashes.

Then open a local project and start a thread with the provider you already use.

### Server CLI

The npm package supports advanced CLI/server and remote-bootstrap usage:
Expand Down Expand Up @@ -63,11 +76,17 @@ output noticeably slows installs, builds, and file watching.

```powershell
vp install --frozen-lockfile
vp run dist:desktop:artifact -- --platform win --target nsis --arch x64 --build-version 0.2.0
vp run dist:desktop:artifact -- --platform win --target nsis --arch x64 --build-version 0.3.0
```

The artifact is written to `release/`.

## Supported providers

Codex and Claude Code are the maintained provider paths. Other inherited
provider surfaces may remain visible while Threadlines narrows toward a smaller
native desktop surface, but they are not actively supported.

## Origins

Threadlines began as a fork of [T3 Code](https://github.com/pingdotgg/t3code).
Expand Down
15 changes: 2 additions & 13 deletions apps/marketing/src/lib/releases.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
const REPO = "Threadlines/threadlines";

export const RELEASES_URL = `https://github.com/${REPO}/releases`;

const LATEST_URL = `https://api.github.com/repos/${REPO}/releases/latest`;
const LIST_URL = `https://api.github.com/repos/${REPO}/releases?per_page=1`;
const CACHE_KEY = "threadlines-latest-release-v2";
const CACHE_KEY = "threadlines-latest-stable-release-v3";

export interface ReleaseAsset {
name: string;
Expand Down Expand Up @@ -42,15 +39,7 @@ export async function fetchLatestRelease(): Promise<Release> {
if (isRelease(parsed)) return parsed;
}

// /releases/latest only knows stable releases; fall back to the newest
// release of any kind (nightlies are prereleases) when none exists yet.
let data: unknown;
try {
data = await fetchJson(LATEST_URL);
} catch {
const list = await fetchJson(LIST_URL);
data = Array.isArray(list) ? list[0] : undefined;
}
const data = await fetchJson(LATEST_URL);

if (!isRelease(data)) throw new Error("No release available");

Expand Down
11 changes: 6 additions & 5 deletions apps/marketing/src/pages/download.astro
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import Layout from "../layouts/Layout.astro";
title="Download Threadlines"
description="Download Threadlines for macOS, Windows, and Linux. Free and open source."
canonicalPath="/download/"
noindex
>
<section class="dl-holding">
<div class="container dl-inner">
Expand Down Expand Up @@ -60,7 +59,7 @@ import Layout from "../layouts/Layout.astro";
</p>
<a
class="dl-primary"
href="https://github.com/Threadlines/threadlines/releases"
href="https://github.com/Threadlines/threadlines/releases/latest"
target="_blank"
rel="noopener noreferrer"><span class="dl-ico"><svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M12 .5C5.65.5.5 5.65.5 12a11.5 11.5 0 007.86 10.93c.58.1.79-.25.79-.56v-2c-3.2.69-3.88-1.37-3.88-1.37-.52-1.33-1.27-1.69-1.27-1.69-1.04-.71.08-.7.08-.7 1.15.08 1.76 1.18 1.76 1.18 1.02 1.76 2.68 1.25 3.33.96.1-.75.4-1.25.72-1.54-2.55-.29-5.24-1.27-5.24-5.67 0-1.25.45-2.28 1.18-3.08-.12-.29-.51-1.45.11-3.02 0 0 .96-.31 3.15 1.18a10.96 10.96 0 015.74 0c2.19-1.49 3.15-1.18 3.15-1.18.62 1.57.23 2.73.11 3.02.74.8 1.18 1.83 1.18 3.08 0 4.41-2.7 5.38-5.27 5.66.41.36.78 1.06.78 2.13v3.16c0 .31.21.67.8.56A11.5 11.5 0 0023.5 12C23.5 5.65 18.35.5 12 .5z"/></svg></span>Download from GitHub</a
>
Expand All @@ -75,7 +74,7 @@ import Layout from "../layouts/Layout.astro";
<noscript>
<p class="dl-sub">
Grab any installer from
<a class="dl-link" href="https://github.com/Threadlines/threadlines/releases"
<a class="dl-link" href="https://github.com/Threadlines/threadlines/releases/latest"
>GitHub Releases</a
>.
</p>
Expand All @@ -84,7 +83,7 @@ import Layout from "../layouts/Layout.astro";
<p class="dl-note">
Signed and notarized for macOS · Signed for Windows · AppImage for Linux · All releases and checksums on&nbsp;<a
class="dl-link"
href="https://github.com/Threadlines/threadlines/releases"
href="https://github.com/Threadlines/threadlines/releases/latest"
target="_blank"
rel="noopener noreferrer">GitHub</a
>
Expand Down Expand Up @@ -148,7 +147,9 @@ import Layout from "../layouts/Layout.astro";
? "Download for Windows"
: isLinux
? "Download for Linux"
: "Download for macOS";
: installers.macArm
? "Download for macOS (Apple Silicon)"
: "Download for macOS (Intel)";
primarySize.textContent = formatAssetSize(primaryAsset.size);
primary.hidden = false;
}
Expand Down
23 changes: 16 additions & 7 deletions apps/marketing/src/pages/index.astro
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ const playGlyphs = `<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="tr
>
</div>
<p class="pv-note pv-rise" style="--pv-d: 0.7s">
Free and open source (MIT) · No account · Your code never leaves your machine
Free and open source (MIT) · Bring your own Codex or Claude account · Runs locally
</p>
<div class="pv-providers pv-rise" style="--pv-d: 0.8s" aria-label="Supported agents">
<span class="pv-providers-label">Runs the agents you already use</span>
Expand Down Expand Up @@ -473,7 +473,7 @@ const playGlyphs = `<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="tr
<div class="pv-grid">
<div class="pv-card pv-reveal">
<h3>Survives restarts</h3>
<p>Sessions resume across app and server restarts via event replay. Close the lid mid-turn and pick it back up.</p>
<p>Sessions resume across app and server restarts via event replay. Reopen the app and continue the same thread.</p>
</div>
<div class="pv-card pv-reveal" style="--pv-d: 0.08s">
<h3>Fork from anywhere</h3>
Expand Down Expand Up @@ -596,7 +596,7 @@ const playGlyphs = `<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="tr
</div>
<div class="pv-card pv-reveal" style="--pv-d: 0.16s">
<h3>No lock-in</h3>
<p>Every feature works across providers. Switching is a feature here, not a betrayal.</p>
<p>The core workflow supports both providers. Switching is a feature here, not a betrayal.</p>
</div>
</div>
</div>
Expand All @@ -621,6 +621,15 @@ const playGlyphs = `<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="tr
<div><span>43a45e9</span> Freeze marketing deploys and draft new homepage</div>
<div><span>6fcd267</span> Link background task notifications to tool calls</div>
</div>
<div class="pv-cta-row">
<a class="pv-cta pv-cta-primary" href="/download">Download Threadlines</a>
<a
class="pv-cta"
href="https://github.com/Threadlines/threadlines"
target="_blank"
rel="noopener noreferrer">Star on GitHub</a
>
</div>
<p class="pv-note">github.com/Threadlines/threadlines · macOS + Windows + Linux</p>
</div>
</section>
Expand Down Expand Up @@ -658,17 +667,17 @@ const playGlyphs = `<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="tr
} else if (isLinux) {
label.textContent = "Download for Linux";
document.getElementById("pv-dl-mac")!.hidden = true;
} else if (isMac) {
label.textContent = "Choose a macOS download";
}
if (isWin || isLinux || isMac) {
if (isWin || isLinux) {
// deep-link the button straight to the installer; /download stays the fallback
fetchLatestRelease()
.then((release) => {
const installers = classifyAssets(release.assets);
const asset = isWin
? (installers.winX64 ?? installers.winArm)
: isLinux
? installers.linuxX64
: (installers.macArm ?? installers.macX64);
: installers.linuxX64;
if (asset) dl.href = asset.browser_download_url;
})
.catch(() => {});
Expand Down
5 changes: 4 additions & 1 deletion docs/brand/social/x-banner-workspace.html
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,10 @@
</defs>
<g stroke-linecap="round" stroke-width="10">
<path d="M 44 98 L 212 98" stroke="#ffffff" stroke-opacity="0.32" />
<path d="M 108 98 C 134 98 134 162 160 162 L 188 162" stroke="url(#banner-glyph-live)" />
<path
d="M 108 98 C 134 98 134 162 160 162 L 188 162"
stroke="url(#banner-glyph-live)"
/>
</g>
<g fill="#ffffff" fill-opacity="0.45">
<circle cx="70" cy="98" r="7" />
Expand Down
Loading