The browser where every project is its own world.

Melon is a Chromium browser built around Spaces. Each one keeps a project's tabs, terminal, editor, git and AI agents together, opened in the right folder.

🍉atlas
atlas · Uploads that never failwith Claude, Terminal
Stream large uploads in 8 MB chunks · #182
NW‑412 · Video uploads over 100 MB fail
Source Control
limits.ts
Upload API · atlas docs
localhost:5173
DocsPricingChangelogSign in

Uploads that never fail.

Resumable, chunked uploads with one line of code. Retries, checksums and progress included.

Start building
ResumablePick up where the network dropped.
VerifiedEvery chunk checksummed.
ObservableLive progress events.
import { upload } from "atlas"; await upload(file, { to: "/media", resumable: true });
Claude
Why does the upload test fail on large files?

› Worked for 14s Searched · Read · Edited

Searched maxBodySize

Read src/limits.ts

Edited src/limits.ts+2 −1

The body limit was 100 MB, so anything larger was rejected before upload. I raised it to 2 GB and send files in 8 MB chunks, so large uploads stream instead of buffering.

! Run npm test -- upload?

AllowAlways allowDeny
Reply to Claude…
Ask ▾✳Default High ▾
main2 changed files
Terminal

atlas main % npm test -- upload

✓ resumes after a dropped chunk (41 ms)

✓ rejects a bad checksum (12 ms)

✓ streams files over 2 GB (380 ms)

Tests 3 passed (3)

atlas main % git commit -am "Stream large uploads in 8 MB chunks"

[main 4f2a9c1] 2 files changed, 14 insertions(+), 3 deletions(-)

atlas main %

A Space is a project, not a pile of tabs.

Point a Space at a folder or a server and Melon keeps that project together: its tabs, its tools, its logins. Switch projects from the sidebar and everything switches with you.

🍉atlas
limits.tsTerminal
atlas · Uploads that never fail
Claude · upload limits
Stream large uploads in 8 MB chunks · #182
Source Control
limits.ts
limits.tsupload.ts

1export const limits = {

2 maxBodySize: 2_147_483_648,

3 chunkSize: 8 * MB,

4 retries: 5,

5};

6

7export function plan(size: number) {

8 return Math.ceil(size / limits.chunkSize);

9}

10

11export async function send(file: File) {

12 for (let i = 0; i < plan(file.size); i++) {

13 await putChunk(file, i);

14 }

15}

TypeScriptLn 3, Col 22Spaces: 2UTF‑8
Terminal

atlas main % npm test -- upload

✓ resumes after a dropped chunk (41 ms)

✓ rejects a bad checksum (12 ms)

✓ streams files over 2 GB (380 ms)

Tests 3 passed (3)

atlas main % git commit -am "Stream large uploads in 8 MB chunks"

[main 4f2a9c1] 2 files changed, 14 insertions(+), 3 deletions(-)

atlas main %

atlasmainzshRunning
01

Local folders

Bind a Space to any folder. The terminal opens there, git treats it as the repo, and agents use it as their working directory.

02

Remote over SSH

Pick a host from your SSH config. Terminal, files, git, search and language servers run on the server through the same tools.

03

Separate profiles

Each Space keeps its own cookies, logins and site data, so client work and personal accounts never mix.

04

Split into a grid

Pages and tools side by side, stacked or nested, with drag‑to‑split and resizable panes. Layouts are saved.

Every Space wears its own colour.

Pick a style, Flat or Glass, in dark or light, then a colour. Flat can blend in a second colour and add grain; Glass lets the desktop show through. The window changes as you choose. Try it here.

🎨ui-kit
Upload progress · ui‑kit
New focus ring tokens · #57
Upload API · atlas docs
Claude · progress states
localhost:6006/?path=/story/upload-progress
ui‑kitButtonCardUpload progressToast
Components / Upload progress / Resuming
onboarding.mp4Chunk 37 of 154 · resumed after a dropped connection
brand-assets.zipVerifying checksum
PauseCancel
🎨
Style
Color
Custom ›
See-through
55%
Icon

The apps you alt‑tab to, as tabs.

Every Space comes with tools that open like any other tab, already pointed at the project. Put the terminal next to the docs, or the editor beside your local preview.

🍉atlas
atlas · Uploads that never fail
Terminal
Source Control
Files
limits.ts
Agent
Terminal

atlas main % npm test -- upload

✓ resumes after a dropped chunk (41 ms)

✓ rejects a bad checksum (12 ms)

✓ streams files over 2 GB (380 ms)

Tests 3 passed (3)

atlas main % git commit -am "Stream large uploads in 8 MB chunks"

[main 4f2a9c1] 2 files changed, 14 insertions(+), 3 deletions(-)

atlas main %

atlasmainzshRunning

Terminal

GPU‑rendered, with clickable file paths, find and saved scrollback.

Editor

Monaco, the editor inside VS Code, with real language servers.

Files

An explorer with git badges, quick search and drag‑and‑drop.

Git

Stage, commit, diff, branch, worktrees and pull requests.

Agents

Claude and Codex, in a tab, in the project folder.

Notes

Markdown with backlinks, next to the work it is about.

Search

Ripgrep and fuzzy find across the whole project.

Capture

Regions, full pages and screen recordings, annotated.

Claude and Codex, already in the right folder.

Open an agent from a Space and it starts in that project. No cd, no pasted paths, no guessing which repo it is touching.

