[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-3094":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":16,"stars7d":17,"stars30d":18,"stars90d":16,"forks30d":16,"starsTrendScore":16,"compositeScore":19,"rankGlobal":10,"rankLanguage":10,"license":10,"archived":20,"fork":20,"defaultBranch":21,"hasWiki":22,"hasPages":20,"topics":23,"createdAt":10,"pushedAt":10,"updatedAt":24,"readmeContent":25,"aiSummary":26,"trendingCount":16,"starSnapshotCount":16,"syncStatus":14,"lastSyncTime":27,"discoverSource":28},3094,"Noustiny","UfukNode\u002FNoustiny","UfukNode","An agent native video creation pipeline that runs on top of Hermes Agent","",null,"TypeScript",167,18,2,1,0,4,17,44.54,false,"main",true,[],"2026-06-12 04:00:16","\u003Ch1 align=\"center\">Noustiny\u003C\u002Fh1>\n\n\u003Cp align=\"center\">\u003Cem>Drop a seed. Walk a universe.\u003C\u002Fem>\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  \u003Cimg alt=\"Built for Nous Creative Hackathon 2026\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FNous_Creative_Hackathon-2026-FF6B35?style=flat-square\">\n  \u003Cimg alt=\"Built on Hermes Agent\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FHermes_Agent-Nous_Research-635BFF?style=flat-square\">\n  \u003Cimg alt=\"Next.js 16\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FNext.js-16-000?style=flat-square&logo=next.js\">\n  \u003Cimg alt=\"React 19\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FReact-19-149ECA?style=flat-square&logo=react\">\n  \u003Cimg alt=\"TypeScript\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FTypeScript-strict-3178C6?style=flat-square&logo=typescript&logoColor=white\">\n\u003C\u002Fp>\n\n---\n\n> **The stories you keep imagining. See them, hear them, share them.**\n\nYou don't ask for *a* story. You drop a seed and walk every \"what if\"\nbranch the universe could take. Every splice becomes a real branch: the\nagent re-harmonises the canon, paints the visuals, clones a fitting\nnarrator voice, and renders the version you picked into a video you can\npost.\n\n\u003Cp align=\"center\">\n  \u003Cimg src=\"docs\u002Fscreenshots\u002Ftree.png\" alt=\"Story tree, early branches\" width=\"49%\">\n  \u003Cimg src=\"docs\u002Fscreenshots\u002Ftree2.png\" alt=\"Story tree, expanded canon path\" width=\"49%\">\n\u003C\u002Fp>\n\n## At a glance\n\n| Action                    | Result                                                         |\n| :------------------------ | :------------------------------------------------------------- |\n| Type a seed               | A canon-tracked, live branching story canvas                   |\n| Pick an option            | Hermes proposes the next 2 to 3 critical beats                 |\n| Splice a beat mid-tree    | Downstream beats re-harmonise themselves automatically         |\n| Hit Render                | A landscape audiobook or a vertical reel, ready to post        |\n| Drop a YouTube URL        | ElevenLabs IVC clones that voice for every line of narration   |\n| Save \u002F Load               | Full tree state, with provenance, in localStorage              |\n\n## How it works\n\nTwo distinct loops sit under the canvas. The **authoring loop** runs per\nbeat as you grow the tree. The **render loop** runs once, when you press\nRender: the agent dispatches four registered Hermes tools in sequence on\na single chat completion, no app-side orchestration.\n\n### Two ways to fork the story\n\nThe canvas exposes two `+` buttons with different shapes and different\njobs. Both grow the tree, but only one of them needs the council.\n\n```mermaid\nflowchart LR\n  classDef canon fill:#0d1828,stroke:#4fc3f7,color:#e0f7fa,stroke-width:2px\n  classDef inserted fill:#1a1208,stroke:#e9c16b,color:#fff8e1,stroke-width:2px\n  classDef whatif fill:#0f1019,stroke:#7a7e8a,color:#cdd2de,stroke-dasharray: 5 3\n  classDef arm fill:#0f131b,stroke:#e9c16b,color:#e9c16b,stroke-width:2px\n  classDef trunk fill:#0f131b,stroke:#7a7e8a,color:#cdd2de,stroke-width:2px,stroke-dasharray: 4 3\n\n  A[\"Beat 1\u003Cbr\u002F>opening\"]:::canon\n  B[\"Beat 2\u003Cbr\u002F>discovery\"]:::canon\n  C[\"Beat 3\u003Cbr\u002F>climax\"]:::canon\n  ARM[\"⬛ +\u003Cbr\u002F>arm splice\"]:::arm\n  INS[\"Beat 1.5\u003Cbr\u002F>inserted, gold\"]:::inserted\n  TRK((\"○ +\u003Cbr\u002F>trunk\")):::trunk\n  WIF[\"Beat 2'\u003Cbr\u002F>what-if branch\"]:::whatif\n\n  A -- canon --> ARM\n  ARM -- splice --> INS\n  INS -- canon --> B\n  B -- canon --> C\n  A -. parent stub .-> TRK\n  TRK -. what-if .-> WIF\n```\n\n| Gesture | Where it sits | What it does |\n| :--- | :--- | :--- |\n| **Square +** (gold, parallelogram) | Midpoint between a parent and its canon child | Splices a new beat *into* the canon. `narrative-writer-assist` drafts the inserted beat, then the council cascade patches every downstream beat the splice made stale. |\n| **Round +** (dashed circle) | Off the parent's outgoing stub | Adds a what-if sibling, a parallel timeline that doesn't touch existing canon. No cascade fires; brainstorm just produces 3 fresh next options on this new branch. |\n\n### Authoring loop: per-beat council\n\nEvery beat passes through a small council of narrative skills. Splice one\nbeat and the cascade walks downstream by itself until the canon is coherent\nagain.\n\n```mermaid\nsequenceDiagram\n  autonumber\n  participant U as user\n  participant N as next.js\n  participant H as hermes gateway\n\n  U->>N: enter seed\n  N->>H: brainstorm\n  H-->>N: 2-3 next options\n  U->>N: pick \u002F splice\n\n  rect rgba(80,140,255,0.10)\n    Note over N,H: re-harmonisation cascade\n    N->>H: continuity-critic\n    H-->>N: contradictions per node\n    N->>H: rewriter\n    H-->>N: patched beats\n    N->>H: judge\n    H-->>N: approve \u002F reject\n  end\n\n  N-->>U: tree updated\n```\n\n### Render loop: autonomous tool chain\n\nWhen you press Render, the agent chains four registered Hermes tools in\nsequence on a single chat completion. No app-side glue.\n\n```mermaid\nsequenceDiagram\n  autonumber\n  participant A as agent\n  participant D as narration_voice_director\n  participant S as voice_sample_builder\n  participant C as voice_clone_synthesize\n  participant R as noustiny_storybook\n\n  A->>D: title, seed, voice_gender\n  D-->>A: persona_label, search_query, fallback_query\n  A->>S: query\n  S-->>A: sample_path (24 kHz mono PCM)\n  A->>C: text, reference_wav\n  C-->>A: audio + per-character alignment\n  A->>R: voice_reference_wav, persona, render args\n  R-->>A: rendered video path\n```\n\n### Character continuity: one face per character\n\nStories drift visually when \"Tony Stark\", \"Mr. Stark\", and \"Tony\" each\nget a different portrait. Noustiny pins the cast at seed time and threads\nthe same reference image through every beat that mentions them.\n\n```mermaid\nflowchart LR\n  classDef seed fill:#0d1828,stroke:#4fc3f7,color:#e0f7fa,stroke-width:2px\n  classDef sheet fill:#1a1208,stroke:#e9c16b,color:#fff8e1,stroke-width:2px\n  classDef beat fill:#0f131b,stroke:#7a7e8a,color:#cdd2de\n  classDef tool fill:#0a1018,stroke:#4fc3f7,color:#4fc3f7,stroke-dasharray: 4 3\n\n  seed[\"seed prompt\"]:::seed --> sheet\n  sheet[\"character_sheet_builder\u003Cbr\u002F>1 to 4 named cast\u003Cbr\u002F>IP-free portrait per character\"]:::sheet\n\n  beat[\"beat mentions a name\"]:::beat --> reg\n  reg{{\"character_alias_resolver\u003Cbr\u002F>'Mr. Stark' → 'Tony Stark'\"}}:::tool --> lookup\n  lookup{{\"character_registry_lookup\u003Cbr\u002F>fetch portrait reference\"}}:::tool --> img\n\n  sheet -. registers .-> lookup\n  img[\"beat image gen\u003Cbr\u002F>conditioned on portrait\"]:::beat\n```\n\nThe cast sheet is built once. From then on, every beat that names a\ncharacter pulls the same portrait reference, so a face stays a face across\nthe whole tree, including the rendered video.\n\n## Tools\n\n12 registered tool names across 10 Python files. Each one fills a primitive\nHermes did not ship with.\n\n### Story state\n\n| Tool                        | Purpose                                                                            |\n| :-------------------------- | :--------------------------------------------------------------------------------- |\n| `story_tree_graph`          | Tree graph operations: canon path, descendants, splice insertion points            |\n| `narrative_context_builder` | Walks the canon chain, returns the live structured context every skill reads from  |\n| `motif_tracker`             | Recurring motif memory across the arc (a sword in beat 2 must reappear later)      |\n\n### Character continuity\n\n| Tool                        | Purpose                                                                            |\n| :-------------------------- | :--------------------------------------------------------------------------------- |\n| `story_copyright_detector`  | IP scrub: \"Iron Man\" becomes an IP-free description before the image API sees it   |\n| `character_sheet_builder`   | Produces 1 to 4 named characters with IP-free visuals plus portrait prompts        |\n| `character_registry_lookup` | Find a character on the cast sheet, attach the correct portrait reference          |\n| `character_alias_resolver`  | \"Mr. Stark\" resolves to \"Tony Stark\" so one character keeps one portrait           |\n\n### Voice\n\n| Tool                        | Purpose                                                                            |\n| :-------------------------- | :--------------------------------------------------------------------------------- |\n| `narration_voice_director`  | Director-agent reads seed and story, returns persona plus reference search query   |\n| `voice_sample_builder`      | yt-dlp + ffmpeg, accepts URL, 11-char ID, or free text. Normalises to 24 kHz mono  |\n| `voice_clone_synthesize`    | ElevenLabs IVC + with-timestamps. Voice cached by reference SHA. Alignment is free |\n| `voice_clone_cleanup`       | Frees the cached voice ID after render                                             |\n\n### Render\n\n| Tool                        | Purpose                                                                            |\n| :-------------------------- | :--------------------------------------------------------------------------------- |\n| `noustiny_storybook`        | Render entry. Agent dispatches it; one call drives the FastAPI service end to end  |\n\n## Skills\n\n13 agentskills.io bundles, each one a system prompt for a single creative\nconcern. Next reads them from the local mirror and sends them as the\nsystem role on every chat completion; the autonomous storybook chain pulls\nits own from the gateway side.\n\n### Tree authoring\n\n| Skill                         | Role                                                              |\n| :---------------------------- | :---------------------------------------------------------------- |\n| `narrative-brainstorm`        | Proposes 2 to 3 next-checkpoint options from the canon chain      |\n| `narrative-writer-assist`     | Writes a spliced insert beat that fits parent and child           |\n| `narrative-continuity-critic` | Audits downstream beats against any insert                        |\n| `narrative-rewriter`          | Patches the stale beats the critic flagged                        |\n| `narrative-judge`             | Approves or rejects the rewrite against the original              |\n| `narrative-scene-qa`          | Per-beat sanity check (consistency, length, register)             |\n| `narrative-writer`            | Seals the chosen branch as final prose                            |\n\n### Visual + IP\n\n| Skill                       | Role                                                              |\n| :-------------------------- | :---------------------------------------------------------------- |\n| `story-copyright-detector`  | Skill counterpart of the same-named tool                          |\n| `character-sheet-builder`   | Cast extraction rules + IP-free portrait prompt format            |\n| `visual-prompt-builder`     | Turns a beat into an IP-free image prompt; reads character sheet  |\n| `scene-composition`         | Shot framing and layout rules                                     |\n| `storybook-intro`           | Cinematic intro page generator                                    |\n\n### Voice\n\n| Skill                      | Role                                                               |\n| :------------------------- | :----------------------------------------------------------------- |\n| `narration-voice-director` | Persona reasoning rules backing the same-named tool                |\n\n## Architecture\n\n```mermaid\nflowchart TB\n  subgraph windows[Windows side]\n    nx[Next.js\u003Cbr\u002F>:3000]\n    mirror[hermes-skills-local\u003Cbr\u002F>NTFS mirror]\n  end\n\n  subgraph wslblock[WSL]\n    gw[Hermes gateway\u003Cbr\u002F>:8642]\n    svc[Storybook render\u003Cbr\u002F>:8643]\n    tools[hermes-agent tools]\n    skills[hermes-agent skills\u003Cbr\u002F>canonical]\n  end\n\n  subgraph cloud[Cloud]\n    nous[Nous Portal]\n    el[ElevenLabs]\n    yt[YouTube \u002F yt-dlp]\n  end\n\n  browser([browser]) --> nx\n  nx -- chat completion --> gw\n  nx -. \"read SKILL.md\" .-> mirror\n  gw -- forward --> nous\n  gw --> tools\n  tools --> el\n  tools --> yt\n  tools --> svc\n  svc --> nx\n```\n\nThe `hermes-skills-local` directory is a Windows-side mirror of the canonical\nskills folder in WSL. Reading SKILL.md over UNC stalls under parallel reads\n(25 second timeouts on canvas-enter), so Next reads from local NTFS instead.\nResync after editing a SKILL.md:\n\n```bash\ncp -r \u002F\u002Fwsl.localhost\u002FUbuntu\u002Fhome\u002F\u003Cuser>\u002Fhermes-agent\u002Fskills\u002Fcreative \\\n      .\u002Fhermes-skills-local\u002F\n```\n\n## Repo layout\n\n```\n.\n├── hermes-additions\u002F          tools + skills we authored for Hermes\n│   ├── tools\u002F                 10 .py files, 12 registered tool names\n│   ├── skills\u002Fcreative\u002F       13 SKILL.md bundles\n│   └── README.md              install + integration notes\n├── hermes-skills-local\u002F       Windows mirror (gitignored)\n└── web\u002F                       Next.js 16 app\n    ├── app\u002F                   routes, pages, layouts\n    ├── components\u002F            canvas, modals, agent ticker, etc.\n    ├── lib\u002F                   store, hermes client, save system\n    └── public\u002F                static assets\n```\n\n## Built for\n\nNous Creative Hackathon, 2026.\n\n## Credits\n\nHermes Agent · Nous Research\nElevenLabs Instant Voice Cloning\nyt-dlp\nffmpeg + libass\n","Noustiny 是一个基于 Hermes Agent 的原生视频创作流水线。它利用 TypeScript 开发，集成了 Next.js 16 和 React 19 技术栈，通过输入故事种子自动生成多分支的叙事树，并能自动调和下游节点以保持连贯性。用户可以选择特定的故事路径并渲染成视频或音频格式，适合创意写作、内容创作以及快速原型制作等场景。此外，Noustiny 还支持通过 YouTube URL 克隆叙述声音，进一步丰富了生成内容的表现力。","2026-06-11 02:52:29","CREATED_QUERY"]