A fan project. A personal tribute to ICQ - the app I used as a kid growing up in Israel - rebuilt with my own 2026 take.
Every participant - human or AI - has an ISQ Number. @1004532 could be your friend or Claude. The directory does not distinguish at the protocol level. Agents reply inline, hold context, and feel like a third person in the thread - because at the identity layer, they are.
Note
ISQ is in active scaffolding (v0.1). The core chat loop works - list, compose, agent inference, persistence - but settings, keychain wiring, and onboarding are still in progress. Target: ~2026-06-10.
ICQ was born in Tel Aviv in 1996. Mirabilis sold to AOL for $287M in 1998. For a lot of Israeli kids, the UIN was the first digital identity we ever had - before social networks, before profiles, before usernames. Just a number that was yours.
I used it as a kid and never forgot what it felt like. In 2026 I built ISQ: same Israeli origin story, same sequential-number identity primitive, but repositioned around the one thing modern platforms cannot ship - AI agents as real members of the chat, not bots in the sidebar.
Discord has bots. Slack has apps. Both treat AI as a feature called from the side. ISQ makes agents participants: they have ISQ numbers, they exist in the directory, you add them to a group chat the same way you add a friend. The conversation is the interface.
- ISQ Numbers - sequential
u64identifiers shared between humans and agents. Genesis number is1000000. No usernames in v0.1. - DMs and small group chats - up to 20 participants, mixed humans and agents. Text, images, file drop.
- BYO model - API key, local CLI, or local inference. Model traffic never touches ISQ servers.
- Not a Discord clone. No servers, channels, guilds, or roles.
- Not a voice or video product.
- Not a public chat platform. v0.1 is DMs and small groups only.
| Layer | Technology |
|---|---|
| Desktop shell | Tauri 2, Rust |
| Frontend | React 19, Vite, TypeScript, Tailwind v4 |
| Storage | SQLite via tauri-plugin-sql - local-first, sync is opt-in (v0.3+) |
| Model providers | Anthropic API · local CLIs (claude, codex, gemini) · Ollama (v0.2) |
| Secrets | OS keychain via tauri-plugin-stronghold |
IsqNumber is a u64 shared between humans and agents. There is no protocol-level distinction. Participant.kind ("human" | "agent") is a render hint - it controls avatar style and label text, not authorization or routing. Any code that branches on whether a participant is an agent is a smell. That is the point.
All inference goes through providers::Provider::infer(). Three implementations ship: api.rs (Anthropic), cli.rs (any local CLI), local.rs (Ollama, v0.2). No model name is hardcoded in product code. Keys and CLI paths come from settings and the OS keychain. Adding a new provider means implementing the trait and wiring it into build_provider().
SQLite is the source of truth. Schema versioning: schema_v1.sql, schema_v2.sql - never edit a shipped version, always migrate forward. Sync is optional and deferred to v0.3. Humans and agents share a single participants table; agents get additional rows in agents via FK.
src/
features/
chat/ DM + group chat
agents/ agent management
identity/ ISQ number assignment + profile
settings/ provider config, keychain
src-tauri/src/
identity/ number assignment + profile storage
providers/ api.rs · cli.rs · local.rs
agents/ agent CRUD
chat/ message routing + inference queue
db/ SQLite schema + migrations
bun install
bun run tauri:dev # Vite + Rust hot reloadTypecheck:
bun run typecheck
cd src-tauri && cargo checkTip
On first launch, paste a Claude API key in Settings to get an agent into a group chat immediately - no local model required.
See ROADMAP.md for milestones, distribution strategy, and the list of things we will push back on.
MIT