{"id":48567332,"url":"https://github.com/lucifer1004/typub","last_synced_at":"2026-04-08T13:30:37.266Z","repository":{"id":340140636,"uuid":"1157003800","full_name":"lucifer1004/typub","owner":"lucifer1004","description":"Typub - A Typst-first local CMS","archived":false,"fork":false,"pushed_at":"2026-04-04T01:23:18.000Z","size":15087,"stargazers_count":29,"open_issues_count":3,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-04T03:26:18.559Z","etag":null,"topics":["markdown","publish","typst"],"latest_commit_sha":null,"homepage":"https://lucifer1004.github.io/typub/","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lucifer1004.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-02-13T10:06:51.000Z","updated_at":"2026-04-04T01:23:05.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/lucifer1004/typub","commit_stats":null,"previous_names":["lucifer1004/typub"],"tags_count":36,"template":false,"template_full_name":null,"purl":"pkg:github/lucifer1004/typub","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lucifer1004%2Ftypub","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lucifer1004%2Ftypub/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lucifer1004%2Ftypub/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lucifer1004%2Ftypub/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lucifer1004","download_url":"https://codeload.github.com/lucifer1004/typub/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lucifer1004%2Ftypub/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31558378,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-08T10:21:54.569Z","status":"ssl_error","status_checked_at":"2026-04-08T10:21:38.171Z","response_time":54,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["markdown","publish","typst"],"created_at":"2026-04-08T13:30:36.326Z","updated_at":"2026-04-08T13:30:37.242Z","avatar_url":"https://github.com/lucifer1004.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# typub\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/lucifer1004/typub/actions/workflows/ci.yml\"\u003e\u003cimg src=\"https://github.com/lucifer1004/typub/actions/workflows/ci.yml/badge.svg\" alt=\"CI\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://codecov.io/gh/lucifer1004/typub\"\u003e\u003cimg src=\"https://codecov.io/gh/lucifer1004/typub/graph/badge.svg\" alt=\"codecov\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://crates.io/crates/typub\"\u003e\u003cimg src=\"https://img.shields.io/crates/v/typub.svg\" alt=\"Crates.io\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://opensource.org/licenses/MIT\"\u003e\u003cimg src=\"https://img.shields.io/badge/License-MIT-yellow.svg\" alt=\"License: MIT\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/govctl-org/govctl\"\u003e\u003cimg src=\"https://img.shields.io/badge/governed%20by-govctl-6366F1\" alt=\"governed by govctl\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n**English** | [中文](./README_CN.md)\n\ntypub is a Typst-first, multi-platform publishing tool.\n\n## User Basics\n\n### Prerequisites\n\n**Important:** typub depends on [typst CLI](https://github.com/typst/typst). You must have `typst` installed and available in your PATH.\n\nInstall typst CLI:\n\n```bash\n# Via cargo\ncargo install typst\n\n# Or via other package managers (see https://github.com/typst/typst for more options)\n```\n\n### Install\n\n```bash\ncargo install typub\n```\n\n### Minimal flow\n\n```bash\ntypub init\ntypub new \"My Post\"\ntypub dev posts/my-post -p ghost\ntypub publish posts/my-post -p ghost\n```\n\n## Key Features\n\n### 🎯 Typst-first with Markdown-compatibility\n\nWrite content in Typst (`content.typ`) or Markdown (`content.md`). Typst is the primary format with powerful typesetting capabilities, while Markdown provides a familiar alternative. Both formats can be published to any supported platform.\n\n### 🌐 Multiple-platform Compatibility\n\nPublish to multiple platforms from a single content source:\n\n- **API-based**: Dev.to, Ghost, HashNode, Confluence, Notion, WordPress\n- **Copy-paste (HTML)**: WeChat, Zhihu, Toutiao, Bilibili, Weibo, Baijiahao, Wangyihao, Sohu, Sspai, OSChina\n- **Copy-paste (Markdown)**: CSDN, Juejin, SegmentFault, Cnblogs, Medium, Jianshu, InfoQ, 51CTO, TencentCloud, Aliyun, HuaweiCloud, Elecfans, ModelScope, Volcengine\n- **Local output**: Astro, Static, Xiaohongshu\n\n### 👀 Dev Preview\n\nPreview your content locally before publishing:\n\n- **Live reload**: Auto-refresh on save with built-in dev server (`typub dev`)\n- **Platform-specific preview**: See exactly how content renders on each platform\n- **Theme support**: Choose from built-in themes (github, notion, minimal, tech, etc.) or create custom ones\n- **Math rendering**: MathJax-powered LaTeX rendering\n\n```bash\n# Preview with auto-reload\ntypub dev posts/my-post -p ghost\n\n# Preview for different platforms\ntypub dev posts/my-post -p confluence\n```\n\nThemes are configured in `meta.toml` or `typub.toml`, not via command-line arguments.\n\n### 🖥️ Terminal User Interface (TUI)\n\nInteractive terminal dashboard for content management:\n\n- **Post management**: Browse, sort, and manage all your posts\n- **Platform overview**: See publishing status across all platforms at a glance\n- **Preview content**: Preview posts in terminal or browser for selected platform\n- **Publish control**: Selectively publish to individual platforms or all at once\n- **Real-time progress**: Track publishing progress and results\n\n```bash\n# Launch interactive TUI dashboard\ntypub tui\n```\n\n### 📦 4 Asset Strategies\n\nChoose how images and other assets are handled:\n\n- **embed**: Base64 encode inline — small images, no upload dependency\n- **upload**: Upload to platform storage — platforms with native media APIs\n- **copy**: Copy to local output — local/static outputs\n- **external**: Upload to S3-compatible host — CDN, large assets, cross-platform URLs\n\n### 📐 3 Math Rendering Strategies\n\nRender mathematical expressions based on platform capabilities:\n\n- **SVG**: Platform supports inline SVG — use Typst's native SVG rendering (default)\n- **LaTeX**: Platform requires LaTeX math macros — preserve original LaTeX source\n- **PNG**: Platform supports base64 images but not SVG — rasterize to PNG via resvg\n\n### ⚙️ Layered Config System\n\nManage configuration with 5-level resolution priority (highest to lowest):\n\n1. **Post-platform**: Per-content platform-specific (`meta.toml` → `[platforms.\u003cid\u003e]`)\n2. **Post**: Per-content default (`meta.toml` → top level)\n3. **Global-platform**: Global platform-specific (`typub.toml` → `[platforms.\u003cid\u003e]`)\n4. **Global**: Global default (`typub.toml` → top level)\n5. Adapter default (fallback)\n\n---\n\n## Showcases\n\n### Preview Examples\n\n![WeChat Preview](./docs/guide/platforms/wechat/preview-page.png)\n\n![Xiaohongshu Preview](./examples/xiaohongshu.png)\n\n![Confluence Published](./docs/guide/platforms/confluence/published.png)\n\n---\n\n## Documentation Map\n\n### For users (publishing content)\n\n- Basic path: `docs/guide/getting-started.md`\n- Platform setup: `docs/guide/adapters.md`\n- Assets: `docs/guide/assets.md`\n- Copy-paste profiles: `docs/guide/profiles.md`\n- Advanced customization: `docs/guide/advanced-customization.md`\n\n### For developers (contributing to typub)\n\n- Development workflow: `DEVELOPING_GUIDE.md`\n- Agent/contributor guardrails: `CLAUDE.md`\n- Specifications and architecture: `docs/rfc/` and `docs/adr/`\n\n## User Advanced Features\n\n- Per-platform asset strategy (`embed` / `upload` / `copy` / `external`)\n- External storage integration for cross-platform asset URLs\n- Copy-paste profile selection and customization\n- Node policy override (`raw` / `unknown`) via platform config\n\nSee `docs/guide/advanced-customization.md` for a platform-agnostic overview.\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flucifer1004%2Ftypub","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flucifer1004%2Ftypub","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flucifer1004%2Ftypub/lists"}