Agent skill · Audited from source
anidoodle
skill · alexgreensh/anidoodleApache-2.0 licenceAudited 30 Oct 2026 · source 46cc64da6899
Is it safe? No — BLOCK, grade D (65/100). We read this skill's source at commit 46cc64da6899 and observed filesystem, network and shell access and no hard-coded secrets. The audit raised 25 findings, 1 critical or high. What it does: Code-drawn stills, films, 3D motion graphics, explainers and web animations in 32 styles, with scores, narration and subtitles. Use when asked for an illustration, animation, video or drawing lesson.
Cite
Cite this page
ModelsAtlas. “anidoodle (alexgreensh/anidoodle)”. Retrieved 30 Oct 2026. https://modelsatlas.com/skills/alexgreensh/anidoodle
Blocked. The page stays public so you can check this skill if someone recommended it to you. The audit found 1 critical or high finding, starting with “Code injection” in engine/tools/registry.mjs:24. Do not install it without reading them.
Trust audit
Audit 0.4.1 · source read 30 Oct 2026
BLOCK means the audit found something that could harm you or your machine. Grade D is shared by 721 of 17,602 audited skills.
What the source does
- FilesystemDeclared5 observations
- NetworkDeclared15 observations
- ShellDeclared4 observations
- DependenciesPinnedNothing floats
- SecretsNone foundNo keys in source
Five audit layers
| Layer | What we check | Result | Findings |
|---|---|---|---|
L0 Provenance | Repo owner, licence, archive status, activity | PASS | 0 |
L1 Static source | Secrets, path traversal, supply chain, hidden code | FAIL | 25 |
L2 Instructions | Prompt injection, authority framing, hidden directives | PASS | 0 |
L3 Inventory | The files and declarations match the source | PASS | 0 |
L4 Sandbox | Run in isolation and watch behaviour | SKIPPED why | 0 |
Gates applied: no behavioural pass.
Findings (25)
HIGHCode injectioncode.eval_exec · engine/tools/registry.mjs:24
let style; try { style = new Function(`return (${m[1]})`)(); } catch (e) { throw new Error(`unparseable STYLE in src/canvas-core/${f}: ${e.message}`); }- Why
- evaluates text as code
- Fix
- remove; use a parser or a dispatch table
MEDIUMNetwork egressnet.raw_ip · engine/tools/brand-unit.mjs:57
t("RED: ANIDOODLE_FIGMA_API pointing at another host is refused", () => { assert.throws(() => figmaBase({ ANIDOODLE_FIGMA_API: "https://evil.example.com" }), /local test server/); assert.throws(() =>- Why
- No further detail recorded for this rule.
- Fix
- —
MEDIUMNetwork egressnet.raw_ip · engine/tools/brand-unit.mjs:58
t("no override gives Figma itself; a localhost override is kept", () => { assert.equal(figmaBase({}), "https://api.figma.com"); assert.equal(figmaBase({ ANIDOODLE_FIGMA_API: "http://127.0.0.1:4010/" }- Why
- No further detail recorded for this rule.
- Fix
- —
MEDIUMNetwork egressnet.raw_ip · engine/tools/brand-unit.mjs:66
else if (q.url.startsWith("/v1/images/")) { s.setHeader("content-type", "application/json"); s.end(JSON.stringify({ images: { "1:2": `http://127.0.0.1:${srv.address().port}/img.svg` } })); }- Why
- No further detail recorded for this rule.
- Fix
- —
MEDIUMNetwork egressnet.raw_ip · engine/tools/brand-unit.mjs:70
const env = { ...process.env, FIGMA_TOKEN: "test-token", ANIDOODLE_FIGMA_API: `http://127.0.0.1:${srv.address().port}` };- Why
- No further detail recorded for this rule.
- Fix
- —
MEDIUMNetwork egressnet.raw_ip · engine/tools/brand.mjs:114
if (u.protocol !== "http:" || !["127.0.0.1", "localhost", "[::1]"].includes(u.hostname)) throw new Error(`ANIDOODLE_FIGMA_API must be a local test server (http://127.0.0.1:<port>), got ${u.host}: unse- Why
- No further detail recorded for this rule.
- Fix
- —
MEDIUMObfuscation / stealthobf.base64_blob · engine/assets/fonts/poppinsBold.ts:8
export const POPPINS_BOLD = "AAEAAAAOAIAAAwBgRFNJRwAAAAEAAmFUAAAACEdERUYJFgkZAAIkXAAAAEBHUE9TJZojvAACJJwAABT0R1NVQvCEChMAAjmQAAAnxE9TLzLbJHrtAAABaAAAAGBjbWFwkuicugAAElgAAAT4Z2x5Zpk0GVsAAB+cAAHcpGhlYWQ
- Why
- No further detail recorded for this rule.
- Fix
- —
MEDIUMObfuscation / stealthobf.base64_blob · engine/src/canvas-core/narrationDemoVoice.ts:10
"open": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- Why
- No further detail recorded for this rule.
- Fix
- —
MEDIUMObfuscation / stealthobf.base64_blob · engine/src/canvas-core/narrationDemoVoice.ts:11
"code": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- Why
- No further detail recorded for this rule.
- Fix
- —
MEDIUMObfuscation / stealthobf.base64_blob · engine/src/canvas-core/narrationDemoVoice.ts:12
"duck": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- Why
- No further detail recorded for this rule.
- Fix
- —
LOWInsecure cryptocrypto.weak_hash · engine/test/sampler.test.ts:173
const r = renderPiece(make(), SR), h = createHash("md5"); h.update(new Uint8Array(r.L.buffer)); h.update(new Uint8Array(r.R.buffer));- Why
- No further detail recorded for this rule.
- Fix
- —
LOWInsecure cryptocrypto.weak_hash · engine/tools/adapters/playwright.mjs:27
const useBakes = bakeCacheOn(bakeCache), bv = `${browser.version()}-${createHash("md5").update(found.executablePath ?? "playwright-default").digest("hex").slice(0, 8)}`; let loadedBakes = 0;- Why
- No further detail recorded for this rule.
- Fix
- —
LOWInsecure cryptocrypto.weak_hash · engine/tools/ensemble-check.mjs:19
const md5 = (L, R) => createHash("md5").update(Buffer.from(L.buffer, L.byteOffset, L.byteLength)).update(Buffer.from(R.buffer, R.byteOffset, R.byteLength)).digest("hex");- Why
- No further detail recorded for this rule.
- Fix
- —
LOWInsecure cryptocrypto.weak_hash · engine/tools/gate.mjs:167
const md5 = (b) => createHash("md5").update(b).digest("hex"), p1 = [], p2 = new Array(frames.length);- Why
- No further detail recorded for this rule.
- Fix
- —
LOWInsecure cryptocrypto.weak_hash · engine/tools/lesson.mjs:64
const md5 = (b64) => createHash("md5").update(Buffer.from(b64, "base64")).digest("hex");- Why
- No further detail recorded for this rule.
- Fix
- —
LOWFilesystem / pathfs.traversal · engine/assets/brand/lantern/brand.ts:3
import type { BrandElement } from "../../../src/canvas-core/brandKit";- Why
- No further detail recorded for this rule.
- Fix
- —
LOWFilesystem / pathfs.traversal · engine/src/canvas-core/character/human/balance.ts:12
import type { P } from "../../core";- Why
- No further detail recorded for this rule.
- Fix
- —
LOWFilesystem / pathfs.traversal · engine/src/canvas-core/character/human/figure.ts:4
import type { P } from "../../core";- Why
- No further detail recorded for this rule.
- Fix
- —
LOWFilesystem / pathfs.traversal · engine/src/canvas-core/character/human/head.ts:13
import type { P } from "../../core";- Why
- No further detail recorded for this rule.
- Fix
- —
LOWFilesystem / pathfs.traversal · engine/src/canvas-core/character/human/mannequin.ts:13
import type { P } from "../../core";- Why
- No further detail recorded for this rule.
- Fix
- —
LOWObfuscation / stealthobf.decode_call · engine/src/canvas-core/launchLook.ts:161
const bin = atob(file.data), u8 = new Uint8Array(bin.length); for (let i = 0; i < bin.length; i++) u8[i] = bin.charCodeAt(i);
- Why
- No further detail recorded for this rule.
- Fix
- —
LOWObfuscation / stealthobf.decode_call · engine/src/canvas-core/voice.ts:28
const s = atob(b64), n = s.length >> 1, out = new Float32Array(n);
- Why
- No further detail recorded for this rule.
- Fix
- —
LOWObfuscation / stealthobf.decode_call · engine/src/hosts/audio.ts:6
const bytes = atob(a.float32), data = new Uint8Array(bytes.length);
- Why
- No further detail recorded for this rule.
- Fix
- —
LOWObfuscation / stealthobf.decode_call · engine/src/hosts/page.ts:30
const load = async (entries: Record<string, string>) => { on = true; await Promise.all(Object.entries(entries).map(async ([k, b64]) => { try { const bin = atob(b64), u8 = new Uint8Array(bin.length); f- Why
- No further detail recorded for this rule.
- Fix
- —
LOWObfuscation / stealthobf.decode_call · engine/src/three-core/ttf.ts:41
const bin = atob(src.replace(/\s+/g, "")), u8 = new Uint8Array(bin.length);
- Why
- No further detail recorded for this rule.
- Fix
- —
Audit 0.4.1 · source sha 46cc64da6899 · 30 Oct 2026Report an issue or request a re-scan
Provenance
Who published it, and what the verdict is pinned to
- Publisheralexgreensh GitHub userOwner of the repository this skill is read from
- Source folderalexgreensh/anidoodle/skills/anidoodleThe exact folder we audited
- LicenceApache-2.0As the repository states it
- Commit pinned for this verdict46cc64da6899A new audit runs when the source changes
- Repository statusNot archivedPushed today
- Sandboxed runNot runSkills are read, not executed; layer L4 is skipped
What it tells the agent
Full source on GitHub ↗Its description: Code-drawn stills, films, 3D motion graphics, explainers and web animations in 32 styles, with scores, narration and subtitles. Use when asked for an illustration, animation, video or drawing lesson.
--- name: anidoodle description: Code-drawn stills, films, 3D motion graphics, explainers and web animations in 32 styles, with scores, narration and subtitles. Use when asked for an illustration, animation, video or drawing lesson. metadata: created_by: Alex Greenshpun (10x Company) license: Apache-2.0 --- # anidoodle Pictures, films and interactive pieces drawn entirely in code, in 2D or in 3D. One pure function paints every frame; another composes the score and plays it. The same source rebuilds the same pixels and the same sound on any machine, at any size, at any length. Eight acoustic instruments can play recordings of real ones from an optional download. ASK the user before any score work; never download unasked. The engine is the easy half. Work gets thrown away because it had no point, the subject was an icon of itself, a style was only a palette swap, the music had no form, or the person spent their patience approving fragments. This skill carries the craft that prevents each of those. ## Start by asking, then build Read `references/workflows/start-here.md` and run its intake: one question at a time, only what the request leaves open, your recommendation first. **What** are they making, in **which style** (show the gallery sheet, https://github.com/alexgreensh/anidoodle/blob/main/skills/anidoodle/assets/styles.jpg; the list is `references/styles/INDEX.md`) or in 3D (one medium per film), what **shape** (1x1, 9x16, 16x9, 4x5 or any W x H), how **long** (any length; never cap it), what **sound** (silent, a music style and mood, narration), which **characters**. "You pick" means pick and say why in one line. Write the answers into a short brief before drawing. ## What are you making? | Making | Read | |---|---| | A still: hero, spot, cover, card, poster, a series | Still workflow below, `references/formats.md` | | A picture that draws itself (timelapse, making-of) | `references/workflows/drawing-process.md` | | A loop, sticker, animated logo, ambient header | Loop workflow below, `references/formats.md` | | A story film, any length | Film workflow below, `references/workflows/long-film.md` | | A 3D film or 3D motion graphics: extruded type, objects, puppets, a camera through space | `references/workflows/three-d.md` | | An explainer or infographic; a machine that comes apart to explain an idea, in any style | `references/workflows/explainer.md`, `references/workflows/machines.md` | | A launch or product video, or 2D motion graphics (their screenshots welcome) | `references/workflows/launch-video.md`; one world, one camera: `references/workflows/motion-film.md`; the kit: `references/workflows/launch-video-kit.md`; claims: `references/workflows/facts.md` | | A film in someone else's brand: their exact elements, logos, fonts, sponsors, an event program | `references/workflows/brand-film.md` (imported and signed off before the first board) | | Art for a site (hero by a headline, tiles, spots, share card) on its page colour and brand; or a web animation that reacts to the UI | `references/workflows/site-art.md`; `references/workflows/interactive.md` | | A drawing lesson, or "how do I draw this?" | `references/workflows/teach-drawing.md` | | A character kept identical in any style (woodcut to toy brick) | `references/workflows/character-consistency.md`, `references/anatomy.md` | | A style matched from their image | `references/workflows/adapt-a-style.md` | | A score or soundtrack; or a generated or licensed track cut to the film | `references/music/README.md`; `references/music/generated-tracks.md` | | Narration, a voice-over, word timing or subtitles | `references/workflows/narration.md` | - Music: pick a style vocabulary (`references/music/styles/vocabularies.md`; deep dives `references/music/styles/music-box.md`, `references/music/styles/lofi-electronic.md`) and mood, sketch the tension arc and motif, compose your own harmony, motif and form (references/music/compose.md, craft in references/music/theory/), revise until node tools/music.mjs craft shows only findings you chose, then check must PASS before a human listens. Styles give sound, never notes. - Sound effects: references/music/sound-design.md. 14 layered, seeded effects cued by film frame (filmSfx); the score ducks, and every cue must be within 6 dB of it. Effects only on real direction changes, one riser + one impact per film. Under someone else's music, unpitched `tap` effects only. - Launch films: `launchTemplate.ts` renders a product's launch from data (prompts, plates or its own UI, a score composed for it, words, install lines) in every shape from one timeline; `launch.mjs new|ship`. Habits that save tokens: `references/working-method.md`. ## The seven laws 1. **Every piece has a point.** A still: one idea, one focal subject, one light. A film: one transformation, one payoff, one token that returns. → `references/storytelling.md` 2. **State the realism.** Name the anatomy, the view and the reference you opened, for animals, objects and people alike. → `references/realism-and-craft.md`, `references/anatomy.md` 3. **A style is a way of making marks.** Change the medium, the edge and the order of the marks, beyond the palette. → `references/styles.md` 4. **Prove the look on ONE still, then build end to end.** After that, gates cost more than they save. → `references/working-method.md` 5. **The contract is absolute.** Pure in `(frame, env)` (and the input log, for interactive pieces), `rng(seed)` only, no clock, no `ctx.filter`. Nothing generated, with one exception the person opts into: narration, in the voice they chose, each take cached by hash and baked into the film. Images they bring may be embedded by hash; the sound pack is a separate, hash-pinned download. → `references/determinism-and-contract.md`, `references/workflows/narration.md` 6. **Music gets a plan, never an adjective.** A style, a mood per section, the notes as data, then measurements. You cannot hear it, so one hu
Excerpt, first 6,000 characters of SKILL.md, verbatim from the audited commit. It is text from someone else’s repository, quoted so you can judge it before your agent reads it.
Install
Pinned to the audited commit 46cc64d
git clone https://github.com/alexgreensh/anidoodle git -C anidoodle checkout 46cc64da6899
The author documents no install command, so this uses the repository directly. Our verdict covers commit 46cc64da6899 only.
Works in which agents?
What its own text says, not a test
| Agent | Status | More |
|---|---|---|
| Cursor | Mentioned in its text, not tested | Skills for Cursor · About Cursor |
Audit history
Every audit, every source change
- ✕BLOCK D 65 / 100
first audit · source
46cc64da6899
README badge
For maintainers · shows the latest audit
[](https://modelsatlas.com/skills/alexgreensh/anidoodle/)
The badge shows our verdict and grade for this skill, and links back to this page. It changes when the audit does.
Similar skills
athevon/genjutsu
Three.js and React Three Fiber sub-skill - 3D scenes, shaders, postprocessing.
athevon/genjutsu
UI/UX design-system intelligence - 84 styles, 192 palettes, 74 font pairings, 25 charts, 99 UX guidelines across 22 stacks (searchable dataset + CLI). Internal genjutsu module: loaded by /genjutsu:cast and…
athevon/genjutsu
Advanced SwiftUI visuals - Metal shaders (.colorEffect, .layerEffect, .distortionEffect), .visualEffect, Liquid Glass (iOS 26), Canvas, holographic and CRT effects.
athevon/genjutsu
SwiftUI animation foundations - withAnimation, transitions, matchedGeometryEffect, PhaseAnimator, KeyframeAnimator, springs, gestures.
athevon/genjutsu
Motion design foundation - timing, easing, enter/exit patterns, accessibility, performance.
athevon/genjutsu
Paint a complete visual universe with genjutsu - art direction brainstorm, design system, implementation, audit. Anti-AI-slop design pipeline. Adapts to Web, Android (Compose), Apple (SwiftUI).
Add this badge to your README
[](https://modelsatlas.com/skills/alexgreensh/anidoodle/)
<a href="https://modelsatlas.com/skills/alexgreensh/anidoodle/"><img src="https://modelsatlas.com/skills/alexgreensh/anidoodle/badge.svg" alt="ModelsAtlas: BLOCK D"></a>
Questions about anidoodle
What does the anidoodle skill do?
Is anidoodle safe to install?
What can anidoodle access on my machine?
Which assistants does anidoodle work with?
How current is this page?
Sources
- github.com/alexgreensh/anidoodle/tree/main/skills/anidoodle — the audited source at commit 46cc64da6899 and every finding aboveObserved · 30 Oct 2026
Spotted something wrong? Report a correction · Methodology
Keep going in your AI
Opens with this page as the source. We add nothing else to the prompt.
- What does the anidoodle skill do?
- Is anidoodle safe to install?
- What can anidoodle access on my machine?