Skip to content

Commit 83dbd92

Browse files
Merge pull request #11 from a-baran-orhan/claude/project-core-features-ob0d4l
Rename the project from Movit to Posecode
2 parents c6960fe + 834736c commit 83dbd92

153 files changed

Lines changed: 948 additions & 990 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@ coverage/
55
.DS_Store
66
.vite/
77
.vercel
8+
.claude/worktrees/

LICENSE

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
MIT License
22

3-
Copyright (c) 2026 Movit
3+
Copyright (c) 2026 Posecode
44

55
Permission is hereby granted, free of charge, to any person obtaining a copy
66
of this software and associated documentation files (the "Software"), to deal

README.md

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
<h1 align="center">◆ Movit</h1>
1+
<h1 align="center">◆ Posecode</h1>
22

33
<p align="center"><b>Kinematic motion as text.</b> Mermaid gave LLMs a way to draw diagrams.<br/>
4-
Movit gives them a way to <i>show movement</i> — exercises, physiotherapy, posture —<br/>
4+
Posecode gives them a way to <i>show movement</i> — exercises, physiotherapy, posture —<br/>
55
as a tiny human-readable language that renders to an animated 3D figure in the browser.</p>
66

77
---
@@ -14,16 +14,16 @@ descent") — it just has no syntax to express it that a renderer can read.
1414
Diffusion-based text-to-motion models exist, but they're heavy, expensive, and
1515
give you no fine control over the anatomical phases.
1616

