A personal tech radar for discovering, filtering, and keeping up with what matters.
Pulse brings feeds, papers, repositories, tools, and technical discussions into one local desktop workspace.
The useful parts of the tech world are spread across too many places. A paper appears on arXiv, the implementation lands on GitHub, someone explains it on Reddit, and the important context is buried in a blog post or a discussion thread.
I wanted a calmer way to follow all of that.
Pulse collects the sources I care about, gives each item enough context to decide whether it is worth my time, and keeps the resulting library on my machine. It is made for people who enjoy following technology closely but do not want their entire day to become an unread queue.
| Area | What it gives me |
|---|---|
| Collection | Technical content from multiple sources in one place |
| Classification | Category, field, topic, and signal for each item |
| Daily view | A clear split between what was published and what was newly discovered |
| Triage | Save, mark important, archive, annotate, and open items quickly |
| Reader | Full-page fetching when an excerpt is not enough |
| Resources | Repositories, papers, products, and models extracted from what I read |
| Personal signal | Watchlists and reader feedback that influence ranking |
| Desktop workflow | Tray access and scheduled sync while Pulse is running |
| Data ownership | A local library and configuration without a Pulse account |
Pulse is intentionally built around a short loop:
- Connect the sources I actually follow.
- Sync when I want a new batch.
- Scan the feed and keep the promising items.
- Open the reader when something deserves attention.
- Save a note, fetch more context, or move on.
The interface is organized around that loop rather than around a large collection of settings.
flowchart LR
A[Feeds and sources] --> B[Pulse sync]
B --> C[Local SQLite library]
C --> D[Today]
C --> E[Feed and reader]
C --> F[Resources]
B --> G[Classification and generation]
G --> C
E --> H[Notes and triage]
H --> C
The frontend is a Next.js application loaded inside a Tauri desktop shell. Rust handles the desktop integrations and background scheduler, while the local SQLite database remains the source of truth for the library.
Items are stored with a content hash, so syncing the same source again does not create duplicate entries or repeatedly spend classification calls on the same content.
Pulse currently supports the following sources:
| Source | Collection style |
|---|---|
| Chrome profile | |
| X / Twitter | Chrome profile |
| Chrome profile | |
| Hacker News | Direct collection |
| GitHub Trending | Direct collection |
| arXiv | Direct collection |
| Hugging Face Papers | Direct collection |
| Lobste.rs | Direct collection |
| Dev.to | Direct collection |
| Product Hunt | Direct collection |
| RSS and Atom | Configurable feed URLs |
Public sources can be used immediately. Reddit, X, and LinkedIn use a local Chrome profile through
helmsman, because those sites are more reliable to
collect through a browser session than through a simple HTTP request.
Every source has its own options. Subreddits, keywords, arXiv categories, GitHub languages, RSS URLs, and similar settings can be changed without affecting the rest of the library.
The job-board providers under jobs/providers are adapted from
career-ops. That project maps public, no-auth job
sources (ATS APIs, RSS/XML feeds, and server-rendered careers pages) onto a common shape, which is
what lets Pulse scan boards without a login, an API key, or a model call. Credit to its authors:
without it this list would be a handful of boards rather than the coverage it has now.
This part is a work in progress. Coverage is partial, some providers have not been tested against their live boards, and more will be added over time. A source that the scanner cannot reach yet can still be tracked by adding the company's careers page directly under Sources.
Today follows the local calendar day. It separates two questions that are easy to mix up:
| View | Question it answers |
|---|---|
| Published today | What was published today? |
| New to Pulse | What did Pulse discover today, regardless of when it was published? |
The reader keeps the original item, generated context, fetched content, and personal notes together. From there I can save, mark important, archive, open the original page, or give Pulse simple feedback about whether I want more items like it.
Resources are the things mentioned by the items I collect: repositories, papers, products, models, and useful sites. Pulse keeps those separate from the feed so a discussion can lead to a useful resource without becoming the resource itself.
Watchlists give matching topics a small ranking boost. More like this and Less like this record feedback about an item's topic, source, and field. The original classifier score is kept intact; personal ranking is applied on top of it.
The tray keeps Pulse close without keeping the main window open. It can open the app, start a sync, or quit Pulse. Scheduled sync is tied to the running tray process, so it does not pretend to be a closed-app background service.
Pulse does not require an account or a hosted library. The local library is stored in SQLite, and
the provider configuration is stored under ~/.pulse/config.json.
When I configure an AI provider, the relevant content is sent to that provider for classification or generation. Source requests also go to the source being collected. Apart from those explicit requests, the library stays local.
Pulse is currently developed and tested on macOS. Tauri configuration for other desktop platforms is kept in the project as the app expands.
Requirements:
| Requirement | Why it is needed |
|---|---|
| Node.js 22.13 or newer | Runs the extraction engine, and pnpm 11 will not install on anything older |
pnpm |
Installs dependencies and runs project scripts |
| Chrome | Required for sources that use a browser profile |
Run the development app with:
pnpm install
pnpm tauri devInstall the extraction engine from Settings → Extraction engine → Install helmsman. Pulse
places it under ~/.pulse/helmsman and can update it from the same screen.
Open Settings → Providers to configure the services Pulse can use:
| Provider | Used for |
|---|---|
| Cloudflare | Jev and Cloudflare models |
| OpenRouter | Chat and generation models |
| OpenAI-compatible endpoint | Custom model providers |
| GitHub token | A higher GitHub API rate limit; optional |
Classification and generation are separate settings. That means I can use Jev to sort items and a different chat model to write the briefing, or use an LLM for both.
| Key | Action |
|---|---|
j / k |
Move through the feed |
Enter / Space |
Open the reader |
s |
Save the selected item |
i |
Mark it important |
a |
Archive it |
o |
Open the original URL |
⌘K / Ctrl+K |
Open the command palette |
Esc |
Close the reader or palette |
pnpm build
pnpm tauri buildThe native output is written under:
src-tauri/target/release/bundle/
The macOS WidgetKit source is kept under native/macos/PulseWidget for future work. It is not
embedded in the regular app or DMG at the moment.
Contributions are welcome: bug reports, new job providers, and pull requests. If something is broken or missing, open an issue and I will take a look.
The job sources are the easiest place to help, since coverage there is the most obviously
incomplete. Adding a board is one self-contained module under
jobs/providers, following the contract documented in _types.js; it needs no
login, no API key, and no model call.
Before opening a pull request, run what the release workflow runs:
pnpm install
pnpm build
cd src-tauri && cargo testpnpm build typechecks the frontend and writes the static export, and cargo test covers the Rust
side. There is no ESLint setup in the repository yet, so pnpm lint will offer to scaffold one
rather than run.
| Layer | Choice |
|---|---|
| Frontend | Next.js with Tailwind CSS v4 |
| Desktop layer | Tauri v2 and Rust |
| Storage | Embedded local SQLite database |
Pulse is still evolving. The goal is not to collect everything. The goal is to make the signal worth returning to.
