Repository navigation
GOAT 3.1.0 "Alpine"
GOAT 3.1.0 "Alpine" brings GOAT AI: an assistant that answers questions about your projects and builds, checks and runs analyses as workflows, hosted in the EU. Around it come AI credits and a rebuilt Usage page, a PT network Explorer for GTFS feeds, ÖV-Güteklassen walked along the street network, and layer switchers and widget copies in dashboards. On GOAT's hosted service, trials, credits and subscriptions now run through Plan4Better's Odoo, with a one-step sign-up and one layout for every mail.
What's New in GOAT 3.1.0 ✨
🤖 GOAT AI
-
Ask AI
A dock in every project answers questions about its layers, datasets, workflows and layouts. It finds projects and datasets you can open, and datasets in the Catalog, and it works with each member's own GOAT permissions: it sees and changes only what that member could. -
Workflows built by AI
Describe an analysis and the assistant builds the workflow, checks it, runs it and reads the results back to you. The editor follows its edits and runs as they happen, and every answer that changed something can be undone. -
AI settings per organization
Admins switch AI on or off for their organization and choose GOAT AI, included and hosted in the EU, or a connection of their own. A data policy decides what reaches the model: everything a member can see, or only field names, types, counts and statistics, never single rows or geometries. -
For your own AI tools
External AI agents can use GOAT through its MCP endpoint, now served by the assistant, with the same permissions as the person who connects them.
📊 Usage and AI credits
-
AI credits
Answers are paid from a monthly pool of AI credits per organization: 200 per editor seat, 100 for a whole trial. An answer costs 1 to 3 AI credits by how many steps it took, never by the model behind it, and nothing when the model's provider fails. The dock shows what is left and what each answer cost. -
A Usage page that loads what you open
Settings > Usage now shows five tiles: Credits, AI credits, Storage, Projects and Editors. Each opens its own detail with date ranges, a drill-down per member, sortable lists that load page by page, search and a CSV export; Storage shows what takes up the space, the trash included.
🚆 PT Network Explorer
-
Explore a GTFS feed on the map
"Explorer" in a GTFS bundle's layer menu opens the feed in the map view: routes and stops with their figures, a service table by time period with line-specific day ends, the feed's data period, and a cost card with vehicle-kilometres and vehicle-hours priced at European average rates (per train-kilometre for metro and rail). -
Fast in the browser
GOAT prepares a snapshot of the feed once per version and loads it into the browser, so the Explorer answers without a round trip per question. -
Typed GTFS storage
GTFS bundles are stored with the GTFS reference's types: times past midnight, dates, coordinates and distances keep their meaning in tables, filters and formulas.
🧮 Analyses
-
ÖV-Güteklassen along the street network
Next to circles around each station, ÖV-Güteklassen can now walk the class distances along the street network, so rivers, railway lines and dead ends no longer count as reachable. The network is the one you pick, else the one linked to the PT bundle, else GOAT's default. -
Clustering
The distance calculation in spatial clustering is fixed.
📋 Dashboards
-
Layer switchers
A layer group in the Layers widget can be shown as chips, a slider or a dropdown that shows one layer at a time, with an optional play button and the legend of the layer on the map. Viewers of a published dashboard always see exactly one layer of such a group. -
Duplicate widgets
Copy a widget with its settings in one click; a Tabs widget is copied with its tabs' widgets. -
Steadier filters
Filters keep their state when you switch tabs, and Enter picks the typed value in select filters.
🏷️ Trials, Credits and Billing (hosted service)
-
Trials
A new organization starts a trial whose length and quotas come from Plan4Better's terms; the trial chip shows the days left, and GOAT warns before the end. -
Credits
Tool and workflow runtime, downloads and exports are counted in credits. An organization out of credits can still open maps and tables and delete data; new runs and downloads wait for more credits. -
Subscriptions in Odoo
Seats, quotas, monthly credits and premium features come from the organization's subscription in Odoo, which replaces the Stripe integration.
Self-hosted installs keep billing off: no trials, unlimited credits and nothing metered.
✉️ Sign-up and Mails
-
One-step sign-up
Name, email and password on one page, with the terms and an optional newsletter, each recorded with the time it was given. The card fits on phones. -
One layout for every mail
GOAT's mails, Keycloak's mails and the trial mails share one layout, arrive in the recipient's language and name the organization they are about. The footer can carry the operator's company line. -
One language
A user's language is shared between GOAT and the sign-in pages, in both directions.
🛠️ Fixes
- Catalog layers can be renamed, and names may be up to 255 characters long.
- Home lists refresh when an import finishes.
- Long project descriptions scroll in the info popover and tooltip.
- Title and description editors in the dashboard builder follow the selected widget, and the widget toolbar can open its panel.
- The sign-in token is renewed before it expires, so long sessions no longer run into failed requests.
- Workflow result tiles are looked up only for workflow results.
⚙️ Backend and Platform
-
Assistant service
apps/assistantruns the assistant, its tools and the MCP endpoint; its tables live in schemaassistant, created and migrated by core. -
Document revisions
Workflows, layouts and dashboards carry a revision. A save based on an older version is refused with a notice instead of overwriting someone else's changes. -
Metering
Windmill tasks charge compute from finished jobs, traffic from geoapi's counters and reset credits each period; geoapi counts traffic in Redis. -
GOAT's Keycloak image
ghcr.io/plan4better/goat/keycloakcarries the login and mail theme with its providers, and the realm's sign-up profile lives inpackages/js/keycloak-theme/realm. -
Deployment
The compose bundle and the Helm chart (0.8.0) include the assistant.
⚠️ Upgrade notes
- Back up the database first. Migrations
0012to0020run on start.0012removes the old plan, Stripe and sign-up columns for good. - Billing stays off unless you turn it on. With
BILLING_ENABLEDunset nothing changes. With it on, the migrations also suspend organizations whose trial has ended, keep premium features only for organizations that use them until the billing system sends theirs, and give every organization its AI credits; these steps run once, during the upgrade. Billing on needsBILLING_WEBHOOK_SECRET, or core does not start. - New service: assistant. Deploy
apps/assistant(in the compose bundle and the Helm chart 0.8.0). SetASSISTANT_SECRETS_KEYonce and never change it; it encrypts the organizations' own AI connections. For GOAT AI setASSISTANT_DEFAULT_PROVIDER,ASSISTANT_DEFAULT_BASE_URL,ASSISTANT_DEFAULT_MODELandASSISTANT_DEFAULT_API_KEY, and optionallyASSISTANT_DEFAULT_HOSTED_IN. The web app shows the dock only while the assistant answers (NEXT_PUBLIC_ASSISTANT_URL). - MCP moved. The MCP endpoint is now the assistant's
/mcp; point external agents there. Its host check isASSISTANT_MCP_ALLOWED_HOSTS; the catalog no longer readsCATALOG_MCP_ALLOWED_HOSTS. - Stripe removed.
STRIPE_*settings are no longer read. - Keycloak. Use GOAT's Keycloak image for the new sign-up and mails. To ask for the terms and newsletter, apply the theme's
realm/user-profile.jsonand thenewslettermapper (see the README there). Mail branding comes fromGOAT_PUBLIC_URLand theEMAIL_*settings on the Keycloak container; core takes the sameEMAIL_*settings, now withEMAIL_COMPANY_NAMEandEMAIL_COMPANY_URL. - GTFS bundles imported before 3.1 are stored as text. Run the Windmill task
gtfs_typed_storageonce (dry run by default) to store them typed. - Nothing to install for users. GOAT runs in the browser; existing users see 3.1 the next time they open the app.
What's Changed
- feat: pt network explorer by @nihar1024 in #3910
- fix: distance calculation in the clustering by @CyrineKamoun in #3908
- fix(geoapi): search workflow temp tiles only for workflow results by @majkshkurti in #3912
- fix(web): planning terms in the Explorer's German texts, clearer English labels by @EPajares in #3915
- feat(web): show layer groups one layer at a time in the Layers widget by @EPajares in #3913
- fix(web): allow renaming catalog layers and names up to 255 characters by @EPajares in #3918
- fix(web): scroll long project info popover and tooltip by @EPajares in #3919
- feat(goatlib): walk ÖV-Güteklassen catchments along the street network by @EPajares in #3916
- feat(billing): SaaS billing with Odoo: trials, credits, accounts, one mail layout by @EPajares in #3911
- feat: pt network explorer improvements by @nihar1024 in #3917
- fix(web): sync title and description editors when selection changes by @EPajares in #3920
- fix(web): add select panel action to builder widget toolbar by @EPajares in #3921
- fix(web): refresh Home lists when an import job finishes by @EPajares in #3923
- feat(web): duplicate a dashboard widget by @EPajares in #3924
- fix(web): keep dashboard filter state when switching tabs by @EPajares in #3922
- fix(web): pick the typed value in dashboard select filters on Enter by @EPajares in #3927
- fix(billing): credit check and compute charging without the core service or Windmill's tables by @EPajares in #3926
- fix(goatlib): the billing tasks get redis in the worker image by @majkshkurti in #3928
- feat: add the AI assistant service with GOAT AI, AI credits and the Usage page by @majkshkurti in #3930
- fix(goatlib): import the io package lazily by @majkshkurti in #3932
- fix(goatlib): encode the database credentials of the billing tasks by @majkshkurti in #3933
- fix(web): name only where GOAT AI is hosted on the AI settings page by @majkshkurti in #3934
Full Changelog: v3.0.12...v3.1.0