T3 Code is an open-source application that provides a unified interface for managing AI coding resources. Developed by the team behind the T3 ecosystem, it allows developers to run coding resources on their own devices and control them through desktop, web, and mobile applications.

Instead of introducing a new AI coding model, T3 Code works with agents already used by developers, such as Claude Code, OpenAI Codex, Cursor, OpenCode, Grok Build, and Google Antigravity. The application essentially serves as a control center for various existing coding tools, allowing users to manage their work sessions without having to constantly switch between different interfaces.

Features

Multiple AI Coding Agents

T3 Code supports several popular coding agents through their existing installations and authentication systems.

Supported providers include:

  • Claude Code

  • OpenAI Codex

  • Cursor

  • OpenCode

  • Grok Build

  • Google Antigravity

  • Pi

  • Muse Code

  • fx

This bring-your-own-agent approach means users can use their existing subscriptions and authentication rather than purchasing another AI coding service specifically for T3 Code.

Each provider runs in the environment where it is installed. Developers can configure multiple provider instances and accounts, making it easier to switch between different models and coding tools.

Desktop, Web, and Mobile Access

One of T3 Code's strongest features is its cross-platform control system.

The desktop application uses Electron, while the web interface provides browser-based access. Dedicated mobile applications for iOS and Android allow developers to monitor and control coding sessions from their phones.

This is particularly useful when an agent is performing a lengthy task. Developers can start work on their computer and continue monitoring progress from another device.

Remote Development

T3 Code supports remote environments through T3 Connect, direct network pairing, and SSH connections.

This allows developers to run coding agents on a workstation or remote Linux machine while controlling them from another computer or mobile device.

The actual execution remains on the host machine. Project files, provider credentials, terminals, and agent processes stay in their original environment rather than being transferred to the client.

For developers with dedicated development servers, this provides a convenient way to manage AI-assisted coding without keeping the desktop application open on their primary computer.

Parallel Agent Workflows

T3 Code organizes development work into projects and threads. Developers can create separate tasks, manage multiple conversations, and run agents against different projects.

This makes it easier to delegate independent tasks to different agents instead of relying on one conversation for everything.

Project management and thread organization also help keep development context separate, especially when working on several repositories simultaneously.

Permission Management

Running AI coding agents with access to project files and terminal commands requires proper permission controls.

T3 Code provides several permission modes:

  • Supervised: Requests approval for commands and file changes.

  • Auto-accept edits: Automatically approves file edits while other actions can still require approval.

  • Auto: Uses the provider's automatic review capabilities where supported.

  • Full access: Allows commands and edits without approval prompts.

These settings can be configured for individual threads, with project and environment defaults available.

Permission behavior can differ between providers, so users should not assume that every agent implements the same restrictions.

Git and Source Control Integration

T3 Code includes source control functionality for working with Git repositories and pull requests.

It supports GitHub, GitLab, Forgejo, Gitea, Bitbucket, Azure DevOps, and GitCafe.

Developers can clone repositories, review changes, create branches, commit modifications, push code, and create pull requests through the application.

This integration makes T3 Code more than a simple interface for agent conversations. It also provides tools for managing the development workflow around those agents.

MCP Integration

T3 Code includes an MCP server that allows external AI agents to interact with its projects and threads.

This is useful for developers who want to connect additional AI tools or automation systems to their existing T3 Code environment.

It also supports workflows involving agents that were not originally launched by T3 Code, extending its functionality beyond the built-in provider integrations.

Download T3 Code v0.1.9 - Software Mirrors

T3 Code v0.1.9 for Windows

T3-Code-0.1.9-x64.exe | 310.46 MB

T3-Code-0.1.9-arm64.exe | 284.34 MB

t3-0.1.9-win32-x64.zip | 127.81 MB

t3-0.1.9-win32-arm64.zip | 99.76 MB

T3 Code v0.1.9 for macOS

T3-Code-0.1.9-x64.zip | 187.2 MB

T3-Code-0.1.9-x64.dmg | 194.32 MB

T3-Code-0.1.9-arm64.zip | 179.22 MB

T3-Code-0.1.9-arm64.dmg | 186.32 MB

t3-0.1.9-darwin-arm64.tar.gz | 109.55 MB

T3 Code v0.1.9 for Linux

T3-Code-0.1.9-x86_64.AppImage | 204.96 MB

T3-Code-0.1.9-arm64.deb | 156.3 MB

T3-Code-0.1.9-arm64.AppImage | 197.27 MB

T3-Code-0.1.9-amd64.deb | 167.36 MB

t3-0.1.9-linux-x64.tar.gz | 142.21 MB

t3-0.1.9-linux-arm64.tar.gz | 133.6 MB

T3 Code v0.1.9 Source Code

T3 Code v0.1.9 Source code (zip)

T3 Code v0.1.9 Source code (tar.gz)

T3 Code v0.1.9 Release Notes:

v0.1.9 · 198 changes from 31 contributors
  • T3 Connect agent sign-in. Approve agent sign-ins with T3 Connect instead of copying a pairing code.
  • Send during uploads. Send messages with attachments while they are still uploading.
  • Claude session approvals. Allow an MCP app for a Claude session instead of approving each action individually.
  • Screen reader announcements. Hear agent messages and steps during a turn without leaving the composer.
  • GitLab revert. Revert a merged GitLab merge request from T3 Code.
  • OpenCode goals. Use OpenCode's native goals and keep their state in sync across clients.
  • Pull request links. Open pull request links directly to their referenced comment, diff line, checks, or commit.

Plus 164 more bug fixes and performance improvements.

Full changelog

