Tachikoma is a panel for building bots that post to social networks by themselves. From the web you define what each one publishes, to which accounts, in which language, at what time and how much it may spend; each administrator loads their own AI key and the system handles the rest: it finds the fact in a checkable source, writes it up, enforces the rules in code and publishes only what it can stand behind. Right now 15 bots are running across 2 networks, with nobody pressing a button.
Publishing unattended since September 12, 2026. The figures on this page come from the production database; none of them are hardcoded.
What you define from the panel
None of this requires touching code or logging in over ssh. Every bot is built and corrected from the web, and the change takes effect on the next cycle.
The subject and the brief it writes from. Each subject brings its own way of being verified: a scientific paper needs a DOI and a journal; a film needs a real image; an anniversary needs the year and the article backing it.
15 bots active right nowWhich accounts it posts to, how many pieces per day and at what hours, in its own time zone. The text is sized to each network — 300 characters on Bluesky, 2,200 on Instagram — so every network gets a piece written for it.
2 connected accounts, 2 networksThe languages of the post body are chosen per bot and switched on one at a time, without touching code. The image is generated separately, because not every alphabet is typeset the same way.
publishing today in Spanish / EnglishA free stock photograph, a figure from the paper itself, the film poster, or a typographic card generated by the system. The contrast of text over background is checked as the card is built, not left to a guideline.
Instagram requires an image: without one, nothing is publishedEach administrator loads their own by pasting it into the panel. It is stored encrypted and never shown in full again: only the last four characters remain visible, just enough to recognise it. One button checks whether it works without spending a single token.
The key never appears in a log or in a server responseA daily cap per bot and a monthly cap per key. The system stops before calling the API, not after: the point is that a bug or a loop cannot run up a bill.
15 of 15 bots have a daily cap setWhat the system does on its own
With the configuration in place, an hourly cycle decides bot by bot — according to its time zone and its quota — what needs doing: generate, publish, measure or reply to comments. This is what happens between waking up and something reaching the network.
Europe PMC for science, the World Bank for economics, TMDB for film, Finnhub for the stock market, Wikipedia for anniversaries. A paper without a DOI, or one already retracted, is discarded before spending a model call. app/Research/PaperFinder.php
It receives the real record and returns text, keywords and the link to current events. The verifiable fields come from the source, never from the model. app/Content/PostComposer.php
A film title is not translated: it is released under a different name in each country, so the official one is requested. Translating it word by word invents a film that does not exist; that happened once, and it is why this is solved this way. app/Content/PostTranslator.php
Instagram requires an image. The typographic card is built while checking WCAG contrast in the constructor itself, rather than trusting a guideline. app/Media/Design/Contrast.php
Source, indexed journal, preprint declared as such, study type, link to current events, keywords, network limit. If one is missing, nothing is published. app/Editorial/EditorialGuard.php
Days can pass between drafting and publishing, and a retraction arrives right afterwards. If the API does not answer, nothing is published: not knowing is not a green light. app/Research/RetractionChecker.php
The post is claimed with a conditional update before going out, and a circuit breaker isolates an account that starts failing. Publishing twice on a real account cannot be undone. app/Social/SocialPublisher.php
Every publication leaves interaction snapshots, cross-referenced with its keywords to learn which subjects work. That is what decides what gets searched for tomorrow. app/Stats/KeywordStatsService.php
The keys
A bot that publishes needs, by definition, credentials that can publish. Those are precisely the ones that must not be readable: not from the database, not in a log, not in a server response, and not by whoever administers the panel.
The credentials of every social account and the key of every AI provider are stored encrypted. Anyone reading the table directly sees ciphertext, not the key.
2 connected accounts, credentials encryptedThe form does not load them back when opened, and they are excluded from every serialisation of the model: they never travel to a log or to an error email. On screen only the last four characters are visible.
Saving the form without touching the field does not erase the keyThe AI key belongs to the administrator, not to the system: it is pasted into the panel and overrides any other server configuration. Changing it takes effect on the next call, with nothing to restart.
One button checks the key against the provider without spending tokensThe money
A bot calling a model several times a day spends real money. The panel answers three different questions — how much today, how much this month, and what each publication cost — and it also stops when it should.
Input, output and cache tokens, latency and cost, stored next to the publication that caused them and at that day's price: pricing changes, and history must not silently recalculate itself.
2.499 calls recorded with their costThe daily figure alone is not enough to know what a bot costs: a day without material costs nothing. The monthly one, with its projection to the close, is the number to compare against what the provider will charge.
With its month-end projection, bot by botThe daily cap belongs to the bot. The monthly one belongs to the key, which is what the provider actually bills: five bots with small caps still add up against the same account. Once reached, nothing is generated.
It stops before calling the API, not on the following callWhat the system does not delegate to the model
A model can ignore an instruction in the prompt, and there is no way to tell from the outside. The editorial rules are evaluated against the finished draft: if they are not met, the post does not go out, whatever the text claims.
208 publications stopped by a rule so farThey are internal subject labels fixed when the content is generated and later cross-referenced with the real interaction of each publication. They answer which subjects are worth looking for again.
505 subjects measured across 66.177 snapshots · best: stocksThe system replies to the first comments on each publication and classifies what it decides not to answer: asking for medical advice, or asking something the study does not support, are legitimate omissions rather than hostility.
8 categories, 4 counted as an attackWhat was not published is kept with the reason written down; it is not deleted. A draft can also be held back by hand for review before it goes out.
17 publications held for review right nowWhat is running
Adding a bot to a subject that already exists means filling in a form. Adding a new subject is code — a class that finds it, one that writes it and one that verifies it — but the rest of the system never notices: the cycle, the queue, the accounts and the statistics are already agnostic about the subject they are processing.
On the network now
Bluesky pieces link to the live post. Instagram ones do not: its public link is only provided by the Meta API, and showing a hand-assembled link would be worse than showing none.
How it is built
It runs on a dedicated 864 MB server: a panel, a scheduled task every minute and a queue that drains on its own. Everything administered is administered from the web — bots, accounts, keys, caps, model catalogue — and the state survives a reboot.