17-
Movit takes the opposite, lightweight approach (see [the research](#background)):
17+
Posecode takes the opposite, lightweight approach (see [the research](#background)):
1818

19-
- The LLM writes a small **`.movit`** document — semantic phases, not 3D matrices.
19+
- The LLM writes a small **`.posecode`** document — semantic phases, not 3D matrices.
2020
- A **client-side** parser + Three.js renderer animates it. Generation is a
2121
fraction of a cent of text; rendering runs at 60fps on a phone.
2222
- Every angle is **hard-clamped to a healthy range of motion**, so a model
2323
hallucinating "knee flex 200°" can't produce an anatomically impossible joint.
2424

25-
```movit
26-
movit exercise "Body-weight squat"
25+
```posecode
26+
posecode exercise "Body-weight squat"
2727
rig humanoid
2828
pose start = standing
2929
@@ -54,22 +54,22 @@ npm test # parser + renderer test suites
5454

5555
In the playground: pick an example, watch it animate, edit the text live, and
5656
hit **Copy LLM prompt** to get a system prompt that teaches ChatGPT/Claude to
57-
write Movit for you.
57+
write Posecode for you.
5858

5959
## Packages
6060

6161
| Package | What it does |
6262
| --- | --- |
63-
| [`movit-parser`](packages/movit-parser) | `.movit` text → validated, ROM-clamped IR. Pure TypeScript, framework-agnostic. |
64-
| [`movit-render`](packages/movit-render) | IR → animated low-poly mannequin (Three.js), forward kinematics + ground-lock CCD IK. |
65-
| [`movit-share`](packages/movit-share) | Encode a `.movit` doc to a URL-safe token so a movement travels as a link. Pure, dependency-free. |
66-
| [`movit-mcp`](packages/movit-mcp) | MCP server: lets an LLM agent author, ROM-validate, and get a render link for a movement — natively. |
63+
| [`posecode-parser`](packages/posecode-parser) | `.posecode` text → validated, ROM-clamped IR. Pure TypeScript, framework-agnostic. |
64+
| [`posecode-render`](packages/posecode-render) | IR → animated low-poly mannequin (Three.js), forward kinematics + ground-lock CCD IK. |
65+
| [`posecode-share`](packages/posecode-share) | Encode a `.posecode` doc to a URL-safe token so a movement travels as a link. Pure, dependency-free. |
66+
| [`posecode-mcp`](packages/posecode-mcp) | MCP server: lets an LLM agent author, ROM-validate, and get a render link for a movement — natively. |
6767
| [`playground`](playground) | Live editor + 3D viewport + warnings + the LLM prompt + shareable links. |
6868

6969
The protocol and both libraries are **MIT-licensed** — the open core. See
7070
[`spec/SPEC.md`](spec/SPEC.md) for the full language and
7171
[`spec/llm-authoring.md`](spec/llm-authoring.md) for the authoring prompt.
72-
For where Movit spreads fastest and the per-domain go-to-market plan, see
72+
For where Posecode spreads fastest and the per-domain go-to-market plan, see
7373
[`docs/market-research.md`](docs/market-research.md); for the engine roadmap,
7474
[`ROADMAP.md`](ROADMAP.md).
7575

@@ -93,6 +93,6 @@ specifies ROM-based safety constraints from clinical normative data, and lays
9393
out the open-core commercialization path. The spec cross-references its
9494
sections (§4 DSL, §5 biomechanics, §6 client rendering, §7 strategy).
9595

96-
> ⚠️ Movit's range-of-motion values are general literature data, not medical
96+
> ⚠️ Posecode's range-of-motion values are general literature data, not medical
9797
> advice. Consult a qualified professional for physiotherapy or exercise
9898
> prescription.

ROADMAP.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
# Movit — domains & roadmap
1+
# Posecode — domains & roadmap
22

3-
Movit's vision is broad: **describe any single-person movement as text and render it
3+
Posecode's vision is broad: **describe any single-person movement as text and render it
44
safely in 3D.** The *protocol* is general; the *current renderer* is deliberately
55
scoped (one figure, forward kinematics, ground-locked hands/feet, no props). This
6-
doc maps the domains Movit can serve, what already works, and what each remaining
6+
doc maps the domains Posecode can serve, what already works, and what each remaining
77
domain needs — so contributions land where they unlock the most.
88

9-
## Where Movit fits
9+
## Where Posecode fits
1010

1111
| Domain | Example uses | Status |
1212
| --- | --- | --- |
@@ -89,6 +89,6 @@ Each prop is a small scene object + an anchor type; movements then reference it
8989
9090
---
9191

92-
See [`docs/market-research.md`](docs/market-research.md) for where Movit spreads
92+
See [`docs/market-research.md`](docs/market-research.md) for where Posecode spreads
9393
fastest, the per-domain go-to-market briefs, and which engine unlock opens which
9494
locked domain.

docs/coverage-gap.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
# Movement coverage — gap analysis
22

3-
> Benchmarks Movit's curated library against a standard fitness taxonomy
3+
> Benchmarks Posecode's curated library against a standard fitness taxonomy
44
> (body-part × equipment × target muscle), the structure popularised by public
55
> exercise datasets. **We use those datasets only as a yardstick for *coverage and
66
> taxonomy* — never their copyrighted media, instructions, or records.** Every
7-
> Movit movement is authored from scratch and ROM-validated.
7+
> Posecode movement is authored from scratch and ROM-validated.
88
99
The point of this doc: find the holes in our library that the **current engine can
1010
already render**, so we author exactly the right movements next.
@@ -20,7 +20,7 @@ barbell / cable / machine / band work (needs load + grip-to-implement), and
2020
anything needing a second person. In a typical exercise dataset these are the
2121
majority; the **body-weight subset (~25%)** is our addressable universe.
2222

23-
## Movit library today, by body part (51 movements)
23+
## Posecode library today, by body part (51 movements)
2424

2525
| Body part | Have | Count | Verdict |
2626
| --- | --- | --- | --- |
@@ -74,7 +74,7 @@ follow-on to the pin work.
7474
## Metadata gap (drives the catalogue work)
7575

7676
A real exercise record carries `body-part, equipment, primary target, secondary
77-
muscles, difficulty`. Movit presets carried only `id, label, domain`. We now add
77+
muscles, difficulty`. Posecode presets carried only `id, label, domain`. We now add
7878
`bodyPart / target / equipment / difficulty` to every preset and a **filterable
7979
gallery**, so the library is searchable like a proper exercise explorer — see
8080
`playground/src/presets.ts` and the filter row in the playground.

docs/market-research.md

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,33 @@
1-
# Movit — market research & go-to-market
1+
# Posecode — market research & go-to-market
22

3-
> Where Movit spreads fastest, who pulls hardest, and which engine unlock opens
3+
> Where Posecode spreads fastest, who pulls hardest, and which engine unlock opens
44
> which locked domain. Companion to [`../ROADMAP.md`](../ROADMAP.md) (engine
55
> capabilities) and [`../spec/llm-authoring.md`](../spec/llm-authoring.md)
66
> (how an LLM authors a movement).
77
88
## 1. The thesis
99

10-
Movit is **"Mermaid for human movement."** A person describes a movement in
11-
words; an LLM writes a short `.movit` document; the browser parses it, clamps it
10+
Posecode is **"Mermaid for human movement."** A person describes a movement in
11+
words; an LLM writes a short `.posecode` document; the browser parses it, clamps it
1212
to a safe range of motion, and renders an animated 3D mannequin — producing a
1313
**shareable URL**. The loop is:
1414

1515
> **ask an LLM for a movement → it renders → share the link.**
1616
17-
This is structurally different from video. A `.movit` doc is **editable text**:
17+
This is structurally different from video. A `.posecode` doc is **editable text**:
1818
an LLM can generate it, a human can tweak one angle, a clinician can fork it, and
1919
it diffs in version control. Diffusion/video models hallucinate anatomy and can't
20-
be safely constrained; Movit's ROM clamp is a *correctness* feature, not a filter.
20+
be safely constrained; Posecode's ROM clamp is a *correctness* feature, not a filter.
2121
Text is also how LLMs natively "think" about structure — so authoring is reliable
2222
and improves as models improve.
2323

2424
### Why it can spread
2525

2626
- **LLM-native.** The unit of creation is a code block any chat model emits. No
2727
studio, no mocap, no rigging.
28-
- **Shareable by construction.** Every movement is a URL ([`movit-share`](../packages/movit-share)).
28+
- **Shareable by construction.** Every movement is a URL ([`posecode-share`](../packages/posecode-share)).
2929
A link is the most viral object on the internet.
30-
- **Agent-native.** The [`movit-mcp`](../packages/movit-mcp) server lets Claude/
30+
- **Agent-native.** The [`posecode-mcp`](../packages/posecode-mcp) server lets Claude/
3131
ChatGPT author, validate, and return a render link *inside the chat* — the
3232
movement appears where the user already is.
3333
- **Safe to trust.** Clinical ROM limits mean shared links can't depict unsafe
@@ -57,7 +57,7 @@ on the roadmap.
5757
- **Aha use case:** "What is shoulder abduction?" → an isolated joint sweeps
5858
through its plane, labeled. The answer is a *moving figure*, not a static
5959
diagram.
60-
- **Viral loop:** an LLM answering an anatomy question embeds a Movit link;
60+
- **Viral loop:** an LLM answering an anatomy question embeds a Posecode link;
6161
teachers paste links into slides/LMS; students re-prompt for the next joint.
6262
- **Ships:** `shoulder-abduction-demo`, `hip-flexion-demo`, `knee-flexion-demo`,
6363
`spine-rotation-demo`, `elbow-flexion-pronation`.
@@ -116,15 +116,15 @@ expressive, and social — exactly the content people share.
116116
- **Engine-fit:** ★★★☆☆ today (turnout, plié, relevé, port de bras all render);
117117
precise foot placement, traveling steps, and partner work are future.
118118
- **Long game:** a **shareable, LLM-authorable choreography notation** — Labanotation
119-
was never going to be typed into a chat box; a `.movit` phrase is. If Movit
119+
was never going to be typed into a chat box; a `.posecode` phrase is. If Posecode
120120
becomes the way people sketch and pass around movement, dance is the wedge.
121121

122122
## 4. Spread mechanics
123123

124-
- **MCP inside the assistant.** [`movit-mcp`](../packages/movit-mcp) puts authoring +
124+
- **MCP inside the assistant.** [`posecode-mcp`](../packages/posecode-mcp) puts authoring +
125125
a render link directly in Claude/ChatGPT — distribution rides on assistants we
126126
don't have to build an audience for.
127-
- **Links as the unit.** [`movit-share`](../packages/movit-share) makes every
127+
- **Links as the unit.** [`posecode-share`](../packages/posecode-share) makes every
128128
movement a URL; links are forwarded, bookmarked, and embedded.
129129
- **Gallery grouped by domain.** The playground presets carry a `domain` and the
130130
gallery auto-groups them (Education, Physiotherapy, Desk & posture, Martial
@@ -134,7 +134,7 @@ expressive, and social — exactly the content people share.
134134
ask LLMs daily; each answer can carry a link.
135135
- **Workplace cadence.** "Every hour" stretch prompts create recurring,
136136
habit-driven link generation.
137-
- **Embeds.** A link that renders in an iframe drops Movit into LMSs, clinic
137+
- **Embeds.** A link that renders in an iframe drops Posecode into LMSs, clinic
138138
portals, and blog posts.
139139

140140
## 5. Which engine unlock opens which domain
@@ -156,6 +156,6 @@ a hand rig now shipped, the roadmap's 🟡 domains (functional/elderly care, flo
156156
yoga, loaded strength, gesture) are reachable today; the remaining frontier is
157157
deeper props (load, bands, rings), ROM-constrained reach, and two-person work.
158158

159-
> ⚠️ Movit's range-of-motion values are general literature data, not medical
159+
> ⚠️ Posecode's range-of-motion values are general literature data, not medical
160160
> advice. Consult a qualified professional for physiotherapy or exercise
161161
> prescription.

editors/vscode/README.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,27 @@
1-
# Movit for VS Code
1+
# Posecode for VS Code
22

3-
Language support for the **Movit** (`.movit`) kinematic motion DSL:
3+
Language support for the **Posecode** (`.posecode`) kinematic motion DSL:
44

55
- **Syntax highlighting** (TextMate grammar) — keywords, kinds, joints, actions, easings, strings, numbers.
66
- **Diagnostics** — parse errors and **range-of-motion safety clamps** as you type (e.g. `knees: flex 200° → clamped to 144°`).
7-
- **Completion** — context-aware: kinds after `movit`, joints at line start, actions after `<joint>:`, easings in a `step` header, poses after `pose start =`, effectors after `ground-lock:`.
7+
- **Completion** — context-aware: kinds after `posecode`, joints at line start, actions after `<joint>:`, easings in a `step` header, poses after `pose start =`, effectors after `ground-lock:`.
88
- **Hover** — the safe ROM range for a joint + action, and short docs for keywords.
99

10-
The smart features are provided by [`movit-lsp`](../../packages/movit-lsp), which shares its language logic ([`movit-language`](../../packages/movit-language)) with the web playground — so the editor and the playground always agree.
10+
The smart features are provided by [`posecode-lsp`](../../packages/posecode-lsp), which shares its language logic ([`posecode-language`](../../packages/posecode-language)) with the web playground — so the editor and the playground always agree.
1111

1212
## Develop / run locally
1313

1414
From the repo root:
1515

1616
```bash
1717
npm install
18-
npm run build -w movit-vscode # compiles the client + bundles the LSP to dist/server.cjs
18+
npm run build -w posecode-vscode # compiles the client + bundles the LSP to dist/server.cjs
1919
```
2020

21-
Then open this folder in VS Code and press **F5** ("Run Extension") to launch an Extension Development Host, and open any `.movit` file.
21+
Then open this folder in VS Code and press **F5** ("Run Extension") to launch an Extension Development Host, and open any `.posecode` file.
2222

2323
## Package
2424

2525
```bash
26-
npx @vscode/vsce package # produces movit-vscode-0.1.0.vsix
26+
npx @vscode/vsce package # produces posecode-vscode-0.1.0.vsix
2727
```

editors/vscode/package.json

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,36 @@
11
{
2-
"name": "movit-vscode",
2+
"name": "posecode-vscode",
33
"private": true,
4-
"displayName": "Movit",
5-
"description": "Language support for the Movit (.movit) kinematic motion DSL — syntax highlighting, range-of-motion diagnostics, completion, and hover.",
4+
"displayName": "Posecode",
5+
"description": "Language support for the Posecode (.posecode) kinematic motion DSL — syntax highlighting, range-of-motion diagnostics, completion, and hover.",
66
"version": "0.1.0",
77
"license": "MIT",
88
"engines": {
99
"vscode": "^1.85.0"
1010
},
1111
"categories": ["Programming Languages"],
12-
"activationEvents": ["onLanguage:movit"],
12+
"activationEvents": ["onLanguage:posecode"],
1313
"main": "./dist/extension.js",
1414
"contributes": {
1515
"languages": [
1616
{
17-
"id": "movit",
18-
"aliases": ["Movit", "movit"],
19-
"extensions": [".movit"],
17+
"id": "posecode",
18+
"aliases": ["Posecode", "posecode"],
19+
"extensions": [".posecode"],
2020
"configuration": "./language-configuration.json"
2121
}
2222
],
2323
"grammars": [
2424
{
25-
"language": "movit",
26-
"scopeName": "source.movit",
27-
"path": "./syntaxes/movit.tmLanguage.json"
25+
"language": "posecode",
26+
"scopeName": "source.posecode",
27+
"path": "./syntaxes/posecode.tmLanguage.json"
2828
}
2929
]
3030
},
3131
"scripts": {
3232
"compile": "tsc -p ./",
33-
"bundle-server": "esbuild ../../packages/movit-lsp/src/server.ts --bundle --platform=node --format=cjs --outfile=dist/server.cjs",
33+
"bundle-server": "esbuild ../../packages/posecode-lsp/src/server.ts --bundle --platform=node --format=cjs --outfile=dist/server.cjs",
3434
"build": "npm run compile && npm run bundle-server"
3535
},
3636
"dependencies": {

editors/vscode/src/extension.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
/**
2-
* Movit VS Code extension entry point.
2+
* Posecode VS Code extension entry point.
33
*
44
* Syntax highlighting comes from the bundled TextMate grammar; everything
55
* smarter (range-of-motion diagnostics, completion, hover) comes from the
6-
* Movit language server, which this client launches over stdio. The server is
6+
* Posecode language server, which this client launches over stdio. The server is
77
* bundled to `dist/server.cjs` by `npm run build` so it runs with plain node.
88
*/
99

@@ -25,12 +25,12 @@ export function activate(context: ExtensionContext): void {
2525
debug: { module: serverModule, transport: TransportKind.stdio },
2626
};
2727
const clientOptions: LanguageClientOptions = {
28-
documentSelector: [{ scheme: "file", language: "movit" }],
28+
documentSelector: [{ scheme: "file", language: "posecode" }],
2929
};
3030

3131
client = new LanguageClient(
32-
"movit",
33-
"Movit Language Server",
32+
"posecode",
33+
"Posecode Language Server",
3434
serverOptions,
3535
clientOptions,
3636
);

editors/vscode/syntaxes/movit.tmLanguage.json renamed to editors/vscode/syntaxes/posecode.tmLanguage.json

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"$schema": "https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json",
3-
"name": "Movit",
4-
"scopeName": "source.movit",
3+
"name": "Posecode",
4+
"scopeName": "source.posecode",
55
"patterns": [
66
{ "include": "#comments" },
77
{ "include": "#strings" },
@@ -15,40 +15,40 @@
1515
"repository": {
1616
"comments": {
1717
"patterns": [
18-
{ "name": "comment.line.number-sign.movit", "match": "#.*$" },
19-
{ "name": "comment.line.double-slash.movit", "match": "//.*$" }
18+
{ "name": "comment.line.number-sign.posecode", "match": "#.*$" },
19+
{ "name": "comment.line.double-slash.posecode", "match": "//.*$" }
2020
]
2121
},
2222
"strings": {
23-
"name": "string.quoted.double.movit",
23+
"name": "string.quoted.double.posecode",
2424
"begin": "\"",
2525
"end": "\"",
2626
"patterns": [
27-
{ "name": "constant.character.escape.movit", "match": "\\\\." }
27+
{ "name": "constant.character.escape.posecode", "match": "\\\\." }
2828
]
2929
},
3030
"keywords": {
31-
"name": "keyword.control.movit",
32-
"match": "\\b(movit|rig|pose|start|step|repeat|ground-lock|cue|hold)\\b"
31+
"name": "keyword.control.posecode",
32+
"match": "\\b(posecode|rig|pose|start|step|repeat|ground-lock|cue|hold)\\b"
3333
},
3434
"kinds": {
35-
"name": "storage.type.movit",
35+
"name": "storage.type.posecode",
3636
"match": "\\b(exercise|stretch|posture)\\b"
3737
},
3838
"actions": {
39-
"name": "keyword.operator.movit",
39+
"name": "keyword.operator.posecode",
4040
"match": "\\b(flex|extend|abduct|adduct|rotate-in|rotate-out|supinate|pronate|dorsiflex|plantarflex)\\b"
4141
},
4242
"joints": {
43-
"name": "variable.other.movit",
43+
"name": "variable.other.posecode",
4444
"match": "\\b(shoulders|elbows|wrists|hips|knees|ankles|pelvis|spine|chest|neck|head|shoulder_left|shoulder_right|elbow_left|elbow_right|wrist_left|wrist_right|hip_left|hip_right|knee_left|knee_right|ankle_left|ankle_right)\\b"
4545
},
4646
"constants": {
47-
"name": "constant.language.movit",
47+
"name": "constant.language.posecode",
4848
"match": "\\b(ease-in-out|ease-in|ease-out|linear|neutral|standing|plank|hands|feet|humanoid)\\b"
4949
},
5050
"numbers": {
51-
"name": "constant.numeric.movit",
51+
"name": "constant.numeric.posecode",
5252
"match": "\\b[0-9]+(\\.[0-9]+)?s?\\b"
5353
}
5454
}

0 commit comments

Comments
 (0)