Wes Ellis./ a personal notebook
Technology. Stories. Side projects.
A few things worth writing down.
← Back to Side Projects

Side Projects

Browser Profile Icons: Telling Your Chrome, Edge and Firefox Profiles Apart at a Glance

Rows of identical cream-colored mailboxes mounted on a bright yellow wall.

Part 4 of the thread Desktop tinkering

PROJECT AT A GLANCEOpen source
What it is
Desktop app
My role
Creator
Year
2025
Built with
  • Python
  • customtkinter
  • Pillow
  • JavaScript
  • pytest
THE SHORT VERSION4 points
  • A Python desktop app, ProfilePop, generates custom profile icons with your own text, colors, shapes and effects.
  • Companion extensions for Chrome, Edge and Firefox handle profile switching, search, keyboard shortcuts and JSON export/import.
  • There's a library of 59 icon templates across 11 categories, from Work and Coding to Gaming and Finance.
  • Close the browser before generating icons. No Safari extension, and no automatic profile detection.

Once you've got more than two or three browser profiles, they start to blur together. Same browser icon on the taskbar, same default avatar, and you only find out you're in the wrong one after you've logged into something. A custom icon per profile fixes that, but making them by hand is a chore nobody wants to repeat.

browser-profile-icons is my answer to that. It's two things in one repo: a desktop app that makes the icons, and a set of browser extensions that help you manage and jump between profiles.

What it does

The desktop side is ProfilePop, a Python GUI built on customtkinter and Pillow. You pick a browser from the sidebar, set up the look in the right-hand panel, and hit "Generate All Icons." There's an optional step to create desktop shortcuts that wear the new icons, which is the part that actually makes the taskbar readable.

What you can change:

Option What you get
Shapes Circle, rounded, square, hexagon, badge
Colors 20+ preset colors, with gradient support
Effects Shadow, glow, border, opacity
Browsers Chrome, Edge, Firefox, Brave, Opera, Vivaldi, Safari
Platforms Windows, macOS, Linux

Settings persist between runs, and you can export and import your profile configurations so you're not rebuilding them on a new machine.

The extensions

The other half lives in the browser. There are three extensions: Chrome and Edge on Manifest V3, Firefox on Manifest V2. They cover the same ground: add a profile, rename it, click to switch, search and filter by name, and back everything up to a JSON file. The Chrome one also hooks into the context menu and can show notifications.

Keyboard shortcuts are where it earns its keep. Alt+P opens it, and Ctrl+Shift+1, 2 and 3 jump straight to profiles. If you're the kind of person who tidies the bookmarks bar down to a handful of short labels, you'll probably like having profiles on hotkeys too.

Templates

Version 3.0 added a template library: 59 pre-built icons across 11 categories. Professional, personal, education, entertainment, creative, social media, business, productivity, finance, medical and legal, plus a general bucket. The extensions have a gallery where you can browse by category and apply one in a click.

The templates also live in a small Python module, icon_templates.py, if you'd rather script it. There are get_template(), get_templates_by_category() and search_templates() functions, so pulling the "work" template or everything in "professional" is one line each.

Using it

The desktop app runs from source:

git clone https://github.com/wesellis/browser-profile-icons.git
cd browser-profile-icons
pip install -r requirements.txt
python ProfilePop_Modern.py

The extensions load unpacked. In Chrome or Edge, open the extensions page, turn on Developer mode, click "Load unpacked" and point it at chrome-extension or edge-extension. In Firefox, go to about:debugging#/runtime/this-firefox, choose "Load Temporary Add-on" and pick the manifest.json in firefox-extension.

Tip

If icons don't generate, close the browser first. On Windows, permission errors usually go away if you run the app as administrator.

There's a pytest suite too (50+ tests, per the README) covering the templates, the extension manifests and the export format. pytest -v runs the lot.

Rough edges

Version 3.0 was mostly a cleanup. Earlier builds had a cloud sync feature, a Pro tier with payments, and some analytics code. None of it really worked, so it's gone, and I'd rather ship less that works than more that doesn't.

Heads up

There's no Safari extension (Safari's restrictions got in the way), and the extensions can't detect your existing browser profiles automatically because the browser APIs don't expose that. You add them yourself.

The extensions aren't on the web stores yet either. The build script produces store-ready packages, but publishing is still on the optional list, along with pulling the template gallery into the desktop app, pushing the library past 100 templates, a visual template creator and local sync between browsers.

It sits alongside my custom new tab page in the pile of small things I've built to make the browser a little less annoying. MIT licensed, so take it apart if you want.