Inko Handwriting logo

Inko Handwriting

Community
pretend1111
inko-handwriting

Generate standard flat handwritten PNG pages and PDFs from text, notes, letters, essays and math solutions via Inko (inkotype.com), with free Lyric / Logic handwriting inference. Choose paper, handwriting and pen; edit layout and ink locally. Use for 手写、手写作业、 手写笔记、手写信、二维手写图片、handwritten pages or handwritten PDF. Input images may be read for their content; output is always a flat page, without camera effects or compositing into real-world scenes.

Overview

Publisherpretend1111
Repositoryinko-skill
Skill nameinko-handwriting
Stars
121
Forks
10
Bundled files
25
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • 25 bundled files

    Scripts, templates, and references the model can read while it works. Files are read-only and never executed.

  • Open source

    Published by pretend1111 on GitHub. Read the source before you install it.

Installation

Install the Inko Handwriting AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/pretend1111/inko-skill/tree/main/inko-handwriting
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/pretend1111/inko-skill.git /tmp/inko-skill
mkdir -p .claude/skills
cp -r /tmp/inko-skill/inko-handwriting .claude/skills/inko-handwriting
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Inko Handwriting in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Inko Handwriting on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Inko Handwriting is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

Inko handwriting

Inko writes text the way a person does — real pen strokes, not a font — and returns A4 pages (PNG + PDF, 300 dpi). This skill makes you the expert operator: you prepare the content, pick paper / size / handwriting / pen with the user, generate for their request for free, and deliver standard flat page images or PDFs. Preserve the natural handwriting, not a simulated camera: no perspective, desk scenes, shadows, page curl, scanner effects or photo compositing.

Current pricing — skill 1.6.0 (2026-10-08)

Lyric 1 and Logic 1 handwriting inference is free on both the website and this API / Skill. No per-character fee, minimum charge, membership or recharge is required; an authenticated account with zero balance can generate. The website's DeepSeek assistant is billed separately for actual API token usage. This handwriting CLI does not call DeepSeek; the external AI agent's own model fees belong to its provider, not Inko handwriting inference. Each user also gets one free custom-handwriting seat; never suggest purchasing an extra seat.

All scripts are in scripts/ next to this file (call them with the path you installed to, e.g. python .claude/skills/inko-handwriting/scripts/inko.py …). They print JSON on stdout — read it, don't guess.

