Skip to content
ShenepoyPublic

About

Fukaha (فكها) — untangle social links from the system share sheet

Resources

Stars

1 star

Watchers

0 watching

Forks

Repository files navigation

Fukaha

Fukaha - فكها

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).

release repo Obtainium kotlin android license

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.


What you get

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.

Screenshots

Share sheet — clean, embed, or download Settings Preferred embed fixers About — shenepoy

Dark theme

Share sheet — dark Settings — dark Preferred embed fixers — dark About — dark


Install

Android

Option
Obtainium (recommended) Obtainium — tracks GitHub Releases. Builds before v0.4.2 used a one-off CI debug key; uninstall once, then install 0.4.2+. Later updates keep the same signature.
APK Download from latest release

iOS

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.

Web / PWA

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.


Develop

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.apk

Open 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.


Architecture (short)

  • 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 in localStorage
Share menu → Fukaha → clean | embed | file → system share again

CI / CD

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.0

Contributing & secrets

This 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.


License

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.


Made by shenepoy · GitHub

About

Fukaha (فكها) — untangle social links from the system share sheet

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages