πΌοΈ UPP β UNIVERSAL PROFILE PICTURE UPDATER FOR GITHUB
Automatically picks any image (SVG, PNG, JPG) from the Pictures/ folder of this repository, converts it to a small PNG (< 1β―MB), and sets it as your personal avatar, organization avatars, or all at once.
Fully automated β with 2FA support, a headless browser, and caching for speed.
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β¨ FEATURES
β’ Modeβbased uploads β p (personal), o:<org> (org), a (all)
β’ Accepts .svg, .png, .jpg, .jpeg β with or without extension
β’ Always converts to PNG, resizing to 400Γ400 (preserving aspect ratio) and
compressing to < 1β―MB; SVG files are rendered at high density (300β―DPI)
β’ Handles twoβfactor authentication (TOTP) automatically
β’ Multiβtarget: update personal + multiple organisations in one run
β’ Emojiβrich logs: β
β π π π
β’ Debug screenshots saved only on failure (no noisy commits on success)
β’ Fast β Playwright binaries are cached, typical run < 30β―seconds
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ π§ ONEβTIME SETUP
-
Enable Actions write access
- Go to Settings β Actions β General
- Under βWorkflow permissionsβ, select Read and write permissions
- Save. This lets the workflow push debug screenshots to the repo.
-
Add these secrets (Settings β Secrets and variables β Actions)
Secret Description GH_LOGIN_USERNAME Your GitHub username GH_LOGIN_PASSWORD Your GitHub password GH_2FA_SECRET (if 2FA enabled) TOTP base32 setup key GH_ORGANIZATIONS (only for [a]mode) commaβseparated org usernames,example: `myorg1,myorg2`π How to get the TOTP secret Settings β Password and authentication β Authenticator app β Edit β Reconfigure β Click βSetup keyβ below the QR code β copy the string.
-
Place your images Create a folder named Pictures (if it doesnβt exist) and put your SVG / PNG / JPG files inside. Case does not matter.
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ π USAGE
-
Go to the Actions tab β UPP β Run workflow.
-
In the input field, type the file name and the target mode.
Format:
<filename>[<mode>]Modes
Mode Meaning [p]Personal account (default if omitted) [o:orgname]Specific organisation [a]Personal + all organisations (needs GH_ORGANIZATIONSsecret)Combine modes with a comma:
logo[p],[o:design] -
Examples
GozoSag[p]β personal avatar fromGozoSag.svgicon[o:dev-team]β only org βdev-teamβ (any extension)banner[a]β personal + every org inGH_ORGANIZATIONSphoto.jpg[p],[o:hr]β personal & βhrβ org, usingphoto.jpg
-
Click Run workflow.
The action will:
- Look for your file in
Pictures/(if you give an extension, it uses exactly that; otherwise it tries.svgβ.pngβ.jpgβ.jpeg) - Convert / resize to a small PNG (always reprocessed to ensure the size limit)
- Log into GitHub (2FA filled automatically if secret is set)
- Upload the image to every requested profile
- Save screenshots to
Debug/only on failure (then commit them)
- Look for your file in
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ π LOGS (example)
π Launching browserβ¦ π Entering 2FA code β Logged in successfully π― Uploading to p (https://github.com/settings/profile) π Trying to open upload dialogβ¦ π File attached β p updated π― Uploading to o:myorg (https://github.com/organizations/myorg/settings/profile) β o:myorg updated β All targets updated successfully
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ π TROUBLESHOOTING
-
βFile not foundβ β Check that the file is inside the
Pictures/folder. If you typed justphoto, it searches forphoto.svg, thenphoto.png, thenphoto.jpg, thenphoto.jpeg. Use the exact extension to be precise. -
β2FA wrongβ β Make sure
GH_2FA_SECRETis the base32 setup key (not a 6βdigit code, not the QR image). Time is synced automatically. -
Push / identity errors β Confirm that Actions permissions are set to βRead and writeβ (Step 1) β this workflow needs to commit debug files.
-
For
[a]mode β the secretGH_ORGANIZATIONSmust contain the exact organisation usernames, separated by commas (no spaces). Example:myorg,another-org -
Slow install β The first run installs Playwright and Chromium. Subsequent runs use a cache and will complete in under 30 seconds.
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ π CREDITS
Build by Plangto and DeepSeek Powered by Playwright, Puppeteer Stealth, and GitHub Actions. TOTP generation uses only Node.js crypto - no external libraries.