{"id":"typewriter-terminal","version":"1.0.0","title":"Typewriter Terminal","summary":"A terminal window typing commands with a human, uneven rhythm and a block caret, printing the output after each one.","kind":"text","target":"canvas2d","collections":["kinetic-text","product-reveals"],"tags":["terminal","command line","typing","typewriter","code","developer","cli","text animation","caret","hacker"],"loopable":false,"motion":"procedural","durationSeconds":9,"status":"published","media":{"poster":"https://aipixelwizard.com/media/typewriter-terminal/1.0.0/poster.webp","preview":"https://aipixelwizard.com/media/typewriter-terminal/1.0.0/preview.mp4","sample":"https://aipixelwizard.com/media/typewriter-terminal/1.0.0/sample.mp4","sampleBytes":146100,"sampleNote":"Pre-rendered with the default settings. Customised settings must be exported locally (npm run render)."},"urls":{"page":"https://aipixelwizard.com/visuals/typewriter-terminal","manifest":"https://aipixelwizard.com/api/v1/visuals/typewriter-terminal/versions/1.0.0","agentMd":"https://aipixelwizard.com/registry/typewriter-terminal/1.0.0/agent.md","files":"https://aipixelwizard.com/registry/typewriter-terminal/1.0.0/","demo":"https://aipixelwizard.com/registry/typewriter-terminal/1.0.0/index.html"},"description":"A command line typing itself out. A terminal window drifts in, a prompt appears, a command is typed at a human, slightly uneven pace with a blinking block caret, the output prints in a dimmer colour and the next command follows. The typing times come from a seeded generator, so the same words always type the same way. Type two commands and their output, choose the theme (midnight, paper, phosphor or ember), the typing speed, the window title and the backdrop colour.","role":"Text scene (Canvas 2D): the developer-demo, tutorial and tech-product look.","useCases":["A developer tool, CLI or API product demo","A tutorial or course intro that shows a command","A tech-themed title sequence"],"synonyms":["typing animation","console","shell","type on effect","command prompt","code typing"],"digest":"03280ecb2a61e10835306b582075817389b3f08e63174f2e8197839ccf1acaed","implementation":{"target":"canvas2d","runtime":"browser","language":"javascript","module":"esm","entry":"src/typewriter-terminal.js","exports":[{"name":"createTypewriterTerminal","signature":"createTypewriterTerminal({ steps?, title?, prompt?, theme?, speed?, start?, seed?, fontFamily? }) => { draw(ctx, info, width, height), revealDuration }","description":"Canvas 2D terminal layer driven by info.time (seconds); steps are [command, output] pairs."},{"name":"THEMES","signature":"THEMES: { midnight, paper, phosphor, ember }","description":"Colour themes: window, bar, text, prompt, dim and accent."}],"reusable":["src/typewriter-terminal.js"],"demo":"demo.js","harness":"index.html"},"dependencies":[{"id":"apw-runtime","version":"1.0.0","scope":"demo","reason":"Demo harness. The reusable source has no dependencies."}],"uses":[],"usedBy":[],"params":[{"key":"command1","label":"First command","type":"text","default":"npm create video@latest","maxLength":40,"sensitive":true},{"key":"output1","label":"First output","type":"text","default":"Scaffolding project… done ✓","maxLength":48,"sensitive":true},{"key":"command2","label":"Second command","type":"text","default":"node render.js --loop","maxLength":40,"sensitive":true},{"key":"output2","label":"Second output","type":"text","default":"Rendered 240 frames in 3.2 s","maxLength":48,"sensitive":true},{"key":"title","label":"Window title","type":"text","default":"zsh — 80×24","maxLength":30,"sensitive":true},{"key":"theme","label":"Theme","type":"select","default":"midnight","options":[{"value":"midnight","label":"Midnight"},{"value":"paper","label":"Paper"},{"value":"phosphor","label":"Phosphor"},{"value":"ember","label":"Ember"}]},{"key":"speed","label":"Typing speed","help":"Characters per second.","type":"number","min":6,"max":24,"step":1,"default":13},{"key":"seed","label":"Seed","type":"integer","min":1,"max":999,"step":1,"default":7},{"key":"background","label":"Backdrop","type":"color","default":"#0a0d14"}],"presets":[{"id":"default","label":"Midnight","params":{}},{"id":"paper","label":"Paper, light","params":{"theme":"paper","background":"#d8d2c4","command1":"git push origin main","output1":"Everything up-to-date","command2":"deploy --prod","output2":"Live in 4 s ✓"}},{"id":"phosphor","label":"Phosphor green, fast","params":{"theme":"phosphor","background":"#030a05","speed":19,"command1":"ssh root@mainframe","output1":"Access granted","command2":"./run_demo.sh","output2":"All systems nominal"}},{"id":"ember","label":"Ember, slow","params":{"theme":"ember","background":"#120c0a","speed":9,"command1":"make launch","output1":"Countdown started","command2":"tail -f mission.log","output2":"T-minus ten…"}}],"output":{"width":1080,"height":1080,"fps":30,"durationSeconds":9,"posterSeconds":6.5,"alpha":false,"motion":"procedural","loop":{"seamless":false,"method":"Not a loop: the window arrives, both commands type and print, and the caret blinks on a fresh prompt."},"seed":{"param":"seed","behavior":"Seed sets the uneven timing of the keystrokes: same seed, same typing."}},"composition":{"inputs":"Canvas 2D context, info.time (seconds), width, height.","outputs":"Draws the terminal on top of the canvas; does not clear it.","coordinates":"The window is centred and 86% of the width wide; its height follows the number of lines; type size scales with the smaller side of the canvas.","lighting":"A soft drop shadow lifts the window; the demo adds a glow of the theme's accent behind it.","timing":"Pure function of time; the schedule of keystrokes is computed once from the seed; revealDuration says when everything is on screen.","compatibleWith":["kinetic-title","gradient-background"],"notes":["Monospace metrics are measured, so the caret always lands after the last typed character.","Text is treated as private: it is not stored in shared packs unless you choose to include it."]},"reuse":["Dev tool demo: Midnight.","Clean docs: Paper, light.","Hacker look: Phosphor green, fast."],"integration":{"newProject":"Create the terminal once, then each frame draw your backdrop and call term.draw(ctx, { time: frame / fps }, width, height).","existingProject":"Copy src/typewriter-terminal.js. Call draw on your existing 2D canvas after the rest of the frame."},"performance":{"notes":"A few filled shapes and measured text per frame; negligible.","limits":"Commands and outputs should fit on one line (about 40 characters)."},"limitations":["System fonts differ between computers; pass fontFamily and load the font first for identical renders.","There is no scrolling: a long session needs a taller window or fewer lines."],"license":{"spdx":"MIT","notice":"Copyright (c) 2026 AI Pixel Wizard. Released under the MIT License. See LICENSE in this folder.","thirdParty":[]},"rights":{"approvedForPublicRelease":true},"provenance":"Original code written for AI Pixel Wizard in October 2026, to the catalog quality bar (docs/QUALITY.md).","changelog":[{"version":"1.0.0","date":"2026-10-08","notes":"Initial release."}],"verification":{"testedOn":"2026-10-08","inputs":{"typewriter-terminal@1.0.0":"03280ecb2a61e10835306b582075817389b3f08e63174f2e8197839ccf1acaed","apw-runtime@1.0.0":"5be859cdac74823ba0bcc32c6daf06688a871104d24db5d4ceaffffd84d7c40d"},"environment":"Chrome 154.0.8037.97 headless on Linux 7.0.0-38-generic (x64), Node 22.14.0","renderer":"Canvas 2D","width":1080,"height":1080,"fps":30,"frames":270,"renderSeconds":15.8,"loopCheck":{"checked":false,"seamless":null,"maxDifference":null,"note":"Asset does not claim a seamless loop."},"determinism":{"checked":true,"identical":true},"errors":[],"media":{"poster":"/media/typewriter-terminal/1.0.0/poster.webp","preview":"/media/typewriter-terminal/1.0.0/preview.mp4","sample":"/media/typewriter-terminal/1.0.0/sample.mp4","sampleBytes":146100}},"files":[{"path":"LICENSE","size":1072,"sha256":"8a5f3a96f07e11522ec4bdd0a583356f99bad1245920f9709cee09b995a45153","contentType":"text/plain; charset=utf-8","url":"https://aipixelwizard.com/registry/typewriter-terminal/1.0.0/LICENSE"},{"path":"asset.json","size":8009,"sha256":"ecf81ae520a1a77b2af59cfa419a3d5aaa0ddfc7c06a2c266294c027a3f6caa7","contentType":"application/json; charset=utf-8","url":"https://aipixelwizard.com/registry/typewriter-terminal/1.0.0/asset.json"},{"path":"demo.js","size":1182,"sha256":"de214cab58196aac42e21ea689214a683f172381be0684db26be1dd2f8913564","contentType":"text/javascript; charset=utf-8","url":"https://aipixelwizard.com/registry/typewriter-terminal/1.0.0/demo.js"},{"path":"index.html","size":533,"sha256":"6d31d6f674e658b322905c3b7d799df3a218f4a6d14b9b12130a52e69c7405ab","contentType":"text/html; charset=utf-8","url":"https://aipixelwizard.com/registry/typewriter-terminal/1.0.0/index.html"},{"path":"src/typewriter-terminal.js","size":7024,"sha256":"5f5cc500e991367b5e492c6d7fcacaa5a7a9f69a1b93bd43ff62a972f60b6d4b","contentType":"text/javascript; charset=utf-8","url":"https://aipixelwizard.com/registry/typewriter-terminal/1.0.0/src/typewriter-terminal.js"}],"warnings":[]}