Live public repository at github.com/znep/znep-link-cleaner. Every release (v1.0.0 – v21.0) is committed as a separate Git commit and tag containing the triggering user prompt and changelog.
Complete Git repository packfile synchronized 1:1 with github.com/znep/znep-link-cleaner (v1.0.0 – v21.0), including all 21 separate prompt-annotated commits and tags.
tag: v21.0v21.0: Google Play Publishing Version Bump (v21.0 / Build 21)
Author: Marc Slemko <marcs@znep.com> • Date: November 3, 2026 • Branch: main (HEAD)
> TRIGGERING USER PROMPT //
"Publishing to Google Play finished. Please bump the version code: increment `versionCode` by 1 in the app build.gradle(.kts) file, and set `versionName` to \"<new versionCode>.0\"."
Incremented versionCode from 20 to 21 and updated versionName to 21.0 following Google Play publishing completion for v20.0
Synchronized v21.0 release notes and triggering prompt across Android app, linked GitHub repo (README.md, CHANGELOG.md), and web portal (index.html, repo.html)
Committed v21.0 as a separate prompt-annotated commit on main, tagged v21.0, and pushed to https://github.com/znep/znep-link-cleaner (main, gh-pages, and GitHub Releases)
> TRIGGERING USER PROMPT //
"Does it make sense to setup the git repository so I can host the website on GitHub pages? Or something? Explain each option presented. / This happened trying to expand a Facebook link from a copy from a text field."
Decoded Facebook native Android app deep-link redirects (fb://native_post/<base64>?wtsid=..., fb://facewebmodal/f?href=..., fb://story/..., and intent://...#Intent;scheme=fb;...) directly into canonical https://www.facebook.com/<actorId>/posts/<postId> permalinks
Eliminated false-positive "Security Firewall // Unsafe Redirect Blocked" errors when Facebook mobile web pages attempt to launch the native fb:// app scheme during headless WebView expansion
Added DOM meta-tag fallback extraction (al:android:url, link[rel=canonical], og:url) in FacebookWebViewExpander and added wtsid, _rdc, and _rdr to KNOWN_TRACKING_PARAMS
Deduplicated stacked security advisory banners and clarified the output URL box header when warnings are present in CleanResultCard
Configured GitHub Pages static deployment (gh-pages + CNAMElinkcleaner.znep.com) and automated GitHub Releases binary asset publishing via the GitHub REST API
tag: v19.0v19.0: Google Play Publishing Version Bump (v19.0 / Build 19)
> USER PROMPT //
"Publishing to Google Play finished. Please bump the version code: increment `versionCode` by 1 in the app build.gradle(.kts) file, and set `versionName` to \"<new versionCode>.0\"."
Incremented versionCode from 18 to 19 and updated versionName to 19.0 following Google Play publishing completion for v18.0
Synchronized v19.0 release notes and triggering prompt across Android app, linked GitHub repo (README.md, CHANGELOG.md), and web portal (index.html, repo.html)
Committed v19.0 as a separate prompt-annotated commit on main, tagged v19.0, and pushed to https://github.com/znep/znep-link-cleaner
tag: v18.0v18.0: Unchanged Link Indicator, Randomized Cyberpunk 'Z' Glitch Engine, In-Place Text Replacement, Canonical AMP/Amazon Simplifier & Redirect Hop Trace
> USER PROMPT //
"Give me some ideas for useful features to add that are technically solid. This could include ux changes, but the less ux bloat the better. / Additionally, indicate clearly if the link is unchanged instead of requiring the user to compare the two versions of it. / Also make the Z jiggle more or do other cool visual things randomly."
Added an unmistakable [ ✓ UNCHANGED // ALREADY CLEAN ] emerald status badge, 0 B CHANGED pill, and VERIFIED CLEAN LINK // IDENTICAL TO INPUT notice so users never have to visually diff two identical URLs
Upgraded the Zlc logo with a 5-mode Randomized Cyberpunk Z Glitch & Stunt Engine (Seismic Tri-Chromatic Jiggle, Horizontal CRT Scanline Slice Tear, Kinetic Snap-Flip, High-Voltage Neon Overdrive with corner sparks, and Quantum Blink) in both the Android UI and web portal
Added zero-UI In-Place Android Text Selection Replacement (ACTION_PROCESS_TEXT write-back) inside editable text fields
Added Canonical URL Normalization for Google AMP cache/viewer URLs (*.cdn.ampproject.org/v/s/..., /amp) and verbose Amazon product paths (/dp/<ASIN>)
Added a collapsible Redirect Hop Chain Inspector recording every intermediate hop during link unwrapping and expansion
tag: v17.0v17.0: Google Play Publishing Version Bump (v17.0 / Build 17) & Tagged GitHub Release Sync
> USER PROMPT //
"Publishing to Google Play finished. Please bump the version code: increment `versionCode` by 1 in the app build.gradle(.kts) file, and set `versionName` to \"<new versionCode>.0\"."
Incremented versionCode from 16 to 17 and updated versionName to 17.0 following Google Play publishing
Synchronized v17.0 release notes and triggering prompt across Android app, linked GitHub repo (README.md, CHANGELOG.md), and web portal (index.html, repo.html)
Committed v17.0 as a separate prompt-annotated commit on main, tagged v17.0, and pushed to https://github.com/znep/znep-link-cleaner
> USER PROMPT //
"Analyze the app for security concerns including, but not limited to, dangers of processing untrusted links. Recommend improvements. [Selected: Block private IPs and non-HTTPS schemes in UrlExpander; Lock down Facebook WebView domains, cookies, and file access; Detect homograph, user@host, HTTP, and APK phishing risks; Expand automatically by default with a toggle for Offline-Only mode]"
Implemented UrlSecurityValidator and SafePublicDns in UrlExpander to block SSRF redirects against loopback, RFC1918 LAN, link-local, CGNAT, and cloud metadata IPs
Enforced strict http/https scheme validation across all redirect hops, offline link shims, and browser intent launches
Hardened FacebookWebViewExpander sandbox: locked navigation and subresource requests strictly to HTTPS official Meta domains, disabled file/content/DOM storage and cookies, and wiped cache/storage on teardown
Added anti-phishing & homograph detection that strips deceptive user:pass@host credentials and alerts on Punycode (xn--) lookalike domains, .apk/.exe downloads, raw IPs, and cleartext HTTP links
Added Offline-Only Mode toggle in Protection settings with on-demand shortlink expansion
tag: v15.0v15.0: Public GitHub Repo Integration, Live Embedded Commit Explorer & Per-Release Prompt-Annotated Git Commits
> USER PROMPT //
"I had to manually push changes to GitHub from the UI and it didn't include the prompt in the commit message as requested. I want every new version published to the website to also be pushed to GitHub as a separate commit. Also note the GitHub repo is public and should be linked to and embedded if possible."
Linked and embedded the public GitHub repository (https://github.com/znep/znep-link-cleaner) across the web portal (index.html & repo.html) and Android app UI
Added a live interactive GitHub Repository & Commit Explorer widget on linkcleaner.znep.com that streams real-time commit metadata and expandable prompt-annotated commit messages
Rebuilt and standardized all release Git commits (v1.0.0 through v15.0) as separate commits on main whose commit message bodies explicitly include the triggering User Prompt: and release changelog
Added automated GitHub remote push daemon (scripts/sync_github.py + server.py.env watcher) so every new version published to the website is pushed as a separate prompt-annotated commit to https://github.com/znep/znep-link-cleaner
tag: v14.0v14.0: Google Play Publishing Version Bump (v14.0 / Build 14)
November 2, 2026 • Build 14 • Domain: linkcleaner.znep.com
> USER PROMPT //
"Publishing to Google Play finished. Please bump the version code: increment `versionCode` by 1 in the app build.gradle(.kts) file, and set `versionName` to \"<new versionCode>.0\"."
Incremented versionCode from 13 to 14 and updated versionName to 14.0 following Google Play publishing
Synchronized v14.0 release notes and triggering prompt across Android app, linked GitHub repo (`README.md`, `CHANGELOG.md`), and web portal (`index.html`, `repo.html`)
November 2, 2026 • Build 13 • Domain: linkcleaner.znep.com
> USER PROMPT //
"Update the app logo to be a large Z with a smaller \"lc\". Where possible make the Z quiver slightly. It should be cyberpunk inspired but not too complicated. / Also ensure the GitHub repo published is a copy of the linked GitHub repo and the linked GitHub is updated with the prompts and changes for each release. Persist this request."
Redesigned app logo to a cyberpunk Zlc monogram (large Electric Cyan Z with Neon Purple chromatic glitch + smaller steady lc)
Added interactive & periodic quiver animation to the Z in the Android Compose UI and web portal
Synchronized workspace Git repository (`README.md`, `CHANGELOG.md`, annotated tags) with the published portal repo (`repo.html`, `ZnepLinkCleaner.bundle`, `ZnepLinkCleaner-git.zip`)
tag: v12.0v12.0: Google Play Publishing Version Bump, Direct Nginx Portal Hardening & Cloudflare Reverse-Proxy Support
November 2, 2026 • Build 12
> USER PROMPT //
"The website is down again. / Publishing to Google Play finished. Please bump the version code: increment `versionCode` by 1 in the app build.gradle(.kts) file, and set `versionName` to \"<new versionCode>.0\". / Remove the dns setup instructions from the website, they are only for me not the public. Also, the option A cloud flare setup is redirecting me to the run.app name not proxying. Note I'm on a free cloud flare plan."
Bumped versionCode to 12 and versionName to 12.0 following Google Play publishing
Removed internal DNS setup instructions from the public web portal and configured Nginx with absolute_redirect off
Hardened public web portal by configuring Nginx (PID 5) to serve /app/applet/download_portal directly + self-healing server.py daemon
November 2, 2026 • Build 11 • Domain: linkcleaner.znep.com
> USER PROMPT //
"Before we go further, I want to rename the app. The name should still indicate what it does but be unique in a way that might be legally protectable in the future. Perhaps include \"znep\"... Choose ZnepLinkCleaner. I own znep.com. The app can live under that name, and you can give me DNS entries to setup make linkcleaner.znep.com resolve to the website. Don't worry about backwards compatibility. Ensure you are recording prompts as part of the release notes and have clear messaging the app is a vibe coded proof of concept, and that this instruction sticks in the future."
Full rebrand to ZnepLinkCleaner across Android UI, system Share Sheet targets, and web portal (`com.znep.linkcleaner`)
Added prominent "Vibe-Coded Proof of Concept" messaging and embedded triggering User Prompts across all release notes
> USER PROMPT //
"Instagram links still have an exln param that looks like tracking. Should it be removed? If so, update the app and also look for other missing tracking params."
tag: v1.8.0v1.8.0: Share Sheet prominence, Direct Share shortcuts, full release history & 24/7 public portal watchdog
November 2, 2026 • Build 9
> USER PROMPT //
"The website is no longer public, ensure it remains public and analyze why previous attempts reverted. Always include the full release notes history on the webpage and within the app somewhere. You don't need to include prompts that don't modify the app itself. In addition, provide tips on how to make the app show up earlier and more prominently in the share dialogue. Modify the app if possible to help."
Added Direct Share Target Shortcut (shortcuts.xml), intent filter priority=100, and full release history viewer
> USER PROMPT //
"Add Option 1 (on-device headless Android WebView resolution) for Facebook share links (/share/p/, /share/r/, etc.) to resolve client-side JS redirects to canonical permalinks. Implement a red warning when Facebook share links fail to expand and an orange advisory for unexpanded shorteners. Include technical details for Facebook share links in the app without cluttering the main screen, and provide a config setting to disable Option 1 (enabled by default)."
Implemented FacebookWebViewExpander with on-device JS interception and Red/Orange expansion warnings
> USER PROMPT //
"Create a public download portal webpage hosting the signed APK, an offline Git bundle, a source archive, an interactive Git repository browser, and a visual system architecture diagram."
Generated architecture topology diagram, standalone Git Repository Browser (`repo.html`), and web download portal
> USER PROMPT //
"Restyle the UI with a sleek retro/cyberpunk monospace terminal aesthetic, add auto-copy on share and auto-close after reshare options, and design a custom adaptive launcher icon."
Added retro monospace typography, auto-copy on share, and auto-close after resharing
tag: v1.4.0v1.4.0: Strict cleaning mode & Amazon affiliate tag preservation
October 28, 2026 • Build 5
> USER PROMPT //
"Add a Protection / Rules tab with a toggle to preserve Amazon creator affiliate tags while stripping tracking parameters, plus a Strict Cleaning Mode for aggressive heuristic token removal."
Added Protection / Rules tab with Amazon affiliate preservation and Strict Cleaning Mode
tag: v1.3.0v1.3.0: Room SQLite local history & privacy telemetry stats
October 26, 2026 • Build 4
> USER PROMPT //
"Add a local Room database to record cleaned link history on-device and show privacy stats (links cleaned, trackers removed, and bytes saved)."
Implemented on-device Room SQLite history and privacy telemetry dashboard
> USER PROMPT //
"Support expanding shortened links like TikTok (vt.tiktok.com), Amazon (a.co, amzn.to), bit.ly, and t.co by following HTTP redirects before cleaning the destination URL."
Added `UrlExpander` to traverse HTTP 301/302 redirects for TikTok, YouTube, Amazon, bit.ly, and t.co
> USER PROMPT //
"Add Material 3 theming, automatic clipboard link detection with a quick-paste button, and a searchable dictionary of known tracking parameters."
Added Material 3 dynamic theming, clipboard link detection, and searchable tracking parameter dictionary
tag: v1.0.0v1.0.0: Initial release — pure on-device link sanitizer
October 20, 2026 • Build 1
> USER PROMPT //
"Build an Android app that receives shared links from the Android Share Sheet, strips tracking parameters like utm_source, fbclid, and gclid, and lets you copy or reshare the clean URL."
Initial release with offline tracker stripping (`utm_*`, `fbclid`, `gclid`) and Android Share Sheet integration