Skip to content

melvinchia3636/stickr

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

15 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

🧾 stickr

A React Native app for creating, browsing, and managing WhatsApp sticker packs. No ads, no bloat, no nonsense.

Note

On Supervised Vibe Coding
This project is built using supervised vibe coding: where intuition drives exploration, and discipline shapes what stays.

πŸ€” The Problem

I have dozens of Sacabambaspis sticker packs I wanted to download from the Sigstick official app, but a 30-second ad shows up on every single pack download. That's a massive waste of time, and you have to pay just to remove those pesky ads. I needed a way to download and manage sticker packs without sitting through ads, and I wanted full control over conversion quality for my own custom stickers without relying on bloated, ad-ridden third-party apps.

βœ… The Solution

So yeah, instead of wasting time sitting through ads, I've decided to waste more time developing my own custom app. Initially, I was hoping to ship the conversion mechanism within the app itself, but I faced a lot of issues with native FFmpeg bindings and cross-platform compatibility. So I ended up decoupling it into a separate self-hosted backend server.

The result is a React Native (Expo) mobile app paired with a lightweight Express.js + FFmpeg conversion server. Pick images from your gallery, paste a URL, or download packs from sigstick.com - the server handles conversion with automatic quality compression to meet WhatsApp's strict size limits. All sticker data is stored locally in SQLite. No ads, no accounts, no cloud dependency.

✨ Features

  • Sticker Conversion - Upload images/videos and convert them to WhatsApp-compliant 512Γ—512 WebP stickers, static or animated
  • Automatic Compression - Progressive quality fallback (100 KB limit for static, 500 KB for animated) ensures WhatsApp never rejects your stickers
  • Tray Icon Generation - Automatically generates 96Γ—96 PNG tray icons with palette reduction to stay under 50 KB
  • Sigstick Integration - Browse and download sticker packs directly from sigstick.com with a single tap
  • Local-First Storage - All sticker packs and metadata stored in SQLite via Drizzle ORM - no internet required after download
  • WhatsApp Import - One-tap import to WhatsApp via Android native modules (StickerContentProvider)
  • Minimal, Clean UI - Built with React Native Paper, Reanimated, and dark/light theme support
  • Self-Hosted Server - Run the conversion server on your own machine or network - no data leaves your control

πŸ–₯ Screenshots

image image image

πŸ”¬ Technologies Used

skills skills skills skills skills skills skills skills

Mobile App: React Native, Expo, TypeScript, Drizzle ORM, React Native Paper, Reanimated
Conversion Server: Express.js, FFmpeg, Bun, Morgan
Tools: cwebp, dwebp, webpmux (WebP Processing)

⌨️ Setup

Prerequisites

  • Bun (or Node.js 18+)
  • CLI libraries: ffmpeg cwebp, dwebp, webpmux
  • Android device/emulator for the mobile app

Server

cd server
bun install
bun start

The server runs on http://localhost:3000.

Mobile App

bun install
npx expo run:android

Configure the server URL in the app settings to point to your running server.

Building the APK

Warning

EAS Build does not support native Kotlin code. Since this app includes Android native modules for WhatsApp sticker integration, you must build locally using the Gradle method above.

Unfortunately in Expo's architecture, the android/ folder will always be completely wiped out and regenerated when doing prebuild, which also eliminates that native modules we've put inside. Therefore, before bundling the app into an APK, the app has to be prebuilt through a custom-written script. This generates the android/ folder and injects the custom native Kotlin code for WhatsApp sticker integration:

bun run prebuild

Then build the release APK:

cd android && ./gradlew assembleRelease

The APK will be at android/app/build/outputs/apk/release/app-release.apk. You can send it to your mobile app for installation, or simply install through adb if it's available (which it should):

adb install app-release.apk

πŸ§ͺ Running Tests

cd server
bun test

πŸ”Œ API Endpoints

Method Endpoint Description
GET /api/health Health check
POST /api/convert Convert image/video to WebP sticker (accepts url or fileData + animated)
POST /api/tray Generate 96Γ—96 PNG tray icon (accepts url or fileData)

πŸ“ˆ Status

All core functionality is complete. Custom sticker creation, sigstick downloads, tray icon generation, and WhatsApp import are all working. If you encounter any bugs, feel free to file an issue in this GitHub Repo.

πŸ™ Credits

  • Gemini 5.5 via Antigravity - Assisted with debugging and conversion logic
  • Deepseek via OpenCode - Assisted with implementation and boring tasks
  • My Brain - For all the ideas, late-night debugging, and questionable life choices
  • WhatsApp Stickers - Demo app reference for Android sticker integration
  • sigstick.com - For all the gorgeous sacabambaspis sticker packs

πŸ“„ License

This project is licensed under the MIT License.