Skip to content

Releases: otzua/O-CHAT

OChat v1.2.0

Choose a tag to compare

@github-actions github-actions released this 25 Jul 22:19

Adds a profile screen, and restores two things that had no entry point at all.

Downloads

File For
ochat-arm64.apk ARM64 — essentially every modern phone. Pick this one.
ochat-x86_64.apk x86_64 — Chromebooks, some tablets, emulators
ochat-universal.apk All architectures — larger, use if unsure

Requires Android 8.0 (API 26) or newer. Signed; certificate SHA-256:

87:E2:6E:CC:64:F3:19:DB:6C:FB:03:48:30:02:4F:00:04:6C:63:BB:E1:53:84:52:88:4F:96:3F:80:55:C8:8F

New: profile screen

Open it from your avatar in the top bar, or the overflow menu.

  • Your avatar, nickname, and how many people you are connected to
  • Change your nickname — saved when you tap Done or the tick
  • Theme — System, Light or Dark
  • Your identity keys — peer ID, key fingerprint and Nostr key, in monospace and copyable, each explaining what it is for. The fingerprint is what you compare with someone in person to be sure you are talking to them and not an impostor.
  • Clear all data, behind a confirmation that says plainly the identity cannot be recovered

Fixed

Changing your nickname was impossible. The nickname editor only existed in the old chat header, which stopped being used when the interface was rebuilt in 1.0.0. There was no way to change your name at all.

The emergency data wipe was unreachable, for the same reason. It had lived behind an undocumented triple-tap on the header. That is a privacy feature in a privacy app, so losing it mattered.

Renaming yourself no longer floods the mesh. The old editor saved and re-broadcast an announce on every keystroke, so typing a ten-character name sent ten announcements to everyone nearby.

Identity keys refresh after a wipe. They were cached without a key, so after clearing your data the screen would have kept showing your old fingerprint — dangerous, since that is exactly the value someone reads out to verify you.

Please read before installing

The interface changes in 1.1.0 and 1.2.0 have been compiled and reviewed, but not run on a device. No phone or emulator was available when they were built.

Everything below the interface is unchanged and has been verified on hardware — mesh networking, protocol and cryptography are untouched from upstream bitchat, and OChat has been confirmed discovering and exchanging signed announces with an unmodified bitchat client.

Still untested against a real bitchat client: private chats and media (images, voice notes, files). Only the public mesh timeline has been verified end to end.

Open an issue if something looks wrong — that feedback is genuinely useful right now.

Notes

  • OChat installs alongside bitchat rather than replacing it, so you can run both and message between them.
  • Only English strings are rebranded; other locales still say "bitchat".
  • No external security review. Do not rely on this for sensitive communication.

Fork of bitchat-android, licensed under GPL-3.0.

OChat v1.1.0

Choose a tag to compare

@github-actions github-actions released this 25 Jul 22:00

A UX pass over the whole app: swipeable tabs, unread badges, live mesh status, and motion across lists and navigation.

Downloads

File For
ochat-arm64.apk ARM64 — essentially every modern phone. Pick this one.
ochat-x86_64.apk x86_64 — Chromebooks, some tablets, emulators
ochat-universal.apk All architectures — larger, use if unsure

Requires Android 8.0 (API 26) or newer. Signed; certificate SHA-256:

87:E2:6E:CC:64:F3:19:DB:6C:FB:03:48:30:02:4F:00:04:6C:63:BB:E1:53:84:52:88:4F:96:3F:80:55:C8:8F

What's new

Swipe between tabs. Chats, Channels and People can now be swiped as well as tapped. The tab underline follows the pager offset continuously rather than snapping when the swipe settles, so it tracks your finger through the drag.

Unread badges on tab labels. Activity in a tab you are not looking at is visible without switching to it.

Live mesh status in the top bar — "3 people nearby", or "searching for people nearby" when the mesh is empty. On an off-grid app, whether anyone is actually in range is the most useful thing to surface.

Jump-to-latest is back. This existed in the original bitchat screen and was lost when the interface was rebuilt; on a long backlog there was no way back to the newest message except scrolling by hand.

Haptic feedback on send. Mesh delivery is not instant, so the tap itself needs to feel acknowledged.

Motion. Messages and conversation rows animate into place instead of appearing instantly, which matters most when rows reorder as a conversation becomes the most recent. Opening a conversation slides in and back slides out.

New launcher icon — an amber "O" whose tail turns it into a speech bubble.

Performance