What's Changed

  • fix(web): checking for updates finds provider updates on every machine by @t3dotgg in #33538
  • fix(web): settings say custom instructions cover pull request descriptions by @maria-rcks in #33113
  • feat(web): send messages while attachments upload by @maria-rcks in #33092
  • fix(mobile): Android PDF preview double-tap zoom and easier link taps by @juliusmarminge in #33570
  • feat: approve agent sign-ins with T3 Connect instead of a code by @juliusmarminge in #33600
  • fix(mobile): the composer and search bars move with their iOS columns by @juliusmarminge in #33543
  • ci(mobile): build Android store releases on Blacksmith by @juliusmarminge in #33565
  • fix(web): thread title menu opens without a half-second wait on desktop by @t3dotgg in #33598
  • fix(web): a new side chat focuses its message input by @darioielardi in #32929
  • perf(opencode): bound usage reads to in-window messages by @Yash-Singh1 in #33612
  • chore(web): upgrade @pierre/diffs to 1.7 and use its built-in find by @juliusmarminge in #33627
  • fix(web): expanding hidden diff context works after a diff refresh by @juliusmarminge in #33629
  • feat: approve agent sign-ins on app.t3.codes with T3 Connect by @juliusmarminge in #33632
  • perf(cursor): improve account usage scanning by @Yash-Singh1 in #33636
  • fix(web): dropdown items over the desktop title bar respond to clicks by @screen-gd in #32643
  • fix: hosted agent approval no longer fails with "Your session cannot approve" by @juliusmarminge in #33645
  • fix(web): new threads use the last used project by @Yash-Singh1 in #33626
  • fix(mobile): distinguish local ACP instances by name by @shivamhwp in #32467
  • ci(mobile): dev clients build on Blacksmith, and mobile:install starts that build by @juliusmarminge in #33617
  • fix(mobile): Android sidebar and composer transitions no longer reflow at rest by @juliusmarminge in #33599
  • fix(server): price Antigravity Gemini Flash effort variants by @Ephraim-9 in #13809
  • fix(mobile): Android feed stays at its end after the keyboard or sidebar changes by @juliusmarminge in #33611
  • fix(server): Antigravity install no longer fails on a stale Windows Crashpad pipe by @juliusmarminge in #26374
  • ci(mobile): Android PR preview clients build on Blacksmith by @juliusmarminge in #33618
  • fix(web): scrolling pans expanded images and Mermaid diagrams by @shivamhwp in #26630
  • fix(desktop): agents see visible:true while the desktop shows their tab by @shivamhwp in #23589
  • fix(server): allow requested WebMCP writes by @shivamhwp in #26570
  • fix(antigravity): resolve model names from usage metadata by @Yash-Singh1 in #33661
  • fix(web): show details for background commands by @Yash-Singh1 in #33647
  • fix(ci): store-build checkouts drop credentials without submodule cleanup by @juliusmarminge in #33664
  • fix(web): "Use T3 Code in another app" opens the Grok Bot app by @juliusmarminge in #33663
  • ci(mobile): keep the Android store AAB as a workflow artifact by @juliusmarminge in #33674
  • fix(mobile): hide compose in the detail rail while starting a task by @juliusmarminge in #33678
  • ci(mobile): version bump commits no longer credit Codex by @juliusmarminge in #33689
  • fix(server): stop PR watch flapping while workflows await approval by @shivamhwp in #24599
  • fix(server): show idle paragraphs before the assistant turn ends by @shivamhwp in #28221
  • fix(mobile): fit usage view selector beside the date range at large text by @PixPMusic in #33682
  • fix(web): center short PR titles in thread details by @Yash-Singh1 in #33724
  • fix(server): Claude threads can allow an MCP app for the session by @t3dotgg in #33707
  • fix(web): reclaim notice says the machine will be offline by @shivamhwp in #33730
  • fix(server): detaching a session no longer strands its pending approval by @juliusmarminge in #33535
  • fix(opencode): long command turns no longer fail when the command request times out by @juliusmarminge in #27677
  • fix(server): a queued message that names no model keeps the model picked ahead of it by @juliusmarminge in #33591
  • fix(ssh): tunnel readiness no longer counts ssh's connection time by @juliusmarminge in #33554
  • fix(server): preview_evaluate accepts top-level await by @juliusmarminge in #31925
  • fix(server): quitting no longer restarts the relay client mid-shutdown by @juliusmarminge in #33628
  • fix(shared): relative Windows file links open the file by @juliusmarminge in #33643
  • fix(server): a steer that restarts a completion wake no longer strands later subagent results by @juliusmarminge in #33469
  • fix(server): provider status checks no longer make mise download missing CLIs by @juliusmarminge in #33448
  • fix(forgejo): find merged pull requests whose head branch was deleted by @juliusmarminge in #33675
  • perf(shared): speed up escaped Markdown in long PR descriptions by @AksharP5 in #33438
  • fix(server): a background agent tab survives a desktop window reload by @juliusmarminge in #33666
  • fix(server): Commit, push & PR no longer pushes the default branch into itself by @juliusmarminge in #33695
  • fix(acp): OMP threads show html_render pages by @juliusmarminge in #33677
  • fix(ssh): Intel Mac hosts no longer try to download a missing t3 archive by @juliusmarminge in #33325
  • fix(server): opening the branch menu no longer wipes PR status by @juliusmarminge in #33263
  • fix(server): failed updates report download diagnostics by @tanav29 in #33239
  • fix(web): remote Lineage rows keep their title when the environment name is long by @f4llenz in #33181
  • fix(web): custom snooze footer stays inside the dialog by @juliusmarminge in #33759
  • fix(desktop): right-clicking a mailto link offers Copy Email Address by @juliusmarminge in #33262
  • fix(acp-registry): commands past the 128th are no longer dropped by @juliusmarminge in #33768
  • fix(server): one finished turn looks up its branch's pull request once by @juliusmarminge in #33752
  • fix(mobile): Android Files sheet scrolls its tree instead of dragging the sheet by @RadekManak in #33223
  • fix(web): prompt suggestions show after a steered turn by @thelogicmatrix in #33706
  • fix(server): usage prices Claude Mythos 5.2 from its Bedrock rate by @juliusmarminge in #33721
  • fix(server): Claude turns whose CLI exits before its first frame fail instead of running forever by @juliusmarminge in #33008
  • fix(web): panel resize handles follow touch drags by @juliusmarminge in #33066
  • fix(server): signed-out Claude instances with their own config dir name it in the sign-in hint by @juliusmarminge in #32951
  • perf(server): opening a long thread reads from its latest segments, not its whole history by @t3dotgg in #33305
  • fix(server): repos without a remote no longer record failed spans on status refresh by @ferhtgoldaraz in #32905
  • fix(mobile): missing files in previews name the checked path instead of asking to reconnect by @juliusmarminge in #32994
  • fix(server): a restart that misses its turn starts as a new turn by @juliusmarminge in #32899
  • fix(desktop): new browser tabs no longer lose waits, clicks and snapshots for good by @juliusmarminge in #32861
  • fix(web): Go to source on a side chat quote keeps you on its parent thread by @juliusmarminge in #33160
  • fix(server): removing a queued completion message keeps its siblings' wakes by @juliusmarminge in #32815
  • fix(server): dev database seed drops active pull request watches by @juliusmarminge in #32744
  • fix(server): capture iOS screenshots on Xcode 26's simctl by @shivamhwp in #28353
  • fix(mobile): medium Android windows keep the rail's room and the sidebar's place by @dongxingong in #33021
  • fix(web): notify when a new request replaces the pending one in a run by @juliusmarminge in #32719
  • fix(server): Codex first-request usage limits keep their reset time by @shivamhwp in #27791
  • fix(web): minimap next turn is disabled at the bottom of a thread by @juliusmarminge in #33038
  • fix(cursor): a steer keeps the prompt it interrupted by @juliusmarminge in #32583
  • test: remove redundant short-string truncation test by @t3-code-bot[bot] in #33867
  • fix(pi): Pi models whose provider ID contains a slash can be selected by @juliusmarminge in #32585
  • perf(server): MCP tool calls no longer read the caller's whole thread by @t3dotgg in #33295
  • fix(ssh): concurrent launches on one remote home share one server by @juliusmarminge in #32587
  • fix(mobile): iOS 18 iPad sidebar and thread feed start below the header by @juliusmarminge in #32936
  • fix(web): Tab reaches the add-project and new-project submit buttons by @juliusmarminge in #32605
  • fix(web): screen readers hear the add-project submit shortcut by @juliusmarminge in #32576
  • fix(server): Antigravity limits read the quota host the account is metered on by @juliusmarminge in #32425
  • fix(web): the thread menu works for an older settled thread the sidebar hasn't loaded by @juliusmarminge in #32507
  • fix(opencode): show questions asked while OpenCode wakes a session on its own by @juliusmarminge in #32434
  • fix(server): blank .gitignore lines no longer make checkpoints drop new files by @juliusmarminge in #32374
  • test(web): minimap next-turn test no longer flakes after a resize by @t3dotgg in #33964
  • feat(opencode): mirror native goals across clients by @Yash-Singh1 in #33758
  • feat(web): bindable shortcut to regenerate a thread's title by @sharanry in #33987
  • fix(server): linked projects keep their repository identity while it refreshes by @juliusmarminge in #32359
  • fix(mobile): tool call commands are highlighted and monospaced like on web by @juliusmarminge in #33957
  • fix: Claude monitor wakes no longer fire a completion alert per line by @juliusmarminge in #32520
  • fix(server): removed thread worktrees keep their project's skills in the picker by @juliusmarminge in #32471
  • fix(web): drag command palette threads into the composer by @Yash-Singh1 in #33990
  • fix(shared): show zero seconds in minute durations by @Yash-Singh1 in #33994
  • fix(web): closing the right panel returns focus to where it was by @juliusmarminge in #32569
  • fix(server): say why threads without a project are unavailable by @juliusmarminge in #32342
  • fix: chat file links open the file agents cite by @juliusmarminge in #33943
  • fix(clients): scroll truncated command output notice with logs by @Yash-Singh1 in #34011
  • fix(web): show app bundle icons and open apps from markdown links by @Yash-Singh1 in #33950
  • feat(opencode): project native todo updates into checklists by @Yash-Singh1 in #34000
  • fix(antigravity): recognize Gemini 4 Carbon and its quota by @DrSeedon in #33991
  • perf(client): reopening a finished command row no longer refetches its output by @juliusmarminge in #34002
  • perf(server): user-only message reads use the user-message index for ordinals by @juliusmarminge in #33009
  • fix(web): keep HTML previews anchored when accordions expand by @Yash-Singh1 in #34003
  • fix(web): preserve search result titles in drag previews by @Yash-Singh1 in #34017
  • fix: file links with line ranges open at their first line by @juliusmarminge in #34006
  • fix(codex): show image generation tool calls by @Yash-Singh1 in #34020
  • fix(pi): a steer Pi has not read yet shows as waiting, not steered by @juliusmarminge in #33982
  • fix(server): provider switches hand off started cancelled runs by @juliusmarminge in #34016
  • fix(web,mobile): replace sparkles icons and ban them with a lint rule by @flamboh in #25422
  • fix(github): a proxy's 403 with Retry-After is no longer reported as a rate limit by @juliusmarminge in #33676
  • fix(web): sending from an empty citation comment clears the composer by @juliusmarminge in #33440
  • fix(server): text generation fallback respects project provider settings by @Muzammil-Bit in #33741
  • feat(usage): show Muse Code limits, and xAI and Antigravity accounts from a CLIProxyAPI hub by @StiensWout in #33800
  • fix(web): preserve previews during attachment preparation by @Yash-Singh1 in #33949
  • fix(desktop): input during window teardown no longer throws in the main process by @juliusmarminge in #33620
  • fix(web): sent messages keep the numbers written on list items by @tsapa44 in #33820
  • fix(server): quitting stops an agent-device daemon left by an earlier server by @juliusmarminge in #33587
  • fix(mobile): attaching larger images no longer crashes with a BigInt error by @juliusmarminge in #34087
  • feat(mobile): pick a voice environment once, then its method by @juliusmarminge in #34073
  • fix(server): a t3 thread send to a finished delegated child notifies its parent by @juliusmarminge in #33446
  • fix(web): question panel header text sits centered in its row by @juliusmarminge in #34095
  • feat(scripts): scenarios prove a fix in the real app with e2e, on web and iOS by @juliusmarminge in #34007
  • feat(claude): Fable resets are offered and redeemed apart from weekly resets by @juliusmarminge in #34106
  • fix(desktop): desktop IPC only answers the main app window by @juliusmarminge in #34094
  • feat(server): voice models reuse copies already on disk by @juliusmarminge in #34096
  • fix(web): scroll project picker to top on first result by @Yash-Singh1 in #34113
  • feat(opencode): track native image job outcomes and previews by @Yash-Singh1 in #34089
  • fix(scripts): scenarios run where localhost resolves to IPv6 first by @juliusmarminge in #34121
  • ci: browser secret helper apt step fetches fewer indexes by @t3dotgg in #33966
  • fix(client-runtime): a search query pasted from github.com lists pull requests again by @juliusmarminge in #30150
  • fix(web): tighter outdated-conversation cards in the PR code panel by @Yash-Singh1 in #34140
  • fix(web): MCP App cards no longer flash white in dark mode while the app loads by @juliusmarminge in #33352
  • fix(peer): link requests use the addresses the app already has for a machine by @t3dotgg in #34139
  • fix(server): Find frees searched thread text after one idle minute by @t3dotgg in #34132
  • fix(web): settings search shortcuts follow the physical key on non-US layouts by @juliusmarminge in #33395
  • fix(server): import Codex chats moved into a project from the scratch folder by @juliusmarminge in #32880
  • fix(desktop): clear stale GPU caches when the Electron version changes by @juliusmarminge in #33641
  • fix(web): PR links jump to the comment, diff line, checks or commits they name by @Yash-Singh1 in #33989
  • fix(cli): installers retry transient GitHub errors by @juliusmarminge in #32913
  • fix(web): opening the terminal with Cmd+J no longer re-renders the whole sidebar by @juliusmarminge in #33129
  • refactor(web): remove icon morphing by @maria-rcks in #33985
  • feat(opencode): track native shell jobs across turns by @Yash-Singh1 in #34141
  • fix(server): restart send stops a Claude turn and runs the message next by @juliusmarminge in #32902
  • fix(shared): login-shell environment probe ignores DEBUG trap output by @juliusmarminge in #32646
  • fix(web): make Q&A option outlines visible across themes by @Yash-Singh1 in #34178
  • fix(web): hide empty replies when renders show the result by @Yash-Singh1 in #34182
  • fix(web): mouse tilt wheel no longer switches threads on Windows and Linux desktop by @juliusmarminge in #32963
  • fix(web): timeline minimap preview no longer steals hover or jumps around by @NoomStuff in #32151
  • fix(server): auto thread sends queue while a turn is stopping by @tanav29 in #34163
  • fix(server): stream the usage-scan cache to disk instead of one string by @juliusmarminge in #34030
  • fix(clients): images the agent opens stay visible in the chat by @fedeinfe in #30473
  • fix(client-runtime): pasted repository page URLs clone the repository into its own folder by @juliusmarminge in #32681
  • fix(web): trackpad flicks over the right panel tabs no longer navigate back by @juliusmarminge in #33396
  • fix: new threads move from draft to Working in one step by @juliusmarminge in #33783
  • fix(gitlab): review comments can cover a range of lines by @TonybynMp4 in #30535
  • test(web): right panel tab swipe test runs as macOS on any CI host by @juliusmarminge in #34191
  • fix(shared): cite assistant messages with IDs over 512 characters by @juliusmarminge in #28084
  • fix(server): updates copy the database while the server still runs when it cannot be cloned by @binjamshid in #33058
  • fix(mobile): file links in question cards open the file viewer by @juliusmarminge in #29151
  • fix(server): cloning into a stranded clone project's empty folder reuses that project by @juliusmarminge in #33439
  • fix(desktop): stable updates no longer show a nightly's release notes by @juliusmarminge in #32832
  • fix(shared): Open in Zed ignores the OpenZFS zed daemon on Linux by @juliusmarminge in #33479
  • fix(mobile): chat code blocks colour diff, kotlin, sql and other languages again by @juliusmarminge in #33680
  • fix(server): fork Claude threads after project root changes by @juliusmarminge in #22836
  • fix(web): snooze times read naturally in context menus by @TonybynMp4 in #24945
  • feat(web): label chips show the label's description on hover by @TonybynMp4 in #28732
  • feat(web): composer strip names the worktree folder by @TonybynMp4 in #28459
  • feat(gitlab): revert a merged merge request by @TonybynMp4 in #30556
  • fix(claude): version errors from a custom endpoint no longer say to run claude update by @binjamshid in #34176
  • fix(web): files marked Viewed stay folded when a pull request's Code tab opens again by @Umais-Adeed in #34168
  • feat(server): watched GitHub pull requests react to host events, not only the 2-minute sweep by @juliusmarminge in #33548
  • fix(server): hide passive Claude Stop-hook summaries by @juliusmarminge in #22964
  • fix(web): dismiss image path tooltips after preview and scroll by @voltcrash in #30620
  • fix(server): PR sync and run-status checks stop reading whole thread histories by @juliusmarminge in #25728
  • fix(server): preview snapshots keep page text beside large accessibility trees by @juliusmarminge in #33745
  • feat(web): screen readers can hear the agent's messages and steps during a turn by @shivamhwp in #33900
  • fix(server): thread search finds phrases inside quotes and their comments by @only21mil in #22553
  • fix(web): local server cards in the browser empty state take pointer clicks by @juliusmarminge in #34050
  • fix(server): worktrees cut from a non-default base no longer show the base's PR by @t3dotgg in #22861
  • fix(desktop): wait for the local server to exit when quitting by @juliusmarminge in #22996
  • fix(server): agent continuations preserve the working timer start by @juliusmarminge in #22947
  • fix(web): disable the git actions menu when nothing in it is usable by @Serendeep in #31972
  • fix(server): preserve active turns when switching provider instances by @juliusmarminge in #22755
  • fix(server): scheduled task updates keep the saved workspace unless the binding changes by @juliusmarminge in #32494
  • fix(web): full-screen HTML pages fit their content and zoom by reflowing by @Zeus-Deus in #22349
  • fix(web): project actions auto-open Preview in web clients by @juliusmarminge in #34048
  • fix(server): a follow-up delegated task waits for a run its child queued on its own thread by @juliusmarminge in #32504

