| 1 | # Alcove |
| 2 | |
| 3 |  |
| 4 | |
| 5 | A privacy focused RSS reader for the open web |
| 6 | |
| 7 | [alcove.tools](https://alcove.tools) |
| 8 | |
| 9 | ## Reasoning |
| 10 | |
| 11 | Alcove is built on two principles: **privacy** and **freedom of speech**. |
| 12 | |
| 13 | Those two things are becoming harder to find these days, yet blogs and RSS feeds provide a way out. As long as someone is publishing and someone else is listening, these two fundamentals can help keep free speech alive. |
| 14 | |
| 15 | Alcove accomplishes privacy through a "can't be evil" tech stack, which you can read more about [here](https://stevedylan.dev/posts/introducing-alcove/). **TLDR:** All of your feeds and posts that you read are encrypted locally and synced via cryptographic keypairs. Even if we wanted to read your stuff, we can't. We believe this is important as many other RSS readers cannot make the same promise and would have to hand over the data if ordered by authorities. |
| 16 | |
| 17 | ## Tech Stack |
| 18 | |
| 19 | Alcove is built with [Evolu](https://evolu.dev) to handle the encrypted syncing of feeds. With Evolu each time the app is opened in a browser it spins up an identity used to encrypt and decrypt files, as well as an SQLite instance. As you add feeds or read posts, changes to the db are made and then encrypted before syncing with a relay. The relays let you access your data on another device by recovering your previous identity using a passphrase (mnemonic). Alcove currently has two relay instances: |
| 20 | |
| 21 | - `wss://relay.alcove.tools` - Bare metal server |
| 22 | - `wss://relay2.alcove.tools` - Hosted Railway instance |
| 23 | |
| 24 | The app also has to use a CORS proxy when fetching RSS feeds as most feeds do not allow cross origin fetching. Alcove will try a direct attempt first, and if it fails then it falls back to `proxy.alcove.tools`, which is a simple instance of [cors-proxy](https://github.com/stevedylandev/cors-proxy) that I have running on bare metal. If for any reason the main proxy is down it will use a fallback of `proxy2.alcove.tools` which is on a Cloudflare Worker. |
| 25 | |
| 26 | > [!NOTE] |
| 27 | > While Alcove does everyhing possible to provide privacy it is still recommended to use a VPN to help mask IP addresses |
| 28 | |
| 29 | ## Quickstart |
| 30 | |
| 31 | To start developing Alcove locally follow these steps: |
| 32 | |
| 33 | 1. Make sure [Bun](https://bun.sh) is installed |
| 34 | |
| 35 | ```bash |
| 36 | bun --version |
| 37 | ``` |
| 38 | |
| 39 | 2. Clone and install dependencies |
| 40 | |
| 41 | ```bash |
| 42 | git clone https://github.com/stevedylandev/alcove.git |
| 43 | cd alcove |
| 44 | bun install |
| 45 | ``` |
| 46 | |
| 47 | 3. Run the dev server |
| 48 | |
| 49 | ```bash |
| 50 | bun dev |
| 51 | ``` |
| 52 | |
| 53 | 4. Run a local relay (Optional) |
| 54 | |
| 55 | ```bash |
| 56 | bunx @evolu/relay start |
| 57 | ``` |
| 58 | |
| 59 | Update the relay transport in `src/lib/evolu.ts` |
| 60 | |
| 61 | ## Roadmap |
| 62 | |
| 63 | - [x] Mark posts as read/unread |
| 64 | - [x] Import/Export OPML |
| 65 | - [x] Import/Export account through mnemonic |
| 66 | - [x] Refresh/Update Feeds |
| 67 | - [ ] Tweakcn theme switching |
| 68 | |
| 69 | ## Acknowledgements |
| 70 | |
| 71 | Alcove is heavily inspired by [NetNewsWire](https://netnewswire.com/) and [this post](https://inessential.com/2025/10/04/why-netnewswire-is-not-web-app.html) by Brent Simmons |
| 72 | |
| 73 | ## Questions |
| 74 | |
| 75 | [Send me an email](mailto:contact@stevedylan.dev?subject=Alcove)! |