Edition No. 15 · 9 Sep 2026
Twelve repositories for work that runs while you sleep
Scheduled jobs, the messages your app sends, your own mail server, and the tool that tells you when a job did not run.
The web version carries the English / Русский switch. The Russian text of this edition is also in the file radar-2026-09-09-ru.md, delivered into the chat on the day. This archive stays English only.
Fourteen editions handed you tools. Almost every one of them is a thing you open, use, and close. This edition is about the other kind: work that happens while you are asleep, and the small number of tools that tell you whether it happened at all.
There is a reason to say this today. Yesterday's edition dropped three good repositories because a GitHub page looked stale. It was wrong. All three are alive, and all three are here. That mistake was found because the run left a record of what it dropped and why. The same idea, applied to your own work, is most of this edition.
We aim for twelve every day. Some candidates fall out while we check them — those are listed at the end, with the reason.
Two things worth knowing
- Yesterday's report dropped three good projects by mistake, and today's puts them back. Activepieces, Novu and Plane were all dropped on 8 September because their GitHub releases list showed nothing newer than 2024. That list is unreliable. Checked properly today, Activepieces released version 0.90.4 on 8 September 2026, Plane released v1.4.2 on 23 August 2026, and Novu tagged a package on 7 September 2026. All three are in this edition. The lesson is already written into the rules: read the single latest release page, not the list. - Before you plan on running your own mail server, check one thing with Hetzner. Entry #5 is excellent software, but hosting companies block outgoing port 25 on new accounts to stop spam, and Hetzner is one of them. You have to ask them to open it, and they can refuse. Ask first. Install second.
If you only do three things
- healthchecks/healthchecks (#8) — tonight, fifteen minutes, free. Your daily report failed to finish three times and nothing told you. Your backup can fail the same way, and you will find out on the day you need it. One line added to a command fixes this.
- towfiqi/serpbear (#6) — this evening, about an hour. It records where your pages sit in Google every day. You cannot go back and collect the last three months. Every day you wait is a day of history you will never have.
- activepieces/activepieces (#1) — this weekend, half a day. A new Grasppy signup should reach your CRM, your newsletter list and your phone without you copying anything. Right now none of that happens.
Every link in one place
| # | Repository | What it does | Stars | Licence | Latest | Website |
|---|---|---|---|---|---|---|
| 1 | activepieces/activepieces | Connects your tools so one thing starts another | 23.4k | MIT, except packages/ee/ | 0.90.4, 8 Sep 2026 | activepieces.com |
| 2 | windmill-labs/windmill | Turns your scripts into scheduled jobs with a web form | 17.5k | AGPL-3.0 | v1.808.0, 9 Sep 2026 | windmill.dev |
| 3 | makeplane/plane | A calendar and list for what you are going to publish | 55.5k | AGPL-3.0 | v1.4.2, 23 Aug 2026 | plane.so |
| 4 | novuhq/novu | One place to write app messages and send them anywhere | 39.7k | MIT, plus a paid edition | @novu/framework@v2.13.2, 7 Sep 2026 | novu.co |
| 5 | postalserver/postal | Your own mail-sending server, with delivery records | 16.8k | MIT | v3.3.7, 3 Jun 2026 | postalserver.io |
| 6 | towfiqi/serpbear 💎 | Daily Google position for the words you choose | 2.1k | MIT | v3.1.0, 27 Mar 2026 | docs.serpbear.com |
| 7 | elmohq/elmo 💎 | Records whether AI chatbots name you in their answers | 201 | MIT | v0.3.0, 31 Aug 2026 | elmohq.com |
| 8 | healthchecks/healthchecks | Tells you when a scheduled job did not run | 10.1k | BSD-3-Clause | v4.4, 31 Aug 2026 | healthchecks.io |
| 9 | segment-any-text/wtpsplit 💎 | Splits text into real sentences in 85 languages | 1.3k | MIT | 2.2.1 on PyPI, 11 Apr 2026 | PyPI page |
| 10 | ueberdosis/hocuspocus 💎 | The server Yjs needs to share a document | 2.4k | MIT | v4.7.0, 9 Sep 2026 | tiptap.dev |
| 11 | timescale/timescaledb | Makes three years of price data fast in PostgreSQL | 23.3k | Apache-2.0, plus a separate licence on some features | 2.30.0, 8 Sep 2026 | tigerdata.com |
| 12 | pola-rs/polars | A faster replacement for pandas on large files | 39.4k | MIT | 1.44.1 on PyPI, 26 Aug 2026 | docs.pola.rs |
Jobs that run on their own
Twelve repositories, checked and reviewed. Every version verified against the GitHub API and dated.
▶Repo detailsthe review · specs · pros & cons · install
What it is
Activepieces is an open-source alternative to Zapier. You build a rule in a browser window by choosing a trigger and then one or more actions.
Why it matters
A new Grasppy signup could add a row to your CRM, put the person on your newsletter list, and send a message to your phone. Today none of that happens, so the person sits in a database and nothing follows. It works on the YouTube side too. A new video can post itself to your social accounts and drop into a newsletter draft.
- The main code is MIT, so you can run it, change it, and build on it.
- About 400 ready-made connections, plus a plain HTTP step for anything with a web address.
- You can write your own step in TypeScript when a ready-made one does not exist.
- Not all of it is MIT. Files under
packages/ee/are under a separate paid licence. Read that before you build on a feature. - It is a Node.js application with its own database. Expect it to want 1 to 2 GB of memory on the Hetzner box, so check what is free first.
- n8n (Edition 1 #6) does the same job. Running both wastes memory and attention. Pick one and mark the other
exclude.
sudo apt install -y docker.io docker-compose-plugin mkdir -p ~/activepieces && cd ~/activepieces curl -fsSL https://raw.githubusercontent.com/activepieces/activepieces/main/docker-compose.yml -o docker-compose.yml # Open docker-compose.yml and set the passwords and AP_FRONTEND_URL before starting. sudo docker compose up -d
▶Repo detailsthe review · specs · pros & cons · install
What it is
Windmill is a developer platform that runs scripts. It supports Python, TypeScript, Go, Bash and SQL. It reads the arguments of your function and builds a small form from them, and it can join several scripts into one flow.
Why it matters
ScalpingMate is full of scripts that pull data, run a test, and write a report. Those run when you sit down and run them. Here they run at six in the morning and tell you if they failed. The form it generates also means you can change one number and press a button, instead of opening an editor and hunting for a variable.
- It builds a usable web form from your function's arguments. You write no front-end code at all.
- It keeps every run, with the values used and the output produced. You can see why last Tuesday's result was wrong.
- Secrets, schedules, retries and queues are handled for you. That is a large amount of code you do not have to write or maintain.
- The licence is AGPL-3.0. Running it privately for your own work is fine. Offering Windmill itself to other people over the web would oblige you to publish your changes.
- It is a big program. Postgres plus worker processes, 2 GB of memory and upwards.
- It overlaps Procrastinate (Edition 5 #10) and entry #1 above. The honest split is this. Windmill runs your scripts. Activepieces connects other people's products.
mkdir -p ~/windmill && cd ~/windmill curl -fsSL https://raw.githubusercontent.com/windmill-labs/windmill/main/docker-compose.yml -o docker-compose.yml curl -fsSL https://raw.githubusercontent.com/windmill-labs/windmill/main/Caddyfile -o Caddyfile sudo docker compose up -d # Then open http://your-server:8000 and create the first account.
▶Repo detailsthe review · specs · pros & cons · install
What it is
Plane is an open-source project tracker. It has work items, cycles, and several ways to look at them, including a board and a calendar.
Why it matters
Edition 14 said you had nowhere for the words to live. This is the other half of that. You have nowhere for the plan to live. One video is really four pieces of work: the script, the recording, the Russian version, and the blog post that goes with it. They share one publish date. Right now that structure only exists in your head, which is why the Russian half slips.
- The calendar view is exactly the shape a publishing schedule needs.
- It runs on your own server, so unpublished plans stay on your box.
- It is moving quickly. Version v1.4.2 was published on 23 August 2026.
- The licence is AGPL-3.0, with the same condition as Windmill above.
- It is heavy for one person. Postgres, Redis, a file store and several containers, wanting 2 to 4 GB of memory.
- A tracker only helps if you open it every day. If you know you will not, a plain text file in your repository is the better answer, and it is free.
mkdir -p ~/plane && cd ~/plane curl -fsSL -o setup.sh https://raw.githubusercontent.com/makeplane/plane/master/deploy/selfhost/install.sh # Read setup.sh before you run it. It writes files and starts containers. chmod +x setup.sh ./setup.sh
▶Repo detailsthe review · specs · pros & cons · install
What it is
Novu is notification infrastructure. You define a message flow once. It handles sending across channels, remembers what each person agreed to receive, and gives your app a ready-made notification list.
Why it matters
Grasppy takes real time to turn a long chat into a map. Right now the person either watches a spinner or leaves and never comes back. This sends "your map is ready" by email and by browser alert, and keeps the message in a list inside the app. It also carries the per-person "stop emailing me" setting, which you would otherwise have to build yourself and which the law expects you to have.
- One template, several channels. You change the wording in a dashboard, not in Python.
- It ships a ready-made notification bell for React, so the in-app half is an afternoon rather than a week.
- It is very active. The newest tag is dated 7 September 2026.
- The About sidebar says MIT, but the project also has a separately licensed paid edition. Check that the feature you want sits in the free half before you plan around it.
- Self-hosting means an API service, a worker, a dashboard, MongoDB and Redis. That is 2 GB of memory and upwards, and MongoDB is a database you do not currently run. Their hosted free tier is the sensible start.
- Novu sends messages. It does not decide when to send them. Dittofeed (Edition 14 #8) decides. Do not adopt both at once, or you will have two half-built systems.
git clone -b next https://github.com/novuhq/novu.git cd novu/docker/community cp .env.example .env # Set the secret values listed in .env, then: sudo docker compose up -d
▶Repo detailsthe review · specs · pros & cons · install
What it is
Postal is a complete mail server for outgoing mail. It has a web interface, an HTTP interface and an SMTP interface, and it tracks what happened to every message.
Why it matters
Listmonk (Edition 2 #1), Mautic (Edition 10 #6) and Dittofeed (Edition 14 #8) all write the email. None of them deliver it. Every one of them asks you for a sending account. That is the same missing piece three times over. Owning it removes a bill that grows as your list grows, and it gives you the delivery log you need on the day a group of Russian addresses stops receiving anything.
- MIT, and the whole product is in the repository. Nothing is held back.
- It does the real delivery work: message signing, bounce processing, suppression lists, and a searchable log of every message.
- It accepts mail over both SMTP and HTTP, so any of the tools above can hand it their messages.
- The install is the easy half. Getting mail accepted is the hard half. A brand new sending address has no reputation, so you must start with small volumes and build up, or you land in spam folders.
- Hosting companies block outgoing port 25 on new accounts, and Hetzner is one of them. You have to ask them to open it and they can say no. Check this before you spend the afternoon.
- MariaDB plus a message queue plus the application, about 2 GB of memory. And when mail stops flowing at midnight, it is your problem, not a supplier's.
sudo apt install -y docker.io docker-compose-plugin git sudo git clone https://github.com/postalserver/install /opt/postal/install sudo ln -s /opt/postal/install/bin/postal /usr/bin/postal sudo postal bootstrap postal.yourdomain.com sudo postal initialize sudo postal make-user sudo postal start
2.1k stars · MIT · v3.1.0 (2026-03-27)
Self-hosted Google rank tracker — unlimited keywords, one small SQLite container, Search Console integration.
▶Repo detailsthe review · specs · pros & cons · install
What it is
SerpBear is a self-hosted rank tracker. You add your domains and your keywords, it checks their position once a day, and it keeps the history. It also reads Google Search Console.
Why it matters
Fifteen editions have given you tools to make pages better. Not one has told you whether the pages moved. Grasppy competes for words like "chat summariser" and "conversation map", and it competes for them twice, once in English and once in Russian. This is the only thing in the ledger that measures that. Start it today, because you cannot fill in the past.
- MIT, small, one container, and it stores its data in a single SQLite file. It sits happily beside everything else on the Hetzner box.
- Unlimited keywords. Paid rank trackers charge steeply per keyword, and that is what usually stops people tracking the Russian words at all.
- It connects to Google Search Console, so you also see the words you already rank for and never thought to track.
- It needs a key from a third-party search-data company, such as ScrapingAnt or SerpApi. That is a small monthly bill, and it is the real cost of running this.
- The last release is v3.1.0, from 27 March 2026. Almost six months quiet. That is still well inside the eighteen-month line this radar uses, but it is not a fast-moving project.
- Position on its own is a number that flatters you. Read it next to real traffic from GoAccess (Edition 8 #4) or PostHog (Edition 11 #8).
mkdir -p ~/serpbear/data sudo docker run -d --name serpbear -p 3000:3000 \ -v $HOME/serpbear/data:/app/data \ -e USER=admin \ -e PASSWORD=choose-a-real-password \ -e SECRET=a-long-random-string \ -e APIKEY=another-long-random-string \ towfiqi/serpbear
305 stars · MIT · v0.3.0 (2026-08-31)
Self-hosted AEO/GEO tracker — records whether ChatGPT, Perplexity, Gemini and AI Overviews mention and cite your brand.
▶Repo detailsthe review · specs · pros & cons · install
What it is
Elmo is a self-hosted tracker for AI answer engines. You give it a list of prompts. It runs them against the models on a schedule and stores the answers, including which brands were mentioned and which pages were cited.
Why it matters
Editions 1, 2 and 8 gave you an AI-visibility skill, llms.txt and structured data. Those are all changes you make to your pages. Not one of them tells you whether the change worked. This is the measuring half of that work. For Grasppy this is not a side channel. Your buyer is a person who is already inside a chat window.
- MIT and self-hosted, so your prompt list and your results stay yours. That list is competitive information.
- It is moving. Version v0.3.0 was published on 31 August 2026.
- It records the other products named in the same answer. That is a competitor list you did not have to build.
- 201 stars and a small team. If they stop, you are left with a working copy and nobody to fix it. Treat it as a tool, not a foundation.
- Every check is a paid call to a model. Ten prompts across four models every day adds up quietly. Put LiteLLM (Edition 5 #9) in front of it and set a spending limit.
- Model answers vary from run to run. Read the trend over weeks. A single day means nothing.
git clone https://github.com/elmohq/elmo.git && cd elmo cp .env.example .env # Add your model API keys to .env, then: sudo docker compose up -d
▶Repo detailsthe review · specs · pros & cons · install
What it is
Healthchecks waits for a signal instead of watching a machine. Each job gets a web address and an expected schedule. Silence is the alarm.
Why it matters
This is the most concrete item on the list, because the problem has already happened to you. This daily report failed to finish three separate times, and you only found out by opening the chat. A backup is worse. Restic (Edition 8 #11) has no way to tell you it stopped running, so you would learn about it on the day the disk dies. One extra line at the end of the command closes that hole for good.
- Two minutes per job. You add
&& curl -fsS https://hc-ping.com/your-idto the end of the command and you are done. - The hosted version is free for twenty jobs. That is more than you have, and it means nothing new to run or update.
- It can alert by email, Telegram, Slack, and ntfy (Edition 7 #4), which you may already have on your phone.
- It only knows what you tell it. A job that finishes normally but writes a broken file still reports success. Make the script check its own output.
- It overlaps Uptime Kuma (Edition 7 #1), which also has this kind of check built in. If Uptime Kuma is already running, use that and skip this.
- Running it yourself is a Django application with Postgres. Use the free hosted version unless you have a firm reason not to.
# Nothing to install for the hosted version. Sign up at healthchecks.io, # create a check, copy its address, then edit your crontab: 0 3 * * * /usr/local/bin/backup.sh && curl -fsS -m 10 --retry 3 https://hc-ping.com/YOUR-ID # If you would rather run it yourself: sudo docker run -d --name healthchecks -p 8000:8000 \ -e SECRET_KEY=a-long-random-string \ -e SITE_ROOT=https://checks.yourdomain.com \ -v $HOME/healthchecks:/data \ healthchecks/healthchecks
▶Repo detailsthe review · specs · pros & cons · install
What it is
wtpsplit is a Python library with small trained models that find sentence boundaries. The current model family is called SaT.
Why it matters
Everything Grasppy does afterwards depends on this first cut. Chonkie (Edition 2 #10) makes chunks from it. BERTopic and turftopic group those chunks. model2vec and vicinity search them. All of them work with whatever the splitter hands over. Real chat is lowercase, runs on, and often has no full stops. A rule-based splitter turns a whole message into one enormous sentence, and the topic map comes out vague for reasons nobody can see. Russian makes it worse, because the simple splitters were tuned on English.
- MIT, and the small models run on an ordinary processor. No graphics card needed.
- It handles text with no punctuation, which is exactly the case that breaks the simple approach.
- One language-agnostic model covers both your English and your Russian data, so you do not maintain two paths.
- It is a model, so the first run downloads weights and it wants a few hundred MB of memory. Load it once when your service starts, not on every request.
- It is slower than splitting on full stops. Do it in a background job rather than while a person is waiting. Procrastinate (Edition 5 #10) is the queue for that.
- The last release on PyPI is 2.2.1, from 11 April 2026. Five months. Fine, but not fast-moving.
source venv/bin/activate
pip install wtpsplit
python -c "from wtpsplit import SaT; s = SaT('sat-3l-sm'); print(s.split('привет как дела все нормально спасибо'))"▶Repo detailsthe review · specs · pros & cons · install
What it is
Hocuspocus is a collaboration backend for Yjs. It holds documents in memory, sends changes to everyone connected, and saves them to your database through a small hook you write.
Why it matters
Edition 13 #9 recommended Yjs for shared Grasppy maps and stopped there, which was half an answer. Yjs alone only agrees between browsers that are already connected to something. This is that something, and it is the exact piece a solo founder loses a week to. It also brings the boring parts you would forget: who is allowed into a document, and when to write it back to Postgres.
- MIT, and it was released today. Version v4.7.0 is dated 9 September 2026, and the npm package agrees.
- Saving to your database is a few lines of code. The document is stored as bytes in the Postgres you already run.
- It comes from the same team as Tiptap, so the documentation is real and kept up to date.
- It is a Node.js service and your backend is Python. That is a second thing to deploy, watch and restart.
- Long-lived connections change how you size the server. Memory grows with the number of open documents, not with the number of requests.
- It is only worth anything if Grasppy really gets shared maps. If one person opens one map, this is a week spent on nothing.
mkdir grasppy-collab && cd grasppy-collab
npm init -y
npm install @hocuspocus/server @hocuspocus/extension-database
# server.js
# import { Server } from '@hocuspocus/server'
# Server.configure({ port: 1234 }).listen()
node server.js▶Repo detailsthe review · specs · pros & cons · install
What it is
TimescaleDB is an extension for PostgreSQL built for data with a timestamp. It splits one big table into time-based pieces on its own, compresses the older pieces, and keeps rolling summaries up to date.
Why it matters
You have around three years of EURUSD data and one goal: find a pattern worth about 2% a month. Finding a pattern means asking the same question hundreds of times with different settings. If one pass takes a minute, you test ten ideas in an afternoon. If it takes a second, you test hundreds. That is the whole difference between searching and guessing. The rolling summaries also give you one-minute, five-minute and hourly bars kept current for you, instead of rebuilding them in Python on every run.
- It is still PostgreSQL. Same connection string, same SQL, same backups. Nothing else in ScalpingMate has to change.
- Compressing older pieces usually cuts stored size a great deal, which matters on a VPS disk you pay for.
- It is very active. Version 2.30.0 was published on 8 September 2026.
- There are two licences in one repository. The core is Apache-2.0. Some features sit under the Timescale License, which forbids offering it to others as a database service. Selling ScalpingMate is fine. Reselling the database is not.
- Installing it means matching your PostgreSQL version and restarting the server. Test it on a copy of your data first, never on the live one.
- If your data already fits comfortably and your queries already feel fast, this changes nothing. Time one real query before you spend the evening.
sudo apt install -y gnupg postgresql-common apt-transport-https lsb-release wget
echo "deb https://packagecloud.io/timescale/timescaledb/ubuntu/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/timescaledb.list
wget --quiet -O - https://packagecloud.io/timescale/timescaledb/gpgkey | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/timescaledb.gpg
sudo apt update
sudo apt install -y timescaledb-2-postgresql-16
sudo timescaledb-tune
sudo systemctl restart postgresql
# Then, inside psql, on a COPY of your database first:
# CREATE EXTENSION IF NOT EXISTS timescaledb;
# SELECT create_hypertable('candles', 'time', migrate_data => true);▶Repo detailsthe review · specs · pros & cons · install
What it is
Polars is a table library written in Rust with a Python interface. It uses every processor core, and it can work through a file that is larger than your memory.
Why it matters
A backtest sweep is the same loading and reshaping repeated hundreds of times. Anything that makes one pass three times faster makes the whole afternoon three times shorter. Polars also reads Parquet files well, and Parquet is the sensible format for three years of ticks. It pairs neatly with entry #11. The database holds and summarises the data. Polars does the run-by-run work in memory.
- MIT and mature. Version 1.44.1 was released on 26 August 2026.
- It uses every processor core without you writing anything special for it.
- Lazy mode looks at all your steps before it starts, then skips the work it does not need.
- It is not pandas. Method names and behaviour differ. Expect a day of rewriting and a few surprises.
- Some libraries in ScalpingMate expect a pandas table. You will call
.to_pandas()at the edges, and that copy costs time and memory back. - If your files are small, you will not feel any difference, and you will have spent a day for nothing. Time one real run first.
source venv/bin/activate pip install polars python -c "import polars as pl; print(pl.__version__)"
Checked, and left out
These were opened for this edition and did not make it, with the reason.
amicalhq/refref
amicalhq/refref — Re-checked today and UNCHANGED since 7 September: 215 stars, 113 commits, still no releases at all. Dropped again because a payments-adjacent tool with no released version is not something one person should run. Recorded loudly because the CATEGORY is still empty after fifteen editions: nothing in this ledger lets a happy customer earn something for bringing another one, and refref is the only candidate anyone has found.
pentacent/keila
pentacent/keila — VERIFIED ALIVE today (0.30.3, 6 September 2026, AGPL-3.0) and left out on slate fit, not health. It is third in line for the same slot behind Listmonk (Ed.2 #1) and Mautic (Ed.10 #6), and it runs on Elixir, a runtime nothing else on his box uses. Stays in the backlog; surface only if Listmonk is marked exclude.
Coming tomorrow