New Contributors

  • @darioielardi made their first contribution in #32929
  • @tanav29 made their first contribution in #33239
  • @RadekManak made their first contribution in #33223
  • @thelogicmatrix made their first contribution in #33706
  • @ferhtgoldaraz made their first contribution in #32905
  • @dongxingong made their first contribution in #33021
  • @sharanry made their first contribution in #33987
  • @tsapa44 made their first contribution in #33820
  • @NoomStuff made their first contribution in #32151
  • @fedeinfe made their first contribution in #30473
Full Changelog: v0.1.8...v0.1.9

Performance and Compatibility

T3 Code uses a local server architecture with web, desktop, and mobile clients communicating through HTTP and WebSocket connections.

The server handles agent execution, project files, terminals, provider credentials, and persistent state. This architecture allows remote clients to control development environments without moving the actual coding workload onto mobile devices.

The desktop application is available for Windows, macOS, and Linux. Mobile applications are available for iOS and Android, while the web interface can be accessed through a compatible browser.

Performance is an important design consideration, particularly when managing multiple active threads and remote environments. However, actual responsiveness also depends on the host machine, network connection, and coding agent being used.

The project is actively evolving and its documentation explicitly warns that users should expect bugs. Some features and provider integrations may also behave differently depending on their respective implementations.

System Requirements

T3 Code requires at least one supported coding agent to be installed and authenticated before developers can start using it for coding tasks.

The requirements depend on the chosen installation method:

  • Desktop: Install the appropriate application package for Windows, macOS, or Linux.

  • CLI: Use the supplied installer for supported operating systems.

  • Web: Run the T3 Code server on a machine accessible through a browser.

  • Mobile: Connect to an existing T3 Code server or remote environment.

Remote SSH environments require a supported Linux or Apple Silicon macOS host with the necessary runtime utilities.

Individual coding agents have their own system requirements and authentication procedures.

Pros and Cons

Pros

  • Supports multiple popular AI coding agents.

  • Works with existing agent subscriptions.

  • Provides desktop, web, and mobile interfaces.

  • Supports remote development environments.

  • Includes multiple permission modes.

  • Offers Git and pull request integration.

  • Supports MCP connections with external agents.

  • Open-source and MIT licensed.

Cons

  • Still in early development and may contain bugs.

  • Requires separately installed and authenticated coding agents.

  • Provider capabilities and permission behavior are not completely uniform.

  • Remote access requires a running and reachable host.

  • Some advanced features require additional configuration.

  • Not a standalone AI coding model or replacement for an agent provider.

How to Install

The easiest way to install T3 Code is through its official command-line installer.

On Linux and macOS:

curl -fsSL https://t3.codes/install.sh | sh

On Windows PowerShell:

irm https://t3.codes/install.ps1 | iex

After installation, start T3 Code with:

t3

This starts the server and opens the local web interface.

To keep the server running in the background on supported systems:

t3 service install

Alternatively, developers can use the Electron desktop application.

On Windows, installation through Winget is available:

winget install T3Tools.T3Code

On macOS:

brew install --cask t3-code

Ubuntu and Debian users can download the DEB package from the GitHub Releases page and install it using:

sudo apt install ./T3-Code-*.deb

After installing T3 Code, configure at least one supported provider and complete its authentication process.

Final Verdict

T3 Code is a compelling open-source solution for developers who already use multiple AI coding agents. Instead of competing directly with Claude Code, Codex, or Cursor, it provides a unified environment for controlling them.

Its strongest advantages are remote access, mobile support, permission management, parallel development workflows, and Git integration. These capabilities make it particularly useful for developers who run coding agents on dedicated workstations or servers.

The requirement to install and authenticate external agents may be inconvenient for beginners, and the project is still evolving. Nevertheless, its architecture and broad provider support make it an interesting alternative to proprietary agent management applications.

T3 Code is worth trying if you want to manage multiple AI coding agents from one interface without abandoning your existing subscriptions.

Sources


T3 Code v0.1.9
Free
Software Informations:
Developer:

Operating System:
Windows / macOS / Linux
Date Added:
2026-11-11T15:07:17.347Z

RustFS is an open-source object storage system designed to provide S3-compatible storage for applications, backups, data lakes, AI workloads, and other large-scale data environments. Built in Rust, the project focuses on performance, memory safety, distributed deployment, and compatibility with existing S3-based applications.

It can run as a standalone server or as a distributed storage cluster, making it suitable for both smaller self-hosted deployments and larger storage environments.

Features

RustFS provides an S3-compatible API for storing and managing objects. It supports core capabilities such as uploads, downloads, bucket management, versioning, object locking, lifecycle management, event notifications, and server-side encryption.

The platform includes distributed storage, healing and background scanning, bitrot protection, pool expansion, bucket replication, and site replication. These features make RustFS more suitable for production object-storage deployments than a simple file server.

Security features include IAM policies, OIDC and SSO integration, server-side encryption, and a built-in key management system. RustFS supports Vault and AWS KMS backends for production KMS deployments.

RustFS also includes a web-based management console for administration and object management. Kubernetes Helm charts are available for container-orchestrated deployments.

Beyond S3, RustFS provides additional protocols and integrations, including OpenStack Swift, Keystone authentication, SFTP, FTPS, and WebDAV. Some of these capabilities are enabled through optional build features.

Download RustFS 1.0.5 - Software Mirrors

RustFS 1.0.5 for Windows

rustfs-windows-x86_64-v1.0.5.zip | 111.79 MB

rustfs-windows-x86_64-latest.zip | 111.79 MB

RustFS 1.0.5 for macOS

rustfs-macos-aarch64-v1.0.5.zip | 92.59 MB

rustfs-macos-aarch64-latest.zip | 92.59 MB

RustFS 1.0.5 for Linux

rustfs-linux-x86_64-musl-v1.0.5.zip | 103.45 MB

rustfs-linux-x86_64-musl-v1.0.5.rpm | 102.68 MB

rustfs-linux-x86_64-musl-v1.0.5.deb | 74.11 MB

rustfs-linux-x86_64-musl-latest.zip | 103.45 MB

rustfs-linux-x86_64-gnu-v1.0.5.zip | 116.8 MB

rustfs-linux-x86_64-gnu-v1.0.5.rpm | 113.75 MB

