Greetings everyone!
TL;DR: It’s an awesome tech drop. Christmas has arrived earlier.
I am happy to announce that Blast got a massive remake. A few years ago, it started as a library that simplified communication with canisters and auto-discovered their interfaces. Today it does that, but in a way that allows your agents (Codex, Cloude, etc) to use it through MCP. The technical details you can check at GitHub - infu/icblast , but let’s first see what it can do.
For the demo, I’ve started a fresh Caffeine.ai project. After asking ChatGPT to refine my 10-line spec for a mini social network app, I gave it to Caffeine, and my app quickly materialized with one input.
Spec here
Tiny, Hackerish, Console-Driven Social Spec (Abstract)
1) Concept & Principles
- What it is: A minimal, mobile-first, channel-based microfeed. Interactions happen through a console with slash-commands. UI is single-screen; no inner pages.
- Post style: X/Twitter-like short posts (≤ 255 chars) with optional single image. Replies are also ≤ 255 chars. Everything appears in one chronological feed.
- Channels: Users join channels. Every post belongs to exactly one channel. Users see a unified timeline of all channels they’ve joined.
- Operators: First user to join a channel becomes operator (op), with powers to manage members.
2) Core Objects (Abstract)
- User:
username (unique),display name (optional),profile photo (client-resized 128×128),join date,status (active/banned per channel). - Channel:
name (string, case-insensitive),created at,topic (optional),members,ops,bans. - Post:
id,author,channel,text (≤255),image (optional; client-resized ≤512×512; optimized JPEG),created at,likes count,reply count. - Reply:
id,parent post id,author,channel,text (≤255),created at, (optional image not allowed for replies—clarify if needed; default: no images). - Like:
user,post,created at. - Membership:
(user, channel)withrole: member | op,joined at,status: active | banned.
3) Information Architecture & Navigation
-
Single screen app. No navigation to subpages.
-
Default state (logged-in, no channels): Empty timeline with centered message: “Join a channel”.
-
Unified Timeline: Stream merges posts and replies from all joined channels, strictly reverse-chronological by
created at(newest first). No algorithmic ranking. -
Channel presence panel: A right drawer showing members of the currently focused channel (or “All Joined” when viewing unified feed).
- Gesture: Swipe left to reveal the right drawer; swipe right or tap overlay to close.
- Shows: online members (heuristic), ops marked with a badge, member count, channel name.
4) Layout (Mobile-First)
-
Header (compact):
- Left: app wordmark (text).
- Center: dropdown/pill for channel focus:
All(unified) or a specific channel (quick switch). - Right: user avatar (tap ➜ minimal profile sheet: change photo, username is fixed/unique).
-
Main Feed (scrollable):
- Post cell: author (username), channel name (pill), timestamp (relative), text, optional image, action row (Like, Reply), counts.
- Reply cell: visually indented beneath parent post in the feed (still chronologically placed in the global stream). Parent preview line (first ~80 chars) can be shown inline to provide context.
- No pagination controls: continuous scroll with auto-fetch older items when near end.
-
Console (bottom fixed):
- Single input line that accepts commands and plain text (for posting).
- Commands auto-complete and show inline hints.
- When composing a post: attach image (optional). On send, client enforces char limit and image constraints (see §6).
- /help button icon at the left; send at the right.
5) Command Console (Behavior)
-
The console accepts slash-commands and plain text:
- Plain text creates a new post in the currently focused channel. If focus is
All, prompt user to set a channel (/joinor switch focus). - Commands start with
/and show a help tooltip while typing.
- Plain text creates a new post in the currently focused channel. If focus is
-
Command list (baseline):
/help→ Lists all commands with short descriptions./join <channel>→ Join or create a channel; first member becomes op./leave <channel>→ Leave channel; if last op leaves, auto-op the longest-tenured member./focus <channel|all>→ Set the channel that plain text posts go to; affects right drawer./who→ Show member list of focused channel (also visible via right drawer)./topic <text>(op only) → Set channel topic (optional)./op <@user>(op only) → Grant operator role./deop <@user>(op only) → Remove operator role./kick <@user>(op only) → Remove user from channel (they can rejoin unless banned)./ban <@user>(op only) → Ban user from channel (auto-removes if present)./unban <@user>(op only) → Lift channel ban./me <action>→ Post an emote-style action (e.g., “user waves”) in focused channel./channels→ (Optional) List channels you’ve joined (textual; no dedicated page).
-
Command feedback: All commands generate system messages in the feed (e.g., “@alice joined #funchan”, “@bob was banned by @alice”).
6) Posting & Media
-
Text: ≤ 255 UTF-8 characters. Hard stop; show counter.
-
Images (posts only):
-
Single image per post (default). If multiple selected, take the first (or block with message).
-
Client enforces:
- Resizing to fit within 512×512 (preserve aspect ratio; no upscaling).
- Export as optimized JPEG.
-
Show a local preview with file size before sending.
-
-
Replies: Text-only (≤ 255). Appears both:
- As an indented child under its parent (local context).
- As an item in the unified stream according to its own timestamp.
-
Likes: Tap toggles like; show like count. No reactions beyond like.
7) Roles, Permissions, & Channel Rules
- Roles:
opandmemberper channel. - Op acquisition: First to
/joina new channel becomes op. Additional ops via/op. - Op powers:
/op,/deop,/kick,/ban,/unban,/topic. - Bans: Ban blocks reading/posting in that channel; banned users see command error feedback.
- Kick vs. Ban: Kick is one-time removal; user can rejoin. Ban prohibits rejoin until
/unban. - Op continuity: If a channel loses all ops, auto-assign op to the longest-tenured active member.
8) Feed Rules & Ordering
- Global ordering: Strict reverse-chronological by creation time (server time).
- Scope: The unified feed includes posts and replies from all joined channels. The focused view filters to a single channel.
- Thread context: Replies render with a one-line parent reference in the global stream; in channel focus, show the parent inline above the reply when first encountered.
9) Status & System Messages
- Types:
join,leave,op granted/revoked,kick,ban/unban,topic change,help output,errors. - Render style: subtle monospace or gray system line, non-interactive.
10) Identity & Profiles
- Username: unique, set at account creation; shown as
@username. - Profile photo: user-provided; client-resized to 128×128, square crop, shown as a small circle in feed and header.
- Minimal profile sheet: avatar change, display name (optional), view joined channels list (text).
11) Gestures & Micro-Interactions
- Swipe left → open right drawer (members of focused channel).
- Tap channel pill on a post → switch focus to that channel.
- Long-press a post → quick actions (Copy link/id, Like, Reply).
- Pull to refresh → fetch latest.
- @-mentions: auto-complete usernames of members in the focused channel.
12) Errors, Limits, & Feedback
- Message too long / image too large: inline validation before send.
- Not in channel: posting plain text while focused on
Allprompts to/joinor/focus. - Permission errors: clear system message (“You must be an op to do that.”).
- Rate limiting (suggested): soft limits on posts/replies/likes (e.g., bursts of 5 within 10s) with cool-down feedback.
- Name collisions: joining existing channel is idempotent; creating a new channel uses case-insensitive exact match.
13) Presence & “Online” (Lightweight)
- Online indicator: heuristic (recent activity within N minutes). Display in right drawer.
- Typing indicator: none (keep minimal).
- Read receipts: none.
14) Accessibility & Internationalization
- Keyboard-first: Console always focused; supports hardware keyboards.
- Contrast: High-contrast minimal theme by default; dark mode optional.
- ARIA roles & labels for drawer, buttons, like/reply.
- RTL text supported; counter and limits remain unaffected.
15) Privacy & Safety (Minimal)
- Public by default within channels (no private DMs in v1).
- Report content: not included in v1 (operators moderate their channels).
- Content retention: posts are persistent; deletions (optional v1) can be omitted for simplicity.
- Images: client-side processed; originals are not kept (only the optimized derivative is sent/stored).
16) Observability (Minimal)
- Local counters for: total posts, replies, likes per session (optional).
- No public metrics beyond like counts.
17) Non-Goals (v1)
- No global discovery page or channel directory.
- No hashtags, search, or advanced threading.
- No quote-posts, reposts, or DMs.
- No multi-image posts.
- No server-side image transforms beyond storing the client-optimized upload.
18) Copy & Empty States
-
Empty app: “Join a channel” with hint
/join <name>or tap help. -
Empty channel: “Nobody has posted yet. Say hi!”
-
Banned user attempt: “You are banned from #. Ask an operator to
/unban @you.” -
Help output (sample):
/help– List commands/join <channel>– Join/create a channel/leave <channel>– Leave a channel/focus <channel|all>– Set where you post/who– Show members/topic <text>– Set topic (op)/op <@user>//deop <@user>– Manage operators/kick <@user>//ban <@user>//unban <@user>– Moderate/me <action>– Emote
19) Visual Style (Super Minimal)
- Typography: system font; monospace for console and system lines.
- Color: monochrome with a single accent for links and active elements.
- Surfaces: flat; subtle dividers; no heavy chrome.
- Density: compact cards; generous touch targets (~44px).
- Avatars: small circles; channel pill is tiny, subdued.
20) First-Run & Onboarding
- Username selection (unique) → optional avatar upload (resized to 128×128) → land on empty timeline with “Join a channel” prompt and a visible /help hint in the console.
This spec keeps the product sharply minimal, console-first, and channel-centric—while covering the necessary behaviors, constraints, and flows to build a usable, mobile-first microfeed.
Almost exactly what I wanted from the first prompt. I decided to first get the backend to work well, then focus on UI improvements.
What I’ve found while using AI is that it’s best not to try to wrestle it as a developer and attempt to fix things bug after bug manually. Instead, set up the environment, improve connectivity, and create closed loops where, preferably, you aren’t asked to confirm anything - don’t stand in the way of alien technology. A real dev’s job is now to delete AI code for a living. Closed loops in which you let the AI loop for a while and make changes while it’s checking if spec is correct. Think->Act->Evaluate->Repeat. So what I did was open up the Codex agent with Blast MCP installed and gave it that prompt.
I am going to make new posts with updates, because posts have size limits, and I’ll report what happens in real-time.




