|
1 | 1 | # Animated GitHub Profile Studio |
2 | 2 |
|
3 | | -A browser-based editor for creating a personal GitHub profile README from one reusable configuration. Customize the design, fonts, text, animated terminal, featured repositories, images, GIFs, links, section order, colors, and motion settings, then export a ready-to-upload ZIP. |
| 3 | +A desktop-only visual editor for building animated GitHub profile READMEs from one reusable configuration. Design the profile, preview every theme and motion mode, then export a complete repository-ready bundle. |
4 | 4 |
|
5 | | -The built-in sample is intentionally fictional and fully replaceable, so no maintainer profile, repository, or personal identity is used as the starting point. |
| 5 | +<p align="center"> |
| 6 | + <img src="./assets/profile-header-dark.svg" alt="Fictional desktop GitHub profile generated by Animated GitHub Profile Studio" width="100%"> |
| 7 | +</p> |
6 | 8 |
|
7 | | -After GitHub Pages is enabled, the hosted Studio is available at: |
| 9 | +<p align="center"> |
| 10 | + <a href="https://tfq0.github.io/animated-github-profile/"><strong>Open the hosted Studio</strong></a> |
| 11 | + · |
| 12 | + <a href="./SETUP.md">Setup and release guide</a> |
| 13 | + · |
| 14 | + <a href="./USER_CONTENT_NOTICE.md">Content notice</a> |
| 15 | +</p> |
8 | 16 |
|
9 | | -**[Open the hosted Studio](https://tfq0.github.io/animated-github-profile/)** |
| 17 | +The header above is a committed example generated by the Studio. Its identity, repositories, and links are intentionally fictional and safe to replace. |
10 | 18 |
|
11 | | -## Templates, layout, and media customization |
| 19 | +## What the Studio does |
12 | 20 |
|
13 | | -Configuration v3 provides seven templates: Quality Control, Classic Terminal, Retro Arcade, Anime HUD, Bento Grid, Signal Poster, and Custom Canvas. The templates use generic, original interface elements and include no franchise characters, logos, or copied artwork. |
| 21 | +Animated GitHub Profile Studio turns a validated `profile.config.json` into a polished profile README and four self-contained desktop SVG headers: |
14 | 22 |
|
15 | | -The templates are more than palette swaps: they provide structurally distinct desktop compositions. Custom Canvas uses the same validated rendering system and offers constrained layout controls rather than unrestricted canvas editing. |
| 23 | +- Dark animated |
| 24 | +- Light animated |
| 25 | +- Dark static |
| 26 | +- Light static |
16 | 27 |
|
17 | | -The customization contract includes: |
| 28 | +Every header uses a fixed 1200 × 610 desktop canvas. The editor targets browser widths of 1180 px or wider and does not generate a separate phone layout. |
18 | 29 |
|
19 | | -- Desktop composition, alignment, spacing, and placement choices within safe layout bounds. |
20 | | -- Two to six workflow steps, with an allowlisted safe shape selected for each step. |
21 | | -- Decorative shapes described through a bounded SVG-safe DSL. The renderer converts validated shape data into SVG; users cannot insert arbitrary SVG elements or path commands. |
22 | | -- Curated font presets that map to controlled, SVG-safe system font stacks. |
23 | | -- Structured remote media entries for images and GIFs referenced by HTTPS URL, with accessibility and attribution information kept alongside each entry. Media remains separate README content and is not inserted into the generated hero canvas. |
| 30 | +## Highlights |
24 | 31 |
|
25 | | -Applying a template changes its visual system and layout defaults without replacing the user's profile text, repositories, links, sections, or media. Loading a complete sample is a separate, confirmed action that replaces profile content. Valid v1 and v2 configurations migrate automatically when imported or restored from browser storage. |
26 | | - |
27 | | -The editor does not accept arbitrary raw CSS, SVG markup, SVG paths, or remote fonts. Decorative elements are code-generated from allowlisted primitives and bounded numeric values. |
28 | | - |
29 | | -## What it includes |
30 | | - |
31 | | -- Live desktop preview in dark and light themes. |
32 | | -- Animated and reduced-motion/static SVG variants. |
33 | | -- Seven structurally distinct desktop templates plus constrained custom layout controls. |
34 | | -- Design, font, profile, hero, workflow-step shape, decorative shape, project, skill, link, structured media, palette, section, Markdown, and footer editing. |
35 | | -- Optional public GitHub repository import with no login or token. |
| 32 | +- Seven distinct designs: Quality Control, Classic Terminal, Retro Arcade, Anime HUD, Bento Grid, Signal Poster, and Custom Canvas. |
| 33 | +- Live GitHub-style preview with dark/light and animated/static controls. |
| 34 | +- Editable identity, headline, terminal sequence, workflow, projects, skills, links, media, sections, colors, typography, and footer. |
| 35 | +- Constrained composition, spacing, alignment, panel, workflow, and decorative-shape controls. |
| 36 | +- Optional import of public GitHub repository metadata without login or a token. |
36 | 37 | - Local autosave of the last valid configuration. |
37 | | -- Versioned `profile.config.json` import/export. |
38 | | -- One-click download of the currently previewed SVG variant without creating a ZIP. |
39 | | -- Deterministic ZIP generation containing `README.md`, setup guidance, the saved config, and all four desktop SVG assets. |
40 | | -- Strict runtime validation, HTTPS-only generated links, contextual XML/Markdown escaping, and self-contained SVG output. |
41 | | -- WebMCP tools for agents to read or stage the same configuration used by the visible editor. |
| 38 | +- Versioned configuration import/export with automatic v1 and v2 migration. |
| 39 | +- Direct download of the currently previewed SVG. |
| 40 | +- Deterministic ZIP export containing everything needed for a profile repository. |
| 41 | +- Reduced-motion fallbacks and dark/light theme selection in the generated README. |
| 42 | +- Agent access through WebMCP tools that read or stage the same configuration used by the editor. |
42 | 43 |
|
43 | | -The Studio targets desktop browser widths of 1180 px or wider. Every generated hero variant uses a fixed 1200 × 610 desktop canvas. |
| 44 | +## Create a profile |
44 | 45 |
|
45 | | -## Use the studio |
| 46 | +1. Open the [hosted Studio](https://tfq0.github.io/animated-github-profile/) or run it locally. |
| 47 | +2. Choose a design, start with a blank profile, or load the clearly labeled fictional sample. |
| 48 | +3. Customize the profile content and desktop composition. |
| 49 | +4. Review the dark/light and animated/static previews. |
| 50 | +5. Resolve validation errors and inspect any design warnings in the Export step. |
| 51 | +6. Select **Save SVG** for one header or **Download ZIP** for the complete profile. |
| 52 | +7. Upload the generated `README.md` and `assets/` directory to the public GitHub repository named exactly like your username. |
46 | 53 |
|
47 | | -1. Open the app and choose one of the seven templates, then adjust its constrained layout controls if desired. |
48 | | -2. Select **Start a blank profile** or customize the clearly labeled fictional sample. |
49 | | -3. Work through Profile, Hero, workflow steps and shapes, Projects, Skills, Links, Media, Colors, and Sections. |
50 | | -4. Check the desktop preview in dark/light and animated/static modes. |
51 | | -5. Resolve validation errors and review any design warnings in Export. |
52 | | -6. To keep only the image, choose its dark/light and animated/static options, then select **Download SVG**. |
53 | | -7. To publish the complete profile, download the ZIP instead. |
54 | | -8. Upload its `README.md` and `assets/` directory to the public GitHub repository whose name exactly matches your username. |
| 54 | +Keep the exported `profile.config.json`. Importing it later restores the editable profile without requiring manual SVG changes. |
55 | 55 |
|
56 | | -Keep the exported `profile.config.json`; importing it later restores an editable profile instead of requiring manual SVG changes. |
| 56 | +## Exported bundle |
57 | 57 |
|
58 | | -## Deploy the Studio with GitHub Pages |
| 58 | +| File | Purpose | |
| 59 | +| :--- | :--- | |
| 60 | +| `README.md` | Generated GitHub profile content and theme/motion image selection | |
| 61 | +| `profile.config.json` | Reusable, editable source configuration | |
| 62 | +| `SETUP.md` | Profile-specific publishing instructions | |
| 63 | +| `assets/profile-header-dark.svg` | Dark animated desktop header | |
| 64 | +| `assets/profile-header-light.svg` | Light animated desktop header | |
| 65 | +| `assets/profile-header-dark-static.svg` | Dark reduced-motion desktop header | |
| 66 | +| `assets/profile-header-light-static.svg` | Light reduced-motion desktop header | |
59 | 67 |
|
60 | | -This repository includes [`.github/workflows/deploy-pages.yml`](./.github/workflows/deploy-pages.yml). The workflow runs the type-checker and tests, builds the Vite application with the repository's GitHub Pages base path, and publishes the generated `dist/` directory whenever a commit is pushed to `main`. A failed check stops the deployment. |
| 68 | +Structured remote media remains referenced by HTTPS URL. It is not copied into the ZIP or embedded in the generated header. |
61 | 69 |
|
62 | | -Complete this one-time setup after pushing the repository to GitHub: |
| 70 | +## Customization model |
63 | 71 |
|
64 | | -1. Open the repository on GitHub. |
65 | | -2. Select **Settings**, then **Pages**. |
66 | | -3. Under **Build and deployment**, choose **GitHub Actions** as the source. |
67 | | -4. Open the **Actions** tab and run **Deploy to GitHub Pages**, or push another commit to `main`. |
68 | | -5. Wait for the workflow to finish, then open `https://tfq0.github.io/animated-github-profile/`. |
| 72 | +`ProfileConfig` is the single source of truth for the editor, preview, README, SVGs, saved draft, and ZIP. |
69 | 73 |
|
70 | | -No deployment branch, generated `dist/` commit, server, API key, or repository secret is required. The published Studio is a public static website and stores editable drafts in each visitor's browser. |
| 74 | +| Area | Available controls | |
| 75 | +| :--- | :--- | |
| 76 | +| Design | Template, composition, content order, spacing, panel system, background pattern, console style, text alignment | |
| 77 | +| Hero | Headline, command, status checks, animation timing, workflow labels and shapes, footer labels | |
| 78 | +| Content | About text, repositories, skills, links, custom Markdown, structured images and GIFs | |
| 79 | +| Appearance | Curated system font stacks, dark/light palettes, corner radius, decorative shapes | |
| 80 | +| Output | Theme, motion mode, standalone SVG, full ZIP, configuration import/export | |
71 | 81 |
|
72 | | -The `animated-github-profile` repository publishes the Studio itself. It is separate from a generated profile repository named `<username>/<username>`: use **Download complete ZIP** inside the Studio when you want to publish a generated profile. |
| 82 | +Applying a design changes the visual system without replacing profile content. Loading a complete sample is a separate confirmed action because it replaces the current content. |
73 | 83 |
|
74 | | -To publish a later update, verify it locally and push it to `main`. GitHub Actions will replace the hosted version automatically: |
| 84 | +## Local development |
75 | 85 |
|
76 | | -```bash |
77 | | -npm run typecheck |
78 | | -npm test |
79 | | -npm run build |
80 | | -git push origin main |
81 | | -``` |
| 86 | +Requirements: |
82 | 87 |
|
83 | | -## Local development |
| 88 | +- Node.js `^22.13.0` or `>=24.0.0` |
| 89 | +- npm |
84 | 90 |
|
85 | | -Requirements: Node.js `^22.13.0` or `>=24.0.0` and npm. |
| 91 | +Install dependencies and start the development server: |
86 | 92 |
|
87 | 93 | ```bash |
88 | 94 | npm ci |
89 | 95 | npm run dev |
90 | 96 | ``` |
91 | 97 |
|
92 | | -The local app is served at `http://localhost:4173/`. |
| 98 | +Open `http://localhost:4173/` in a desktop browser. |
| 99 | + |
| 100 | +Run the complete verification pipeline: |
93 | 101 |
|
94 | 102 | ```bash |
95 | 103 | npm run typecheck |
96 | 104 | npm test |
97 | 105 | npm run build |
98 | 106 | ``` |
99 | 107 |
|
100 | | -The production site is written to `dist/`. Local builds keep portable relative asset URLs; the Pages workflow supplies the repository path during its production build. |
101 | | - |
102 | 108 | ## Architecture |
103 | 109 |
|
104 | 110 | ```text |
105 | 111 | src/ |
106 | | -├── domain/profile.ts # strict v3 config plus v1/v2 migration |
107 | | -├── domain/presets.ts # trusted template defaults and visual presets |
| 112 | +├── domain/ |
| 113 | +│ ├── profile.ts # strict v3 schema, defaults, and v1/v2 migration |
| 114 | +│ └── presets.ts # trusted visual presets |
108 | 115 | ├── generator/ |
109 | | -│ ├── svg.ts # pure four-variant desktop SVG renderer |
110 | | -│ ├── readme.ts # GitHub README renderer |
111 | | -│ ├── escape.ts # XML/Markdown/URL safety boundaries |
112 | | -│ └── artifacts.ts # deterministic file and ZIP assembly |
113 | | -├── services/github.ts # optional public repository import |
114 | | -├── components/ # editor fields and GitHub-like preview |
115 | | -├── webmcp.ts # agent-facing read/stage actions |
116 | | -└── App.tsx # editor state and workflows |
| 116 | +│ ├── svg.ts # four-variant desktop SVG renderer |
| 117 | +│ ├── readme.ts # GitHub README renderer |
| 118 | +│ ├── escape.ts # XML, Markdown, and URL safety boundaries |
| 119 | +│ └── artifacts.ts # deterministic file and ZIP assembly |
| 120 | +├── services/github.ts # optional public repository import |
| 121 | +├── components/ # editor fields and profile preview |
| 122 | +├── webmcp.ts # agent-facing read and stage tools |
| 123 | +└── App.tsx # editor state and workflows |
117 | 124 | ``` |
118 | | - |
119 | | -`ProfileConfig` is the single source of truth. The visible preview, README source, SVG files, saved config, and ZIP are all produced from the same validated object. Template, desktop layout, workflow-shape, and decorative-shape values are resolved through trusted renderer registries. Imported GitHub data becomes an editable snapshot; it is never a hidden dependency of later exports. |
120 | | - |
121 | | -## Privacy and output safety |
122 | | - |
123 | | -- The editor has no backend and requests no GitHub token. |
124 | | -- Drafts and the short-lived public repository cache stay in browser storage. |
125 | | -- Only public repository metadata is fetched directly from GitHub's public API. |
126 | | -- Generated SVGs contain no scripts, event handlers, remote fonts, external images, tracking, or live CI claims. |
127 | | -- Layout and decorative SVG output is generated only from validated, bounded controls and allowlisted shape primitives; raw CSS, SVG markup, and path data are not accepted. |
128 | | -- User-selected media is referenced by HTTPS URL in the README rather than copied into the ZIP or embedded in the generated hero SVG. |
129 | | -- Previewing or viewing remote media may send an ordinary request to its third-party host. Remote content can disappear or change independently of the Studio. |
130 | | -- Static fallbacks are generated for visitors who prefer reduced motion. |
131 | | -- Custom Markdown blocks raw HTML and neutralizes non-HTTPS link destinations in generated output. |
132 | | - |
133 | | -Users must own or hold permission for any media they add. Attribution alone does not grant permission, and adding media does not imply affiliation with or endorsement by its creator or rights holder. See [User content and third-party media notice](./USER_CONTENT_NOTICE.md). |
134 | | - |
135 | | -## License |
136 | | - |
137 | | -Animated GitHub Profile Studio is released under the [MIT License](./LICENSE). |
138 | | - |
139 | | -The MIT License does not grant rights to user-supplied content or third-party media. See [User content and third-party media notice](./USER_CONTENT_NOTICE.md). |
0 commit comments