rustfs-linux-x86_64-gnu-v1.0.5.deb | 81.48 MB

rustfs-linux-x86_64-gnu-latest.zip | 116.8 MB

rustfs-linux-aarch64-musl-v1.0.5.zip | 95.35 MB

rustfs-linux-aarch64-musl-v1.0.5.rpm | 95.12 MB

rustfs-linux-aarch64-musl-v1.0.5.deb | 69.23 MB

rustfs-linux-aarch64-musl-latest.zip | 95.35 MB

rustfs-linux-aarch64-gnu-v1.0.5.zip | 113.24 MB

rustfs-linux-aarch64-gnu-v1.0.5.rpm | 110.74 MB

rustfs-linux-aarch64-gnu-v1.0.5.deb | 79.76 MB

rustfs-linux-aarch64-gnu-latest.zip | 113.24 MB

RustFS 1.0.5 Source Code

RustFS 1.0.5 Source code (zip)

RustFS 1.0.5 Source code (tar.gz)

RustFS 1.0.5 Release Notes:

Upgrade notes

  • Complete the upgrade from 1.0.4 on every node before adding or removing pools, or retrying a decommission operation.
  • While 1.0.4 and 1.0.5 nodes coexist, DELETE requests handled by new nodes may temporarily return HTTP 503. Retry them after all nodes are upgraded. The compatibility check verified existing data integrity and DELETE recovery after the upgrade.

Known issue on macOS

The macOS archive can display an extra 1.0.5-preview.1 line because both tags identify the same source commit. This affects version text and may affect update notifications. The archive source, startup, Console and S3 read/write/delete checks were verified. This minor issue is tracked for 1.0.6; the new candidate pipeline explicitly stamps the final product version.

