Skip to content

BasicShell 0.7.1

Choose a tag to compare

@mbahakeskin mbahakeskin released this 31 Oct 20:57
· 11 commits to main since this release

Download: BasicShell-0.7.1.zip, with BasicShell.app inside: unzip, move it to Applications. A release is the build with the agent tools (Settings › Agents, off until you turn it on); the plain build is ./build.sh from the source.

It is self-signed, not an Apple Developer ID, so the first time macOS refuses to open it: open it once, then System Settings › Privacy & Security › Open Anyway.

Requires: macOS 27 on Apple silicon.

Updates. BasicShell updates itself: BasicShell menu › Check for Updates…, and once a day by itself unless Settings › General turns that off. Update and Restart downloads the zip, checks it against its SHA-256 and the app in it against this app's identifier, then replaces the old app (which goes to the Trash) and opens the new one. Nothing is installed without your say.

New since 0.7.0

  • Dark pages (Settings › General, off until you turn it on). A page that stays white while macOS is dark gets dark colours of its own, with pictures left alone; a site that already has a dark look is left alone, which is measured, not read off what the site says. Some pages break (a hero over a picture, say), so the way out is close: the button in the site's tools (the half-filled circle) or ⇧⌘D turns it off for that site, ⌥⇧⌘D pauses it everywhere until pressed again or BasicShell quits. Settings lists the sites you set by hand. The page script and colour engine are adapted from Search (MIT, credited in LICENSE and the README).
  • Download button on photos and videos (Settings › General; no sites until you add some). On a listed site and its subdomains, a small button comes up in the corner of a large photo or video while the pointer is on it, even beneath a transparent layer the site lays over its pictures. It works in the page and in the player frames inside it, which is where most players live, including frames that are loaded hidden behind an ad and grow later.
  • Pages drawn as fast as the screen (Settings › General, on). WebKit holds a page's own animations and scripted scrolling to about 60 frames a second even on a 120 Hz screen; this lets them go as fast as the screen does. Off puts the limit back. The effect shows only on a faster screen than 60 Hz.
  • Tab groups: a tab opened from a link inside a group now shows its place in the tree, indented under the tab it came from, with the lines in the group's colour.

How the download button saves a video

It saves what the site gives, in the order that works:

  1. A photo: the largest picture the page offers for it (what its srcset lists, or the image a link around it goes to), otherwise what is shown.

  2. A video that is a file: the file, through the Downloads panel, on the page's own session (its cookies) with the page as referrer.

  3. A video whose address is a playlist. Many players give <video> an HLS playlist address that doesn't end in .m3u8, which WebKit plays itself. The first bytes of the address are read; if it is a playlist, it is saved as in 4, not as that text.

  4. A video a site sends in pieces (a blob: address, as most do). On a listed site BasicShell notes what the page asks for that looks like video: playlists and video or audio files (addresses, kinds and sizes only; nothing is put into the page and nothing of what came back is read). When you press the button it takes what the page loaded last:

    • an HLS playlist: the best quality of the master, and its separate sound if it has one, are fetched piece by piece (six at a time, AES-128 pieces decrypted), as the page would, and put end to end;
    • or the video and sound files, as most social sites keep them (the picture's file and the sound's, asked for in byte ranges): each is fetched whole.

    The Mac then joins them into one .mp4 (AVFoundation: picture from one, sound from the other; a transport stream is turned into an mp4 on the way). It shows as a row in the Downloads panel with progress and Cancel, and a "Show" button when it is done.

  5. Play the video for a moment first: what the page has not yet loaded, BasicShell has not yet seen.

No outside software is used for any of it: no ffmpeg, no packages, only what macOS has (WebKit, AVFoundation, CommonCrypto). It uses two private WebKit calls (_resourceLoadDelegate, _removeAllUserScriptsAssociatedWithContentWorld:), noted in the README.

Known limits

  • Tested on files and streams made for the purpose (HLS with transport-stream and fragmented-mp4 pieces, separate picture and sound files read in ranges) and on a public test stream. Not yet tried on Instagram, Facebook or X; if a video there doesn't save, the Downloads panel row or the pill says why.
  • Not saved: DRM-protected video, live streams, and video described by a DASH .mpd with segment templates.
  • A site you list is watched while its tabs are open; a site you don't list is not watched at all.
  • Passkeys and Apple Passwords need an Apple Developer ID and so don't work yet.
  • Extensions run in the main profile only.

After updating, quit and reopen BasicShell if it did not restart itself, and start a new chat in your agent.

SHA-256: BasicShell-0.7.1.zip 0465d9421b564ec5c4a16f0f7e24465235bdca63f2d3c08dbdee23fe2759c240