Astra Ink & Wash — static AI drawing environment Open /sketch/ in a JavaScript-capable browser. Wait until window.astraSketch exists. This is a Canvas 2D illustration renderer: transparent dry polygon glazes with paper grain, plus independent antialiased ink lines. It does NOT simulate fluid physics, pigment spectra or wet-in-wet diffusion. No model inference, remote API, or GPU compute is provided. const a = window.astraSketch; const observed = a.observe(); const scene = a.checkpoint(); // detached editable copy scene.layers.push({id:'my-ink',intent:'Add a fine wire',marks:[{type:'line',points:[[.3,.3],[.5,.32],[.7,.3]],color:'#617885',opacity:.5,width:.0005}]}); const proposal = a.preview(scene,{expectedRevision:observed.revision}); // proposal.image is a PNG data URL. Inspect it; committed state is unchanged. await a.accept(proposal.id,{expectedRevision:proposal.baseRevision}); Operations: describe(), observe({includeImage:false}), checkpoint(), preview(scene,{expectedRevision}), accept(id,{expectedRevision}), undo({expectedRevision}), exportPNG(). accept/undo return promises and resolve after IndexedDB commits. Observe revision after any ambiguous failure; never blindly repeat a stale accept. Candidates expire on reload and when more than three exist. New document: preview a new scene (empty layers allowed), then accept. Import JSON checkpoint the same way. Changing resolution: edit scene.width/height, preview, accept. Render coordinates are normalized [0,1], top-left origin. Width is a fraction of paper width, minimum .0001. No square-grid quantization. Canvas sizes: width256..2400, height256..3000, maximum7.2 million pixels. Default study1600x2000 is natively rasterized from geometry, not a resized bitmap. Scene: {version:'astra-sketch-1',title:string,seed:uint32,width:int,height:int,layers:[{id:unique string,intent:string,marks:[]}]}. Mark wash: {type:'wash',points:[[x,y],...],color:'#rrggbb',opacity:0..1,edge?:0..1,texture?:0..1}. At least3 points; polygon white holes must be represented by separated marks / unpainted space. Mark line: {type:'line',points:[[x,y],...],color:'#rrggbb',opacity:0..1,width:.0001..03}. At least2 points. Both max256 points; maximum32 layers and6000 marks per scene. Unknown properties are rejected. See /sketch/schema.json. Layers render in order with multiply blending. Each dry glaze is retained in the scene; later strokes never move earlier shapes. RGB multiply is an artistic transparency model, not calibrated pigment mixing. No blur or rewetting commands exist in this mode. Data is local to this browser's IndexedDB, isolated from the / CPU watercolor experiment. Existing works are never migrated or overwritten on app updates. One writer tab per profile. PNG and JSON buttons export COMMITTED work, even when a candidate is visible. Export JSON to move work to another browser. Previous6 commits support undo. Pure static host: network /api/* is not available. ARTIST STUDY / VIDEO UPDATE (2026-09-07) Open /sketch/?study=artist-v2 for the artist-informed study in an independent saved document. Existing /sketch/ work is preserved. Research and source attribution: /sketch/research.html. Additional wash fields: softness0..0.02 (fraction of paper width, artistic edge blur); dry0..1 (broken paper contact); holes:[[[x,y],...],...] reserves negative spaces in THAT wash. Up to16 rings, each3..64 points. Maximum150000 vertices across the whole scene. These effects approximate artist techniques; they are not wet fluid physics. const result = await window.astraSketch.exportVideo({width:720,fps:12,secondsPerLayer:4,download:true}); // result: {blob,mimeType,extension,srt,cues,width,height,duration}. Default download:false. // window.astraSketch.cancelVideo() aborts the current export. Only one export at a time. Video snapshots the committed scene and does not mutate it. Actual ordered marks are redrawn incrementally. Each layer.intent is a short authored caption describing purpose (e.g. "ここは遠くなので薄く"). It is an explanatory replay, NOT a recording of real-time painting or private model reasoning. Captions are burned into the video; measured-time SRT is also available. Defaults720px wide,12fps,4sec/layer plus2sec final hold. Recording time can be longer on slower devices. Maximum160sec authored timeline,180sec export watchdog. Keep this tab visible; hiding it aborts to avoid silently incomplete recordings. MP4 preferred, WebM fallback by MediaRecorder support. No microphone or screen permission, backend, or cloud upload. Both formats are genuine encoded video, not renamed image sequences. Composition study: /sketch/?study=composition-v3 uses separate saved state. Read-only alternatives + value comparison: /sketch/composition/ Editable source: /sketch/composition-v3.json. Selection notes: /sketch/composition/decision.json.