Generate nostalgic, meme-ready Clippy profile pictures right in your browser by layering transparent PNG parts (backgrounds, body shapes, heads, eyes, mouths, hands, decorations). Everything renders client-side onto a 512×512 canvas.
This project is a lightweight static web app that lets you compose a custom "Clippy" avatar. It grew out of the recent wave of people adopting paperclip-themed profile pictures. Our goal: make remixing fast and intuitive.
Key characteristics:
- 100% front-end: Just open
index.html - Layer ordering: Fixed for consistency
- Optional layers: Each non-body layer is optional (create minimalist variants)
- Export: Produces a transparent PNG
- Theme toggle: Light/dark mode stored locally
- Offline-ready: Works offline (static assets)
Not affiliated with Microsoft. All assets are fan-made for fun/parody purposes.
- 🎲 Randomize button to quickly explore combinations
- 🔄 Reset to base template
- 💾 Download as PNG (timestamped filename)
- ⌨️ Keyboard shortcuts:
R(randomize),C(clear) - 📱 Responsive layout (canvas + controls adapt to viewport)
- ♿ Accessible focus styles and semantic labeling of parts
- Open the site (or double-click
index.htmllocally). - Use the tabs to switch part categories.
- Click thumbnails to select/deselect (for non-body categories, you can choose "None").
- Press Randomize to explore.
- Press Download to save the current composite PNG.
Check out the live demo to try it out!
assets/ # PNG layer folders
├── bg/ # Background tiles
├── body/ # Core required body layer
├── head/ # Head variants
├── eyes/ # Eye expressions
├── mouth/ # Mouth expressions
├── hand/ # Hand/gesture overlays
└── deco/ # Decorative overlays (sparkles, etc.)
generate-manifest.js # Node script to build manifest.json list of PNGs
manifest.json # Generated mapping { folder: [files...] }
index.html # Single-page application (HTML + inline JS)
README.md # This file
Why-Is-Everyone-Changing-Their-Profile-Picture-to-Clippy.html #Article explaining the clippy movement
At runtime, the app fetches manifest.json to know which PNG files exist per folder. If you add or remove PNGs, regenerate the manifest.
Requires Node.js (>=14). From the project root:
node generate-manifest.jsThis will overwrite manifest.json with a fresh list.
- Drop a new
.pnginto the appropriate subfolder underassets/. - Run the manifest generation script.
- Reload the page. New part appears automatically.
Guidelines:
- Use 512×512 or proportional transparent PNGs aligned to the same coordinate system so layers stack cleanly.
- Keep filenames simple:
eyes_12.png, etc. - Avoid spaces; use underscores.
No build step is required (Tailwind CDN). Just regenrate the manifest if required, and open index.html.
- 🌱 Seeded randomization for shareable combos
- 🔗 URL hash/state encoding for direct sharing
- 🎨 Color tint/variation sliders
- 🖱️ Drag-to-reorder experimental layers
- ⚙️ Service Worker for explicit offline caching
- 📊 Lightweight analytics opt-out toggle
The interface uses buttons with aria-labels for thumbnails and maintains visible focus rings. Further enhancements planned:
- Add
aria-livestatus updates when a layer changes - Provide a text export of the current selection
All compositing happens locally in the browser. Downloaded images never leave your machine. Only Google Analytics (if kept) tracks aggregate usage.
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/AmazingFeature) - Commit your changes (
git commit -m 'Add some AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
If you find bugs or have feature requests, please open an issue.
"Clippy" is an iconic assistant concept originally from Microsoft Office. This project is a fan-made, non-commercial homage.
- Clone or download:
git clone https://github.com/Utkarsh-username/Clippy-PFP-Generator.git - (Optional) Run
node generate-manifest.jsif assets changed. - Open
index.htmlin a modern browser. - Randomize, tweak, download.
Enjoy building your paperclip persona! ✨📎