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

Changelog History
Page 2

  • v1.4.2 Changes

    November 10, 2020

    โž• Add a "visitor counter" image you can add to your website to display the number of visitors, similar to old-style counters back in the โ€™90s (#398).

    ๐Ÿ›  Other than this, it's mostly contains a few minor bugfixes and the like. You can see a list of changes in the git log: v1.4.1...v1.4.2

  • v1.4.1 Changes

    September 04, 2020

    ๐ŸŽ A few small updates, fixes, and performance enhancements. Nothing major.

    ๐Ÿ‘€ You can see a list of changes in the git log: v1.4.0...v1.4.1

  • v1.4.0 Changes

    August 24, 2020

    Major changes:

    ๐Ÿ”„ Change defaults for -listen (#336)

    0๏ธโƒฃ The default for the -listen flag changed from localhost:8081 to :443, which is probably a better and less confusing default for most people. There is also some more detailed docs available in goatcounter help listen.

    Set Cache-Control header for static files (#348)

    โšก๏ธ The Cache-Control header is now set for static files. Since the "cache busting" happens based on the goatcounter version it's now recommended to set this if you're compiling GoatCounter yourself. See the updated README for instructions.

    โž• Add multi-factor auth (#306)

    ๐Ÿ‘ TOTP-based multi-factor auth is now supported.

    ๐Ÿ‘ Better export, export API, add import feature (#316, #318, #329)

    ๐ŸŒ You can now import the CSV exports, useful for migrating from self-hosted to or vice versa, or for migrating from other systems. There is a web interface and a goatcounter import command.

    ๐Ÿ”€ The export now supports a "pagination cursor", so you can export only rows you didn't previously export. This is especially useful with the new export API. which should make it easy to sync GoatCounter data with another external platform.

    ๐Ÿ‘€ See for details on the export API.

    API for sending pageviews (#357)

    Doing that with the regular /count is actually quite painful, as you quickly run in to ratelimits, need to set specific headers, etc. Adding an API endpoint for that makes things much easier.

    API for creating and editing additional sites (#361)

    Some redesigns (#324, #315, #321 #320)

    The "Totals" is now placed below the Pages; I think it makes more sense there. The Y-axis for the totals is now also independent. There's also been a quite a few restylings.

    โž• Add "text view" mode (#359)

    View your data as a simple table without too much graphics; only the main "Pages" overview is implemented for now.

    ๐Ÿ‘‰ Make it easier to skip your own views (#290)

    ๐Ÿ’ป Previously this required adding custom code, but now loading any page with #toggle-goatcounter added will enable/disable the GoatCounter tracking for that browser.

    Can now manage "additional sites" from self-hosted GoatCounter (#363)

    This wasn't possible before for no other reason than laziness on my part ๐Ÿ™ƒ

    public/count.js is now ISC licensed (#309)

    Previously the EUPL applied, which is fairly restrictive and may prevent people from including/self-hosting the count.js script.

    โž• Add goatcounter db command

    ๐Ÿš€ This is mostly useful for writing deploy scripts: goatcounter db schema-sqlite prints the SQLite schema, schema-pgsql prints the PostgreSQL schema, and goatcounter db test tests if the database exists.

    Session hashes are no longer persisted to the database

    This is kind of an internal change, but session hashes are now stored in memory only and never recorded to the database. There's no real reason to persistently store this information, and this is a (small) privacy/GDPR compliance improvement.

  • v1.3.2 Changes

    July 17, 2020

    This is a small fix to set some server http timeouts; this is especially relevant if you run GoatCounter "directly" internet-facing, without using a proxy such as HAPRoxy, Varnish, etc.

    โฑ When using GoatCounter directly internet-facing it's liable to keep connections around for far too long, exhausting the max. number of open file descriptors, especially with "idle" HTTP/2 connections which, unlike HTTP/1.1 Keep-Alive don't have an explicit timeout.

    0๏ธโƒฃ This isn't much of a problem if you're using a proxy in front of it, as most will have some timeouts set by default (unlike Go, which has no timeouts at all by default).

    โฑ For the backend interface, keeping a long timeout makes sense; it reduces overhead on requests (TLS setup alone can be >200ms), but for the /count request we typically want a much shorter timeout.

    ๐Ÿ”ง Unfortunately, configuring timeouts per-endpoint isn't really supported at this point, although some possible workarounds are mentioned in 1, it's all pretty ugly. We can add "Connection: close" to just close the connection, which is probably much better for almost all cases than keeping a connection open since most people only visit a single page, and keeping a connection open in the off-chance they click somewhere again probably isn't really worth it.

    And setting any timeout is better than setting no timeout at all!

  • v1.3.1 Changes

    July 04, 2020

    ๐Ÿ›  Fixes for SQLite concurrency issues

    In some busy workloads various SQLite operations would fail due to "locked tables"; most of this is related to the session code:

    • ๐Ÿ”’ On every pageview a new session is either read (OK) or written (LOCK!)
    • ๐Ÿ”’ At the same time, the cron may be writing data to the db (LOCK!)

    ๐Ÿ”’ On smaller instances this isn't much of an issue since everything is fast enough to not lock for too long, but on longer instances this can be a problem.

    Setting SetMaxOpenConns(1) solves this by limiting the connections writing to the database.

    ๐ŸŽ Also set the default journal mode to WAL, which should give better performance. Both of this is done in the update.

    โž• Add "goatcounter help db" to document database usage a bit better.

  • v1.3.0 Changes

    June 01, 2020

    ๐Ÿš€ Note: this release contains quite a few database migrations; they make take a minute to run (depending on your table size), and you may want to run a VACUUM afterwards.

    • โœ‚ Remove email auth, replace -auth with -email-from.

    As mentioned in the 1.2 release the email authentication is now removed. You can still reset the password for old accounts.

    Since the email auth no longer exists the -auth parameter no longer makes sense. It's now replaced with -email-from, which can be set to just an email address.

    Action required: if you set the email address with -auth you'll have to change it to -email-from.

    • โž• Add OS stats, improve accuracy of browser stats.

    GoatCounter now tracks the OS/platform in addition to just the browser, and the accuracy of the browser stats should be improved.

    Action required: you'll need to populate the system_stats table:

      $ goatcounter reindex -table system_stats

    If you want to process all browser stats with the new logic too, then use this instead:

      $ goatcounter reindex -table system_stats,browser_stats
    • ๐Ÿ‘Œ Improve performance.

    Increase performance by quite a bit on large sites and time ranges.

    • โœ‚ Remove the per-path scaling.

    Previously GoatCounter would scale the Y-axis different for every path in the dashboard, but this was more confusing than helpful. It's now always scaled to the maximum of all paths in the selected date range and filter, with a field to scale it lower on-demand if desired.

    • โž• Add totals overview.

    Add chart with totals for the selected date range and filter.

    • โž• Add goatcounter.url(), goatcounter.filter().

    Adds two new methods to the count.js script so it's easier to use write own implementation. In addition the script will now issue a console.warn() if a request isn't being counted for some reason.

  • v1.2.0 Changes

    May 18, 2020

    โšก๏ธ There are a number of changes in 1.2, and a few which require a bit of action when updating. Also see:

    Password authentication (#232)

    ๐Ÿ—„ The email-based authentication has been deprecated in favour of password authentication.

    Action required Use the interface to set a password (you will get a notification about this). Email authentication still works, but will be removed in the next release, after which updating the password will be tricky.

    Unique visit tracking (#212)

    GoatCounter now tracks unique visits (without using cookies).

    ๐Ÿ“š Technical documentation about the implementation is in doc/sessions.markdown.

    There are two ways to display the older stats:

    Do nothing; meaning that "visits" will be 0 for previous date ranges.

    Assign a new 'session' to every hit, so that unique visits will be the same as the number of pageviews.

    Doing option 2 is a potentially expensive database operation and not everyone may care so it's not done automatically; instructions for doing this are:

    SQLite (do not do this on a running system; as far as I can tell there's no good way to get the next sequence ID while incrementing it):

    delete from sessions;
    update hits set session=id, first_visit=1;
    update sqlite_sequence set seq = (select max(session) from hits) where name='sessions';


    update hits set session=nextval('sessions_id_seq'), first_visit=1;

    And then run goatcounter reindex.

    ๐Ÿ‘Œ Improve bot detection (#219)

    โšก๏ธ The bot detection is now improved; this will be applied to older pageviews in the database with a migration, but the cached statistics aren't updated automatically (as it can take a while for larger sites). Use the reindex command to fully update older pageviews (this is entirely optional).

    Track events (#215)

    ๐Ÿ“š There is now better support to track events; see the updated documentation on the Site Code page for details.

    ๐Ÿ‘ Better support for campaigns (#238)

    There is now a "campaign parameters" setting; if the URL matches one of these parameters it will be set as the referrer (overriding the Referer header).

    The default is utm_campaign, utm_source, ref.

    ๐Ÿ‘ Better export (#221)

    The export was a quick feature added in the first version, but didn't scale well to larger sites with a lot of pageviews. This now works well for any number of pageviews.

    ๐Ÿ›  Many small improvements and bug fixes

    ๐Ÿฑ It's almost 2 months of work, and there have been many small changes, fixes, and improvements. I didnโ€™t keep track of them all ๐Ÿ˜…

  • v1.1.2 Changes

    March 27, 2020

    ๐Ÿ›  Fix small issue with the domain not showing correct in the site code ๐Ÿ˜…

  • v1.1.1 Changes

    March 27, 2020

    ๐Ÿ›  Small bugfix release which fixes some small issues and improves a few small documentation issues. List of changes: v1.1.0...v1.1.1

    The biggest change is that the saas command no longer works (and is no longer documented). It was only ever useful for hosting, and has a number of assumptions and hard-coded values.

    If you're using saas, then you can migrate to serve by setting a custom domain (sites.cname) for all the sites. The serve command should work after that.

  • v1.1.0 Changes

    March 18, 2020

    This list is not comprehensive, and only lists new features and major changes.

    Incompatible Improve CLI UX (#154, #173, #175, #181)

    The entire CLI has been redone; the original wasn't very user-friendly for
    ๐Ÿ‘€ self-hosting. See goatcounter help for the full docs, but in brief:

    o Use "goatcounter serve" instead of just "goatcounter".
    o Create new sites with "goatcounter create".
    o Good support for TLS hosting and ACME certificates (see -tls flag).
    o Invert -prod to -dev (i.e. just drop -prod for production services, add -dev for development).
    o -smtp flag is no longer required.
    o -dbconnect โ†’ -db
    o -pgsql โ†’ -db postgresql://...
    o -staticdomain โ†’ no longer needed, but if you really want it you can
                                    append to domain: -domain,
    o -emailerrors โ†’ -errors mailto:...
    o goatcounter -migrate โ†’ goatcounter migrate
    o goatcounter -migrate auto โ†’ goatcounter serve -automigrate

    Action required Show top referrals (#192)

    To populate the ref_stats and size_stats tables for older data, update first
    and then run:

    $ goatcounter reindex -confirm -table ref_stats
    $ goatcounter reindex -confirm -table size_stats

    Charts are displayed in local timezone (#155)

    โž• Add "IgnoreIPs" setting to ignore your own views (#128)

    ๐Ÿ”— Link to paths by adding a new domain setting (#138)

    โž• Add configurable data retention (#134)

    ๐Ÿ‘ Allow configuring the thousands separator (#132)

    ๐Ÿ‘ Allow filtering pages in the dashboard (#106)

    ๐Ÿ‘Œ Improve the integration code (#122)

    ๐Ÿ‘ Allow sending emails without a relay (#184)

    โž• Add get_query() to count.js to get query parameter (#199)

    ๐Ÿ‘ Allow viewing the charts by day, instead of only by hour (#169)