Skip to content

Orbit v0.8.2-beta

Choose a tag to compare

@github-actions github-actions released this 04 Oct 12:19
· 50 commits to main since this release

Orbit v0.8.2-beta

Version: v0.8.2-beta
Commit: a828468
Built: 2026-10-04

Note: A maintenance release. Nothing new to look at on purpose — this is the mobile restyle's own regressions, closed out. The redesign shipped in v0.8.1 and then a run of things it had quietly broken surfaced: a contacts list that flipped between two renderers, a tab strip that was hidden unless you had already created a folder, and custom profile banners that had stopped rendering without anything looking wrong. Diagnostics was rebuilt while I was in there. If you were on v0.8.1 and something felt off, it was probably one of these.

Features

  • The Phone Offers All 55 Profile Frames — The desktop enumerated 1–55 and the phone's picker stopped at 42, so twelve frames were simply not there. Nothing errored and nothing looked wrong: a picker missing its last entries is indistinguishable from a picker that ends there. Both platforms now read one list, shared/ui/profile-frames.js, and a test fails if the list and the shipped PNGs ever disagree — in either direction, so a frame file nobody can choose is caught too.

  • Diagnostics, Rebuilt — It was a section title repeating the screen header, one card, six bare rows floating on the background with nothing under them, and the top third of a screen filled. It opens with a verdict now — "Everything checks out" or "Something needs a look", with a count of how many checks passed — the checks sit in one grouped card instead of loose on the background, and the report is shown in a monospace block rather than only described. "Copy these values to paste into a bug report" was a promise about content you could not see; the same promise kept is the actual text. The Copy button and the preview come from one builder, because they were two separate loops over the same rows and would have drifted the first time either changed.

