Open-source project
adriankarlen/textfox avatar
adriankarlen/textfox

textfox restyles Firefox from a chrome.css file in your profile

firefox theme for the tui enthusiast

1,701 stars57 forksCSSMPL-2.0

At a glance

What is it?
textfox is a CSS theme for Firefox aimed at people who prefer terminal style chrome, laid down as a chrome/ directory plus a user.js inside the profile. It ships an install script and a home-manager module, and it deliberately hard codes no colours of its own.
Who is it for?
Adopt textfox if you want a compact, terminal flavoured Firefox chrome and you are willing to maintain a file inside your profile directory. Skip it if you rely on Firefox's own add-on updates or if your distribution repackages chrome, since nothing in the repository pulls upstream Firefox CSS changes back in.
Can I use it commercially?
Yes, with conditions. MPL-2.0 is a weak copyleft licence: you can use it inside commercial and closed-source software, but if you distribute changes to its own files, you must publish those changes under the same licence.
Is it still maintained?
Yes. The repository last received commits 25 days ago.
What is it written in?
Mainly CSS, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 20, 2026, and from our analysis. They are not legal advice.

Editorial analysis

A theme that works by replacing Firefox chrome CSS

textfox is a stylesheet, not a fork and not an add-on. It targets the parts of Firefox that live in your profile directory: the chrome.css cascade that draws toolbars, tabs, the urlbar and the window controls. The repository is mostly CSS, with user.js at its root and a chrome directory holding the overrides.

The reason this matters is how Firefox loads UI styling. Any file named userChrome.css or userContent.css inside a profile is applied on top of the shipped stylesheets, so textfox relies on the same mechanism a hand written userChrome.css would use. The difference is volume and intent. Instead of one file you patch yourself, you get a coordinated set of rules that strip the toolbar down to a text row, tighten tab shapes and set a monospace font, sized at 15px with Fira Code in the documented configuration.

The README calls it "a firefox theme for the tui enthusiast", and that framing is accurate about the result. Nothing about the browser engine changes. Rendering, networking and security behaviour stay exactly where Firefox put them. What you are evaluating is appearance, and the risk surface is limited to files that can be deleted to undo the whole thing.

The install script copies chrome/ and leaves your own config.css alone

The documented install path is a POSIX shell script. You clone the repository, enter the clone directory and run `sh tf-install.sh`, then follow the prompts the script prints. The README flags this twice, once as IMPORTANT because the script automates file writes, and once as NOTE describing what it actually writes: it copies the contents of the repository's chrome directory into the path you specify, and it does so in a way that leaves a config.css or any other CSS file that is not part of the repository in place. That merge behaviour is the design decision worth noticing. Your own overrides survive the install, so a later update is not a clean overwrite of your customisations.

Nix users get the same files from a home-manager module instead, imported and enabled with a profile list:

nix
# home.nix
imports = [ inputs.textfox.homeManagerModules.default ];

textfox = {
    enable = true;
    # Replace with the names of profiles, defined in home-manager, or find existing ones in `about:profiles`
    profiles = ["profile_1" "profile_2"];
    config = {
        # Optional config
    };
};

The README gives a second Nix route for people using home-manager.lib.homeManagerConfiguration rather than nixosConfigurations, where the module goes into the homeConfigurations modules list and pkgs is pinned with nixpkgs.legacyPackages.x86_64-linux.

The manual route is the same destination without the script. Open about:profiles, find the profile name Firefox shows, such as Profile: Default, open that profile's root directory, move the chrome directory and user.js there, and restart Firefox. Two things in that sequence are load bearing. The files must sit at the profile root, not in a subdirectory, and Firefox has to be restarted before the cascade is re-evaluated.

The README also states that the preference file is not optional decoration. If you would rather not accept a wholesale user.js, it asks you to read the file and apply its settings by hand in about:config, because the CSS depends on them. Which specific preferences are required is not spelled out, so reading user.js before copying it is the responsible first step.

Horizontal tabs are off until you flip a variable in config.css

textfox handles horizontal tabs by making the layout choice configurable. Out of the box the theme presents the vertical tab strip shown in the preview images. To get horizontal tabs you edit config.css and change the `--tf-display-horizontal-tabs` variable to `block`. The value is a CSS display keyword rather than a boolean, which tells you the variable is wired straight into a display property for the tab strip container. Leaving it at its shipped value keeps the strip hidden. This is the theme's no hard coding philosophy applied to structure as well: the choice is exposed as a variable in a file you own, not a branch you have to check out.