This has to stay usable on low-end hardware, so the motion is deliberately cheap:

  • Only the visible tab is composed (beyondViewportPageCount = 0). Pre-composing neighbours would build three lists during a cold start.
  • Every animated property is alpha, scale or translation. No blur, no animated shadows, no animateContentSize inside a scrolling list.
  • Timings run 120–280ms and live in one file, so they are easy to dial down.

Fixed

The new tab indicator was missing fillMaxWidth() before wrapContentSize, which would have measured its offset against the wrong box and mispositioned the underline. Caught in review before release.

Please read before installing

The interface changes in this release have been compiled and reviewed, but not run on a device. No emulator or phone was available when it was built. Motion timings especially are judged by eye, and they have not been.

Everything below the interface is unchanged and has been verified on hardware:

  • Mesh networking, protocol and cryptography are untouched from upstream bitchat
  • OChat and an unmodified bitchat client discover each other and validate each other's signed announces
  • The BLE scanning fix from 1.0.1 is included

Also still untested against a real bitchat client: private chats and media (images, voice notes, files). Only the public mesh timeline has been verified end to end.

If something looks wrong, open an issue — that feedback is genuinely useful right now.

Notes

  • OChat installs alongside bitchat rather than replacing it, so you can run both and message between them.
  • Only English strings are rebranded; other locales still say "bitchat".
  • No external security review. Do not rely on this for sensitive communication.

Fork of bitchat-android, licensed under GPL-3.0.

OChat v1.0.1

Choose a tag to compare

@github-actions github-actions released this 25 Jul 21:33

First working release of OChat — bitchat's mesh networking with a conventional chat interface.

Verified on hardware against an unmodified bitchat client: both devices discovered each other and validated each other's signed announces.

Downloads

File For
ochat-arm64.apk ARM64 — essentially every modern phone. Pick this one.
ochat-x86_64.apk x86_64 — Chromebooks, some tablets, emulators
ochat-universal.apk All architectures — larger, use if unsure

Requires Android 8.0 (API 26) or newer.

Android will warn when installing from outside the Play Store; allow installation from unknown sources to proceed.

Certificate SHA-256 fingerprint:

87:E2:6E:CC:64:F3:19:DB:6C:FB:03:48:30:02:4F:00:04:6C:63:BB:E1:53:84:52:88:4F:96:3F:80:55:C8:8F

What this is

OChat is a fork of bitchat-android with a rebuilt interface. Messages travel peer-to-peer over Bluetooth LE mesh — no servers, no accounts, no phone numbers.

The networking, protocol and cryptography are unchanged from upstream, so OChat talks to unmodified bitchat clients on Android and iOS. It installs alongside bitchat rather than replacing it, so you can run both and message between them.

What changed is the presentation: a conversation list with Chats / Channels / People tabs, full-screen chats with message bubbles and delivery ticks, an amber dark theme with a matching light theme, sans-serif typography, and no emoji anywhere in the interface.

Fixed in this release

BLE scanning could stop permanently, preventing all peer discovery.

Leaving a duty-cycled power mode cancelled the duty-cycle timer without re-enabling scanning. If the cycle happened to be in its OFF phase, the radio was left deaf with nothing remaining to wake it. In power-saver mode the cycle is off for 28 of every 30 seconds, so simply bringing the app to the foreground had roughly a 93% chance of killing discovery until the process restarted.

A second fault made the "restart scanning on power mode change" check compare a value against itself, so it could never fire.

Both faults are inherited from upstream bitchat and affect it identically. The fix touches radio scheduling only, not the wire protocol, so compatibility is unaffected.

Known hardware limitation

Peer discovery needs at least one device in range that can advertise over BLE (peripheral mode). Some phones report BLE support but provide no advertiser — they can only scan, and can never be discovered themselves. Two such devices will never find each other no matter how long you wait.

Confirmed on a Samsung Galaxy M10s (Android 11):

W/BluetoothAdapter: getBluetoothLeAdvertiser() ble not available
E/BluetoothGattServerManager: BLE advertiser not available

This is a hardware/firmware limitation and cannot be fixed in software. Such a device still works fine as long as the peer it is talking to can advertise.

Not yet tested

Please treat this as early software:

  • Only the public mesh timeline has been exercised against a real bitchat client. Private chats and media (images, voice notes, files) have not.
  • Only ~30 English strings were rebranded; other locales still say "bitchat" and still contain emoji.
  • This build has not had any external security review. Do not rely on it for sensitive communication.

Licence

GPL-3.0, inherited from upstream bitchat-android. Source is in this repository.