├── bgrun ├── go.sum ├── .github │ └── FUNDING.yml ├── go.mod ├── README.md ├── LICENSE └── default.go ├── .github └── FUNDING.yml ├── tpl ├── help │ ├── 404.md │ ├── translating.md │ ├── spa.md │ ├── campaigns.md │ ├── backend.md │ ├── countjs-location.md │ ├── csp.md │ ├── countjs-host.md │ ├── logfile.md │ ├── skip-path.md │ ├── domains.md │ ├── skip-dev.md │ ├── frame.md │ ├── consent.md │ ├── events.md │ ├── modify.md │ ├── privacy.md │ ├── path.md │ └── countjs-versions.md ├── _email_top.gotxt ├── _dashboard_pages_refs.gohtml ├── _email_bottom.gohtml ├── _email_bottom.gotxt ├── email_import_error.gotxt ├── email_verify.gotxt ├── _dashboard_configure_widget.gohtml ├── user.gohtml ├── contact.gohtml ├── _dashboard_warn_collect.gohtml ├── email_forgot_site.gotxt ├── email_import_done.gotxt ├── email_password_reset.gotxt ├── _dashboard_widgets.gohtml ├── contribute.gohtml ├── email_adduser.gotxt ├── _bottom.gohtml ├── user_forgot_pw.gohtml ├── email_export_done.gotxt ├── _backend_signin.gohtml ├── _dashboard_totals_row.gohtml ├── _favicon.gohtml ├── _user_nav.gohtml ├── email_welcome.gotxt ├── _dashboard_hchart.gohtml ├── email_report.gotxt ├── totp.gohtml ├── _dashboard_toprefs.gohtml ├── user_reset.gohtml ├── _user_dashboard_widgets.gohtml ├── _top.gohtml ├── api2.html ├── bosmang_cache.gohtml ├── user_forgot_code.gohtml ├── _dashboard_totals.gohtml ├── _backend_bottom.gohtml ├── _settings_nav.gohtml ├── _bottom_links.gohtml ├── settings_changecode.gohtml ├── settings_sites_rm_confirm.gohtml ├── bosmang_metrics.gohtml ├── settings_server.gohtml ├── settings_users.gohtml ├── _user_dashboard_widget.gohtml ├── bosmang_sites.gohtml ├── _dashboard_pages.gohtml ├── user_dashboard.gohtml ├── _dashboard_pages_text.gohtml ├── _contact.gohtml ├── _dashboard_pages_text_rows.gohtml ├── email_report.gohtml ├── bosmang_bgrun.gohtml ├── i18n_list.gohtml ├── signup.gohtml └── settings_delete.gohtml ├── .ignore ├── db ├── migrate │ ├── 2021-12-13-1-drop-role-postgres.sql │ ├── 2022-11-17-1-open-at.sql │ ├── 2023-12-15-1-rm-updates.sql │ ├── 2021-04-02-1-cluster-paths-postgres.sql │ ├── 2021-11-15-1-user-role-postgres.sql │ ├── 2022-01-14-1-idx.sql │ ├── 2022-11-05-1-paths-title.sql │ ├── 2022-10-21-1-apitoken-lastused.gotxt │ ├── 2021-12-13-2-superuser.sql │ ├── 2021-06-27-1-public-postgres.sql │ ├── 2021-06-27-1-public-sqlite.sql │ ├── 2021-04-01-1-store-warn.sql │ ├── 2021-12-02-2-language-enable-postgres.sql │ ├── 2021-12-09-1-email-reports-postgres.sql │ ├── 2021-04-07-1-billing-anchor-sqlite.sql │ ├── 2021-12-02-2-language-enable-sqlite.sql │ ├── 2022-02-16-1-rm-billing-sqlite.sql │ ├── 2022-02-16-1-rm-billing-postgres.sql │ ├── 2022-11-03-1-uncount.sql │ ├── gomig │ │ └── gomig.go │ ├── 2022-11-03-2-ununique.sql │ ├── 2022-10-17-1-campaigns.gotxt │ ├── 2021-04-07-1-billing-anchor-postgres.sql │ ├── 2022-03-06-1-campaigns.gotxt │ ├── 2022-01-13-1-unfk-postgres.sql │ └── 2021-12-09-1-email-reports-sqlite.sql └── query │ ├── paths.List.sql │ ├── hit_list.List-stats.sql │ ├── hit_stats.ListSizes.sql │ ├── hit_list.Totals.sql │ ├── hit_stats.ListCampaign.sql │ ├── hit_stats.ListSystem.sql │ ├── hit_stats.ListBrowser.sql │ ├── hit_list.PathCount.sql │ ├── hit_stats.ListSize.sql │ ├── hit_stats.ListLocation.sql │ ├── ref.ListRefsByPathID.sql │ ├── hit_stats.ListSystems.sql │ ├── hit_stats.ListBrowsers.sql │ ├── hit_list.List-counts.sql │ ├── hit_stats.ListCampaigns.sql │ ├── hit_stats.ListLanguages.sql │ ├── hit_stats.ListLocations.sql │ ├── hit_stats.ByRef.sql │ ├── hit_list.ListPathsLike.gotxt │ ├── paths.PathFilter.sql │ ├── hit_list.DiffTotal.sql │ ├── ref.ListTopRefs.sql │ ├── bosmang.List.sql │ └── hit_list.GetTotalCount.sql ├── public ├── logo.png ├── int-logo │ ├── wp.png │ ├── schlix.png │ ├── gatsby.svg │ └── write-as.svg ├── screenshot.png ├── screenshot2.png ├── screenshot3.png ├── fonts │ ├── latolatin.woff2 │ ├── latolatin-bold.woff2 │ └── latolatin-italic.woff2 ├── vcounter │ ├── vcounter.png │ └── vcounter-total.png ├── favicon │ ├── favicon-16x16.png │ ├── favicon-32x32.png │ ├── mstile-150x150.png │ ├── apple-touch-icon.png │ ├── android-chrome-192x192.png │ ├── android-chrome-512x512.png │ ├── browserconfig.xml │ └── site.webmanifest ├── index.html ├── logo.svg ├── i18n.js ├── i18n.css └── script.js ├── pack └── GeoLite2-Country.mmdb.gz ├── deploy ├── README.md └── alpine │ └── README.md ├── .gitattributes ├── logscan └── testdata │ ├── common │ ├── common-vhost │ ├── combined │ └── combined-vhost ├── cmd └── goatcounter │ ├── testdata │ ├── access_log │ └── export.csv │ ├── pg_test.go │ ├── old.go │ ├── help_test.go │ ├── serve_test.go │ ├── saas_test.go │ ├── goat.go │ ├── monitor_test.go │ ├── db_migrate.go │ └── main_test.go ├── .editorconfig ├── .gogo-release ├── gctest └── pg.go ├── i18n └── en-GB.toml ├── .gitignore ├── helper_cgo.go ├── run-ci ├── netlify.toml ├── context_test.go ├── kommentaar.conf ├── metrics └── metrics_test.go ├── helper_test.go ├── cron ├── campaign_stat_test.go ├── hit_count.go ├── ref_count.go ├── language_stat.go ├── system_stat.go ├── size_stat.go ├── tasks_test.go ├── browser_stat.go ├── campaign_stat.go ├── location_stat_test.go ├── location_stat.go └── browser_stat_test.go ├── refspam_test.go ├── path_test.go ├── widgets ├── dummy.go ├── internal.go ├── languages.go ├── sizes.go ├── toprefs.go ├── systems.go ├── browsers.go └── campaigns.go ├── campaign.go ├── size.go ├── gen.go ├── acme └── acme_test.go ├── locations_test.go ├── tpl_test.go ├── handlers ├── dashboard_test.go └── website_test.go └── bosmang.go /bgrun/go.sum: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: arp242 2 | -------------------------------------------------------------------------------- /bgrun/.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: arp242 2 | -------------------------------------------------------------------------------- /bgrun/go.mod: -------------------------------------------------------------------------------- 1 | module zgo.at/bgrun 2 | 3 | go 1.19 4 | -------------------------------------------------------------------------------- /tpl/help/404.md: -------------------------------------------------------------------------------- 1 | This page doesn't seem to exist. 2 | -------------------------------------------------------------------------------- /.ignore: -------------------------------------------------------------------------------- 1 | /public/jquery.js 2 | /public/*.min.* 3 | /pack 4 | /msg 5 | -------------------------------------------------------------------------------- /tpl/_email_top.gotxt: -------------------------------------------------------------------------------- 1 | {{t .Context "email/header|Hi there,"}} 2 | -------------------------------------------------------------------------------- /db/migrate/2021-12-13-1-drop-role-postgres.sql: -------------------------------------------------------------------------------- 1 | alter table users drop column role; 2 | -------------------------------------------------------------------------------- /public/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cweiske/goatcounter/master/public/logo.png -------------------------------------------------------------------------------- /db/migrate/2022-11-17-1-open-at.sql: -------------------------------------------------------------------------------- 1 | alter table users add column open_at timestamp null; 2 | -------------------------------------------------------------------------------- /db/migrate/2023-12-15-1-rm-updates.sql: -------------------------------------------------------------------------------- 1 | alter table users drop column seen_updates_at; 2 | -------------------------------------------------------------------------------- /tpl/_dashboard_pages_refs.gohtml: -------------------------------------------------------------------------------- 1 | {{horizontal_chart .Context .Refs .Count false true}} 2 | -------------------------------------------------------------------------------- /db/migrate/2021-04-02-1-cluster-paths-postgres.sql: -------------------------------------------------------------------------------- 1 | cluster paths using "paths#site_id#path"; 2 | -------------------------------------------------------------------------------- /db/migrate/2021-11-15-1-user-role-postgres.sql: -------------------------------------------------------------------------------- 1 | alter table users drop constraint users_role_check; 2 | -------------------------------------------------------------------------------- /public/int-logo/wp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cweiske/goatcounter/master/public/int-logo/wp.png -------------------------------------------------------------------------------- /public/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cweiske/goatcounter/master/public/screenshot.png -------------------------------------------------------------------------------- /public/screenshot2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cweiske/goatcounter/master/public/screenshot2.png -------------------------------------------------------------------------------- /public/screenshot3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cweiske/goatcounter/master/public/screenshot3.png -------------------------------------------------------------------------------- /bgrun/README.md: -------------------------------------------------------------------------------- 1 | Need to put this in its own repo; just need to finish some things and write 2 | docs. 3 | -------------------------------------------------------------------------------- /db/migrate/2022-01-14-1-idx.sql: -------------------------------------------------------------------------------- 1 | drop index "sites#parent"; 2 | create index "sites#parent" on sites(parent); 3 | -------------------------------------------------------------------------------- /public/fonts/latolatin.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cweiske/goatcounter/master/public/fonts/latolatin.woff2 -------------------------------------------------------------------------------- /public/int-logo/schlix.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cweiske/goatcounter/master/public/int-logo/schlix.png -------------------------------------------------------------------------------- /public/vcounter/vcounter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cweiske/goatcounter/master/public/vcounter/vcounter.png -------------------------------------------------------------------------------- /pack/GeoLite2-Country.mmdb.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cweiske/goatcounter/master/pack/GeoLite2-Country.mmdb.gz -------------------------------------------------------------------------------- /public/favicon/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cweiske/goatcounter/master/public/favicon/favicon-16x16.png -------------------------------------------------------------------------------- /public/favicon/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cweiske/goatcounter/master/public/favicon/favicon-32x32.png -------------------------------------------------------------------------------- /public/favicon/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cweiske/goatcounter/master/public/favicon/mstile-150x150.png -------------------------------------------------------------------------------- /public/fonts/latolatin-bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cweiske/goatcounter/master/public/fonts/latolatin-bold.woff2 -------------------------------------------------------------------------------- /public/favicon/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cweiske/goatcounter/master/public/favicon/apple-touch-icon.png -------------------------------------------------------------------------------- /public/fonts/latolatin-italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cweiske/goatcounter/master/public/fonts/latolatin-italic.woff2 -------------------------------------------------------------------------------- /public/vcounter/vcounter-total.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cweiske/goatcounter/master/public/vcounter/vcounter-total.png -------------------------------------------------------------------------------- /db/migrate/2022-11-05-1-paths-title.sql: -------------------------------------------------------------------------------- 1 | drop index "paths#path#title"; 2 | create index "paths#title" on paths(lower(title)); 3 | -------------------------------------------------------------------------------- /public/favicon/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cweiske/goatcounter/master/public/favicon/android-chrome-192x192.png -------------------------------------------------------------------------------- /public/favicon/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cweiske/goatcounter/master/public/favicon/android-chrome-512x512.png -------------------------------------------------------------------------------- /db/migrate/2022-10-21-1-apitoken-lastused.gotxt: -------------------------------------------------------------------------------- 1 | alter table api_tokens 2 | add column last_used_at timestamp {{check_timestamp "created_at"}}; 3 | -------------------------------------------------------------------------------- /deploy/README.md: -------------------------------------------------------------------------------- 1 | Various ways to deploy GoatCounter; see the subdirectories for details. 2 | 3 | - alpine – Set up an Alpine Linux machine. 4 | -------------------------------------------------------------------------------- /db/query/paths.List.sql: -------------------------------------------------------------------------------- 1 | select * from paths 2 | where 3 | site_id = :site 4 | {{:after and path_id > :after}} 5 | order by path_id asc 6 | {{:limit limit :limit}} 7 | -------------------------------------------------------------------------------- /tpl/_email_bottom.gohtml: -------------------------------------------------------------------------------- 1 |
Any problems, questions, comments, or something else to tell me? Just reply to this email.
2 | 3 |Cheers,
4 | Martin
There are a few ways to contact me:
5 | {{template "_contact.gohtml" (map "v" .Validate "r" "/contact" "a" .Args)}} 6 | 7 | {{template "_bottom.gohtml" .}} 8 | -------------------------------------------------------------------------------- /cmd/goatcounter/testdata/access_log: -------------------------------------------------------------------------------- 1 | 127.0.0.1 - - [10/Oct/2000:13:55:36 -0700] "GET /test.html HTTP/1.1" 200 2326 "http://www.example.com/start.html" "Mozilla/5.0" 2 | 127.0.0.1 - - [10/Oct/2000:13:55:36 -0700] "GET /test.html HTTP/1.1" 200 2326 "-" "Mozilla/5.0" 3 | -------------------------------------------------------------------------------- /db/migrate/2021-06-27-1-public-postgres.sql: -------------------------------------------------------------------------------- 1 | update sites set settings = jsonb_set(settings, '{public}', '"public"') where settings->'public' = 'true'; 2 | update sites set settings = jsonb_set(settings, '{public}', '"private"') where settings->'public' = 'false'; 3 | -------------------------------------------------------------------------------- /db/migrate/2021-06-27-1-public-sqlite.sql: -------------------------------------------------------------------------------- 1 | update sites set settings = json_set(settings, '$.public', 'public') where json_extract(settings, '$.public') = 1; 2 | update sites set settings = json_set(settings, '$.public', 'private') where json_extract(settings, '$.public') = 0; 3 | -------------------------------------------------------------------------------- /db/query/hit_stats.ListSizes.sql: -------------------------------------------------------------------------------- 1 | select 2 | width as name, 3 | sum(count) as count 4 | from size_stats 5 | where 6 | site_id = :site and day >= :start and day <= :end 7 | {{:filter and path_id in (:filter)}} 8 | group by width 9 | order by count desc, name asc 10 | -------------------------------------------------------------------------------- /tpl/_dashboard_warn_collect.gohtml: -------------------------------------------------------------------------------- 1 | {{if not .IsCollected}} 2 |This is a CDN to serve static files for 8 | GoatCounter; 9 | not much else here.
10 | 11 | 12 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | indent_style = tab 6 | indent_size = 4 7 | insert_final_newline = true 8 | trim_trailing_whitespace = true 9 | 10 | [*.{yaml,yml}] 11 | indent_style = space 12 | indent_size = 2 13 | 14 | [*.{css,markdown,md}] 15 | indent_style = space 16 | -------------------------------------------------------------------------------- /public/favicon/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 |Servers aren't free, and running goatcounter.com isn't free either. Please 5 | consider contributing on GitHub 6 | sponsor. You can do a one-time contribution or set up a recurring monthly 7 | contribution.
8 | 9 | {{template "_bottom.gohtml" .}} 10 | -------------------------------------------------------------------------------- /public/int-logo/gatsby.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /db/migrate/2021-12-09-1-email-reports-postgres.sql: -------------------------------------------------------------------------------- 1 | alter table users add column last_report_at timestamp not null default current_timestamp; 2 | 3 | create or replace function percent_diff(start float4, final float4) returns float4 as $$ 4 | begin 5 | return case 6 | when start=0 then float4 '+infinity' 7 | else (final - start) / start * 100 8 | end; 9 | end; $$ language plpgsql immutable strict; 10 | -------------------------------------------------------------------------------- /db/query/hit_stats.ListCampaign.sql: -------------------------------------------------------------------------------- 1 | select 2 | ref as name, 3 | sum(count) as count 4 | from campaign_stats 5 | join campaigns using (campaign_id) 6 | where 7 | campaign_stats.site_id = :site and day >= :start and day <= :end and 8 | {{:filter path_id in (:filter) and}} 9 | campaign_id = :campaign 10 | group by campaign_id, ref 11 | order by count desc, ref asc 12 | limit :limit offset :offset 13 | -------------------------------------------------------------------------------- /db/query/hit_stats.ListSystem.sql: -------------------------------------------------------------------------------- 1 | select 2 | trim(name || ' ' || version) as name, 3 | sum(count) as count 4 | from system_stats 5 | join systems using (system_id) 6 | where 7 | site_id = :site and day >= :start and day <= :end and 8 | {{:filter path_id in (:filter) and}} 9 | lower(name) = lower(:system) 10 | group by name, version 11 | order by count desc, name asc 12 | limit :limit offset :offset 13 | -------------------------------------------------------------------------------- /db/query/hit_stats.ListBrowser.sql: -------------------------------------------------------------------------------- 1 | select 2 | trim(name || ' ' || version) as name, 3 | sum(count) as count 4 | from browser_stats 5 | join browsers using (browser_id) 6 | where 7 | site_id = :site and day >= :start and day <= :end and 8 | {{:filter path_id in (:filter) and}} 9 | lower(name) = lower(:browser) 10 | group by name, version 11 | order by count desc, name asc 12 | limit :limit offset :offset 13 | -------------------------------------------------------------------------------- /gctest/pg.go: -------------------------------------------------------------------------------- 1 | // Copyright © Martin Tournoij – This file is part of GoatCounter and published 2 | // under the terms of a slightly modified EUPL v1.2 license, which can be found 3 | // in the LICENSE file or at https://license.goatcounter.com 4 | 5 | //go:build testpg 6 | // +build testpg 7 | 8 | package gctest 9 | 10 | import ( 11 | _ "zgo.at/zdb/drivers/pq" 12 | ) 13 | 14 | func init() { 15 | pgSQL = true 16 | } 17 | -------------------------------------------------------------------------------- /db/query/hit_list.PathCount.sql: -------------------------------------------------------------------------------- 1 | with x as ( 2 | select path_id, path from paths 3 | where site_id = :site and lower(path) = lower(:path) 4 | ) 5 | select 6 | x.path, 7 | coalesce(sum(total), 0) as count 8 | from hit_counts 9 | join x using (path_id) 10 | where 11 | site_id = :site and 12 | path_id = x.path_id 13 | {{:start and hour >= :start}} 14 | {{:end and hour <= :end}} 15 | group by x.path, hit_counts.path_id 16 | -------------------------------------------------------------------------------- /db/query/hit_stats.ListSize.sql: -------------------------------------------------------------------------------- 1 | select 2 | '↔ ' || width || 'px' as name, 3 | sum(count) as count 4 | from size_stats 5 | where 6 | site_id = :site and day >= :start and day <= :end 7 | {{:filter and path_id in (:filter)}} 8 | {{:max_size and width != 0 and width > :min_size and width <= :max_size}} 9 | {{:empty and width = 0}} 10 | group by width 11 | order by count desc, name asc 12 | limit :limit offset :offset 13 | -------------------------------------------------------------------------------- /tpl/help/spa.md: -------------------------------------------------------------------------------- 1 | Custom `count()` example for hooking in to an SPA nagivating by `#`: 2 | 3 | 12 | {{template "code" .}} 13 | -------------------------------------------------------------------------------- /db/query/hit_stats.ListLocation.sql: -------------------------------------------------------------------------------- 1 | select 2 | coalesce(region_name, '(unknown)') as name, 3 | sum(count) as count 4 | from location_stats 5 | join locations on location = iso_3166_2 6 | where 7 | site_id = :site and day >= :start and day <= :end and 8 | {{:filter path_id in (:filter) and}} 9 | country = :country 10 | group by iso_3166_2, name 11 | order by count desc, name asc 12 | limit :limit offset :offset 13 | -------------------------------------------------------------------------------- /db/query/ref.ListRefsByPathID.sql: -------------------------------------------------------------------------------- 1 | with x as ( 2 | select 3 | ref_id, 4 | coalesce(sum(total), 0) as count 5 | from ref_counts 6 | where 7 | site_id = :site and path_id = :path and hour >= :start and hour <= :end 8 | group by ref_id 9 | limit :limit offset :offset 10 | ) 11 | select 12 | x.count, 13 | refs.ref_scheme as ref_scheme, 14 | refs.ref as name 15 | from x 16 | left join refs using (ref_id) 17 | order by count desc, ref 18 | -------------------------------------------------------------------------------- /logscan/testdata/combined-vhost: -------------------------------------------------------------------------------- 1 | example.com:127.0.0.1 - - [10/Oct/2000:13:55:36 -0700] "GET / HTTP/1.1" 200 2326 "http://www.example.com/start.html" "Mozilla/5.0" 2 | example.com:127.0.0.1 - - [10/Oct/2000:13:55:36 -0700] "GET /test.html HTTP/1.1" 200 2326 "-" "-" 3 | example.com:127.0.0.1 - - [10/Oct/2000:13:55:36 -0700] "GET /dash-size HTTP/2.0" 200 - "-" "-" 4 | example.com:1.1.1.1 - - [15/May/2023:00:00:54 +0000] "GET /proxy.pac HTTP/1.1" 200 133 "" "" 5 | -------------------------------------------------------------------------------- /db/migrate/2021-04-07-1-billing-anchor-sqlite.sql: -------------------------------------------------------------------------------- 1 | alter table sites add column billing_anchor timestamp; 2 | alter table sites add column notes text not null default ''; 3 | alter table sites add column extra_pageviews int; 4 | alter table sites add column extra_pageviews_sub varchar; 5 | 6 | -- No need to update sites as SQLite doesn't support saas/billing. 7 | alter table sites drop column plan; 8 | alter table sites add column plan varchar not null default 'free'; 9 | -------------------------------------------------------------------------------- /i18n/en-GB.toml: -------------------------------------------------------------------------------- 1 | [__meta__] 2 | generated = 2021-11-25T14:01:49Z 3 | language = "en-GB" 4 | maintainers = ["Martin Tournoij