Ackless is an open-source browser extension for Chrome, Firefox, and other WebExtensions-compatible browsers. It hides common Australian Welcome to Country and Acknowledgement of Country blocks on Australian websites and can rename selected Aboriginal place names to common Australian place names.
Australians do not need to be “welcomed” to their own country, nor reminded on every page load to acknowledge Traditional Owners—we are already citizens, neighbours, and daily users of the same public life. Whatever you think of acknowledgement in other contexts, the same repeating banners, modals, and footers across Australian sites add little beyond interruption. For many people they feel like empty performance: virtue signalling that annoys more than it informs.
The project is intentionally small: no telemetry, no remote rules, no bundled analytics. TypeScript sources compile and bundle into dist/ for loading and packaging.
This is an early prototype. It uses conservative text matching and DOM hiding rules, so expect false positives and false negatives while the ruleset matures.
- Runs on
.aupages, pages marked asen-AU, and extra sites you enable from the popup. - Looks for common acknowledgement phrases, including
Welcome to Country,Acknowledgement of Country,Traditional Owners, and related wording. - Hides the closest matching banner, modal, section, paragraph, or acknowledgement block.
- Renames a small, auditable list of place names, such as
UluṟutoAyers RockandK'garitoFraser Island. - Watches for late-loaded content and hides matching blocks after the page changes.
- Provides a popup toggle to enable or disable the extension, plus an option to enable matching on the current non-
.ausite.
Ackless keeps a local activity log on your device for the last 24 hours, collated across all sites — not per-page totals and not lifetime stats. Nothing is sent to a server.
Like ad blockers, the extension icon shows a red badge with how many acknowledgement blocks were hidden in the last 24 hours (all sites combined). The badge is hidden when the count is zero, shows the exact number up to 999, then 999+ for higher counts. It updates as blocks are hidden and clears when you wipe activity.
The popup stays minimal:
- Enable/disable toggle
- View activity — opens the full Activity page in a new tab
- A one-line summary:
X hidden · Y renamed in last 24 hours - Enable on this site for non-
.aupages you want included
Open it from the popup (View activity) to review everything from the last 24 hours:
- Overview — total hidden blocks and place-name renames
- What was hidden — each block with a text excerpt, the site hostname, and when it happened
- Place names renamed — global from→to counts (e.g.
Naarm→Melbourne) - Export JSON — download the raw activity data
- Clear all — wipe the 24-hour log and reset the icon badge
Events older than 24 hours are dropped automatically. Hostnames are stored only as context on each log entry — there are no per-site leaderboard tables or URL paths.
Ackless is designed to align with Mozilla’s add-on policies and the Firefox Add-on Distribution Agreement.
| Resource | Purpose |
|---|---|
| SOURCE_SUBMISSION.md | Build steps for AMO reviewers |
| docs/AMO_LISTING.md | Draft listing text and reviewer notes |
| PRIVACY.md | Privacy policy URL for the listing |
Before listing on AMO:
- Set
browser_specific_settings.gecko.idinmanifest.jsonto your Mozilla developer add-on ID (replace the placeholderackless@example.com). - Build the signed XPI:
bun run build:firefox - Attach source zip:
bun run package:amo-source→ uploaddist/ackless-amo-source.zipwith each version.
data_collection_permissions.required is ["none"] with strict_min_version 140.0 so Firefox uses built-in data-collection disclosure (no off-device transmission).
- It does not collect analytics or send activity stats to any server.
- It does not send full page URLs anywhere (activity entries store hostnames only, locally).
- It does not keep activity beyond 24 hours.
- It does not use remote filtering lists.
- It does not use remote place-name mappings.
- It does not sync activity stats across devices.
- It does not target non-Australian websites unless you explicitly enable the current site.
Store listings mean review queues and policy checks. For a small open-source extension, you can ship builds yourself and keep the install path short.
- Download and unzip a release archive (or clone this repo and run
bun install && bun run build). Use thedistfolder from the build output as the unpacked extension root (it containsmanifest.json). - Open
chrome://extensions(oredge://extensions, and so on). - Turn on Developer mode.
- Click Load unpacked and choose the folder that contains
manifest.json.
Users only enable Developer mode once. After that, updates are “replace the folder” or load again from a fresh unzip. For teams, managed installation via enterprise policy is another option if you control devices.
- Temporary load (
about:debugging→ Load Temporary Add-on) is fine for development only; the add-on disappears when Firefox closes. - For normal Firefox, Mozilla requires extensions to be signed. You do not have to list on addons.mozilla.org: you can request signing for self-distribution, get back a signed
.xpi, and host it on GitHub Releases (or your site). Users install via about:addons → gear menu → Install Add-on From File…, or you link to the file if your hosting policy allows. See Mozilla’s docs for signing and distribution.
So the low-friction pattern for both engines is: GitHub Releases with a Chrome zip (unpacked bundle) and a signed Firefox .xpi, plus the short steps above in the release notes.
Run bun install then bun run build once so dist/ contains the packaged extension.
- Open
chrome://extensions. - Enable
Developer mode. - Click
Load unpacked. - Select the
distfolder from this repo.
- Open
about:debugging#/runtime/this-firefox. - Click
Load Temporary Add-on. - Select
dist/manifest.json.
This repo uses Bun for installs and scripts (package.json / bun.lock). Ultracite drives lint + formatting via Oxlint/Oxfmt (oxlint.config.ts, oxfmt.config.ts). Install dependencies once:
bun installAuto-fix lint + formatting issues:
bun run formatValidate (Ultracite / lint / format, TypeScript check, unit tests, production build, web-ext lint):
bun run checkRun tests alone:
bun run testBuild distributable archives (these wrap the dist/ output — always run bun run build first):
bun run build:chrome
bun run build:firefoxGitHub (or other) release artifacts must be produced from dist/: either attach the outputs of bun run build:chrome / bun run build:firefox, or zip the dist/ folder after bun run build. Do not publish the raw TypeScript src/ tree as an installable extension; browsers need compiled JS and the packaged manifest paths under dist/.
Good issues include the affected URL, browser, what was hidden, and what should have happened. Please do not paste private account pages, session cookies, or screenshots containing personal information.
When adding new match rules, prefer specific phrases over broad political or cultural terms. The goal is to hide acknowledgement UI blocks, not unrelated page content.
When adding place-name replacements, keep them specific and publicly reviewable. Avoid broad word replacements that could change unrelated text.
MIT