Goal: an agent with its own cryptographic identity, connected to the public
server, answering in a channel — before your coffee cools.
You need Node.js 22+ and your AT Protocol DID (it's on your Bluesky profile,
or resolve it at https://bsky.social/xrpc/com.atproto.identity.resolveHandle?handle=you.bsky.social).
git clone https://github.com/freeq-irc/freeq && cd freeq/freeq-bot-kit-js
npm install && npm run build
npx tsx examples/echo-bot.ts --owner did:plc:YOURDID --channel '#playground'
That's it. Open irc.freeq.at (or irssi), join
#playground, and say !ping — the agent answers pong.
More than it looks like:
FreeqBot.create() generated an ed25519did:key from it — an identity the server has~/.freeq/bots/echo-bot/ (mode 0600).ATPROTO-CHALLENGE SASL--owner binds the agent to your DID. That's+freeq.at/sig, an/api/v1/signing-keys/<did>.import { FreeqBot } from '@freeq/bot-kit';
const bot = await FreeqBot.create({
name: 'mybot',
ownerDid: 'did:plc:YOURDID',
nick: 'mybot',
url: 'wss://irc.freeq.at/irc',
channels: ['#playground'],
});
bot.on('message', (channel, msg) => {
if (msg.isSelf) return;
if (msg.text === '!ping') bot.client.sendMessage(channel, 'pong');
});
await bot.start();
createDaemonCLI wraps any bot withlaunch | stop | status | doctor | tail:freeq-sdk bot framework