Skip to content

Repository files navigation

Boris - Reading in Public

A nostr-native app for reading and highlighting. Paste a URL, share one from the browser, or open an http/https/nostr: link (articles, notes, npub/nprofile). You get a calm article view, your marks, swarm highlights from friends and the rest of the nostrverse, and listen with on-device TTS. Bookmarks and RSS live in the library.

No ads, no trackers, no paywalls, no subscriptions. Nostr is the backend, so your highlights travel with your npub. Pair a local relay like Citrine and keep reading in airplane mode.

Login is optional. Amber or a bunker can sign events. Boris never holds an nsec.

Get it on Zap Store Get it on GitHub

Screenshots

Reading

Light mode. An article on cream paper, a mark in the text, Boris reading it aloud.

Reading in light mode Orange highlight in light mode Listening with on-device TTS TTS playing in light mode

Dark

Dark mode. Cover on the article, other people's marks on the same passage, a profile, TTS.

Article in dark mode Swarm highlights in dark mode Profile highlights in dark mode Listening in dark mode

Home

Home, library, feeds, search. You is the fifth tab; I left it off so the row stays four wide.

Home Library Feeds Search

Settings

Settings, highlight colors, airplane mode, About.

Settings Highlight colors Airplane mode About

Contributing

Boris is free and open source and always will be. Fork it, change it, send a pull request, or just use it.

Come say hi on Nostr. Report a bug or suggest a feature. Pull requests run lint and unit tests; same commands as under Build.

If you like the work, you can zap the Boris account directly or send sats to the author.

Build

./gradlew :app:assembleDebug

Pull requests run Android Lint (debug) and JVM unit tests. Same checks locally:

./gradlew :app:lintDebug :app:testDebugUnitTest

Fatal lint errors fail the job. Warnings are reported and do not fail the build.

Release build

Signing uses a local upload keystore. Put these in gitignored local.properties:

OEM_STORE_FILE=/absolute/path/to/upload.jks
OEM_STORE_PASSWORD=…
OEM_KEY_ALIAS=upload
OEM_KEY_PASSWORD=…

Then:

./gradlew :app:assembleRelease

Publishing to Zapstore

Config lives in zapstore.yaml (includes publisher pubkey). Releases are published with zsp.

  1. Install zsp from zsp releases (or go install github.com/zapstore/zsp@latest).
  2. Cut a GitHub release that includes the signed APK (or build assembleRelease locally).
  3. Publish with your Nostr key for npub1dergggklka99wwrs92yz8wdjs952h2ux2ha2ed598ngwu9w7a6fsh9xzpc:
export SIGN_WITH='nsec1…'   # or bunker://… or browser
./scripts/zapstore-publish.sh

SIGN_WITH can also live in a gitignored .env file at the repo root.

The script publishes through zapstore.yaml (not a bare APK path) so release_notes from CHANGELOG.md are included. Use ZSP_EXTRA_ARGS='--overwrite-release' to replace an already-published version.

First publish links the APK signing certificate to your Nostr identity (NIP-C1) and whitelists the repo via zapstore.yaml.

License

MIT. Versions are in CHANGELOG.md.

About

Distraction-free social reader with swarm highlights, built on nostr.

Topics

Resources

Stars

5 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages