Untangle social links. Share them clean.
From the system share sheet — strip tracking, rewrite to embed-friendly hosts,
or download media and share the file. Kotlin Multiplatform · Android (+ iOS WIP).
Latest release · Web app · What you get · Screenshots · Install · Develop · العربية
The name Fukaha comes from Arabic فكها (fakkahā): untangle / unwrap it — pulling tracking and clutter off a shared link.
| Share sheet | Appears in Android’s system share menu for text/links — overlay sheet, not a full browser app. |
| Clean link | Strips utm_*, fbclid, igshid, and similar noise; normalizes hosts. |
| Embed link | Rewrites to fixer hosts (fixvx, ddinstagram, fxTikTok, …) from several community collections of embed-fixer lists. |
| Media file | Optional download via your own Cobalt instance, then re-share as a file. |
| Settings | Default action, per-network fixer, Cobalt URL/key, short-link resolve, EN/AR, theme, update check. |
| Lite | No background sync, no accounts — network only when you share. |
| Web app | The same core at fukaha.shenepoy.com — installable, offline, and it joins the Android share sheet once installed. |
Default actions
| Action | Behaviour |
|---|---|
| Ask each time | Show the sheet (clean / embed / download / copy). |
| Clean / Embed / Download | Run immediately, then open the system share chooser. |
| Option | |
|---|---|
| Obtainium (recommended) | |
| APK | Download from latest release |
Not on the App Store yet. CI builds an unsigned Simulator app (no Apple Developer account required). To run locally or later ship with a paid team, see iosApp/README.md.
fukaha.shenepoy.com — installable, works offline, no account.
Install it and Fukaha joins the system share sheet, same as the app. That part is Chromium on Android only: iOS has no Web Share Target at any version, so on iPhone it is Add to Home Screen plus the paste box.
Embedder reachability checks work here too, run manually from Settings. In the Android app, the checker uses HTTP status codes and a bounded request pool; the browser is more limited because CORS stops it reading a third-party response. A browser no-cors request resolves for any HTTP status and rejects only on a network-level failure, so browser results remain reachability checks rather than reliable 404 detection. Short-link resolving and media download do stay app-only — following a redirect means reading a response the browser will not hand over.
Requirements: JDK 17 · Android SDK 37 · Android device/emulator (minSdk 26). iOS Simulator builds need a Mac + Xcode — see iosApp/README.md.
export ANDROID_HOME=~/Android/Sdk # or your SDK path
./gradlew :shared:testAndroidHostTest
./gradlew :composeApp:assembleDebug
adb install -r composeApp/build/outputs/apk/debug/composeApp-debug.apkOpen Fukaha for Settings / About, or share any social URL into it from another app.
Watch install: with a device or emulator connected, run ./gradlew -t :composeApp:installAndLaunchDebug (or the Cursor/VS Code task Android: watch install + launch). Gradle rebuilds, reinstalls, and relaunches Settings on save. This is not Compose Hot Reload / Live Edit — the app restarts and UI state is not kept.
Modules
| Module | Role |
|---|---|
shared |
URL clean, embed catalog, Cobalt download, settings models (Android + iOS + web) |
composeApp |
Android UI — share sheet + Settings/About |
iosApp / iosShareExtension |
SwiftUI Settings + Share Extension (XcodeGen + Simulator CI) |
webApp |
Kotlin/JS PWA — plain DOM UI over shared, no Compose |
Web: ./gradlew :webApp:jsBrowserDevelopmentRun --continuous serves it on localhost:8080 and rebuilds on save. The service worker only registers off localhost, so a dev server never fights a stale cache. ./gradlew :webApp:jsBrowserDistribution writes the deployable output to webApp/build/dist/js/productionExecutable. Icons are committed; regenerate them from the logo with webApp/scripts/generate-icons.sh (needs rsvg-convert).
Media download: set your own self-hosted Cobalt instance URL (and API key if required) under the collapsible Media download section in Settings (collapsed by default). There is no working public default — the public cobalt.tools API will not work with this app. Download options stay visible but disabled until a valid http(s) instance URL is configured.
- Shared core (KMP) — parse URL → clean → embed rewrite → optional Cobalt download
- Android — translucent
ShareActivity+ Material 3 Compose Settings - iOS — Share and UI Action Extensions calling
FukahaIosFacade+ App Group settings - Web — Kotlin/JS calling the same
FukahaBridge, DOM UI, settings inlocalStorage
Share menu → Fukaha → clean | embed | file → system share again
| Workflow | Trigger | What it does |
|---|---|---|
| CI | push / PR to main, or manual |
Shared unit tests, debug APK, web bundle, unsigned iOS Simulator app |
| Release | tag v* / manual |
Release APK artifact + GitHub Release |
| Deploy Web | push / PR touching webApp or shared, or manual |
Firebase Hosting — preview channel on PRs, live on main |
Versions follow Lamha-style CalVer: YY.0M.MICRO (the current version is 26.09.0). The canonical value lives in VERSION; use bash scripts/ci/next_version.sh to calculate the next version for the current UTC month.
Tag a release:
git tag v26.09.0
git push origin v26.09.0This repository is public. Never commit keystores, API keys, or local.properties. Use Settings in-app for Cobalt credentials.
Release APKs are signed with a keystore stored only in GitHub Actions secrets (RELEASE_KEYSTORE_BASE64, RELEASE_STORE_PASSWORD, RELEASE_KEY_ALIAS, RELEASE_KEY_PASSWORD). Keep a private backup of fukaha-release.jks and key.properties — losing them means Obtainium users cannot update in place.
Web deploys use FIREBASE_SERVICE_ACCOUNT, a service-account JSON for the fukaha-shenepoy Firebase project, stored the same way.
GNU Affero General Public License v3.0 — free software; if you modify and run it as a network service, you must offer the corresponding source.
Full text: LICENSE.
Embed fixer catalog credit: several community collections, including Lexedia, FixTweetBot, mohsreg, meqativ, Postrediori, and EmbedFixer, plus the authors of the listed services.