What the models can write changes as they learn: this skill never lists it. Get it live — inko.py charset (plain text: Greek, pinyin tones, superscripts, ½, ⑪, 「」 … per model, and what custom handwritings can't write) and inko.py models --symbols (LaTeX commands inside $…$) — and let the free quote have the last word. For Logic math, read references/writing-math.md §5 before preparing formulas. When either command reports skill_update, tell the user once that a newer version of this skill is available (git pull the inko-skill clone, then python install.py).

What changed in skill 1.5.0 (2026-10-06): the lists of writable characters and LaTeX commands moved out of these files into the live inko.py charset / models --symbols, so the skill stays right as the models learn (Greek letters, pinyin tones, superscripts, ½, ⑪, 「」 … were added on 2026-10-06).

What changed on 2026-10-04 (skill 1.4.0): both models were retrained on English handwriting (word spacing, capitals, baseline); the layout engine breaks a formula wider than a whole line at =, ≤, + … instead of shrinking it; generated formulas keep the same size as the text around them; Logic can have its own 常用字迹; removing the visible label needs only the signed agreement (no seat).

First time in a session

bash
python scripts/inko.py doctor          # Python deps, API reachable, key valid, balance, the user's 常用字迹 / favourites
  • No key: ask the user to create one at https://inkotype.com (账户 → API key), ideally a separate key for you with a daily spending limit. Save it with python scripts/inko.py auth (reads the key from stdin; --project stores it in ./.inko/key instead of the user config dir). Never repeat the key back, never write it into project files or commits.
  • Missing Pillow/numpy: python -m pip install -r scripts/requirements.txt.
  • inko.py keeps a small git-ignored ./.inko/ folder in the working directory: jobs.jsonl (job log), plans/ (what each job was made from), optionally key. Results go to ./inko-output/<time>-<id>/. You may keep the user's other choices in ./.inko/prefs.json yourself (write it with your file tool, e.g. {"pen": "gel|blue", "paper": "ruled8"}): read it at the start of later sessions and reuse them — no script reads it for you. Their preferred handwriting lives on their Inko account instead (常用字迹, below), so every agent and the website share it.

Rules that matter (and why)

  1. Free inference: validate first, then generate for the user's request. inko.py generate without --yes only checks the content and settings. Quotes remain useful for character support, page count, fit and handwriting; the price should be 0. Once the user has requested generation and essential settings are resolved, run with --yes without asking for payment confirmation or a top-up. --max-cents defaults to 0: an unexpected positive quote is blocked, not silently hidden. Check the API base / service pricing and report the discrepancy instead of assuming inference is paid. Free does not mean unlimited: respect authentication, rate limits and queue capacity.
  2. Keep the AI labels. Every page carries a visible label 「AI生成 · Inko」 and hidden AIGC metadata, required by Chinese law (GB 45438-2025) and Inko's terms. Never crop, cover, blur, recolour or paint over the label, never strip metadata, never re-save through tools that drop it. The scripts here re-apply the label (≥ 5 % of the shortest side, readable contrast) and copy the metadata on every output — use them rather than ad-hoc image code. If the user asks to remove the label, explain it's a legal requirement. Only accounts whose owner signed the AI-labelling agreement (《AI 生成内容标识协议》) on the website can request label-free pages themselves (--label none, see account.can_remove_label; anyone else gets 403 label_required; no seat or purchase is involved), and they still have to disclose AI generation when sharing. Don't bring up label removal unless the user asks.
  3. No forgeries. Inko refuses IOUs, receipts, contracts, certificates, leave notes, signatures and similar documents (content_blocked, not charged). Don't try to work around it (splitting text, renaming things, compositing a signature). Don't imitate a specific real person's handwriting without their consent.
  4. Look before you hand over. Open the PNG / final image yourself (you can view images; zoom into a few lines) and check it: all text present, nothing overlapping, no odd wide gaps (around formulas especially), writing sitting on the ruled lines (not crossing them), left edges not ruler-straight (drifted — see post-processing), label intact, and the usual weak spots — punctuation right after a formula, digits in dates, units. Layout / spacing / pen problems are fixed locally from scene.zip without regenerating (post-processing); only wrong characters need a rewrite. inko.py rewrite JOB --yes re-writes the whole job once for free with a new seed: other characters change too, so compare both versions and keep the better one; a rewrite can't be rewritten. If a character that matters is still wrong after that, rephrase the text around it (a digit in a heading → Chinese numeral, drop a comma right after a formula) and generate again — still free, but at most once or twice rather than retrying endlessly; otherwise deliver the best version and say which character is off. inko.pdf is made of the same pages as the PNGs — check the PNGs, and copy the PDF to a meaningful name when delivering.
  5. Content quality is your job. Inko writes exactly what you give it. Typos, a wrong answer or a clumsy line break will be faithfully hand-written — proofread the text first.
  6. Do what was asked, exactly. "Copy this" means every character, line break, capital and punctuation mark kept — no summarising, tidying or "fixing" the source. "Only the final answers" means only the results: no question text, no working, no checks, no 解 / 答 prefixes. A complete document is delivered as one document that may run over several pages, never shortened or split into repeated copies. If a question is unreadable or a condition is missing, ask — don't guess an answer.

Workflow

  1. Understand the goal: what content, for what (homework to hand in, notes, a letter, a mock-up…), on what paper, and the final form (flat PNG pages, PDF, or both). Images supplied as questions are input material only.
  2. Prepare the content (the part users value most — see the scenario guides below). For math, solve it and write the solution the way a student writes it, not the way a textbook typesets it: each formula on the same line as its lead-in (所以 $x=4$, 移项得 $2x=8$), never $$…$$ (a centred line of its own — textbook look), no full stops (。..) anywhere in a solution, commas at most. Long = chains simply run on: with logic-1 inko.py cuts them into pieces that continue on the next line (formula_splits; --keep-formulas turns it off), and the layout engine breaks anything still wider than a line at = / ≤ / + — never break a chain into lines yourself. Prose keeps its 。. Check every character against what the models can write (references/writing-text.md, "What can be written") before the quote does it for you.
  3. Choose model, handwriting, size, paper, pen. Defaults are fine for anything the user doesn't care about.
  4. Confirm in one message — see "Ask the user" below. Don't interrogate; ask only what changes the result.
  5. Free checks: inko.py quote (plain) or inko.py layout --preview (custom layout) → fix any unsupported characters/symbols (the output says where) and any math_style warnings ($$, full stops, a lead-in cut off from its formula), show the preview if placement matters.
  6. Generate (inko.py generate … --yes) → pages land in ./inko-output/<time>-<id>/ with job.json (and plan.json for layout jobs).
  7. Post-process only as needed (table below). Keep the generated page flat; optional line-position adjustment uses drift (scene.py drift when the job came with scene.zip, else compose.py drift) → look at the result → deliver file paths, cost, and what the user can tweak next ("bluer ink? bolder strokes? a different handwriting? move something yourself in the editor?").

For image/PDF homework, also follow the completeness checklist in references/scenarios.md. Automatic preparation means reusing the user's defaults, not repeatedly asking style questions; it does not create permission for unrelated paid services. A website adapter's provided tools and layout rules take precedence over CLI-only instructions.

Pick the model

ContentModelNotes
Chinese / English prose, letters, essays, notes without formulaslyric-1Hundreds of preset handwritings (+ the user's own custom handwriting). No $…$.
Anything with math: $…$ formulas, Chinese mixed inlogic-1Each account gets 8 curated handwritings. Only the symbols in references/writing-math.md §5 — unknown LaTeX commands are refused.

Formulas decide it: one $x^2$ means logic-1. Chemistry like H₂O can be plain text in either model (whether the subscript ₂ is written as-is or as H2O: see inko.py charset). Answers that are only numbers ("只写最终答案": x=4, -3, 40) need no formulas and can stay with lyric-1. Without --model, inko.py picks this way automatically and says so in its output.

Never ask the user to choose a model or to resolve a handwriting/model clash. When the job needs logic-1 but the handwriting they picked (or their 常用字迹) is Lyric-only — every custom handwriting and most presets are — use their Logic 常用字迹 (default-style shows default_styles["logic-1"]), else one of their Logic favourites, else leave out --style (Inko uses the account's Logic default), and say so in one line: 「含公式,公式部分用 Logic 1 的字迹写」. Only a handwriting they explicitly named for this job and that can't do Logic is worth a sentence before going on.

Choose the handwriting — the user's own choices come first. Go down this list and stop at the first that applies:

  1. They name one for this job (No.205, 「用我自己的字」, 「这次写工整点」) → --style, or filter by that description.
  2. Their 常用字迹 (default handwriting, saved on their account): leave out --style and Inko uses it. There can be two: a general one and, optionally, Logic's own (one of the account's 8) — inko.py default-style lists what each model really uses (default_styles). The quote says which handwriting will be used (style.source: default = their 常用字迹; system = Inko's fallback). When no 常用字迹 can do this job's model — custom handwritings are Lyric-only, Logic only has the account's 8 — the quote's style_note says so; then continue with 3.
  3. Their favourites (收藏): inko.py styles --favorites --model <the job's model> — pick the one that fits the job (neat for homework to hand in, relaxed for notes), or offer two or three.
  4. Nothing saved: filter by what the job needs (references/styles.md). Never settle for the fallback: Lyric's is No.001, one of the most casual, joined-up hands.

When the user says 「以后都用这个」, save it for them: inko.py default-style CODE (add --model logic-1 for a Logic handwriting meant only for math; it changes their account, the website included — only on request).

Plain pages or a custom layout?

  • Plain (--text/--file, --paper white|cream|grid, --size small|medium|large): paragraphs flow on A4. Fast, good for essays and "just write this". Every line of your text is a paragraph and gets a 2-character first-line indent (no switch) — for lists, notes and solutions use a layout with "indent": 0. Squared (5 mm grid) paper exists only here.
  • Layout (--layout layout.json): exact size in mm, line spacing, margins, ruled / 作文纸 / 田字格 / letter paper, titles centred and bigger, no indent, text boxes anywhere (answers, name, date), writing along a curve, per-character pen or handwriting. Use when exact page placement matters. Read references/layout.md; templates are in assets/layouts/; inko.py accepts shorthands so you never count character positions. Check with inko.py layout --spec layout.json --preview preview.png (free, local preview). For squared paper, use plain --paper grid; custom layouts currently use the built-in flat paper types.

Ask the user (only what's missing)

Put the open questions in one message, with your suggested default for each, in the user's language. Never ask in pieces over several turns, never re-ask what they already told you (in this request, earlier, or in ./.inko/prefs.json), and never treat your recommendation as their answer. Typical:

  • Detail level (math/homework): 详细(每步都写,适合交作业/给人讲懂)/ 适中(关键步骤)/ 简洁(像草稿,跳步)
  • Handwriting: if they have a usable 常用字迹, just say you'll use it (no question needed). Otherwise offer 2–4 candidates as a contact sheet — favourites first (inko.py styles --favorites / inko.py styles … + inko.py previews CODES) — or ask "工整 / 自然 / 潦草,偏圆还是偏方?"; their own custom handwriting if they have one (lyric-1).
  • Paper & size: white / cream / grid / ruled 8 mm / 7 mm / 作文纸 / 田字格 / letter; character size (small ≈ 6 mm, medium ≈ 7 mm, large ≈ 8.5 mm tall). This is the one question worth asking for a first job when the user gave only the content: recommend 「A4 竖版白纸」 first. "A4" alone is already an answer (portrait, white, no lines); an uploaded page to write on is one too.
  • Pen: original / gel 中性笔 / ballpoint 圆珠笔 / fountain 钢笔 / pencil 铅笔; black / blue / blue-black; thinner–bolder.
  • Output: standard flat PNG pages / PDF / both.
  • Characters the models can't write (the live list: inko.py charset; the quote flags each one): ask once whether to use the writable equivalent the list suggests, with your recommendation first and one or two real examples from their text. If they already said how, or told you not to ask about such things, just apply the recommended form and mention it.
  • Cost: state that handwriting inference is free; do not ask for payment confirmation for a zero quote.

If the user said "you decide" / 「随便」 / 「默认」 / 「不要问」 or the request is clear, decide, state your choices in one line, and proceed after validation. Don't stop for payment confirmation or optional layout preferences (margins, line spacing, alignment).

Post-processing (all local, instant, free)

NeedCommand
Fix spacing / position / size / pen of glyphs or lines, natural left edges — without regenerating (job has scene.zip, the default)scene.py inspect RUN/scene.zip → tighten / drift / move / pen … → scene.py render RUN/scene.zip -o final --pdf; let the user drag things themselves: scene.py editor RUN/scene.zip (a Chinese page in their browser). See references/scene.md
Natural left edges when there is no scene.zipcompose.py drift --job RUN -o drifted before ink.py; not on 作文纸 / 田字格
Everything is saved locally and the user wants Inko's copies gone early (otherwise kept 30 days)inko.py delivered JOB — only after every file they want, scene.zip included, is saved
Other ink colour, pen texture, bolder/thinner, lighter/darkerink.py restyle page.png -o out.png --color blue --texture ballpoint --weight 0.4
Transparent handwriting layer (for design tools)ink.py extract page.png -o ink.png
PDF of edited flat-page imagespdf.py a.png b.jpg -o out.pdf --size A4

Prefer the API's own pen options (--pen-type/--pen-color/--pen-weight/--pen-ink) when generating — they are applied at full quality; use ink.py for colours the API doesn't have (red, green, purple, #hex), textures like marker, or quick "what if" variants without regenerating. All edits stay on the flat page. paper.py make can draw a separate standard paper background; it does not paste handwriting into a photo. Details: references/postprocess.md.

Scenario guides

Read the relevant guide for content and flat-page layout decisions.

  • references/scenarios.md — math answers, notes, letters, essays and copying practice as flat pages or PDF.
  • references/writing-math.md — how students actually write solutions (解/由…得/所以/答), detail levels, the Logic symbol table, substitutions for unsupported symbols, LaTeX pitfalls.
  • references/writing-text.md — paragraphs, punctuation, letters, essays, English text, line breaks that look natural.
  • references/styles.md — choosing a handwriting from descriptions ("工整好看", "像男生写的", "潦草"), facets, previews.
  • references/layout.md — the layout JSON (papers, d, boxes, marks, pens), recipes, reading the plan.
  • references/postprocess.md — ink / PDF / optional flat-page drift options with examples.
  • references/scene.md — the editable glyph package (scene.zip): inspect, tighten gaps, drift, move, restyle, the browser editor for the user, rendering with the label.
  • references/api.md — endpoints, parameters, limits, billing, job states, files and expiry.
  • references/troubleshooting.md — every error code and what to do; common script problems.

Writing JSON and LaTeX safely

LaTeX backslashes die in shells and JSON (\frac → form-feed + rac, \neq → newline + eq). Write text and layout files with your file-writing tool (not echo/heredoc), double every backslash inside JSON strings ("\\frac{a}{b}"), and pass them with --file / --layout. inko.py refuses input that shows swallowed backslashes and says why.

Bundled files

The model reads these on demand while the skill is loaded. They are exposed as readable files and are never executed.

Frequently asked questions

What does the Inko Handwriting AI skill do?

Generate standard flat handwritten PNG pages and PDFs from text, notes, letters, essays and math solutions via Inko (inkotype.com), with free Lyric / Logic handwriting inference. Choose paper, handwriting and pen; edit layout and ink locally. Use for 手写、手写作业、 手写笔记、手写信、二维手写图片、handwritten pages or handwritten PDF. Input images may be read for their content; output is always a flat page, without camera effects or compositing into real-world scenes.

Why use Inko Handwriting on TypingMind?

Because you install it once and use it with any model. Inko Handwriting is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Inko Handwriting in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/pretend1111/inko-skill/tree/main/inko-handwriting. TypingMind reads its SKILL.md and bundles its files and installs it as a skill you can enable per chat.

Which AI models can use Inko Handwriting?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Inko Handwriting?

As many as you like. As long as a model supports skills, you can use Inko Handwriting with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Inko Handwriting AI skill free?

Yes. It is published on GitHub by pretend1111 under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