🍉atlas
Claude · upload limitsCodex · upload guide
atlas · Uploads that never fail
Terminal
Source Control
Claude · upload limits
Why does the upload test fail on large files?

› Worked for 14s Searched · Read · Edited

Searched maxBodySize

Read src/limits.ts

Edited src/limits.ts+2 −1

The body limit was 100 MB, so anything larger was rejected before upload. I raised it to 2 GB and send files in 8 MB chunks, so large uploads stream instead of buffering.

! Run npm test -- upload?

AllowAlways allowDeny
Reply to Claude…
Ask ▾✳Default High ▾
main2 changed files
Codex · upload guide
Update the upload guide for the new chunk size.

› Worked for 9s Read · Edited

Read docs/upload.md

Edited docs/upload.md+6 −2

The guide now says uploads stream in 8 MB chunks and resume from the last good chunk. I also replaced the old 100 MB limit in the FAQ.

Reply to Codex…
Ask ▾Codex High ▾
main2 changed files

Small things, done carefully.

atlas docs · v2.4

Upload API

Uploads stream in 8 MB chunks. If the connection drops, the next request resumes from the last chunk the server verified, so a 2 GB file never starts over.

const job = await upload(file, { to: "/media", resumable: true }); job.on("progress", (p) => bar.set(p.percent));
Options
  • chunkSize Bytes per request. Default 8 MB.
  • retries Attempts per chunk before the job fails. Default 5.
  • checksum Verified on the server for every chunk. Default sha256.
term
New Terminal↩
Terminal · atlas
Search the web for “term”
↩ Open⌥ Split⌘ Backgroundesc Close
Command barTabs, history, bookmarks, files and every tool behind one shortcut. Open in place, in a split, or in the background.
DocsPricingChangelogSign in

Uploads that never fail.

Resumable, chunked uploads with one line of code. Retries, checksums and progress included.

Start building
ResumablePick up where the network dropped.
VerifiedEvery chunk checksummed.
ObservableLive progress events.
import { upload } from "atlas"; await upload(file, { to: "/media", resumable: true });
localhost:5173
Stream large uploads #182
Terminal · npm test
Recent tabs, with previewsHold ⌃ and tap Tab to flip through tabs in the order you last used them.
Upload API · atlas docs
atlas · Uploads that never failTerminal · npm test
Claude · upload limitswith Stream large uploads in 8 MB chunks · #182, e2e · CI run 4812
limits.tswith NW‑412 · Uploads fail, Upload health, Upload progress · Storybook
Team chat · #atlas
Stream large uploads in 8 MB chunks · #182
Claude · upload limits
e2e · CI run 4812
Splits that read at a glanceTwo panes keep their titles side by side; three or more fold into a card that shows the layout. Prefer rows or a mini-map? It's one setting.
DocsPricingChangelogSign in

Uploads that never fail.

Resumable, chunked uploads with one line of code. Retries, checksums and progress included.

Start building
ResumablePick up where the network dropped.
VerifiedEvery chunk checksummed.
ObservableLive progress events.
import { upload } from "atlas"; await upload(file, { to: "/media", resumable: true });
e2e · uploads failed · CI run 4812
CI · atlas · run 4812 · uploads/chunked

e2e · uploads failed

streams files over 2 GB380 ms

resumes after a dropped chunk4.1 s

upload.test.ts:58 Expected offset 67108864, received 0 at resume (src/upload.ts:91)
Little MelonA CI link from team chat or your terminal opens in a floating peek. Close it, expand it into a tab, or split it beside your code.
Tab folders
Keep a ticket's PR, issue and preview together in one folder in the sidebar.
Archive, not clutter
Old tabs quietly archive themselves; anything is one search away.
Private windows
A separate window that forgets everything the moment it closes.

A real browser, not a wrapper.

Melon is genuine Chromium, de‑Googled, inside a native window. Sites behave the way they do in Chrome, and so do your extensions.

Chrome extensions

Install Manifest V3 extensions from the Chrome Web Store, with popups, side panels, shortcuts and auto‑update.

The whole web platform

WebGPU, WebRTC, screen sharing, installable web apps and DRM video, straight from Chromium.

Chrome DevTools

Docked or in its own window, with Inspect in every context menu, extension popups included.

Passwords and autofill

Chromium's own password manager and address and card autofill, with native save prompts.

Bring everything

Import bookmarks, history and passwords from Chrome, Arc, Brave, Edge and Safari.

A native window

The sidebar, tabs and menus are native, not web pages, so the frame stays fast and light.

Your Spaces, on every device.

Sign in with your email and a one‑time code. Spaces, folders and tabs follow you; close a tab here and it closes there. It keeps working offline and catches up later.

  • Optional. Melon works fully without an account. Sync is off until you sign in.
  • Encrypted at rest. Synced data is sealed with AES‑256‑GCM on the server.
  • Yours to delete. Deleting your account deletes everything stored for it.

Read every line.

Melon is open source. The browser, its Chromium patches and its tools are on GitHub: audit it, build it yourself, or send a pull request. The repository is written for coding agents too: point Claude or Codex at AGENTS.md and it knows how Melon is built, how the pieces fit, and how to add your own tools and features.

melon-browsermain
AGENTS.mdStart here: how to build, change and extend Melon
apps/The web tools: terminal, editor, git, files, agents
core/Spaces, terminals, agents and the RPC bridge
docs/Architecture, build and extension guides
engine/Chromium patches and the embedding layer
macos/The native window, sidebar and Spaces
tooling/Build, sign and audit scripts

Start with one Space.

Free and open source.