All Versions
Latest Version
Avg Release Cycle
52 days
Latest Release
580 days ago

Changelog History
Page 1

  • v2.4.1 Changes

    November 15, 2022
    • πŸ›  Fix regression that caused the charts for SQLite to be off.
  • v2.4.0 Changes

    November 08, 2022

    This is still as "v0" because some details may still change.

    • 0️⃣ Default API ratelimit is now 4 requests/second, rather than 4 requests/10 seconds. You can use the -ratelimit flag to configure this.

    • πŸ”€ Can now also merge paths instead of just deleting them (the "Settings β†’ Delete pageviews" tab was changed to "Manage pageviews").

    • βž• Add goatcounter dashboard, which uses the new API to display the dashboard in the terminal (only a basic non-interactive overview for now).

    • βž• Add a "Show fewer numbers" user setting; this is intended to still give a reasonably useful overview of what happens on your site but prevent an β€œobsession” over the exact number of visitors and stats.

    • No longer store or display "pageviews": always store and display "visitors" instead.

    The visitor count is the only thing that's interesting in pretty much all cases; the "raw" pageviews are still stored for some future purposes (such as "time on page"), but are no longer stored in most other contexts.

    • βž• Add infrastructure for "dark mode".

    This is not yet enabled by default because all "dark mode" themes look "bad" on my eyes, and I'm not really sure what works well for people who do like it.

    So some help is needed here. See:

  • v2.3.0 Changes

    October 17, 2022

    Old data isn't backfilled as this information wasn't stored.

    • 🍎 There are now binaries for Windows, macOS, {Free,Open}BSD, and illumos.

    • 0️⃣ WebSockets are now disabled by default, as it turned out a lot of people had trouble proxying them. You can enable it with goatcounter serve -websocket.

    • βž• Add -dbconn flag for serve to allow setting the maximum number of connections. The default is also lowered from 25 to 16 for PostgreSQL.

    • βž• Add -store-every flag to control how often to persist pageviews to the database.

    • βž• Add "Sites that can embed GoatCounter" setting to allow embedding GoatCounter in a frame.

    • βž• Add "Hide UI for public view" setting to allow hiding the UI chrome and display only the charts.

    • πŸ›  Quite a few bugfixes and minor additions.

  • v2.2.0 Changes

    February 16, 2022
    • The database connection string changed; you now need to use -db engine+connect string rather than engine://connect string:

      -db sqlite+[sqlite connection string] -db postgresql+[sqlite connection string]

    Various aliases such a sqlite3, postgres also work.

    The previous "url-like" strings conflicted with PostgreSQL's URL connection strings, causing confusion.

    ://-type strings without a + will be rewritten, but will issue a warning.

    • GoatCounter can now collect language statistics as well, from the Accept-Language HTTP header. This is disabled by default, but can be enabled in the site settings.

    • 0️⃣ Charts are now drawn as a line chart by default; you can choose to use bar charts in the widget settings menu by selecting the "chart style" for the "Paths overview" and/or "Total site pageviews"

    Both charts are also completely reΓ―mplemented by drawing on a canvas instead of aligning divs in a flexbox because rendering thousands of divs in a flexbox is actually fairly slow.

    • πŸ’… The "View as text table" button in the header moved to the "Chart style" section mentioned above; this checkbox was added before the configurable dashboard feature, and especially now that you can set a chart style it makes more sense to set it there.

    • Data is now sent over a WebSocket, rather than rendering everything. The upshot of this is that the perceived performance is better: it only needs to calculate the data that's initially visible, and it's okay to wait a bit for the data that's not. The downside is that you need JavaScript, but that was already the case to render the charts.

    • There is a "server management" tab in the settings which allows viewing and editing some server internals. This page is only available to users with the (new) "server management" access.

    All sites with just one user have this user's permissions automatically "upgraded"; sites with more than one user since I don't know which user should have which permissions.

    To prevent updating users, you can use (before running migrations):

      % goatcounter db query "insert into version values ('2021-12-13-2-superuser')"

    To update an existing user, you can use:

      % goatcounter db update users -access superuser [email protected]
    • βž• Add -ratelimit flag to configure the built-in ratelimits (the default values are unchanged). See goatcounter help serve for details.

    • πŸ†• New translations: Italian, Spanish (Chilean), Turkish.

  • v2.1.0 Changes

    December 01, 2021

    πŸ›  Aside from a number of small fixes and improvements, major changes include:

    • πŸ‘Œ Support for translations; see for details how to translate GoatCounter.

    • ⚑️ The import path is now updated to use "" so that e.g. "go install" works. This should have been done with the 2.0 release, but I didn't realize how this all worked.

    • πŸ‘ The visitor counter now supports the start and end parameters and the JSON endpoint returns count as well, to get the total pageview count.

    • You can now make the dashboard viewable to anyone who has a secret token (e.g.

    πŸš€ This release requires Go 1.17 to build.

  • v2.0.4 Changes

    April 13, 2021
    • Deal with duplicate entries in the user_agents table in the migration instead of erroring out; mostly fixes a situation that could happen if you ran the broken migrations in 2.0.0 or 2.0.1.
  • v2.0.3 Changes

    April 02, 2021
    • πŸ›  Fix if you had already run the broken migrations in 2.0.0 or 2.0.1.

    • πŸ– Handle failures in goatcounter import a bit more gracefully.

  • v2.0.2 Changes

    April 02, 2021
    • πŸ›  Fix migration order.

    • Don't display the expected "Memstore.Init: json: cannot unmarshal number / into Go struct field storedSession.paths of type int64" error log on startup; this got displayed once, but was a bit confusing.

    • ⚑️ Display a message on startup after the first update to direct people towards the 2.0 release notes and "goatcounter reindex".

  • v2.0.1 Changes

    March 29, 2021
    • πŸ›  Fix migrations 🀦 They worked when they were written, but a bunch of things changed in GoatCounter and some older ones didn't run any more.

    • βž• Add -test flag to goatcounter db migrate to rollback a migration, so it's easier to test if migrations will run correctly without actually changing the database.

  • v2.0.0 Changes

    March 29, 2021

    The version is bumped to 2.0 because this contains a number of incompatible πŸ”„ changes: several CLI commands got changed, and it includes some large database migrations – running them is a bit more complex than the standard migrations.

    An overview of incompatible changes:

    • πŸ‘ There are some rather large changes to the database layout for better efficiency; this means:

      • Somewhat faster queries.
      • Greatly reduced disk space requirements for the database.
      • The Browsers, systems, size, and location stats are filtered if you enter something in "filter paths". Previously this always displayed the site totals.
      • "Purge path" now works as expected for all stats.
      • Easier to add new statistics in the future.

    To update:

    1. You must first update to 1.4.2 and run all migrations from that. Updating from older versions directly to 2.0.0 will not work!

    2. Run the migrations with goatcounter serve -automigrate or goatcounter migrate.

    3. You probably want to manually run VACUUM (or VACUUM FULL for PostgreSQL) after the migration to free up unused rows. This isn't strictly required, but frees up disk space, and removes some of the autovacuum pressure that will run in the background.

    4. Run goatcounter reindex.

    All of this may take a while if you've got a lot of data. For about 500,000 pageviews it takes about 3 minutes on SQLite, but if you've got millions of pageviews it may take an hour or more.

    If you want to keep pageviews while this is running you can:

    1. Write it to a logfile from a proxy or temporary HTTP server and run goatcounter import on this after the migrations are done.

    2. Use goatcounter buffer.

    • goatcounter migrate is now goatcounter db migrate. It also behaves a bit different:

      • goatcounter db migrate pending lists only pending migrations, and will use exit code 1 if there are any pending migrations.
      • goatcounter db migrate list lists all migrations, always exits with 0.
    • If you use PostgreSQL you need PostgreSQL 12 or newer; this was already the case before and you could run in to some edge cases where things didn't work, but this is enforced now.

    • 🚚 The none value got removed from the -tls flag; use tls=http to not serve TLS. This was confusingly named as you can do -tls=none,acme to still generate ACME certificates, but none implies that nothing is done.

    • goatcounter create is now goatcounter db site create, and some flags got changed:

      • -domain is now -vhost.
      • -parent is now -link.
      • -email is now
      • -password is now -user.password.
    • The -port flag for goatcounter serve is renamed to -public-port. This should clarify that this isn't the listen port, but just the port GoatCounter is publicly accessible on.

    • 🚚 The -site flag got removed from goatcounter import; you can now only use -url to set a GoatCounter site to import to. The automagic API key creation was more confusing than anything else.

    You can use goatcounter db create apitoken to create an API key from the CLI.

    • πŸ— If you build from source, the build flag to set the version changed from:

      -ldflags="-X main.version=..."


    • πŸ“œ The CSV export format was increased to 2; it now includes the parsed browser and system values in addition to the User-Agent header. Version 2.0 will not be able to import the older exports from version 1.

    Other changes:

    • You can read pageviews from logfiles with the goatcounter import command; you can also send pageviews to with this (you don’t need to self-host it). See goatcounter help import and the site code documentation for details.

    • You can now create multiple users; before there was always a single one. You can add users in Settings β†’ Users.

    As a consequence, "Site settings" and "User preferences" are now split in to two screens. The Settings button in the top-right now displays only site settings, and clicking on your email address in the top right displays user preferences, which every user can configure to their liking.

    • πŸ”§ You can now configure what's displayed on the dashboard, in what order, and configure some aspects of various "widgets". You can set it in User preferences β†’ Dashboard. Some settings from the main settings page have moved there.

    • 0️⃣ You can save a default view for the dashboard. Instead of always loading the last week by default, you can now configure it to load the last month, or view by day, or anything you want really.

    • You can choose which data to collect; you can disable collecting any User-Agent, location, Referrer information.

    • Ability to record state/province/district in addition to country, so it records "US-TX" or "NL-NB" instead of "United States" or "Netherlands".

    This option can be disabled separately from recording the country (enabled by default) and you can set which countries to record it for (defaults to US, RU, CH).

    This requires specifying the path to a GeoIP City database, which isn't included since it's ~30M.

    • There are now stable count.v*.js scripts that can use subresource integrity. See the integration code for a list and hashes.

    • You can use data-goatcounter-settings on the <script> tag to load the settings (requires count.v2.js or newer).

    • πŸ†• New goatcounter buffer command; this allows buffering of pageviews in case the backend is down, running migrations, etc. See goatcounter help buffer for more information.

    • The database for PostgreSQL is now created automatically; you no longer need to do this manually.

    • You can copy settings from a site to other sites in Settings β†’ Sites.

    • βž• Add goatcounter db command; you can now edit and delete sites, users, and API keys from the CLI. The create and migrate commands are now merged in to this as subcommands.

    • βž• Add a gcbench utility for inserting random pageviews in a database; for testing and comparing performance. This might be useful for end-users too in some cases, for example to see how much performance difference SQLite and PostgreSQL will give you, or to test if frobbing with server settings makes a difference:

      $ go run ./cmd/gcbench -db sqlite://db/gcbench.sqlite3 -ndays=90 -npaths=100 -nhits=1_000_000 $ go run ./cmd/gcbench -db postgresql://dbname=gcbench -ndays=90 -npaths=100 -nhits=1_000_000

    Right now it doesn't try super-hard to simulate read-world usage patterns: the distribution is always uniform, but it still gives a reasonably accurate indication for comparison purposes.