Pinned Tweet
16.9M views. 4.6k followers. $0 earned.
What I learned building an AI influencer in 12 days 🧵
was on the old $5 sub, just switched to the $34 plan to see if the bot hype is real. giving it a week of real work, will post what it actually did
ran the "pelican riding a bicycle" test on chatgpt terra 6.1 at every reasoning level, low to ultra. none took more than a minute
And the prompt is the same for all 4 models:
Build a zero-dependency TypeScript + Vite project that renders an ASCII-art
artificial-life animation on a single full-screen <canvas>: several large
{PREDATOR} hunting flocks/schools/herds of small {PREY}, seen from directly
above. It must look and feel like a living ASCII painting, not a game.
## Visual style (match exactly)
- Pure black background (#000) overlaid with a faint visible cell grid
(1px lines, rgba(255,255,255,0.055)), pre-painted to an offscreen canvas.
- Everything snaps to that grid. Cell width = clamp(round(viewportWidth/124), 8, 13)px,
cell height = round(cellWidth * 1.45). Font: "Geist Mono" weight 600 (Google Fonts),
glyph size ≈ 0.74 × cell height, centered in the cell. Respect devicePixelRatio (cap at 2).
- PREY: one tiny glyph per cell (e.g. "-" for fish; pick something fitting like "v" for
birds, "." for insects, "·"/"-" for herd animals). Pale blue-white, alpha bucketed into
~5 levels: dimmer = farther away (each prey has a depth 0.55–1), brighter when panicking
or turning hard (a "glint"). Nearer prey wins when two land on the same cell.
- PREDATORS: rasterized cell-by-cell from a procedural top-down silhouette. Each covered
cell is a filled grey block (shade from lighting) with a dark glyph on top:
- Supersample each cell (center + 4 sub-samples). ≥60% coverage → solid block; partial
→ no block, just a light edge glyph (":;" heavy, ".',`" light) for an anti-aliased outline.
- Lighting: a rounded back lit from the top-left; the middle of the body is brighter and
the flanks fall off into shadow.
Glyph density follows shade: ramp ":;t%SX8#@" (sparse on bright, dense in shadow).
- Body parts get their own treatment: a bright ridge line down the spine ("@8%", near-white
block), dark eyes ("o" on a near-black block), appendages with their own glyph set
("%;tS:") and dimmer shading, species markings (stripes, spots) as dark blocks ("#%@").
- Per-species tint as RGB multipliers on the grey (cool slate, warm brown, etc.).
- Shimmer: each cell's glyph colour re-rolls on a staggered clock (~2.4 Hz). About 9% of
cells flash an accent colour (#e0892c #e03a32 #b44ae0 #33c8cc #3cb54a #3150e8 #d9c14a),
~4% flash white, and the rest are near-black (#0e0f13 / #1b1d24).
- Glyphs are keyed to body coordinates (position along the body × position across it),
hashed, so the texture rides along with the skin instead of crawling.
- A shadow offset down-right dims the background dots underneath.
- Farther/smaller predators are drawn dimmer and underneath the larger ones.
- WAKE FIELD: a per-cell energy grid. Prey add a little, the predator's tail/rear
adds more, the pointer adds some. Each frame, blur it with a 5-point kernel and decay it
(exp(-dt*1.5)). Cells above a threshold show a small cyan square dot (rgb 110,230,255)
in the lower-right of the cell, in 6 alpha buckets. Otherwise the grid stays black:
no ambient dots.
- KILL FX: when a predator eats, stamp a "heat" field that decays fast and draws
"*" (orange, rgba 255,120,60) when hot and "·" (red) as it cools.
- Batch draws by fillStyle (counting-sort cells into colour/alpha buckets) for performance.
## Simulation
- Fixed timestep 1/60 s with an accumulator (max 4 steps/frame) in a requestAnimationFrame loop.
Pause when the canvas is off-screen (IntersectionObserver). Handle resizes with a
ResizeObserver. With prefers-reduced-motion, pre-step 4 s and draw one still frame.
- PREY = Reynolds boids with Couzin-style zones and a spatial hash (bucket = perception
radius ≈ max(3 cells tall, 5.5 cells wide)):
- separation using an elliptical personal space measured in grid cells (wide in x, tight
in y), so every individual gets its own cell;
- alignment + cohesion with same-species neighbours only; different species keep apart;
- a blind spot directly behind each individual (cos < -0.6);
- 4–5 prey sub-species (like sardine/anchovy/mackerel) with different cruise/max/min speed,
group size, spacing, align/cohesion/jitter weights, and a "mill" tangential force that
makes one species circle into a rotating ball. Different weight mixes should give visibly
different group shapes: tight polarised ribbons, loose swarms, rotating mills;
- level-travel bias (vertical drag) unless panicking, a soft margin at the walls,
and a divergence-free ambient current (the curl of a slowly drifting stream function
built from sin/cos);
- ALARM 0–1: set by nearby predators or the pointer, passed to neighbours at ×0.86 per
hop, and fading over time. Alarmed prey spread out (personal space up to ×2.8), drop
cohesion, and speed up;
- FOUNTAIN EFFECT: fleeing prey break sideways around the predator's path, not just
directly away. Threat distance is measured to the nearest point on the predator's front half.
- PREDATORS = a 20-node follow-the-leader spine (head first) with a maximum bend per joint
(≈0.16 rad), so the body curls into a C at most. Steering = momentum + wander + pursuit
(aim ahead of the target using its velocity) + separation from other predators + an
orbit patrol around the screen centre when not hungry + a soft elliptical no-go zone in
the centre (keep the middle clear for a headline) + turning back once the head leaves
the screen. The turning rate is limited by speed/length, so there is no pivoting in place.
Hunger rises over time and falls when they eat. Prey selection: a forward cone,
preferring stragglers in sparse buckets (dense groups confuse predators), keeping the
current target unless another is clearly better (×1.3).
Speed: cruise ≈ 30 + 0.04·length; up to ~3× when closing in on a target.
- Render-time locomotion: build a smooth render spine from the sim spine plus a travelling
wave whose amplitude grows toward the rear and scales with speed (adapt to
{PREDATOR}: wingbeat flex for birds, leg/gait sway for land animals, body wave for
swimmers). Bank into turns: the appendage on the inside of the turn shortens and the
outside one extends.
- Eaten prey respawn after 3–8 s as a new group arriving from a random screen edge, so the
population stays steady (count ≈ area/4400, clamped 85–340).
## Predator species
Define 6–8 {PREDATOR} variants as data: a halfWidth(s) profile function (s = 0 at the head
to 1 at the tail, as a fraction of length) plus appendage triangles (leading root,
trailing root, tip position, reach), optional notches, eye position, ridge range,
markings function, and tint. Make each variant clearly recognisable at ~20 cells long.
The default scene shows 4 predators of the classic variant at sizes 1, 0.84, 0.77, 0.7.
## Interaction & API
- Pointer move: prey avoid the cursor within ~130px, and the cursor leaves a faint wake.
Touch input doesn't count as hover.
- Pointer down: a "splash/startle" that makes nearby prey burst outward (flash expansion)
and drops a big energy ring into the wake field.
- `?predators=a,b,c` URL param picks the roster: the first is the biggest, and each next
one is 10% smaller.
- Code layout: src/math.ts (clamp, rand, angleDiff, hash3, current), src/species.ts
(prey params), src/world.ts (sim), src/renderer.ts (ASCII renderer),
src/engine.ts (loop, observers, input, destroy()), src/react.tsx (a small
<AsciiCanvas> wrapper), demo.ts, index.html. Use `npm run dev` (Vite) and
`npm run typecheck`. Comment the "why" behind behaviours briefly, citing the
biology (Reynolds, Couzin) where it applies.
## Done when
Running `npm run dev` shows a black grid with dimly glinting prey groups that form
different shapes, and 4 shimmering, shaded ASCII {PREDATOR} that move naturally (no
jitter, no sharp folds), hunt stragglers, cause visible waves of panic and fountain
splits, leave cyan wakes, and spark red on each kill. It should run at 60 fps on a laptop
at 1440×900. Open it in a browser and check it visually before finishing.
I wasn't able to deploy to @Railway since yesterday. First time I'm experiencing something like this. How are you guys dealing with this?
Meet Gayrat. He recreates trending videos with himself in them.
I gave him unusually big ears and a big nose on purpose. People can't scroll past a face like that.
🤖 Made with AI
Most of Gayrat's videos after the switch were made with @Alibaba_Wan 3.0
Same character, way cheaper per video
Results, 8 videos:
• 16.9M views, 8.7M unique viewers
• 1.3M interactions
• 99.7% of views from non-followers
• Best reel: 8.6M views, 801K shares
The real lesson: views ≠ followers.
8.6M views + 8s avg watch time → 1,814 follows
7.6M views + 14s avg watch time → 2,918 follows
Fewer views, 60% more followers. Watch time beats reach.










