Infochat - chatbot with news digest for SimpleX & Signal

Infochat - chatbot with news digest for SimpleX & Signal

Infochat - chatbot for SimpleX & Signal providing news digests, enabling privacy-focused info access via favored messengers.

July 26, 2026· 9 min read
0 score

I decided to give a try to this agentic coding thingy. In previous post I introduced Zecsite - the static HTML + CSS generator that can deliver the same content to Tor, i2p, IPFS/IPNS and as regular 'clearnet' website. That seems did not impress much, but it was fun to build it to find out what is possible. More AI experiments can be found here on GitHub (I have 2 more experiments in queue, but I am not sure if I will finish them).

Zecsite was challenging but also fun. I tried to push it further and I believe that Infochat is level above in complexity. This really cost me some hair (or what was left there), nerves and swearing. I tried to mix multiple models (from various reasons). But I believe what is here now is quite usable, and who knows - it might give some value to some.

What

Infochat is chatbot that can be used through SimpleX and Signal. I was getting tired of travesty around Telegrams, WhatsApps, etc. (plus anyone can fork the repo and add his/her own adapter for their favorite messenger, feel free). So, I wanted to created something for apps that are really focused on privacy, and that I appreciate and really use. Cool, you can have chatbot, so what?

Infochat examples of slash commands and chat - chat answers depends on sources you follow and their posts

The main feature should be a news summary/digest from sources you configure via JSON file (or add on runtime) that is processed by LLM(local/remote - based on your configuration). You can ask more details about the post, find related/connected posts, get evaluation of the content (promotion/opinion/...) and its categorization (ai/java/crypto/...). Or you can have usual talk with the LLM about anything unrelated to followed sources and their posts.

Why?

Why not? I see every day people ignoring what is coming to us. KYC here - KYC there, banning social media, censoring news portals because reasons. Access to information might get harder, especially with the authoritarian shifts in our so called 'free world'. What if, you could have a 'proxy aggregator' that can collect posts and articles from you favorite sources and send you either summary, or full detail of the post to your phone via your favorite privacy messenger? Would not be it great?

Sure, it will hardly replace RSS readers, but being able to get summary of latest events in your phone on demand, or scheduled digest shared in Group chat with friends (if it work well) - would you use it? Or would you rather stay with what is approved by ruling class who does not give a fuck about you? Chat control will be sure good for you...

The idea

The idea was to bring a news digest into SimpleX and Signal. To bypass Twitter and other surveillance applications that you feed with your data. Then various ideas came in play and it got extended into some kind of news agent, or news chatbot - I have no idea how to name it. I started this because I was not aware of any app like this (but I am sure there will be something, as with every project I start - then alike projects pop up to me like mushrooms after rain).

Scale

It was intended as a small project that could handle unit of users - a couple of friends and family members. There is no fancy scaling solution to support 10s or 100s of users. Also, the app is invitation based - to give you full control who access can access it.

Structure

The full architecture is described in the GitHub repo. In here there is only a brief description what blocks the chatbot is made of.

flowchart LR
    ext["External sources<br/>(RSS, Bluesky, Nostr,<br/>Reddit, YouTube, …)"]
    collector["<b>Collector</b><br/>(headless)"]
    db[("PostgreSQL<br/>+ pgvector")]
    provider["<b>Provider</b><br/>(user-facing)"]
    apps["Messaging apps<br/>(SimpleX, Signal)"]
    llm["LLM / embeddings<br/>(Ollama, llama.cpp,<br/>OpenAI, DeepSeek, Anthropic)"]

    ext -->|fetch| collector
    collector -->|writes posts| db
    collector -.->|NOTIFY new_post / quarantine_review| db
    db -.->|LISTEN| provider
    provider <-->|reads / writes| db
    provider <-->|send / receive| apps
    collector -->|ingest evaluation| llm
    provider -->|summaries, chat| llm

There are a couple of blocks but the most important are:

  • Collector

    • isolated from user interactions
    • fetches data from configured external sources
    • evaluate and stores posts
    • fetches asset prices - Zcash, Monero
    • stores processed data into DB and vector DB
  • Provider

    • handles interaction with users through messaging apps
    • handles admin features - user management, approvals, bans, etc.
    • sends automated digest to registered groups

User Tiers

We have 2 user tiers:

  • User
    • has to be invited by chatbot admin
    • can interact with chatbot
    • can be Group chat admin with some special features
  • Chatbot Admin
    • manages users
    • approves groups
    • manages posts flagged as malicious (e.g. injection attempt)

Communication

