Codync
A free, open-source 1:1 alternative to Grok Bot and Muse. Message Claude Code, Codex, Cursor and 40+ coding agents as persistent bots from your iPhone, Mac or Linux desktop. Group chats, threads, appr
Render the TSX you already wrote into App Store screenshots, launch cards, and Open Graph images, in any language, right-to-left included. One CLI command, no Figma, no drift.
Developer toolsTypeScript · MDXGitHub @m7md1alaaOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
local-first studio that renders your own TSX components into finished social/marketing images
Taken from the repository README
Loading the full README.
Read the full README ↗Storybook for images — in your repo and speaking to your agents.
An open-source, local-first studio that renders your own TSX components into pixel-perfect social and marketing images. CLI for scripting, live UI for iteration, and an agent skill for AI coding agents.
# Scaffold a project (installs dependencies with the package manager you ran it with)
bunx @stdout-design/cli init my-studio
cd my-studio
# Render an image → out/bento-feature.default.instagram-square.0.png
bun run render bento-feature --headline "Hello"
# Or open the live studio on http://localhost:3030
bun run dev
bun add -d @stdout-design/cli
Prerequisites: Node.js 22.22+, Bun 1.2+.
--data posts.csv renders one asset per row.--json output.--locales en,ar,es, RTL support, tofu detection for missing glyphs.| Command | Description |
|---|---|
studio init | Scaffold a new studio project |
studio dev | Start the live preview studio |
studio render <template> | Render a single template or batch |
studio cache stats | Show cache statistics |
studio cache clean | Clear the render cache |
studio update | Update a project to the latest CLI |
studio skill install | Install the agent skill |
Inside a scaffolded project, run them through your package manager (bun run render …, bunx studio …). Commands work from any subdirectory of the project. Set STUDIO_DEBUG=1 for verbose logs.
studio render <template> [props...] [options]
| Option | Description |
|---|---|
key=value / --key value | Template props, validated against the template's propsSchema |
--data file.csv | Batch render: one image per CSV/JSON row |
--preset ids | Comma-separated preset IDs, or all (default: defaultPreset) |
--locale en,ar | Render once per locale, using locales/<code>.json |
--out-dir path | Output directory (default: config outDir, else ./out) |
--json | Print the render manifest as JSON on stdout |
Starts a dev server on localhost:3030 (--port to change, --open to open a browser) with:
A template is a TSX component plus a Zod propsSchema, styled with Tailwind classes on the tw prop:
// templates/milestone-card.tsx
import { defineSchema } from "@stdout-design/cli/schema";
import { z } from "zod";
export const propsSchema = defineSchema(
z.object({
title: z.string().default("Milestone"),
stat: z.string().default("10k users"),
})
);
export default function MilestoneCard({
title,
stat,
}: z.infer<typeof propsSchema>) {
return (
<div tw="flex flex-col w-full h-full justify-center bg-black p-16 text-white">
<h1 tw="text-6xl font-bold">{title}</h1>
<p tw="mt-4 text-3xl">{stat}</p>
</div>
);
}
Register it in studio.config.ts under templates ("milestone-card": { componentPath: "./templates/milestone-card" }), then studio render milestone-card stat="50k users".
Install the agent skill so coding agents (Claude Code, Cursor, …) know how to work with a studio project:
studio skill install # or: init --install-skill
Output paths are deterministic (<template>.<locale>.<preset>.<row>.png), and render --json prints a machine-readable manifest.
my-project/
├── studio.config.ts template registry, presets, locales
├── templates/ your TSX components
├── data/ CSV/JSON for batch renders
├── locales/ per-locale prop overrides, keyed by template id
└── out/ rendered assets (gitignored)
import type { StudioConfig } from "@stdout-design/cli";
const config: StudioConfig = {
defaultPreset: "og",
outDir: "./out",
presets: [
{ id: "og", platform: "web", width: 1200, height: 630 },
{ id: "instagram", platform: "instagram", width: 1080, height: 1080 },
],
templates: {
"bento-feature": { componentPath: "./templates/bento-feature" },
},
};
export default config;
Locale files map template ids to prop overrides, e.g. locales/ar.json:
{ "bento-feature": { "headline": "التطبيق المميز" } }
Presets are whatever you define in studio.config.ts; these are handy sizes to copy:
| Preset | Size | Use |
|---|---|---|
| og | 1200×630 | Open Graph / social cards |
| x-card | 1200×675 | X (Twitter) cards |
| 1200×627 | LinkedIn link previews | |
| 1080×1080 | Instagram feed posts | |
| instagram-story | 1080×1920 | Instagram stories |
| appstore | 1290×2796 | App Store screenshots |
| playstore | 1080×1920 | Play Store screenshots |
MIT