Myriad-You/Myriad
Myriad-You/Myriad has 117 GitHub stars and 19 forks. Star changes are not measured yet. Last checked 2026-11-13 23:49 UTC. Last push 2026-11-13.
측정된 스타 증가
- in 24h
- 기록 수집 중
- in 7 days
- 기록 수집 중
- in 15 days
- 기록 수집 중
- in 1 month
- 기록 수집 중
서로 겹치는 기간의 순증가량이며 일별 합계가 아닙니다. 측정값이 없으면 비워 둡니다. 스타는 관심도를 나타내며 품질을 보장하지 않습니다.
소개
Myriad is a self-hosted homepage and creative studio: aggregate your platforms, show a library, and run a site-wide persona, 2.5D face, and Tapp apps you own.
개발 도구README.md
Original
Rendered offscreen: the frontend in this repository (production build) talking to a local instance, drawn frame by frame. The owner, works and numbers are synthetic samples; the character is the one bundled with the project. [How these are recorded](docs/development/README_MEDIA.md) (in Chinese).
What it is
Myriad is a self-hosted personal homepage. It gathers what you leave on other platforms into one site, and gives the site a single character of its own: she has a 2.5D face, talks with visitors and does things for you. The site can also run small apps and host a blog.
Single-tenant. Public or private. PostgreSQL. UI: zh-CN · zh-TW · en-US · ja-JP · ko-KR · fr-FR · de-DE.
- Homepage: a standard 16×4 or free 16×8 grid you lay out yourself; the free layout also takes stickers. Report cards, music, weather, friend links, recent activity and her widget live here, and installed Tapps can add widgets of their own.
- Platforms: data from 11 platforms, including GitHub, Steam, Bilibili, NetEase Music and Bangumi, goes into one database that the report cards, the library and the platform reports all read (see Platforms).
Talk to her
Rendered offscreen. Her reply is a scripted stand-in, not generated by a model on the spot.
- One persona for the whole site: the owner sets her name, personality and portrait, and she is the same person to everyone. With the persona on but no name given, she is called Arael.
- Chat and Help: a long press on empty space opens the panel, and Tab switches between the two modes. In Chat she speaks as the persona; in Help she plans, confirms and carries out work within the permissions granted (see Agent).
- Mouth shapes: without voice, her mouth follows shapes worked out from the reply text, with Chinese, Japanese and English each read by their own sounds.
2.5D face
Rendered offscreen. Character settings › Motion.
Moves in the browser: the layered upper-body portrait is played live in the browser (Anime2.5DRig); the server does no GPU inference.
From portrait to motion: the main portrait can be generated or uploaded; layers come from a PSD, or a layer-splitting service can split it for you. Blinking, mouth shapes and head and body sway all work on the layers.
Expressions and gestures: try them in the workbench; in conversation she picks her own. Some expressions draw symbols such as tears, notes or dizzy spirals.
Turns are drawn, not computed: at import an image-editing model redraws the same illustration with the head turned about 30° left, right, up and down; after layer decomposition each part's keyform is measured from those views. Playback is a deterministic mesh deformation with no inference. Method and measurements are in the technical report Drawn, Not Computed: Measuring Live2D-Style Turn Keyforms from Generated Views of a Single Anime Illustration.
Cite
@misc{wang_2026_23598773,
author = {Wang, Mingen},
title = {Drawn, Not Computed: Measuring Live2D-Style Turn Keyforms from Generated Views of a Single Anime Illustration},
month = oct,
year = 2026,
publisher = {Zenodo},
doi = {10.5281/zenodo.23598773},
url = {https://doi.org/10.5281/zenodo.23598773},
}
Platform reports
Rendered offscreen. The report text is a handwritten sample; real reports are written by a model from the platform data.
- One portrait per platform in three acts: portrait, taste and highlight. There is no separate page: click a report card on the homepage and it plays act by act in a popup.
- The owner regenerates reports, sets how long they stay valid and picks the report style in the same place.
Library
Rendered offscreen.
- Games, anime, film and TV, books and music, synced from connected platforms and filtered by type; the sources for each type are configurable.
- A list or an infinite canvas: drag, pan with the arrow keys, zoom with the wheel. Low-end devices fall back to the list.
Tapp
Rendered offscreen. The generation is a stand-in: the steps and code are scripted, not generated by a model on the spot.
- Small apps for the site: a page, a homepage widget, or both. They run in a sandbox with permissions approved at install; host secrets and app credentials never enter the sandbox, not even in error messages.
- Playground (desktop, owner): describe an app in a sentence, preview it in the production sandbox, then install it or export a
.tapp. - Store and CLI: tapp-store and
tapp-cli(myriad-tapp init / check / pack). See Tapp development.
Blog
Rendered offscreen. After publishing, the local instance really rebuilt the static blog with Hugo.
- Write notes in the studio; published notes become a static blog built with a Hugo theme at
/blog. The pages run no scripts; comments and link requests are same-origin embeds. - Subscriptions (RSS, Notion, RSSHub) are read in the built-in Subscriptions app (see Phantasi).
Also
- Groups and DMs: she is in QQ, Telegram and Discord groups too, answers when mentioned and now and then joins in on her own; paired DM bots go through the same pipeline as Help.
- Federation: ActivityPub and MFP; follow other sites (see Federation).
- Updates and rollback: one step in
/config→ About → Update management (see Operations).
Contents
Product — Talk to her · 2.5D face · Platform reports · Library · Tapp · Blog · Platforms · Agent · Phantasi · Federation · Accounts
Run — Requirements · Deploy · Dev · Operations
Reference — Architecture · Repository · Stack · Docs · License
Platforms
GitHub — repos, stars, contributions |
Bilibili — favorites, anime, viewing history |
Stored in PostgreSQL. Report cards, Library, and Reports read the same data.
Agent
Chat Persona on: speaks only as that persona. No search, booking, generation, or planning. Outfit change and current-player play / pause / skip are allowed. |
Work Plan, confirm, execute. Memory, skills, scheduled jobs, MCP. Scope is granted permissions. |
May propose handing a noticed item to Work; accepting is not autonomy. Optional TTS, listening, and long-press live conversation when speech / realtime talk is configured.
Owner persona, Bot pairing, and heartbeat live at /agent/settings — not /config. MCP server list is still /config → Advanced; save writes mcp_servers.json and hot-reloads children. Private-chat Bots (QQ, Telegram, Discord, 飞书) enter the same Work pipeline; pairing is not a new login. Channels.
Phantasi
Feeds, notes and comments backend. RSS, Notion, RSSHub, optional AI enrichment. Published notes become a static Hugo site at /blog (posts at /blog/posts/{slug}/) using any installed Hugo theme; pages run no scripts, and comments, friend-link applications and in-body widgets are same-origin embeds. The owner writes in /studio. Subscriptions are read in the built-in RSS reader app. Notes RSS (/api/phantasi/notes.xml) is off until an admin enables it. Notes support TeX math, co-authors, columns, and in-body widgets.
Federation
ActivityPub + MFP. Discovery uses BASE_URL.
Follow via Actor URL (https://your.domain/users/<name>) or @[email protected]. Channels and rings are supported. WebFinger, NodeInfo, inboxes, and federation media: proxy → federation-worker, not the SPA or the web process.
A geographic federation gate can disable federation when the server's egress location is a blocked region (fail-open if the lookup fails). The dedicated federation process then exits; web and persona keep running.
Notes: Federation. Federated domain move ≠ ordinary domain change.
Accounts and visibility
- Local accounts after owner creation. Registration on/off. Per-user password login can be disabled after OAuth is linked.
- OAuth: built-in GitHub plus arbitrary OIDC (Authentik, Keycloak, Google, Microsoft, GitLab, Discord, …). Identities bind explicitly; the same email on two issuers is not merged.
- Module visibility: Library, Phantasi, Tapp, Agent — everyone / signed-in / admins.
- Search & AI: private (noindex, empty sitemap, no
/llms.txt), search engines only, AI citations, or fully open. - Site identity: name, blurb, icon, optional PWA, wallpaper and theme, first-party visitor stats, optional Google Analytics / Umami.
Operations
Production: proxy + updater. Only proxy publishes a host port. Web, federation-worker, persona-worker, frontend, Postgres, updater, updater-gateway, and docker-guard stay on internal networks. Proxy splits persona / federation / remaining API; see PORTS.md.
Version switch and rollback: /config → About → Update management. The browser never receives UPDATE_TOKEN. Do not overwrite :latest.
Bundled Postgres: updater snapshots ./pgdata; rollback restores data directory and image tags. External Postgres: MYRIAD_DB_MODE=external; rollback restores image tags only. External PostgreSQL.
Memory-saver profile for ~1 GiB hosts. /config diagnostics run live checks (database, storage, version, egress, federation gate) and emit a credential-free report.
Requirements
Production (Docker)
- Docker + Compose
- Host port (
HTTP_PORT, default 80) - linux/amd64 or linux/arm64
From source
- Rust 1.99+
- Node.js 24 LTS
- PostgreSQL 18 (Compose default; floor: release
min_pg_version)
Deploy
Docker
git clone https://github.com/myriad-you/Myriad.git
cd Myriad
cp .env.production.example .env
# Required: POSTGRES_PASSWORD / JWT_SECRET / CORS_ORIGINS
# BASE_URL / FRONTEND_URL = public origin (federation discovery uses BASE_URL)
# Empty UPDATE_TOKEN / UPDATER_GATEWAY_SECRET / PERSONA_DB_PASSWORD /
# FEDERATION_DB_PASSWORD → generated by deploy.sh
bash scripts/extra/deploy.sh up
Open http://localhost (or HTTP_PORT) and complete the wizard: database, owner, site name.
Official Compose sets DATABASE_URL, so startup requires MYRIAD_SETUP_SECRET (deploy.sh up generates it). Wizard-entered databases do not use that secret. Setup secret.
host HTTP_PORT → proxy → frontend:1102
→ backend:1103 → postgres:5432
→ federation-worker:1103
→ persona-worker:1103
→ updater (internal; via updater-gateway)
bash scripts/extra/deploy.sh status
bash scripts/extra/deploy.sh logs
bash scripts/extra/deploy.sh restart
bash scripts/extra/deploy.sh down
Updates: /config → About → Update management. Manual tag bump: MYRIAD_TAG / PROXY_TAG in .env, then bash scripts/extra/deploy.sh upgrade.
Bundled Postgres backup:
mkdir -p backups
docker compose exec -T postgres pg_dump -U myriad -d myriad > "backups/backup_$(date +%Y%m%d_%H%M%S).sql"
On your own computer (Docker Desktop)
No domain or TLS needed: same steps as above, with these .env values.
BASE_URL/FRONTEND_URL:http://localhostor empty — not the template'shttps://yourdomain.comCORS_ORIGINS:http://localhost, plus the LAN address (e.g.http://192.168.1.20) to open it from other devices; include the port whenHTTP_PORTis not 80- Sign-in works over plain HTTP on the LAN. Federation and third-party sign-in need the public site address.
macOS has been rehearsed; Windows (WSL 2) is uncertain. Local deployment
Quick start · Docker · Ports · Native
Local development
The shared core is the core/ git submodule (myriad-core), her 2.5D figure is the figure/ git submodule (myriad-figure), and the Tapp contract and runtime are the tapp/ git submodule (myriad-tapp). After cloning, and after a pull that moves any of them:
git submodule update --init
./scripts/dev.sh # TUI: menu, processes, database, logs
./scripts/dev.sh start # local PostgreSQL; logs in this terminal
./scripts/dev.sh start --docker # Docker postgres + new terminal
./scripts/dev.sh doctor # toolchain, ports, database
./scripts/dev.sh status # snapshot
.\scripts\dev.ps1 start # Windows
Backend :1103, frontend :1102. Without a local database: ./scripts/dev.sh db-setup.
The frontend dev server proxies /api/*, /health, /ready, and public federation paths to the backend.
Update management in the dev UI: ./scripts/dev.sh start all-updater. Image replace, maintenance mode, and pgdata snapshots: production stack (scripts/extra/deploy.sh).
Architecture
flowchart LR
Browser --> Proxy["proxy :HTTP_PORT"]
Proxy --> FE["frontend :1102"]
Proxy --> BE["web :1103"]
Proxy --> FW["federation-worker :1103"]
Proxy --> PW["persona-worker :1103"]
BE --> PG[("postgres :5432")]
FW --> PG
PW --> PG
BE --> GW[updater-gateway]
GW --> UP[updater]
UP --> Guard[docker-guard]
Development / production topology
Development
browser → Vite dev (:1102)
└─ /api/*, /health, /ready, federation public paths → backend (:1103) → postgres
Production
host HTTP_PORT
→ proxy
├─► frontend (:1102) [myriad-net]
├─► backend (:1103) → postgres MYRIAD_PROCESS_ROLE=web
├─► federation-worker (:1103)
├─► persona-worker (:1103)
│
└─► backend ─► updater-gateway → updater [myriad-admin-net]
└─► docker-guard → Docker sock
(rescue) updater when PROXY_ALLOW_DIRECT_UPDATER=true
The diagram shows bundled PostgreSQL; both workers also connect directly to it.
For an external DB container, backend and both workers share
MYRIAD_BACKEND_EXTRA_NETWORK (default myriad-backend-ext) with it.
Updater/Guard permit this network only for those three services;
upgrade both before using online updates with this topology. See
external PostgreSQL.
Crawler / in-app-share user-agents receive an SEO HTML shell for Home, Library, Phantasi, and Tapp; browsers receive the SPA. Architecture.
Repository
Myriad/
├── backend/ Rust API, SeaORM, migrations
├── frontend/ Vite + React UI, Tapp runtime, i18n (7 host locales)
├── proxy/ production reverse proxy (own Cargo tree)
├── updater/ self-update daemon (own Cargo tree)
├── core/ shared core (git submodule: myriad-core)
├── figure/ 2.5D figure runtime and rig tools (git submodule: myriad-figure)
├── tapp/ Tapp contract, rules, shared runtime, CLI, author docs (git submodule: myriad-tapp; own Cargo tree)
├── crates/ workspace libraries
├── shared/ cross-component static config
├── docker/ backend / frontend Dockerfiles
├── docs/ development, deploy, features (Chinese)
├── scripts/ dev.sh / dev.ps1; extra/ deploy
├── release/ release.json contract
└── docker-compose*.yml
proxy, updater and tapp are independent Cargo trees.
Stack
Frontend Live face Voice |
Backend Data Edge Apps Deploy |
Docs
Currently Chinese. Index.
Deploy |
Sponsor
Myriad is built in the open and kept alive by the people who use it. If it has earned a place in your life, you can help keep it going:
Thank you to everyone who supports us.
Contributing
Issues and PRs welcome. UI copy: zh-CN / zh-TW / en-US / ja-JP / ko-KR / fr-FR / de-DE.
People
AI agents
Much of Myriad is written together with coding agents. Their commits carry a Co-Authored-By trailer, which is why they also appear in GitHub's contributor list.
License
The host (backend, frontend, and workspace crates) and proxy / updater are AGPL-3.0. A Tapp that talks to the host only through the documented Bridge is an independent work; its license is the author's (see the AGPL section 7 additional permission in LICENSE).
The Tapp contract and tooling (tapp/crates/tapp-contract, tapp/shared/tapp_sandbox_contract.json, tapp/tools/tapp-cli, tapp/tools/tapp-contract-export) are Apache-2.0.
2.5D playback: Anime2.5DRig (MIT).