Communication with chatbot is possible in two modes:

  • Slash commands
    • deterministic flow, always the same execution
    • /help
      • prints all supported slash commands (it the user tier)
    • /zcash, /monero
      • prints current market data
    • /summary -w 6h --short
      • creates very brief summary of news in last 6 hours
  • Chat
    • allows user to use human language to interact with chatbot
    • can ask more details about slash commands or fetched data
    • non-deterministic - can provide different answers each time
    • if question is not related to anything in fetched data, LLM uses its own knowledge base (depends which provider is configured)
flowchart TD
    msg["message in"] --> id["identity resolve"]
    id --> ban["ban check"]
    ban --> parse["parse"]
    parse -->|slash command| perm["permission check"]
    parse -->|no slash → chat| prob["probation check"]
    perm --> sql["deterministic SQL<br/><i>(reproducible post set)</i>"]
    prob --> agent["ChatAgent<br/><i>(read-only tool surface)</i>"]
    sql --> llm["optional summarizer / chat LLM"]
    agent --> llm
    llm --> fmt["format (plain text)"]
    fmt --> tr["optional translation"]
    tr --> send["send via messaging adapter"]

Setup

My goal was to make setup as simple as installing game. There is guiding wizard (script) - that should help you set the app without friction. However, there are still some decision to be made on your side:

Note: It should be prepared with default values. If you just want to try it, smashing Enter on the ways should work, too. But you will not have configured it to your needs.

In case of problems there is trouble-shooting section based on hurdles I did face and try to resolve when constructing this wizard setup.

Maintenance

The toolkit of scripts is ready to support you with maintenance of the application. See the After setup section in GitHub. In short it allows you to seamlessly start/stop the app, apply latest upgrade of the app. Or create backup if you plan to migrate to another device (or just want to have backup).

News sources

You can add any source mentioned in this table (for updated version check GitHub)

Kind Examples
RSS / Atom Any news site, blog, or podcast feed
Bluesky Author and feed timelines
Nostr Relay subscriptions (stream source)
Reddit Subreddit and listing feeds
YouTube Channel uploads
Odysee Channel content
Nitter X / Twitter timelines via a Nitter instance

Example of initial configuration can be found here.

Privacy

The app should be able to run completely on your device at home (if you have strong enough mini PC). However, there might be people who cannot afford to run local LLM - you can make compromise and set remote LLM - such as Anthropic, OpenAI, DeepSeek, or even aggregators such as nanoGPT should work - with that you should be aware that data you fetch and chat content is leaving to third parties (that will most likely sell you to anyone).

Current state

I would call it open beta - even though I am not sure how to call it. It is still Work-In-Progress state. I have a couple of ideas for improvements, I will probably try to do a couple of more scanning of spec-doc-impl drifts to align it a bit more.

I tested this app mostly with SimpleX. Signal was tested mostly by Claude Code with multiple rented numbers - it should work the same. If you run into any issue or you will get some idea for improvement - feel free to drop a message.

Development

If you want to fork this project and try to experiment with it or create your own extended version, I would recommend you to read Contribution document. Rather than do manual edits, it might be easier for you to use built in flow for agentic coding, called very stupidly /m1-tick (= milestone 1 ticket).

I am not saying it is the best approach. But this flow helped me to bring this project to the phase when it seems quite usable. And if you want to try, I believe it might be a good tool for you to use that too. It is only implementation lifecycle, tickets still mus be done -> you coding agent should be able to create ticket from templates. But it is up to you.

I left all the track behind, so you can use every skill, every flow and see you can also all my fuck-ups in the history.

Future featuers

There are couple of ides listed. To be honest, I do not know now what will be next. If you ask me what I think right now:

  1. add mutation test framework to avoid flaky tests
  2. add translation LLM to translate fetched posts
  3. add option to generate images with some smaller model

But to be completly honest - this might be quite slow progress on these points. I will try to stabilize the current state and iterate on UX. Also, this is 'work in free time project' - and I will need to catch up with my duties a bit after this adventure. Tl;Dr - it will move forward, but in pace I will chose. If you need something fast- fork it, do it, it is open source.

Conclusion

Here it is - SimpleX/Signal chatbot with the news digest. The code was fully provided by AI with this spec-driven development experiment. I tried to steer it, include multiple models into feedback-loop and development. It cost me a lot of hair, sleepless nights, swearing (and tokens). But it was interesting experience and at the end there is some product that looks like it could actually work.

This is 2nd post I write (after the first one disappear at 2 am - if this one fails too I am not writing it 3rd time, I will just share GitHub I guess :) ) Sorry for my fucked up English and typos I left behind (polished version was better, but lost forever), but I wanted to write this by hand, not by AI. Follow-up post about experience with spec-driven development and agentic AI should come in some upcoming weekends. Now I am cooked. See ya!

Related Articles