What's Changed

  • fix(scanner): treat replication status writebacks as status-class hints by @reatang in #8509
  • fix(s3): preserve catalog lock failures at the error boundary by @houseme in #8550
  • chore(deps): refresh Rustls and TAR parser test crates by @houseme in #8547
  • fix(s3): align raw disk-full failures with capacity refusals by @houseme in #8553
  • feat(iam): support wildcard in IAM policy resources by @alpbeysir in #8555
  • test(e2e): wait for heal control before deep heal after restart by @overtrue in #8554
  • feat(s3): support conditional bulk deletes by @cxymds in #8535
  • fix(ecstore): retain pool metadata repair ownership by @houseme in #8552
  • fix(scanner): use observational leases for incomplete snapshots by @houseme in #8561
  • fix(scanner): clear transient cycle recovery on follower lock contention by @RamakrishnaChilaka in #8566
  • fix(data-usage): retain complete totals when a set is missing by @marshawcoco in #8558
  • fix(s3): make an unsupported delete participant retryable and explain it by @overtrue in #8574
  • fix(replication): skip the replica ETag audit for encrypted sources by @overtrue in #8573
  • fix(ecstore): box the transition payload of CurrentDeleteGeneration by @overtrue in #8581
  • fix(scanner): persist partial progress after budget cancellation by @houseme in #8578
  • test(replication): cover SSE-S3 replicas on ETag-computing targets by @reatang in #8583
  • fix(ecstore): quiet routine admin info timing logs by @houseme in #8584
  • fix(ecstore): merge migrated copies across inline layouts by @cxymds in #8588
  • fix(rpc): clarify stale epoch rejection diagnostics by @houseme in #8585
  • feat(diagnostics): port read attribution to main by @houseme in #8579
  • fix(multipart): retain commits and reclaim verified orphan staging by @cxymds in #8571
  • fix(rebalance): wait for readiness and admit peer workers by @cxymds in #8570
  • test(e2e): gate the rc.5 baseline restarts on drive re-admission by @reatang in #8595
  • test(e2e): send the quota batch delete in verbose mode by @overtrue in #8589
  • fix(ci): stop PRs for sync conflicts by @overtrue in #8598
  • test(s3-select): fix schema reference field ordering by @houseme in #8599
  • chore(deps): refresh workspace dependencies by @houseme in #8597
  • sync: merge main 2026-10-15 (conflicts) by @houseme in #8557
  • fix(ecstore): unify bounded delete recovery across upgrades by @houseme in #8594
  • fix(lifecycle): read exact object versions after writes by @cxymds in #8601
  • feat(scanner): decouple bucket walkers from disk count by @reatang in #8539
  • fix(heal): recover replacements after pool removal by @cxymds in #8600
  • fix(quota): keep writes available with a degraded fleet by @cxymds in #8604
  • fix(ecstore): box large enum variant in CurrentDeleteGeneration by @overtrue in #8576
  • fix(replication): locate encrypted replicas without comparing ETags by @reatang in #8602
  • fix(ecstore): publish delete rollback backups past Windows MAX_PATH by @reatang in #8606
  • fix(ecstore): publish delete rollback files via verbatim-safe rename by @RamakrishnaChilaka in #8607
  • fix(scanner): retain partial progress without a usage update by @marshawcoco in #8612
  • fix(connect): prepare profile fixtures before timed IPC by @marshawcoco in #8616
  • chore(release): align installation references for 1.0.2 by @overtrue in #8617
  • fix(connect): retain bounded object cleanup diagnostics by @marshawcoco in #8624
  • fix: resolve clippy warnings from Rust 1.99 lints by @overtrue in #8619
  • feat(table-catalog): plan maintenance on durable backing by @marshawcoco in #8567
  • fix(s3): return 412 for conditional multipart uploads on existing keys by @RamakrishnaChilaka in #8625
  • fix(admin): preserve dirty usage over observed snapshots by @marshawcoco in #8627
  • fix(ecstore): unify object key admission for Windows hosts by @reatang in #8632
  • fix(startup): drive startup on an explicitly sized thread by @reatang in #8630
  • fix(ecstore): resolve Windows drive paths in URL endpoints by @reatang in #8629
  • fix(lifecycle): compact inline versions once per deletion batch by @cxymds in #8634
  • fix(ecstore): keep Windows disk roots out of verbatim form by @reatang in #8633
  • fix(lifecycle): skip empty delete replication tasks by @cxymds in #8628
  • fix(ecstore): share cache and lock identity across Windows key aliases by @reatang in #8635
  • fix(utils): harden Win32 volume probes and flag Windows network drives by @reatang in #8631
  • fix(ecstore): converge partial pool identity writes by @cxymds in #8636
  • fix(ci): refresh E2E selection and isolate disk lock probes by @overtrue in #8638
  • fix(lifecycle): reject expiry from stale policy snapshots by @cxymds in #8637
  • docs(release): add post-release advisory reconciliation by @overtrue in #8639
  • fix(filemeta): read large metacache records incrementally by @houseme in #8640
  • fix(scanner): preserve checkpoint progress across object failures by @houseme in #8642
  • fix(ecstore): reclaim rollback backups after object heal by @houseme in #8641
  • fix(scanner): certify dirty usage per bucket and complete cycles with pending buckets by @reatang in #8542
  • fix(scanner): attribute incomplete census and lease waits by @houseme in #8643
  • perf(ecstore): keep inline heal rollback backups in staging by @houseme in #8648
  • perf(filemeta): avoid clones and redundant map scans in into_fileinfo by @RamakrishnaChilaka in #8647
  • chore(release): align installation references for 1.0.3 by @overtrue in #8646
  • fix(heal): verify checkpoint integrity before applying defaults by @houseme in #8649
  • test(utils): cover mixed-case metadata alias conflicts by @overtrue in #8651
  • test(table-catalog): validate current backing contracts by @marshawcoco in #8559
  • feat(table-catalog): support conditional maintenance worker retries by @marshawcoco in #8562
  • fix(ecstore): preserve inline heal rollback staging lifetime by @houseme in #8650
  • fix(ecstore): clean completed PUT staging on pre-commit cancellation by @marshawcoco in #8654
  • fix(scanner): pace checkpoints by snapshot construction cost by @marshawcoco in #8656
  • fix(scanner): expose mixed sweep checkpoint transitions by @houseme in #8657
  • fix(listing): accept literal prefixes with repeated slashes by @overtrue in #8605
  • fix(scanner): scale backup deadline to checkpoint save cost by @marshawcoco in #8659
  • feat(oidc): make the Console session duration configurable by @limitcool in #8568
  • feat(policy): support s3:if-none-match and s3:if-match condition keys by @oc7o in #8615
  • perf(filemeta): avoid clones and intermediate allocations in xl.meta codec by @RamakrishnaChilaka in #8661
  • fix(heal): place checkpoint serialization impls before tests by @overtrue in #8663
  • feat(policy): support object creation operation conditions by @houseme in #8671
  • docs: unify agent instructions across tools by @overtrue in #8675
  • docs(architecture): record scanner usage authority and PUT-tail decisions by @overtrue in #8678
  • ci: move compile-free and prebuilt-binary lanes to hosted runners by @overtrue in #8679
  • fix(auth): restrict root-derived accounts and credential logs by @overtrue in #8674
  • chore(docker): upgrade Alpine base image to 3.24.2 by @overtrue in #8680
  • ci: reuse the dev cache in Connect boundary lanes and raise build jobs by @overtrue in #8682
  • fix(helm): skip data PVCs when storageclass.dataStorageSize is empty by @overtrue in #8681
  • ci: build development packages nightly instead of on every main push by @overtrue in #8684
  • fix(helm): hold rolling updates until survivors re-admit a replaced pod by @overtrue in #8686
  • fix(ci): align the ILM build-budget guard with CARGO_BUILD_JOBS 3 by @overtrue in #8687
  • fix(ecstore): recover deletes beside stale data backups by @houseme in #8688
  • fix(ci): restore the release-profile short-credential guard by @overtrue in #8691
  • fix(ci): refresh the e2e-full selection for the new policy tests by @overtrue in #8693
  • ci: run feature lanes nightly and warm caches on a schedule by @overtrue in #8683
  • fix(admin): avoid error logs for idle rebalance status by @cxymds in #8694
  • fix(ecstore): skip node-local prefix dirs in decommission listing by @overtrue in #8702
  • fix(scanner): startup gates back off, rebuild and run degraded by @overtrue in #8695
  • ci: return pull-request build jobs to 2 after an IO-bound timeout at 3 by @overtrue in #8698
  • fix(heal): block replacement and root records per entry by @overtrue in #8700
  • fix(scanner): anchor the bitrot cadence and budget per-disk I/O by @overtrue in #8701
  • fix(storage): preserve scanner checkpoints and bound MRF journal I/O by @houseme in #8692
  • test(connect): hash test provenance before listener peer-cred probe by @overtrue in #8703
  • fix(scanner): stop treating an ordinary PUT as data movement in cycle termination by @overtrue in #8696
  • fix(quota): keep ledger-admitted writes independent of scanner usage by @overtrue in #8699
  • ci: gate pull requests on Clippy and warm its check artifacts by @overtrue in #8708
  • ci: move API-only and summary jobs to hosted runners by @overtrue in #8707
  • fix(readiness): hold startup readiness until peers re-admit the node by @overtrue in #8704
  • fix(heal): decide object absence from storage evidence, not source by @overtrue in #8697
  • fix(ecstore): address the null version exactly during data movement by @overtrue in #8711
  • fix(decommission): adopt target intents left by a killed leader by @overtrue in #8710
  • test(obs): pin daily rotation boundary test to fixed timestamps by @overtrue in #8716
  • fix(quota): stop pinning quota e2e readiness to the scanner leader by @overtrue in #8719
  • fix(decommission): scope temporary-copy budget checks to the growth pool by @overtrue in #8721
  • fix(decommission): keep status reads and starts off the movement gate by @overtrue in #8715
  • test(quota): cover early-reload routing and snapshot age boundaries by @overtrue in #8722
  • perf(ecstore,filemeta): avoid inline-data reads and redundant decodes in list_objects by @RamakrishnaChilaka in #8706
  • fix(decommission): retry every stale target selection without failing by @overtrue in #8724
  • fix(decommission): run the leader-side start to completion by @overtrue in #8723
  • fix(obs): skip address discovery for initialized node identity by @houseme in #8730
  • fix(ecstore): leave no source free version for a moved tier version by @overtrue in #8732
  • fix(table-catalog): authorize warehouse location claims by @GatewayJ in #8736
  • fix(quota): refresh peer metadata after admin quota changes by @cxymds in #8735
  • fix(decommission): allow retry after unresolved failure by @cxymds in #8737
  • fix(metrics): preserve S3 operation across detached tasks by @houseme in #8738
  • fix(s3): validate bucket location constraints by @houseme in #8739
  • fix(table-catalog): support manifest-only rewrites by @GatewayJ in #8731
  • fix(tier): restore private endpoints and forced config removal by @cxymds in #8725
  • fix(metrics): expose allocator observation availability by @houseme in #8748
  • fix(rebalance): move tier free versions with their entry by @overtrue in #8753
  • fix(ecstore): allow repeated marker deletes at write quorum by @cxymds in #8750
  • fix(runtime): isolate configured region per store instance by @houseme in #8743
  • fix(ecstore): reindex pool metadata ids after removal by @cxymds in #8733
  • test(filemeta,ecstore): cover listing metadata and msgpack decode paths by @RamakrishnaChilaka in #8755
  • fix(iam): derive bucket location conditions from XML by @houseme in #8744
  • fix(replication): replicate null versions written before versioning by @reatang in #8757
  • fix(ecstore): ignore child-key prefixes in delete settlement fingerprint by @overtrue in #8751
  • fix(replication): read source delete markers on multi-pool stores by @reatang in #8756
  • fix(scanner): admit dirty scope across the bucket-listing window and pace full-walk fallbacks by @reatang in #8690
  • fix(decommission): let a failed start roll back its own activation by @overtrue in #8752
  • test(heal): retain unknown same-key repair across replay by @houseme in #8759
  • fix(s3): avoid mutation locks for existing buckets by @shurkus in #8745
  • chore(deps): refresh dependencies and patch certificate trust by @houseme in #8761
  • fix(ecstore): handle Windows trash cleanup deletion races by @reatang in #8754
  • fix(decommission): defer source cleanup quorum failures by @overtrue in #8760
  • feat(metrics): observe remote directory walk lifecycles by @houseme in #8765
  • ci(pool): finalize decommission removal and verify surviving pools by @majinghe in #8749
  • test(e2e): add scanner/heal topology protection matrix by @overtrue in #8705
  • perf(filemeta,ecstore): avoid intermediate clones in FileInfo decode by @RamakrishnaChilaka in #8767
  • fix(ecstore): honor idle drive monitoring opt-out by @overtrue in #8770
  • fix(heal): hold unobserved legacy MRF responsibilities by @overtrue in #8772
  • fix(ecstore): retain operation in detached mutations by @houseme in #8776
  • feat(metrics): track usage outcomes and trim decommission probes by @houseme in #8781
  • fix(s3): return InvalidPart and streamline multipart completion by @houseme in #8780
  • fix(ecstore): preserve diagnostic context in config tasks by @houseme in #8779
  • fix(heal): type legacy MRF decisions and defer diagnostics by @houseme in #8778
  • fix(decommission): move the free version of an expired tier version by @overtrue in #8777
  • feat(metrics): observe local walk lifecycle and output bytes by @houseme in #8775
  • perf(heal): aggregate MRF lifecycle metrics in one pass by @houseme in #8773
  • fix(replication): keep replicated multipart null versions as null by @reatang in #8763
  • docs(agents): add three-verdict finding contract to security skill by @overtrue in #8795
  • fix(decommission): finish multipart null versions superseded on target by @overtrue in #8774
  • perf(scanner): move owned usage snapshot keys by @houseme in #8792
  • perf(s3): remove unused multi-delete result clones by @houseme in #8789
  • feat(metrics): count scanner wakeups and cycle attempts by @houseme in #8786
  • fix(diagnostics): preserve context across task handoffs by @houseme in #8785
  • perf(filemeta,ecstore): index metadata batches and trim decodes by @RamakrishnaChilaka in #8784
  • feat(metrics): expose allocator reclaim statistic totals by @houseme in #8782
  • perf(heal): reuse the verified repair proof queue by @houseme in #8790
  • feat(metrics): observe HTTP entry-to-dispatch latency by @houseme in #8788
  • test(obs): cover contended identity under netlink denial by @houseme in #8797
  • fix(ecstore): identify scanner retirement planner failure phases by @houseme in #8796
  • chore(deps): refresh cloud SDKs, runtime and profiling by @houseme in #8787
  • perf(ecstore,filemeta): batch listings and buffer metacache streams by @RamakrishnaChilaka in #8791
  • perf(heal): skip replay anchor clones for empty repair queues by @houseme in #8798
  • fix(ecstore): skip empty tier recovery scans by @cxymds in #8804
  • fix(ecstore): restore marker write quorum on decommission resume by @houseme in #8793
  • perf(heal): borrow intents during retirement proof checks by @houseme in #8800
  • chore(deps): upgrade workspace parking_lot to 0.13 by @houseme in #8801
  • perf(utils,filemeta): vectorize path and metadata key hot loops with SWAR by @RamakrishnaChilaka in #8806
  • fix(ecstore): preserve scanner authority during decommission by @houseme in #8807
  • test(scanner): reserve capacity for all native backlog fixtures by @houseme in #8802
  • fix(config): preserve persisted compatibility fields by @cxymds in #8803
  • feat(metrics): classify terminal remote walk failures by @houseme in #8809
  • perf(filemeta): avoid per-replica cloning during metacache quorum resolution by @RamakrishnaChilaka in #8810
  • fix(scanner): fence backlog writes against stale pool membership by @houseme in #8799
  • perf(filemeta): fast-path canonical V3 header matching and borrowed version merges by @RamakrishnaChilaka in #8811
  • test(e2e): accept retried rebalance deferrals; retry busy decom preflight by @overtrue in #8813
  • fix(admin): serve bare madmin info bodies on the MinIO prefix by @reatang in #8815
  • fix(replication): reject connection edits on site-replication targets by @reatang in #8814
  • fix(site-replication): keep stored name on endpoint-only edits by @reatang in #8817
  • fix(s3): preserve typed upload errors across body readers by @houseme in #8816
  • chore(deps): refresh ICU and profiling dependencies by @houseme in #8820
  • fix(ecstore): preserve migrated reads and retry busy pool heals by @overtrue in #8821
  • fix(heal): list local blocks and quiet legacy ambiguity logs by @overtrue in #8826
  • fix(decommission): keep partially moved versions readable by @overtrue in #8824
  • fix(ecstore): unify multipart generation fence lifetimes by @houseme in #8830
  • fix(scanner): streamline budgeted metadata walks by @houseme in #8837
  • feat(heal): inspect blocked checkpoint validation without mutation by @overtrue in #8838
  • fix(test): select the current G09 upgrade case by @overtrue in #8841
  • perf(ecstore): bound xl.meta read workers and enable HEAD early-stop by @RamakrishnaChilaka in #8846
  • fix(heal): preserve typed replacement readiness deferrals by @overtrue in #8823
  • fix(scanner): preserve remote checkpoint coverage identity by @overtrue in #8827
  • fix(scanner): recover dual corruption with retained epoch fencing by @overtrue in #8833
  • fix(quota): retire degraded floors from durable usage reports by @overtrue in #8832
  • perf(scanner): transfer owned caches without redundant clones by @overtrue in #8849
  • chore(deps): refresh crates and upgrade hotpath to 0.29.0 by @houseme in #8852
  • feat(scanner): configure startup recovery backoff cap by @overtrue in #8845
  • fix(notify): preserve marker IDs and reduce event allocations by @houseme in #8853
  • feat(scanner): observe canonical heal task terminals by @overtrue in #8851
  • fix(scanner): recover backlog across interrupted pool expansions by @overtrue in #8858
  • fix(decommission): count settled entries once, back off repeat pauses by @overtrue in #8848
  • test(heal): cover rc.5 upgrades and refresh ctutils by @overtrue in #8847
  • test(e2e): bound parallel seeding for scanner usage checks by @overtrue in #8861
  • fix(scanner): collect benchmark metrics from realtime route by @overtrue in #8859
  • fix(ecstore): skip orphan cleanup for leading-slash listings by @overtrue in #8864
  • feat(scanner): count cache save payload bytes per attempt by @overtrue in #8865
  • feat(heal): record namespace lock acquisition waits by @overtrue in #8866
  • fix(scanner): recover an interleaved pause backlog wedge after expansion by @overtrue in #8867
  • test(scanner): add recoverable benchmark service control by @overtrue in #8868
  • fix(heal): measure admission lock wait and hold separately by @overtrue in #8863
  • feat(scanner): extract OTLP histogram and counter windows by @overtrue in #8862
  • fix(storage): apply and index explicit delete-marker removals by @houseme in #8854
  • fix(scanner): classify erasure candidates in one budgeted walk by @houseme in #8869
  • fix(s3): apply bucket CORS to virtual-hosted-style requests by @cozima in #8860
  • feat(scanner): count object metadata visits by @overtrue in #8874
  • perf(ecstore): coalesce inline PUT commit and bound disk namespace workers by @RamakrishnaChilaka in #8871
  • test(scanner): verify retained versions with an independent oracle by @overtrue in #8870
  • fix(scanner): preserve unknown catch-up state on ledger failure by @overtrue in #8877
  • test(scanner): attest running benchmark process identity by @overtrue in #8876
  • fix: isolate internode reads and migrate crypto dependencies by @houseme in #8872
  • test(ilm): isolate fixture recovery loop ownership by @overtrue in #8881
  • perf(ecstore): avoid heap allocation for shard descriptors by @houseme in #8873
  • fix(s3): preserve aws-chunked error responses by @houseme in #8875
  • feat(scanner): expose publication and heal observation status by @overtrue in #8878
  • feat(observability): sample live cgroup resource limits by @overtrue in #8882
  • fix(quota): persist lazily created populated shards by @cxymds in #8883
  • perf(ecstore): avoid head-of-line blocking in delete recovery by @houseme in #8884
  • feat(concurrency): retain resource leases through native I/O by @overtrue in #8886
  • feat(observability): track foreground response-body completion windows by @overtrue in #8894
  • fix(lock): reach quorum behind silent voters by @houseme in #8895
  • fix(ecstore): invalidate FdCache on in-place writes, rename_part, and directory rename_file by @jim-czcbangkai in #8889
  • fix(server): preserve UTF-8 boundaries in Content-Disposition filename parsing by @jim-czcbangkai in #8880
  • perf(rpc): remove stream boxing and verify distributed TLS reads by @houseme in #8885
  • fix(ecstore): avoid usize underflow when root_disk drives are offline or unknown by @jim-czcbangkai in #8879
  • fix(s3): preserve legacy plaintext multipart ETags in listings by @houseme in #8900
  • feat(heal): add live node admission feedback by @overtrue in #8897
  • fix(scanner): make startup responsive and skip redundant config work by @houseme in #8898
  • fix(ecstore): unblock delete replay and parallelize preparation by @houseme in #8896
  • fix(multipart): recover aborts without retaining topology locks by @houseme in #8904
  • fix(listing): keep the limit flag monotonic and fix metacache helpers by @overtrue in #8906
  • fix(rio): ZigZag-encode signed delta varints and widen scratch buffer in compress_index by @jim-czcbangkai in #8893
  • fix(heal): retain MRF state when bucket identity is unresolved by @overtrue in #8905
  • perf(ecstore): reduce scanner metadata path allocation overhead by @houseme in #8899
  • chore(deps): refresh allocator, profiling, and archive crates by @houseme in #8910
  • fix(listing): honor per-object quorum with borrowed metadata by @houseme in #8901
  • test(e2e): harden multipart fault and TLS acceptance by @houseme in #8907
  • fix(listing): make page exhaustion explicit, carry limit stops in-band by @overtrue in #8908
  • fix(rebalance): move a version a delete-all expiry would apply inline by @overtrue in #8917
  • fix(ecstore): preserve inactive multipart abort authority by @houseme in #8920
  • perf(ecstore): isolate durable I/O and streamline disk dispatch by @RamakrishnaChilaka in #8902
  • fix(concurrency): prevent premature Workers::wait drain completion on slot handoff by @jim-czcbangkai in #8892
  • feat(heal): read retained MRF lifecycle v2 checkpoints by @overtrue in #8913
  • fix(admin): decouple target inventory from runtime convergence by @houseme in #8921
  • chore(deps): update flake.lock by @houseme in #8922
  • fix(quota): keep reads available without snapshot-wide copies by @houseme in #8928
  • test(ecstore): pin historical compression index reads by @houseme in #8925
  • test(rio): cover maximum index varint totals by @overtrue in #8915
  • fix(test): follow scanner schedules during multi-pool recovery by @overtrue in #8929
  • fix(s3): normalize UploadPartCopy source versionId and populate source versioning state by @jim-czcbangkai in #8890
  • feat(scanner): expose startup phases and attempt deadlines by @houseme in #8931
  • feat(heal): advertise MRF lifecycle reader capability by @overtrue in #8916
  • perf(ecstore): coalesce delete inspection, settlement, and durability by @RamakrishnaChilaka in #8932
  • fix(heal): gate unresolved MRF lifecycle writes on reader support by @overtrue in #8918
  • test(scanner): verify checkpoint debt across process restarts by @overtrue in #8938
  • test(ecstore): verify encoding inputs against released shards by @houseme in #8933
  • fix(storage): guard MPU recovery and startup RPC admission by @houseme in #8934
  • chore(release): align installation references for 1.0.4 by @overtrue in #8940
  • docs(release): reconcile main and clean completed release branches by @overtrue in #8945
  • fix(scanner): retry unreadable cycle state in remote walk fence poll by @loopingz in #8939
  • test(admin): cover target inventory HTTP acceptance by @houseme in #8942
  • test(heal): verify backup recovery and tier owner handoff by @overtrue in #8935
  • refactor(listing): keep paginated listing on ECStore only by @overtrue in #8936
  • test(e2e): cover simultaneous multipart terminal contenders by @houseme in #8943
  • test(e2e): validate conservative Abort recovery boundaries by @houseme in #8941
  • refactor(listing): remove env-gated ListObjects index provider by @overtrue in #8948
  • test(s3-client): make range preflight checks deterministic by @overtrue in #8952
  • fix(storage): fence multipart and metadata recovery by @houseme in #8919
  • fix(scanner): avoid per-set max_entries truncation before cross-set prefix usage merge by @jim-czcbangkai in #8891
  • test(e2e): avoid rescanning publication lock logs by @houseme in #8959
  • chore(deps): update crypto-bigint to 0.7.10 by @houseme in #8962
  • test: stabilize diagnostics and storage CI fixtures by @houseme in #8944
  • refactor(listing): make cursors plain keys and opaque V2 tokens by @overtrue in #8950
  • fix(listing): omit sub-quorum versions from ListObjectVersions by @overtrue in #8964
  • perf(ecstore): optimize cold HEAD and GET metadata read paths by @RamakrishnaChilaka in #8960
  • fix(storage): 404 for dangling objects and strict list quorum default by @overtrue in #8963
  • refactor(listing): list latest versions with MinIO's listing quorum by @overtrue in #8965
  • fix(ecstore): recover drives without serial reconnect delays by @houseme in #8972
  • fix(deps): upgrade russh and replace vulnerable zstd codecs by @houseme in #8969
  • perf(ecstore): coalesce write and multipart metadata I/O paths by @RamakrishnaChilaka in #8975
  • fix(policy): substitute jwt and ldap variables in policies by @RaphaelFakhri in #8927
  • fix(listing): keep the V1 NextMarker escape and document optimal limits by @overtrue in #8976
  • fix(scanner): reduce memory retention and redundant scan work by @houseme in #8971
  • fix(observability): correlate physical namespace lock releases by @houseme in #8974
  • ci: remove never-green Performance A/B workflow by @majinghe in #8979
  • fix(heal): group newly attached replacement disks by @overtrue in #8973
  • docs(agents): add ecstore syscall and blocking-dispatch perf guardrails by @RamakrishnaChilaka in #8987
  • test(e2e): cover partial EC:4 node recovery by @houseme in #8983
  • feat(tools): add read-only BTF prototype inspection by @houseme in #8985
  • docs: define the dirty-journal metadata source contract by @houseme in #8984
  • test(e2e): validate late multipart part transaction packets by @houseme in #8989
  • test(scanner): add memory acceptance runner and budget probes by @houseme in #8988
  • perf(ecstore): reduce multipart source fencing directory and read I/O by @RamakrishnaChilaka in #8986
  • ci: build linux-aarch64 releases on Ubicloud ARM by @majinghe in #8996
  • fix(listing): leave delete recovery out of list requests by @overtrue in #8980
  • docs(scanner): clarify incomplete census diagnostics by @overtrue in #9002
  • test(ecstore): stabilize metadata fanout lifecycle checks by @overtrue in #8999
  • fix(ecstore): select the latest version at read quorum like MinIO by @overtrue in #8982
  • fix(heal): pace and parallelize replacement recovery by @overtrue in #9005
  • feat(tools): inspect BTF scalar member layouts by @houseme in #9003
  • fix(table-catalog): reload peers after table bucket toggle by @marshawcoco in #8994
  • fix(decommission): defer copies that time out on a namespace lock by @overtrue in #9006
  • fix(listing): treat key markers as literal keys by @overtrue in #8978
  • test(connect): report drive probe timeout phases by @overtrue in #8977
  • perf(ecstore): coalesce rename_part and multipart completion I/O by @RamakrishnaChilaka in #9001
  • docs(listing): describe degraded strict quorum limits by @overtrue in #8981
  • fix(admin): make pool diagnostics partial-outage safe by @cxymds in #8995
  • fix(scanner): add context to set cache failures by @overtrue in #9010
  • fix(sftp): allow bucket-scoped root listings by @pentacore in #8998
  • fix(scanner): summarize bucket root collection by @overtrue in #9013
  • fix(lock): retain state during acquisition by @overtrue in #9014
  • test(decommission): cover held target lock and partial-copy resume by @overtrue in #9016
  • fix(ecstore): serve the latest readable version past dangling versions by @overtrue in #9004
  • chore: remove redundant review skills by @overtrue in #9022
  • fix(rebalance): reuse the target pool holding a dangling copy by @overtrue in #9018
  • feat(observability): attribute local batch shard reads by @houseme in #8991
  • chore(deps): refresh fuzz workspace dependencies by @houseme in #9024
  • fix(ecstore): resolve dangling latest versions in metadata updates by @overtrue in #9009
  • fix(ecstore): harden stale multipart cleanup by @houseme in #9023
  • feat(scanner): share node admission with background heal by @overtrue in #8903
  • ci: move lightweight jobs to GitHub-hosted Ubuntu by @majinghe in #9027
  • refactor(storage): reuse dirty journal replay JSON frames by @houseme in #9026
  • feat(plugins): add minimal original-user runner integration by @overtrue in #9017
  • test(storage): pin dirty journal JSON recursion boundary by @houseme in #9029
  • refactor(storage): replay decoded dirty journal records by @houseme in #9030
  • fix(heal): coordinate delete recovery and preserve transient errors by @overtrue in #9031
  • test(targets): bound failing-delete replay observations by @houseme in #9032
  • perf(ecstore): reuse bucket incarnation fences across copy and metadata paths by @RamakrishnaChilaka in #9034
  • feat(s3): serve Veeam SOSAPI system and capacity XML by @loverustfs in #9007
  • fix(metrics): reject missing histogram counts by @overtrue in #9039
  • fix(ecstore): prove multipart part sizes before cleanup by @houseme in #9037
  • test(heal): keep rename-tail repair out of isolated root heal by @overtrue in #9041
  • fix: keep incomplete scanner measurements unknown by @overtrue in #9044
  • perf(ecstore): streamline local GET batch reads by @houseme in #9043
  • fix(admin): protect notification target edits by @houseme in #9048
  • fix: account for shared CPU pressure in background admission by @overtrue in #9050
  • perf(heal): stream MRF intent digests by @overtrue in #9051
  • fix(ecstore): remove misleading remote lock log by @houseme in #9042
  • test(validation): run canonical cases and build pinned Heal tools by @cxymds in #8455
  • fix(tiering): diagnose blocked tier deletion and retry cleanup by @cxymds in #9035
  • feat(ecstore): add sampled batch CPU diagnostics by @houseme in #9019
  • perf(lifecycle): skip size reads for disabled rules by @houseme in #9046
  • fix(storage): reject unwritable data volumes during startup by @majinghe in #9056
  • chore(deps): refresh crates and adopt released aws-sigv4 by @houseme in #9047
  • chore: strengthen agent delivery standards and validation by @overtrue in #9058
  • ci: unify validation planning, artifacts and suite orchestration by @overtrue in #9059
  • ci: qualify workspace packages that share a name with a dependency by @overtrue in #9065
  • ci: let failed-job reruns reuse the producer's test archives by @overtrue in #9071
  • ci: enforce affected validation and rehearse bounded shards by @overtrue in #9070
  • fix(audit): emit entries for multipart parts and bucket config writes by @aepod in #9067
  • ci(ft,heal,chain): FT gate 54, heal budget, and a temporary performance lane disable by @majinghe in #9057
  • fix: preserve PUT lock failure diagnostics by @houseme in #9062
  • fix(site-replication): grant replicator s3:ForceDeleteObject by @timootten in #9069
  • fix(replication): count force-delete outcomes in replication stats by @reatang in #9072
  • fix(audit): emit a bounded audit entry for authorization denials by @aepod in #9073
  • fix(s3select): case-insensitive enums, LINES key order, path names by @babs in #9021
  • perf(ecstore): fuse local PUT/DELETE commit I/O and eliminate redundant metadata disk reads (#9038) by @RamakrishnaChilaka in #9064
  • fix(ci): accept binary target IDs in workspace shards by @overtrue in #9075
  • docs: require removing task build output before handoff by @overtrue in #9078
  • fix(scanner): distinguish missing heal identity fields by @overtrue in #9000
  • fix(scanner): align unversioned overflow heal options by @overtrue in #9036
  • fix(scanner): report incomplete collector observations by @overtrue in #9012
  • fix(heal): preserve data when removal is disabled by @overtrue in #9040
  • fix: reject unverified scanner performance evidence by @overtrue in #9049
  • feat: classify scanner metadata calls by diagnostic prefix by @overtrue in #9052
  • fix(heal): prevent lock timeouts during disk recovery by @overtrue in #9054
  • perf(scanner): batch proportional pacing in folder walkers by @overtrue in #8850
  • fix(scanner): track heal generation and payload observations by @overtrue in #9008
  • feat(scanner): certify cold peer buckets during hot writes by @overtrue in #8970
  • feat(storage): share physical admission across scanner and heal by @overtrue in #8911
  • feat(scanner): fair bucket service across restarts and budgeted first enumeration by @overtrue in #9083
  • fix(console): buffer brotli responses to set Content-Length for Firefox (#9076) by @SavvySloth in #9079
  • fix(console): strip Content-Encoding on brotli buffer failure by @overtrue in #9085
  • test(heal): align cleanup tests with removal-disabled heals by @overtrue in #9087
  • chore(deps): refresh workspace dependencies by @houseme in #9080
  • docs(testing): index event-class drills and retained CI evidence by @overtrue in #9088
  • ci: record CI01 measurements, drill evidence and fix the OIDC live gate by @overtrue in #9091
  • ci: move specialized lanes off the pull-request path by @overtrue in #9093
  • chore(e2e): isolated harness event drill (close after evidence) by @overtrue in #9089
  • feat(release): gate publication on candidate certification (R01) by @overtrue in #9090
  • ci: stamp the plan contract and rename the workspace lint-and-build key by @overtrue in #9095
  • fix(s3): guard conditional multipart pool errors by @houseme in #9092
  • fix(ecstore): clear stale BucketMetadataSys on ECStore drop by @overtrue in #9097
  • fix(scanner): rebuild unreadable usage floor instead of stopping leader iteration by @overtrue in #9101
  • perf(ecstore): optimize listing, versioned put, delete, and multipart (#9077) by @RamakrishnaChilaka in #9094
  • test(console): strengthen brotli buffer middleware test coverage by @SavvySloth in #9098
  • test(e2e): stabilize mixed-version coordinator assertion against leader-lock refresh gaps by @overtrue in #9103
  • perf(ecstore): optimize multipart commit, delete receipts, and fsync by @RamakrishnaChilaka in #9105
  • fix(s3-tables): clean empty catalogs and cache registration reads by @GatewayJ in #9063
  • chore(deps): update flake.lock by @houseme in #9108
  • perf(s3): streamline conditional multipart preflight by @houseme in #9099
  • ci(validation): sweep the migrated canonical validation cases nightly by @majinghe in #9107
  • perf(ecstore,rio,utils): accelerate MD5 ETag hashing and SWAR disk path checks by @RamakrishnaChilaka in #9110
  • fix(test): use available Docker privileges in OIDC live gate by @overtrue in #9109
  • docs(scanner): define prefix statistics contract by @houseme in #9116
  • test(filemeta): cover visible version after tier cleanup by @houseme in #9115
  • feat(tls): add opt-in fips feature for aws-lc-rs and rustls by @boylee1111 in #9084
  • chore(deps): update crates and fix storage CI regressions by @houseme in #9111
  • ci(validation): resolve the newest nightly build on scheduled sweeps by @majinghe in #9114
  • fix(ecstore): release retained file descriptor cache invalidations by @GatewayJ in #9112
  • perf(ecstore): shard disk path lock registries with SWAR byte keys by @RamakrishnaChilaka in #9127
  • chore(deps): bump the dependencies group across 1 directory with 5 updates by @dependabot[bot] in #9113
  • test(e2e): honor namespace backpressure in mixed workload by @houseme in #9122
  • ci: run distributed and upgrade e2e on schedule only by @majinghe in #9126
  • fix(table-catalog): resolve superseded staged commits by @marshawcoco in #9124
  • ci(nightly): dispatch nightly-candidate-ready after asset publish by @majinghe in #9131
  • fix(s3select-api): clamp overflowing u64 GetRange values to i64::MAX by @weile321 in #9118
  • fix(tls): unify FIPS provider policy across clients by @houseme in #9125
  • fix(metrics): reconcile peer-health gauge on successful RPCs and probes by @houseme in #9134
  • perf(filemeta): grow metacache read chunks geometrically by @houseme in #9133
  • fix(replication): finish writeback for already purged versions by @overtrue in #9135
  • fix(heal): preserve lock, format, and repair identity by @houseme in #9132
  • feat(fips): route internode RPC HMAC through aws-lc-rs FIPS by @boylee1111 in #9137
  • fix(replication): skip site-replication rules in replica delete fan-out by @reatang in #9138
  • chore(deps): refresh crate requirements and lockfile by @houseme in #9140
  • perf(ecstore,rpc): shard hot-path delete, multipart, and RPC lock tables by @RamakrishnaChilaka in #9143
  • fix(heal): treat SlowDown as a rate signal and bound page churn by @houseme in #9144
  • fix(replication): replay the MRF journal periodically by @reatang in #9139
  • ci(nightly): embed the console UI in the GNU nightly build by @majinghe in #9158
  • fix(auth): canonicalize s3:VersionId before policy evaluation by @overtrue in #9150
  • fix(admin): keep Vault local-file reads on the operator connection by @overtrue in #9152
  • fix(s3): reserve the __XLDIR__ directory-marker suffix in client keys by @overtrue in #9153
  • fix(ecstore): judge the null version a versionless delete removes by @overtrue in #9151
  • fix(auth): build policy conditions from the value a write stores by @overtrue in #9159
  • fix(policy): close condition, action, principal and resource gaps by @overtrue in #9160
  • fix(ecstore): gate null-version overwrites under Object Lock by @overtrue in #9157
  • fix(iam): close identity, session and admin-authorization gaps by @overtrue in #9163
  • fix(proxies,targets,obs): bound untrusted input in leaf crates by @overtrue in #9166
  • fix(protocols,kms,keystone): enforce client CA, protect the KMS probe by @overtrue in #9168
  • fix(api): keep SlowDownRead off write-path quorum failures by @houseme in #9149
  • chore(deps): refresh Cargo dependencies by @houseme in #9156
  • fix(s3): honor presigned x-amz-meta-* query parameters by @houseme in #9146
  • perf(ecstore): skip unmatched FdCache scans and maintenance wakeups by @RamakrishnaChilaka in #9165
  • perf(ecstore): parallelize bulk-delete lock and metadata fan-out by @houseme in #9155
  • fix(s3): report malformed multipart upload IDs as NoSuchUpload by @KarlEmm in #9147
  • feat(container): add declarative bucket bootstrap by @jmeiracorbal in #9162
  • fix(io-core): preserve pooled capacity and accounting by @houseme in #9171
  • fix(s3): treat duplicate CreateBucket as owned by the requester by @cxymds in #9167
  • fix(ecstore): streamline lock RPC and listing ownership by @houseme in #9176
  • fix(audit): preserve OIDC identity in S3 request audits by @GatewayJ in #9178
  • fix(obs): add fine-grained object lock histograms by @houseme in #9177
  • fix(storage): bound heal retries and recover pool metadata by @overtrue in #9164
  • fix(s3,ecstore,table-catalog): bound work driven by client input by @overtrue in #9172
  • chore(ci): bump overtrue/cla-bot to v0.1.0 by @overtrue in #9188
  • fix(server): bound rejoin waits and preserve recovery ownership by @houseme in #9181
  • fix(sftp): put directory objects as trailing-slash keys by @overtrue in #9180
  • fix(ecstore): retry failed internode channel prewarm by @houseme in #9186
  • feat(ecstore): record unary gRPC operation duration by @houseme in #9187
  • ci: bump overtrue/cla-bot to v0.1.1 by @overtrue in #9189
  • fix(observability): avoid duplicate process metric labels by @houseme in #9182
  • perf(ecstore): fuse overwrite commits and optimize delete recovery by @RamakrishnaChilaka in #9194
  • fix(ecstore): preserve multipart shards within write budgets by @cxymds in #9197
  • fix(lock): converge cleanup after lost release acknowledgements by @cxymds in #9199
  • fix(container): unify directory setup and startup diagnostics by @houseme in #9201
  • fix(scanner): bound wide bucket-root fanout memory by @overtrue in #9193
  • fix(cors): isolate cache variants and streamline policy evaluation by @houseme in #9203
  • fix(webdav): support configured browser CORS access by @houseme in #9205
  • test(e2e): fix quota and conditional write fixtures by @overtrue in #9210
  • test(storage): reproduce HTTPS rejoin readiness in Docker by @houseme in #9206
  • fix(s3): retain protected multipart ETags in object listings by @houseme in #9208
  • fix(lock): preserve acquisition progress during multipart uploads by @cxymds in #9209
  • fix(runtime): release retained replay and allocator memory by @overtrue in #9211
  • fix(ecstore): preserve ownership across multi-pool recovery by @overtrue in #9212
  • fix(webdav): join connection and reload tasks on shutdown by @overtrue in #9213
  • fix(storage): fence bounded deletes during rolling upgrades by @overtrue in #9214
  • fix: preserve usage generations and unify request tracing by @houseme in #9204
  • fix(cors): preserve readiness and complete cache selectors by @houseme in #9207
  • fix(table-catalog): reject storage credentials for catalog access by @marshawcoco in #9185
  • feat(tier): support native Azure Blob endpoints by @cxymds in #9200
  • feat(observability): record unary read RPC durations by @houseme in #9202
  • fix(ecstore): complete and abort native multipart uploads on Windows by @reatang in #9191
  • test(rio,ecstore): add negative-branch durability unit tests by @boylee1111 in #9216
  • fix(swift): preserve bucket metadata with Swift tag values by @overtrue in #9218
  • fix(decommission): reserve owned source usage during activation by @overtrue in #9220
  • fix(ci): bound workspace archive builds to two workers by @overtrue in #9222
  • fix(ci,ecstore): restore validation and defer capacity exhaustion by @overtrue in #9223
  • refactor(table-catalog): retire durable-strong backing by @marshawcoco in #9130
  • fix: correct scanner pacing and unverified MRF outcomes by @cxymds in #9225
  • chore(deps): update flake.lock by @houseme in #9236
  • fix(cache): respect process cgroup memory limits by @overtrue in #9232
  • fix(rpc): size and reserve replay cache for compact entries by @overtrue in #9233
  • fix(select): bound Parquet allocations before decoding by @overtrue in #9231
  • perf(ecstore): optimize PUT, DELETE, and multipart commit hotpaths by @RamakrishnaChilaka in #9227
  • fix: reduce scanner backoff and classify downstream closures by @cxymds in #9235
  • ci: repair e2e selection and verify tool downloads via API by @cxymds in #9240
  • fix(select): bound LZ4 scratch and Arrow schema expansion by @overtrue in #9237
  • fix(rpc): bound replay memory and atomically admit signed requests by @overtrue in #9238
  • fix(ecstore): decouple pool metadata health from the authority gate by @overtrue in #9241
  • fix(catalog): enumerate table owners without skipping namespaces by @overtrue in #9242
  • fix(ecstore): remove hardlinked backup during delete rollback by @RamakrishnaChilaka in #9239
  • fix(tier): recover orphaned prepared mutations by @overtrue in #9246
  • chore(release): prepare 1.0.5 by @overtrue in #9249
  • fix: preserve scanner backlog authority after pool replacement by @overtrue in #9252
  • revert(release): defer certification rollout for 1.0.5 by @overtrue in #9254

New Contributors

  • @alpbeysir made their first contribution in #8555
  • @limitcool made their first contribution in #8568
  • @cozima made their first contribution in #8860
  • @jim-czcbangkai made their first contribution in #8889
  • @loopingz made their first contribution in #8939
  • @RaphaelFakhri made their first contribution in #8927
  • @pentacore made their first contribution in #8998
  • @aepod made their first contribution in #9067
  • @timootten made their first contribution in #9069
  • @SavvySloth made their first contribution in #9079
  • @boylee1111 made their first contribution in #9084
  • @weile321 made their first contribution in #9118
  • @jmeiracorbal made their first contribution in #9162
Full Changelog: 1.0.4...1.0.5

Performance and Compatibility

RustFS is built in Rust and is designed around high performance and efficient resource usage. Its distributed architecture allows storage capacity to scale across multiple nodes and drives.

S3 compatibility is one of its biggest advantages. The project maintains a compatibility matrix for supported S3 functionality, allowing users to evaluate whether their existing applications can work with RustFS. This is particularly useful for applications originally designed around Amazon S3 or other S3-compatible storage systems.

RustFS also positions itself as an alternative for MinIO deployments. However, compatibility should not be interpreted as complete drop-in compatibility. The project currently marks MinIO on-disk compatibility as preview functionality, and its documentation specifically notes that MinIO-encrypted objects cannot be read by RustFS. Existing MinIO installations should therefore be migrated through supported S3-based workflows rather than assuming the underlying storage can simply be reused.

The project supports both single-node and distributed deployments. Its documentation also places specific restrictions on topology expansion, so administrators should plan the initial storage layout carefully before building a cluster.

System Requirements

  • Linux or another supported platform capable of running RustFS

  • Docker, Podman, Kubernetes, or a supported native installation method

  • Storage capacity appropriate for the object-storage workload

  • Writable storage directories when using host-mounted Docker volumes

  • Additional resources for distributed deployments, replication, monitoring, and large workloads

For Docker deployments, the official container runs as the rustfs user with UID/GID 10001:10001. Host-mounted directories therefore need appropriate ownership or permissions.

Pros and Cons

Pros

  • Open-source under the Apache 2.0 license

  • S3-compatible object storage

  • Written in Rust

  • Supports standalone and distributed deployments

  • Web-based management console

  • Versioning and Object Lock

  • Bitrot protection and automatic healing

  • Bucket and site replication

  • Lifecycle management and remote S3 tiering

  • Server-side encryption and KMS integration

  • IAM policies and OIDC/SSO

  • Kubernetes Helm support

  • OpenStack Swift and Keystone support

  • SFTP, FTPS, and WebDAV support

  • Designed for AI, data lake, and high-throughput workloads

  • Suitable as a potential MinIO alternative

Cons

  • Still a relatively young project compared with established object-storage platforms

  • S3 compatibility is broad but not universal, so individual applications should be tested

  • MinIO on-disk compatibility is still marked as preview

  • MinIO-encrypted objects cannot be read directly

  • Distributed deployments require careful topology planning

  • Some protocols require optional build features

  • Large production deployments require proper planning for storage, networking, replication, and recovery

How to Install

RustFS provides several installation methods, including Docker, Docker Compose, native installation, Nix, and other deployment options.

For a simple Docker deployment, create persistent data and log directories, ensure they are writable by the RustFS runtime user, and start the official container with ports for the S3 API and web console.

After starting the service, the web console can be accessed through port 9001 while the S3-compatible service uses port 9000.

For production deployments, the official Docker Compose configuration provides additional observability components, while Kubernetes users can deploy RustFS using the available Helm charts.

When migrating from another S3-compatible platform, test the application's S3 API compatibility and use S3-based migration rather than relying on direct access to another product's underlying storage format.

Final Verdict

RustFS is one of the more interesting open-source alternatives for users looking for S3-compatible object storage outside the traditional MinIO ecosystem. Its Rust implementation, Apache 2.0 license, distributed architecture, encryption, replication, IAM, lifecycle management, and broad protocol support give it a strong feature set.

Its biggest advantage is that it is not merely a lightweight S3 gateway. RustFS aims to provide a complete object-storage platform capable of handling serious distributed workloads.

The main concern is maturity. Because the project is still developing rapidly, compatibility and operational behavior should be validated against the applications and storage topology you intend to use. MinIO users should also be particularly careful not to assume that existing on-disk data can simply be pointed at RustFS.

For new S3-compatible deployments, especially where an Apache-licensed and Rust-based storage platform is desirable, RustFS is a compelling option.

RustFS 1.0.5
Free
Software Informations:
Developer:

Operating System:
Windows / Linux / macOS
Date Added:
2026-11-11T15:07:17.207Z