The page gets the whole window.
BasicShell is a small, quiet web browser for Mac. Tabs wait at the left edge, the address waits at the top, and neither takes any room until you reach for it. Written in Swift, on the WebKit that already ships with macOS. Your AI agent can use it too, with your say.
Your agent can use it. With your say.
Turn it on in Settings and Claude Code, the Claude app, Antigravity or any other client that speaks the Model Context Protocol gets tools for your tabs and the pages in them. No key, no account, no extension that has to see every page.
Asked per site
Once to read a site, again before it clicks or types there. Say no and it stays no.
Passwords stay yours
What is in a password, card or one-time-code field is never given, and nothing is typed into one. Private tabs are never listed.
You can see it, and stop it
The tab it works in is framed and marked in the sidebar, with a Stop button. Everything is let go and nothing more happens until you say so.
YouPut my bird tabs in a group and pin the field guide.
tabs6 tabs in 2 profiles. Main is shown.openfieldguide.example/birds/kestrel in Agent (no sign-ins)read_textKestrel article, 4 paragraphs, 1 videofind“wingspan” in At a glance, 68 to 78 cmarrangeGroup 3 tabs as Birds, pin 1screenshotmax_width 900, marks on
fieldguide.example wants to click and type on this site.
Small, but it does a lot.
Everything below is in the app today. Nothing is a plan. Search it, or pick a part.
Windows and edgesThe page comes first, the rest waits at the edges.
The page takes the whole window
Tabs live in a sidebar that comes out when the pointer reaches the left edge. Back, forward, reload and the address come down from the top edge. Either can be pinned open from the View menu.
Sidebar only
In Settings there can be no top bar at all. The sidebar then holds the traffic lights, back and forward, the site (a click brings up its whole address over the page) and the site's buttons. A fresh install starts this way.
Full screen that uses every pixel
On a Mac with a notch the top bar runs through the strip the menu bar would have, with the notch in its middle, and the window's corners are the screen's own. The menu bar and the Dock stay macOS's own, hidden until you press against the edge.
A new tab is a field
It starts as a field over the page you are on, and the tab exists only once you enter an address or a search. It suggests open tabs, bookmarks and history, and finds a word by its letters in order (“gthub”) or by two initials (“gh bs”).
Several windows
Each window has its own tabs.
Keyboard Shortcuts window
In the BasicShell menu: every key the menus answer to, read off the menus as they are, with a search field, and what the pointer does with a key held.
Tabs, groups and profilesKeep work, home and the rest from running into each other.
Pinned tabs
Pinned tabs sit three to a row as tiles, each with its icon, above the others.
Tab groups
A group has a coloured name that a click folds away, a line of its colour down its tabs, and a small New Tab row at its end. Right-click a tab to add it to one. Groups come back with the session.
Tabs stay under their parent
A tab opened from a link sits under the tab it came from, and closing the tab you are on goes back to the one you were on before, not to its neighbour.
Profiles
A row of coloured dots above the pinned tabs, with the name of the one shown in its colour. Each has its own cookies and sign-ins, tabs, pinned tabs, groups, history and bookmarks. Extensions, zoom and what sites may do are shared.
Split view
Right-click a tab or a link and choose Open Side by Side. Two pages share the window with a divider to drag; the one with the frame has the keyboard, and the address, Find, zoom and Picture in Picture follow it.
Private tabs
They sit beside ordinary ones and share one cookie jar that is kept only in memory and goes when the app quits. They are never saved in the session, and never shown to an agent.
Quiet tabs
A tab off screen is frozen: no script, no timers, nothing lost. After six hours, or when memory runs short, it is unloaded and comes back where it was. A tab with unsent typing, sound or a call is left alone, and a site can be kept awake.
Reading and lookingPages as you would like to read them.
Reader ⌥⌘R
The article on its own: light, sepia, dark or following the system, serif or sans, five sizes, three widths. The page is read, never touched. Only a page that has an article offers it.
Dark pages ⇧⌘D
A page that stays white while macOS is dark gets dark colours of its own, pictures untouched. A site that already has a dark look is left alone, which is measured, not read off what the site says. Off until you turn it on.
Peek ⇧ click
See a link's page in a panel over the one you are reading, which stays where it was. Esc puts it away, and its other button keeps it as a tab beside this one.
Link preview hold ⌘
Hold ⌘ over a link for a moment and a small copy of the page it goes to shows beside it. ⌘ click still opens it behind.
Translate Page
From the address field or a page's menu: the system's own translation, on this Mac, text by text in the page, and back with one more press.
Zoom, by site ⌘+ ⌘−
Set it once and it comes back whenever a tab goes to the site. Never remembered from a private tab.
Picture in picture ⇧⌘P
The system's own: just the video, in a borderless window you can resize. A video that is playing goes into it by itself when you leave its tab or the window, and comes back when you return.
The whole page as one picture ⇧⌘R
Copies the page, top to bottom, as a single image. Pictures that wait to be scrolled to are asked for first, and the page is put back where it was.
Find in the page ⌘F
A small field at the page's top right, every match marked and counted.
SavingTake things with you, tidily.
A download button for photos and videos
On the sites you list (the list starts empty), a small button comes up over a large picture or video while the pointer is on it, even under a layer the site puts over its pictures, and inside a player's frame.
Videos sent in pieces
A video that arrives as many small files is put back together from what the page loaded, with the Mac's own AVFoundation: HLS playlists, AES-128 ones decrypted, or a picture file and a sound file joined into one mp4.
Downloads you can steer
Pause, resume, cancel and restart, with the speed and the time left. A paused one and the last hundred finished are still there after the app is quit.
Copy address without the tracking ⇧⌘C
utm_ parameters, fbclid, gclid and a site's share codes come off; a video's t or a search's q never do. ⌥⇧⌘C copies it as it is. The pill says how many came off and offers a QR code and AirDrop.
Import
Bookmarks and all of the history from Chrome and what is built on it, from Safari and from Firefox; and from Chrome and its kin a password file (CSV) to hand to a password manager.
Notifications
From the sites you allow, to Notification Center, only while the site is open in a tab. Each site asks once and is remembered.
Privacy and the networkWhat it does not do matters more than what it does.
No telemetry, no account
Nothing is sent but the pages you open and, in a release build, a once-a-day look at GitHub for a newer version, which Settings turns off.
Ads and trackers
Blocked by uBlock Origin Lite, the Safari extension that comes with its app from the App Store, including YouTube's ads. Its button in the top bar turns it off for a site.
HTTPS first
An address typed as http is tried over https first and falls back to http when the site has none.
Tracking parameters
fbclid, gclid and the like come off the links you follow, from the list macOS keeps for Safari.
What a site is told, and may do
The lock brings up how the page was fetched and by whose certificate, what it was allowed (location, notifications; each can be taken back), what it keeps on this Mac, and its zoom.
A cache with a limit
Kept under 250 MB unless you change it, and emptied when it passes.
Google searches keep your region
They carry the Mac's language and region, so a VPN does not switch results to another country.
ExtensionsOn WebKit's own extension engine.
From the Chrome Web Store
Signature checked, or from a folder, or a Safari extension loaded from inside the app it came with.
Talks to apps on the Mac
Chrome extensions can reach apps here the way they do in Chrome. Bitwarden's Touch ID through its desktop app works.
Kept alive
WebKit's tracking prevention is kept from deleting an extension's own storage, and a background that fails to start again after macOS ended its process is started afresh.
For developersOut of sight until you turn them on.
Develop and Debug menus
As in Safari: the Web Inspector and its console, a page's source and resources, picking an element, recording a timeline, WebKit's experimental and internal debugging features.
Keep these settings for this site
A site's user agent, colour scheme and switches (JavaScript, images, styles, same-origin restrictions) kept for it, put on a tab as it goes there and taken off as it goes elsewhere.
Any user agent, any size
An iPhone, an iPad, Chrome, Firefox or one you type in, and a phone's, a tablet's or a typed-in window size, in a light or dark look.
Pick Element for the Agent
Point at an element and the agent is told its selector, role, text and HTML, the styles that are not the default's, the React or Vue components it belongs to and the page's recent errors.
AgentsFor the tools you already use.
48 tools over MCP
Tabs and the pages in them: reading, clicking, typing, finding, screenshots, waiting. What a click did comes back with it, so an agent spends fewer turns.
Settings you can read
Per site: read, read and ask before clicking, read only, read and act, or never. A list of what agents did since the app opened, and one Bypass switch for work you are watching.
A profile of its own
Pages an agent opens go in the profile shown (your sign-ins) or in “Agent” (none), task by task, as it says. Its tabs stay open unless it closes them.
UpdatesNothing installs without your say.
Check for Updates
In the BasicShell menu, and once a day by itself unless Settings turns that off. It offers a release with its notes when the version number is higher than the running one's.
Checked before it is installed
The zip is checked against the SHA-256 GitHub gives for the file, and the app inside against this app's identifier, the release's version and its signature. Then the old app goes to the Trash and the new one takes its place.
Nothing here by that name.
Measured on this Mac, not claimed.
Taken on a MacBook Air with the M3 chip, running macOS 27, on 1 November 2026. Where it is level with Chrome it says so. The method is under the numbers, so you can repeat it.
- 1.8 MB
- The download. A zip of the app, 1,836,879 bytes, with the agent tools in it.
- 4.3 MB
- Installed. The whole app in /Applications, its program 4.5 MB of that.
- 0
- Dependencies. No packages, no vendored code. Swift, AppKit, SwiftUI and WebKit.
- 0.08 s
- To its first window. From the moment the app is opened, with the app already in cache.
- 25,952
- Lines of Swift. In 70 files. All of it is in the repository.
Method. Sizes are du -sk of each app in /Applications (Safari from its system volume). Memory is the sum of what macOS counts as each app's (proc_pid_rusage, its own processes and its helpers). The five pages are the same five addresses in every browser: two Wikipedia articles, MDN's page on CSS, a GitHub repository and Hacker News. BasicShell's test copy ran from a fresh data folder with uBlock Origin Lite on (off in the row that says “blocker off”); Chrome ran from a temporary profile with no extension; Safari and Search started on their own, with Search's saved tabs set aside for the run and put back. Safari keeps five new entries in its history for it. Two runs each, the mean shown; the ad-blocker-off row is two runs, the unloaded row one. An empty BasicShell has no tab at all (a new tab is a field); Chrome had about:blank. The hidden-tab figures are a page that animates and runs a timer, over 12 seconds: two runs with it shown, three each with the app's freezing of hidden tabs on and off. First window is the time from open to a window of 300 points or more, six launches with the app in cache, median shown. Lines of Swift are cat Sources/*.swift | wc -l. Arc and Orion were not run: they would have opened your own sessions.
Quiet by build.
It sends nothing anywhere but to the pages you open. The one other thing it does, once a day, is ask GitHub whether a newer version exists. Settings turns that off.
- No telemetryNo analytics, no crash reports, no account, nothing to sign in to.
- Zero dependenciesSwift and the frameworks that ship with the Mac. Nothing vendored, nothing to audit but the source.
- Ads and trackersBlocked by uBlock Origin Lite when its app is on the Mac, YouTube's ads included. The first launch asks before it gets it.
- Links come cleanfbclid, gclid and the like come off links you follow. Copying an address leaves out utm_ and a site's share codes, and says how many.
- Updates by handIt downloads, checks the SHA-256 GitHub gives for the file, checks the app's signature and identifier, and installs nothing without your say.
- The sourceMIT licence, on GitHub. A release is built from a clean clone.
What it cannot do yet
- Passkeys.WebKit hands them to a browser only with an entitlement Apple grants on request, tied to a paid developer account.
- DRM video, live streams.The download button does not save them. Nor video described by an .mpd file.
- Chrome's own tools.An agent here cannot emulate touch or throttle a network; WebKit has no such thing.
- Pages built only for Chrome.It is WebKit, as Safari is. A few of those pages will misbehave.
Questions, answered plainly.
Why WebKit and not Chromium?
WebKit already ships with every Mac and is kept up to date by macOS, so the browser itself can be a few megabytes of Swift instead of a copy of an engine. The price is that a few pages built only for Chrome will misbehave, as they do in Safari.
Is it free?
Yes. It is open source under the MIT licence, with the source on GitHub. There is no account and nothing to buy.
Does it run Chrome extensions?
Many, on WebKit's own extension engine: from the Chrome Web Store (signature checked), from a folder, or a Safari extension from inside its app. An extension that needs Chrome's debugger will not work.
Does it support passkeys?
Not yet. WebKit gives passkeys to a browser only with an entitlement that Apple grants on request, tied to a paid Developer ID. Password managers that work as extensions, such as Bitwarden, do work.
What does it send, and to whom?
Nothing of its own, other than the pages you open and a once-a-day look at GitHub for a newer version, which Settings turns off. There is no analytics and no account. What an agent reads of a page, when you let it, goes to that agent.
Why does the download button start with an empty list?
Because a button that appears over every picture on every site is in the way. You add the sites you want it on, in Settings, and it appears there only, over large photos and videos.
Can it save every video?
No. Live streams, video protected by DRM and video described by an .mpd file are not saved. Play the video for a moment first, so the page has loaded what it needs.
How do I update it?
BasicShell menu, then Check for Updates. It also looks once a day. It shows the notes and installs only when you say so.
Is the name final?
Not yet. The site and the app call it BasicShell for now.