Bug Fixes

  • The Contacts List Kept Changing Its Mind — Two renderers wrote to the same #friends-list: a grouped one (Online / Offline / Groups, with a Message button) and an older flat one (a chevron, and a cat at the end). Whichever ran last won, and the flat one is called from a dozen places — a friend added, a presence change, a profile saved, a search — so the list flipped to flat on almost any update. Dan saw it as "correct, then incorrect" and the trigger he hit was the search box. There is one renderer now, and the test drives that exact path.
  • The Friends / Groups Tabs Were Hidden Unless You Already Had a Folder — The markup was there and the folder machinery was there. One rule — #home-tabs:not(.has-folders) { display: none !important } — meant the strip only appeared to someone who had already created a folder, so the folder feature was gated behind itself and the Friends/Groups control was unreachable for everyone else. It came from the restyle, on the reasoning that groups already render inline in the list. That reasoning cost the only way to scope the list to one kind. The strip is back, and it now sits above the "Active now" row rather than below it — it scopes everything under it, and "Active now" is a list of online friends, so it has no business sitting above the Groups tab.
  • Tab Transitions Only Went One Way — The direction came from the caller, and the only caller passed tabId === 'chats' ? 'reverse' : 'enter' — so the direction was really "is the destination Chats?", and every move that did not involve Chats went the same way. Going Chats → Contacts → Activity → Contacts, the last step slid left when it should have slid right. It is derived from the panel order now, so it always slides the way you are moving.
  • The Content Slide Had No Direction, and the Panel's Fade Came Back With It — The transition animates each panel's content, not the panel, because the tab bar lives inside every panel and animating the panel drags the bar with it — the bar had been measured still at 276 samples across a switch. But the content keyframes were not directional: entering always came from +16px, so "back" looked identical to "forward" even once the direction was correct. And removing the rule that keeps the panel animation off brought the panel's own keyframes back into play, fade included — panelEnter/panelExit carry opacity, which is why the slide started dissolving instead of sliding. The content now has a Reverse pair, the panel animation stays off, and there is no opacity anywhere in the transition. All three are pinned by a test that asserts the animation that actually lands, the panel staying still, and the bar holding one position.
  • The Profile Avatar Sat Inside the Banner Instead of Across It — With the hero's own 44px padding an 88px avatar ended at 132px, entirely within a 150px band — so nothing crossed the edge and the whole header read as crammed against the top with dead space beneath it. The band is 108px now and the avatar starts at 64px, so 44px of it sits below the edge.
  • Cropping a Banner Did Nothing to the Hero — Three separate places painted the banner with heroEl.style.backgroundImage = 'url(...)', and .profile-hero { background: transparent !important } resets background-image — a stylesheet !important beats a non-important inline style, so all three were no-ops. You cropped a banner, the modal closed, the URL field filled in, and the hero did not move. The save path also gated the banner on avatar, so saving with no avatar set cleared the banner you had just chosen. All three go through one setHeroBanner() that writes the <img> layer now.
  • The Gap Under the Profile Name Was a Hole — Between the tag and "Edit Profile" there was about 79px of nothing: 30px of hero bottom padding, 6px of hero margin, 16px on the form's wrapper and 10px on the section, all stacking. The wrapper was a bare <div style="padding: 16px"> with no class, so nothing could target it. It is 18px now, and the header sits about 45px higher.
  • The Avatar Had No Ring Over a Photo — The restyle sets border: none !important on the avatar, which is right on a plain card and wrong over a banner: it merged into the image and read as a square rather than a circle. The 3px surface ring is restored only when there is a banner to separate it from.
  • Custom Profile Banners Were Invisible on Mobile — The banner was applied as an inline background-image on .profile-hero, and the restyle sets background: transparent !important on that element. The shorthand resets background-image, and a stylesheet !important beats a non-important inline style — so every custom banner silently stopped rendering, and it read as deliberate because the blurred accent was still sitting there behind it. All three profile heroes had it (your profile tab, your profile sheet, and a friend's). The banner is an <img> layer now, which no background rule can reach. The desktop was never affected — it puts the banner on a dedicated #profile-banner element with no CSS rule on it.

Technical

  • The Restyle Layer Has Three Shapes That Keep Catching Things — Every bug it has caused is one of them: a bare img or * child selector (it caught the profile-frame overlay), a :not(...) on a state class (it hid the tab strip unless you already had a folder), and a background shorthand with !important (it reset an inline background-image, so custom banners were invisible). All three read as deliberate once they land, which is why none of them were noticed. When writing in that file, prefer the narrowest selector that does the job and never set position when all you need is z-index — a blanket child selector that sets position takes it away from the children that are deliberately absolute, which is how the profile sheet's two buttons ended up stacked down the left edge.
  • Test Suites — npm run test:unit is now 11 suites; npm run test:mobile is now 134 checks across eleven probes; the desktop Playwright suite remains 37 tests across two shards. The new probes cover the Contacts list, the home tabs and Diagnostics.

Downloads

Artifact Size
Orbit-v0.8.2-beta.apk 69M
Orbit-0.8.2-beta-amd64.deb 170M
Orbit-0.8.2-beta-x86_64.AppImage 197M
Orbit-0.8.2-beta-arm64.dmg 181M
Orbit-0.8.2-beta-x64.dmg 186M
Orbit Setup 0.8.2-beta.exe 163M

Installation Notes

Desktop builds are currently unsigned.

  • Windows: Microsoft SmartScreen may appear. Select More info → Run anyway if you trust the source.
  • macOS: You may need to right-click the application and choose Open on first launch.
  • Android: Because Orbit is distributed outside the Google Play Store, Android or Google Play Protect may display a warning before installation. Continue only if you trust the release source.

Verify Your Download

A SHA256SUMS.txt file is included with this release.
Since v0.3.0-beta, the checksum file is also GPG-signed (SHA256SUMS.txt.sig).

Use the Orbit Release public key to verify:

# 1. Import the public key
curl -O https://raw.githubusercontent.com/D4niel-dev/Orbit-beta/main/security/public-key.asc
gpg --import public-key.asc

# 2. Verify the signature
gpg --verify SHA256SUMS.txt.sig SHA256SUMS.txt

# 3. Verify your downloaded file
sha256sum --check SHA256SUMS.txt --ignore-missing

For Windows PowerShell:

Get-FileHash Orbit-Setup.exe -Algorithm SHA256
Compare-Object (Get-Content SHA256SUMS.txt) (Get-FileHash Orbit-Setup.exe -Algorithm SHA256) -Property Hash

Security

Orbit is designed for trusted private networks and local-first communication.
Official releases are published exclusively through this GitHub repository.

Links

  • Repository Orbit-beta
  • View the changelog for the latest changes!
  • Having issues with the app ? Click here to report it!