Generator of GitHub profile READMEs in the Material 3 Expressive style. The profile is set up on the site and installed into the profile repository. A GitHub Action then refreshes the stats every hour.
Open the generator · Live example · GitHub Marketplace
Live cards from github.com/metawka, refreshed hourly by the Action. The look follows the GitHub light or dark theme.
- Blocks: header, socials, about, tech stack, project cards, activity, streak, divider, link buttons.
- Live preview with editing by click, drag to reorder, hiding blocks.
- Material 3 color palette built from one color, a custom color or an image. Five palette styles, light and dark themes.
- Eight Material 3 shapes for the avatar, project cards and social icons.
- Typing animation for the subtitle and animations in every card. Animations can be turned off.
- Icon search across Material Symbols and Simple Icons.
- Templates, a shareable link to a setup and a "make one like this" page for any profile built with the generator.
- English and Russian interface.
- Open the generator and enter a GitHub username.
- Set up the blocks and press Download.
- Install to GitHub signs in with a GitHub code, creates the profile repository and uploads the files.
expressive-profile-demo.mp4
Manual setup: Download archive gives a ZIP for a public repository named exactly like the username. All files from it are uploaded to that repository, including the .github and .profile folders.
Signing in uses the GitHub device flow with the public_repo and workflow scopes. The token stays in the browser tab and is used only for this upload. The sign-in proxy is open source, see proxy/. If the repository already has a README, the generator asks before replacing it.
The first workflow run replaces the preview data with exact stats and pinned repositories. Then the profile updates every hour and commits only when the data changes, plus once a day for the calendar.
To change the profile later, edit profile.json in the repository or set it up again on the site and upload the new profile.json.
Profiles built with the generator can be added to this list with a pull request.
The archive contains this workflow:
name: Expressive Profile
on:
schedule:
- cron: "17 * * * *"
workflow_dispatch:
push:
paths:
- profile.json
- .profile/icons.json
permissions:
contents: write
jobs:
update:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: metawka/expressive-profile@v1
with:
token: ${{ secrets.PROFILE_TOKEN || github.token }}| Input | Default | Description |
|---|---|---|
token |
github.token |
Token for the GitHub API |
commit-message |
Updated profile |
Message of update commits |
With the default token the language chart counts public repositories only. Private repositories are counted with a personal access token saved as the PROFILE_TOKEN secret.
The generator site counts visits with GoatCounter on metawka.github.io only. No cookies are used and no personal data is stored.
Requirements: Node.js 20 or newer.
npm install
npm run devnpm run build builds the site into dist and the Action renderer into action/render.mjs.
The proxy folder contains the sign-in proxy deployed on Vercel. It forwards two device flow requests to GitHub and stores nothing.
The code is under the MIT License.
- Google Sans Flex and Roboto Flex: SIL Open Font License, see
fonts/. - Material Symbols: Apache License 2.0.
- Simple Icons: CC0 1.0. Brand icons belong to their owners.