If you install through home-manager, the same decision is expressed as a module option instead. The documented config block contains a tabs group with horizontal.enable and vertical.enable keys, and the example sets both to true. Whether turning both on at once renders sensibly is not addressed anywhere in the README, so test that pairing on a throwaway profile first.

Colours are deliberately left to the Firefox Color extension

The preview screenshots use Rosé Pine Moon, and the README is quick to add that this is not textfox's own palette. The theme tries to not hard code any colours at all, and the recommended route is the Firefox Color extension.

That split has real consequences for adoption. Out of the box you get shapes, spacing, borders and typography, not a specific tint. Anyone expecting to clone the repository and see the screenshots will be disappointed until Firefox Color is installed and configured. The colour variables the theme reads are not enumerated, so matching a screenshot means reading the CSS.

The same borrowing shows up in the icon handling. The README states that the icon configuration uses code originally from ShyFox and therefore the same settings, configured through about:config. That matters if you already run ShyFox: the settings are shared vocabulary, so a change to one can change the other.

What a home-manager user configures that a manual user edits by hand

The Nix flake exposes inputs.textfox.homeManagerModules.default, which can write the same files or, more usefully, generate them from the config block shown in the README. The documented options map one to one onto things you would otherwise edit by hand: background.color, a border block with color, width, transition and radius, and a run of display flags such as displayWindowControls, displayNavButtons, displayUrlbarIcons, displaySidebarTools and displayTitles.

Layout is covered too. navbar takes margin and padding, bookmarks take an alignment, font takes family, size and accent, and textTransform is settable, with uppercase given as the example. The most distinctive key is newtabLogo, whose documented value is the ASCII textfox banner escaped as a CSS string with \A line separators, which is how a multi line logo gets into a generated stylesheet.

Because those files are generated, a home-manager user never edits chrome CSS by hand and can regenerate on every rebuild. A manual user has no equivalent, and any drift between generated CSS and what a future release expects is theirs to manage. If you use both a flake and a manual install, be aware the two paths write the same files in your profile directory.

Removal is manual, and only the newest backup survives

Uninstallation is the mirror image of installation. The script route is `sh tf-uninstall.sh`, described with the same caution about automated file removal. The manual route is four steps in about:profiles: open the profile root, delete the chrome directory, delete user.js only if textfox put it there, and restart Firefox.

The backup story is the weakest part of the design. If a chrome directory existed before the install, the script saved it as chrome-YYYYMMDD_HHMMSS.bak inside the profile, and restoring it means renaming that file back to chrome. Only the most recent backup is offered on the way out. The README does not say what happens to an earlier one, and it does not document rollback for the preferences that user.js wrote. Those settings survive deleting the file, because user.js writes preferences into the profile's own preference store rather than reading them from that file at runtime. If the pre-install state of your profile matters to you, export it first.

Editorial conclusion

Adopt textfox if you want a compact, terminal flavoured Firefox chrome and you are willing to maintain a file inside your profile directory. Skip it if you rely on Firefox's own add-on updates or if your distribution repackages chrome, since nothing in the repository pulls upstream Firefox CSS changes back in. Before installing, read chrome/ and user.js yourself, and pick a profile you can undo by deleting those two paths.

Frequently asked questions

How do I install textfox on Firefox?

Clone the repository and run `sh tf-install.sh` inside the clone, or copy the chrome directory and user.js into the profile root you find at about:profiles and restart Firefox. Both routes are documented in the README.

Why does textfox not look like the screenshots?

The theme does not hard code colours, and the README points to the Firefox Color extension as the recommended way to colour Firefox with textfox. The preview images use Rosé Pine Moon, which is a separate Firefox theme.

How do I switch textfox to horizontal tabs?

Change the `--tf-display-horizontal-tabs` variable in your config.css to `block`. Home-manager users can set `tabs.horizontal.enable = true` in the textfox config block instead.

Official sources

  1. adriankarlen/textfox on GitHub
  2. Issues
  3. License: MPL-2.0
  4. Project website
  5. README
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/adriankarlen-textfox.svg)](https://hysenlabs.com/projects/adriankarlen-textfox)

Was this useful?