Tools
Services
WorkKompendioAbout
ende
Octinex Radi-O

Local search visibility for healthcare practices, built around Germany’s rules for advertising in healthcare. Radi-O compares what map listings and AI answers show with the practice’s own data, gathers its reviews in one list, and leaves every change to a person.

  • In development
  • For practices in Germany
  • Runs on my own machine for now
  • matches the practice’s data
  • hint: worth a look
  • critical: sends patients wrong

A personal project, built in my own time.

What patients find

Patients look in four places. The practice watches none of them.

  1. Mon 07:40

    A toothache. “Dentist near me” finds the practice, with the phone number it gave up last spring.

  2. 07:42

    Above it: “Bester Zahnarzt Berlin 24/7 ★”, the best dentist in town, around the clock. Names like that can get a listing suspended, and the rules for advertising in healthcare don’t allow “best”.

  3. 07:45

    Two stars, three weeks ago, no reply. Nobody at the practice saw it.

  4. 07:50

    Then an AI. It names two other practices, and this one’s old opening hours.

Radi-O keeps the practice’s own data as the one truth, checks listings and AI answers against it, and leaves every change to a person.

Wrong numbers and stuffed names are flagged before more patients meet them, new reviews land in one list, and replies are drafted, checked and approved, never posted by themselves.

How it works

From the practice’s own data to what patients find, in seven steps.

  1. 01 · The practice’s own data

    One truth per location.

    The name on the door, the address, phone, website and opening hours are kept once for each location. Listings and AI answers are checked against them.

    Gone a different phone number in every listing

  2. 02 · What each listing shows

    Compared, not eyeballed.

    Someone records what a listing on a map or a portal shows today, and Radi-O compares it line by line. “Str.” and “Straße”, “+49 30” and “030” count as the same. A wrong number or an old address is critical, and so is a listing nobody has claimed: nobody can correct it.

    Gone comparing listings by eye

  3. 03 · Rules for name and address

    Flagged before a platform acts.

    Words like “Bester” (best), “Top”, “Nr. 1” or “24/7”, or stars, in a practice’s name, and a P.O. box, c/o or coworking address are flagged: on the listing, and on the name the practice plans to use. So are two categories that name the same service.

    Gone learning the rules from a suspended listing

  4. 04 · Suggestions

    Only the clean kind.

    What’s missing from the practice’s data, where no listing is linked yet, which listing was never checked. Never a stuffed name, never asking only happy patients for reviews, never a reward for one.

    Gone growth tips that break the rules

  5. 05 · Reviews

    One list, and a nudge.

    Two review portals are read twice a day. New reviews land in one task list, by location and portal. Three stars or fewer raises an alert in the app and by email: at once, or in a daily or weekly digest.

    Gone checking portals by hand

  6. 06 · Replies

    Drafted on request, approved by a person.

    Claude drafts a reply from the review alone; what a portal says about the visit stays out. The wording is checked: nothing that confirms the writer was a patient or was treated, no cure promised, no “best”, nothing offered for a review. Still blocked after a second try, the draft goes to a person to rewrite. The approver’s name is recorded, and the reply is pasted onto the portal by hand.

    Gone a reply that says too much

  7. 07 · AI answers

    What an AI tells patients.

    Radi-O asks an AI with web search the questions patients ask, from the practice’s city, and records whether the practice is named, what is said about it, and whether its address, phone, hours and website match. A person then marks with ✓ or ✗ whether Radi-O read each answer right.

    Being tried out: run by hand for now, and the results stay private.

    Gone guessing what an AI says about the practice

Radi-O points. A person decides.

It changes nothing on any map, portal or answer by itself. Listings are corrected by the practice, replies are pasted by hand, and Radi-O records who approved every reply.

Try it

Check a listing the way Radi-O does.

A made-up practice’s own data, and what one of its listings shows. Change the listing: Radi-O’s own comparison and listing rules run on every keystroke.

The practice’s own data

Name
Zahnarztpraxis Beispiel
Street
Musterstraße 12
Postcode
10115
Town
Berlin
Phone
030 23125 412
Website
praxis-beispiel.example

Try Musterstr 12, +49 30 23125412 or www.praxis-beispiel.example/: the same. Then 030 23125 400 as the phone number, Bester Zahnarzt in the name or c/o in the street, or set the listing to not claimed.

What the listing shows

A map listing, as recordedCritical

separated by commas
  • critical Phone number differs: “030 23125 400”, the practice says “030 23125 412”.
  • hint Name differs: “Zahnarztpraxis Beispiel – Beste Zahnärzte Berlin”, the practice says “Zahnarztpraxis Beispiel”.
  • critical Marketing word in the name: “Beste”. Use the practice’s official name.
  • hint Two categories name the same service: “Zahnarzt” and “Zahnarztpraxis”.

Runs in your browser with Radi-O’s own comparison and listing rules, on a made-up practice. In Radi-O someone records what each listing shows; this page reads no real listing.

Who sees what

Three kinds of people, and the database keeps them apart.

  • If you run or manage the practice

    Everything, and the settings.

    Every location, listing, review and reply. Only the practice’s management changes its data, links listings, chooses who gets alerts and sees the AI answers.

  • If you’re a doctor

    Your own, never a colleague’s.

    Your own reviews and those that belong to no single doctor, with their replies to draft and approve. You can’t change the practice’s data or see the AI answers.

  • Anyone else

    Nothing at all.

    Another practice in the same database sees none of it, and a session that names no practice sees no practice’s data at all.

The rules sit in the database, not in the app’s screens: hiding a button is the app’s job, keeping a doctor out of a colleague’s reviews is the database’s.

How it’s built

For the people who’ll ask how.

  • 62commits since July 2026
  • 181tests, all passing
  • 11database migrations
  • 12outside packages in its dependencies

Figures as of 13 October 2026.

The database decides who sees what. Every table of practice data has its own access rule, switched on and forced, so a query that names no practice returns none of it. The web app connects with a role that can’t bypass those rules, and a doctor’s session carries who they are, so the database itself leaves out a colleague’s reviews.

  • TypeScript
  • Next.js
  • React
  • Node.js
  • PostgreSQL
  • Drizzle
  • pg-boss
  • Claude API
  • Docker
  1. Workerreads two portals twice a day · raises alerts and sends mail
  2. Databasean access rule on every table of practice data · no rows without a practice
  3. A personchecks, drafts and approves · in the web app, signed in
  • The listing comparison, the listing rules and the reply rules are small, plain functions with their own tests, so a rule can be read rather than trusted. The reply rules call themselves a floor, not a ceiling: a person still reads every reply.
  • Nothing is posted on its own. The only requests Radi-O makes read public portal pages, ask Claude, or send an alert email; no code posts to a portal or a map.
Where it stands

From a first commit in July to AI answers in October.

  1. 12 Jul 2026First commit
  2. 14–15 JulReviews in one list; replies drafted, checked and approved
  3. 19–20 JulListings checked, sign-in, alerts by email
  4. 11–13 OctAI answers, run by hand; the approver recorded, approvals can be undone
  5. NowIn development, on my own machine. Not offered to practices.
Write to me

Want to talk about Radi-O?

If you look after a practice’s listings and reviews, or you’d like to know how it’s built: one message reaches me.

I use what you send here only to answer you. Privacy policy

The other tools