<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<id>https://docs.snoutdata.com/feeds/cloud.xml</id>
	<title>SnoutData Cloud changelog</title>
	<subtitle>What changed in SnoutData Cloud and the stack: the dashboard, hosted projects, the snoutdata CLI and @snoutdata/client.</subtitle>
	<link rel="self" href="https://docs.snoutdata.com/feeds/cloud.xml"/>
	<link rel="alternate" href="https://docs.snoutdata.com/cloud/changelog/"/>
	<updated>2026-10-03T00:00:00Z</updated>
	<author><name>SnoutData</name></author>
	<entry>
		<id>https://docs.snoutdata.com/cloud/changelog/#2026-10-03</id>
		<title>SnoutData Cloud, 2026-10-03</title>
		<link href="https://docs.snoutdata.com/cloud/changelog/#2026-10-03"/>
		<updated>2026-10-03T00:00:00Z</updated>
		<content type="html">&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Projects run Postgres 18.&lt;/strong&gt; Every Cloud project, every new self-hosted stack and every new &lt;code&gt;snoutdata start&lt;/code&gt; database. New to build with: &lt;code&gt;uuidv7()&lt;/code&gt;, virtual generated columns, temporal keys (&lt;code&gt;WITHOUT OVERLAPS&lt;/code&gt;), &lt;code&gt;OLD&lt;/code&gt; and &lt;code&gt;NEW&lt;/code&gt; in &lt;code&gt;RETURNING&lt;/code&gt;, and &lt;code&gt;NOT ENFORCED&lt;/code&gt; constraints. Asynchronous I/O and data checksums are on. A generated column written without &lt;code&gt;STORED&lt;/code&gt; is now virtual, so add &lt;code&gt;STORED&lt;/code&gt; to DDL written for 17. A local or self-hosted database made on 17 keeps running 17. See &lt;a href="https://docs.snoutdata.com/stack/postgres"&gt;Postgres 18&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The front door accepts protocol 3.2.&lt;/strong&gt; A client that asks for it (libpq 18's &lt;code&gt;max_protocol_version=3.2&lt;/code&gt;) connects, and cancelling a query works with its longer cancel keys.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;SnoutTime is in the self-hosted stack and the local database.&lt;/strong&gt; The Postgres image the stack's compose file and &lt;code&gt;snoutdata start&lt;/code&gt; run now includes SnoutTime, the same as a hosted project, so &lt;code&gt;create extension snouttime&lt;/code&gt; works locally too.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Realtime counts socket broadcasts against your plan's messages a second.&lt;/strong&gt; Only broadcasts sent over HTTP were counted, so one client on a socket could send without limit. Past the limit the channel is closed with "Too many messages per second".&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A free project's table-changes refusal names the plan&lt;/strong&gt;: "Table changes (postgres_changes) are part of the Plus and Pro plans, and this project is not on one of them." It said "not enabled for this project", which read as a fault.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Self-hosted: snout-realtime 0.1.3&lt;/strong&gt; in the stack's &lt;code&gt;compose.yaml&lt;/code&gt;, with the same broadcast limit.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;snoutdata projects pause&lt;/code&gt;, &lt;code&gt;resume&lt;/code&gt; and &lt;code&gt;delete&lt;/code&gt; wait until it is true.&lt;/strong&gt; They printed "resumed." while the project was still paused; now they show each state and finish when the project is paused, ready or gone. &lt;code&gt;--no-wait&lt;/code&gt; returns at once.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The MCP server serves local projects.&lt;/strong&gt; &lt;code&gt;list_projects&lt;/code&gt; lists them under &lt;code&gt;local&lt;/code&gt;, and &lt;code&gt;get_connection_url&lt;/code&gt;, &lt;code&gt;push_migrations&lt;/code&gt;, &lt;code&gt;get_project&lt;/code&gt; and the function tools act on them. A Cloud-only tool asked about one says which tools work instead.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The MCP server's &lt;code&gt;list_projects&lt;/code&gt; and &lt;code&gt;get_project&lt;/code&gt; no longer carry the export download link&lt;/strong&gt; (or its role script) on every project; &lt;code&gt;export_status&lt;/code&gt; has it. &lt;code&gt;reset_password&lt;/code&gt; returns the new URL, and &lt;code&gt;restore_window&lt;/code&gt; says why a restore is not available.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A &lt;code&gt;--file&lt;/code&gt; or &lt;code&gt;--p8&lt;/code&gt; that is not there says &lt;code&gt;no file at …&lt;/code&gt;&lt;/strong&gt; and exits 2, instead of Node's error.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The CLI works against a self-hosted stack on your machine.&lt;/strong&gt; &lt;code&gt;snoutdata link --local&lt;/code&gt; links a project you set up in Studio, or any stack folder, and then &lt;code&gt;db url&lt;/code&gt;, &lt;code&gt;db psql&lt;/code&gt;, &lt;code&gt;db push&lt;/code&gt;, &lt;code&gt;gen types&lt;/code&gt;, &lt;code&gt;keys&lt;/code&gt;, &lt;code&gt;start&lt;/code&gt;, &lt;code&gt;stop&lt;/code&gt;, &lt;code&gt;status&lt;/code&gt;, &lt;code&gt;functions&lt;/code&gt; and &lt;code&gt;secrets&lt;/code&gt; act on it, with no sign-in. Cloud-only commands say they are about SnoutData Cloud.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;snoutdata init --env&lt;/code&gt; on a folder that is already linked now writes &lt;code&gt;.env&lt;/code&gt;&lt;/strong&gt;, and in a git repository &lt;code&gt;.env&lt;/code&gt; is added to &lt;code&gt;.gitignore&lt;/code&gt; the first time, since it holds the password.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Ask AI says when your plan does not include what you are asking about&lt;/strong&gt; (Realtime table changes, the data API) before it gives you SQL for it.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Clearing the Ask AI conversation no longer reads your project's tables&lt;/strong&gt; when your setting says the assistant may see nothing.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Creating a project past your plan's limit says what to do next&lt;/strong&gt;: delete one, or move up a plan.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Terminal sign-ins read as sentences in the activity list.&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The functions docs say where the CPU limit actually stops a request&lt;/strong&gt; (one and a half times the plan's figure, plus half a second), and list two things not built yet: websockets served by a function, and &lt;code&gt;EdgeRuntime.waitUntil&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;snoutdata gen types typescript&lt;/code&gt; types a column the database fills itself as &lt;code&gt;never&lt;/code&gt; on writes&lt;/strong&gt;: a &lt;code&gt;generated always as identity&lt;/code&gt; column and a computed (&lt;code&gt;generated always as (...) stored&lt;/code&gt;) column are &lt;code&gt;?: never&lt;/code&gt; in &lt;code&gt;Insert&lt;/code&gt; and &lt;code&gt;Update&lt;/code&gt;, as other generators write them, so the compiler stops an insert Postgres would refuse. A &lt;code&gt;generated by default&lt;/code&gt; identity stays optional.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;snoutdata domains verify&lt;/code&gt; says why a domain is not verified yet&lt;/strong&gt; (the record it could not find) and prints the records again; it printed nothing. Adding a domain that is already on the project gives its records again instead of a refusal.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Point-in-time restore's refusal names the plans that include it.&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;snoutdata projects show&lt;/code&gt; lists push&lt;/strong&gt; beside auth, storage and the data API.&lt;/li&gt;&lt;/ul&gt;</content>
	</entry>
	<entry>
		<id>https://docs.snoutdata.com/cloud/changelog/#2026-10-02</id>
		<title>SnoutData Cloud, 2026-10-02</title>
		<link href="https://docs.snoutdata.com/cloud/changelog/#2026-10-02"/>
		<updated>2026-10-02T00:00:00Z</updated>
		<content type="html">&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Requests through the data API have statement timeouts&lt;/strong&gt;: 3 seconds for &lt;code&gt;anon&lt;/code&gt;, 8 for a signed-in user, as on other hosted Postgres services. A slow anonymous call used to hold a database connection for as long as it ran. A timeout you set on those roles yourself is kept. &lt;a href="https://docs.snoutdata.com/stack/data-api"&gt;Data API&lt;/a&gt; says how to change them.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;snoutdata secrets set&lt;/code&gt; and &lt;code&gt;unset&lt;/code&gt; answer once your functions see the change&lt;/strong&gt;, and &lt;code&gt;functions delete&lt;/code&gt; once the function has stopped. The old value used to be served for a few seconds.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A two-factor code works once.&lt;/strong&gt; Using the same six digits again within its thirty seconds is refused; the next code works. &lt;a href="https://docs.snoutdata.com/stack/auth"&gt;Auth&lt;/a&gt; now covers two-factor sign-in. Self-hosted: snout-auth 0.1.5.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The Realtime docs say the publication is &lt;code&gt;snoutdata_realtime&lt;/code&gt;&lt;/strong&gt;, for migrations written against another name.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A project without storage switched on says so&lt;/strong&gt; ("This project does not have the storage service enabled.") instead of an internal "Missing tenant config" error.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The dashboard's activity list describes every host action in words&lt;/strong&gt;, and a switch that needs a paid plan links to your plan.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A scheduled push notification goes out at its &lt;code&gt;send_at&lt;/code&gt;.&lt;/strong&gt; It could arrive up to 30 seconds late, or up to a minute early.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Your project's log shows what you did, not every page the dashboard drew.&lt;/strong&gt; Opening a tab used to add a dozen "You ran a statement here" lines; the dashboard's own reads are now kept apart and found by searching for &lt;code&gt;sql.read&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Your files now count toward your plan's files allowance&lt;/strong&gt;, and the Storage tab shows how much you hold against it.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A signed upload URL takes the upload with no key&lt;/strong&gt;, as the client describes, so a server can hand one to a browser or a device. Self-hosted: snout-stack 0.1.3.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Realtime connections no longer count against your API's open-request limit&lt;/strong&gt;, so a Plus project can hold the 500 realtime clients its plan includes.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A refused realtime connection says why&lt;/strong&gt;, for example "Too many connections from this address". One address may hold 100 of a project's realtime clients; &lt;a href="https://docs.snoutdata.com/stack/realtime"&gt;Realtime&lt;/a&gt; has the table.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The storage docs are corrected&lt;/strong&gt;: files have their own allowance beside your database's, resumable (tus) and signed uploads are documented, and the Cron tab says its run times are in your own time zone.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Changing an auth setting no longer interrupts your data API.&lt;/strong&gt; Only the auth server restarts now; REST and GraphQL used to drop requests for about a second.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Signing in, signing up and password recovery need your project's &lt;code&gt;anon&lt;/code&gt; key&lt;/strong&gt;, like every other call, so a rotated key stops them too. Links in auth emails still work without one.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The dashboard's Realtime page stops counting subscribers a key rotation disconnected.&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Self-hosted: snout-stack 0.1.2 and snout-realtime 0.1.2&lt;/strong&gt;, with the same two fixes.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A function answers as soon as &lt;code&gt;snoutdata functions deploy&lt;/code&gt; says it is deployed.&lt;/strong&gt; The URL it printed used to answer "There is no function" for a few seconds.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The keys &lt;code&gt;snoutdata keys rotate&lt;/code&gt; prints work the moment it prints them.&lt;/strong&gt; They used to be refused for a few seconds. Rotating does not sign your users out: their sessions carry on once your app has the new &lt;code&gt;anon&lt;/code&gt; key.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Deleting a project frees its place on your plan at once&lt;/strong&gt;, so creating another straight after is no longer refused.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;@snoutdata/client&lt;/code&gt; in Node reports a table-changes subscription as SUBSCRIBED as soon as it is live&lt;/strong&gt;, instead of ten seconds later.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The dashboard's Settings no longer suggests a Free or Plus project can be restored from its latest backup by you.&lt;/strong&gt; Backups on those plans are what a lost machine is rebuilt from.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A function under a burst of CPU-heavy calls no longer fails healthy requests&lt;/strong&gt; with "it reached its CPU limit". The limit now applies to each request on its own.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Connecting to a paused project that is paused again while it starts answers at once&lt;/strong&gt;, instead of waiting a minute, and the project shows as paused rather than pausing.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;status.snoutdata.com reports a problem that hits most databases at once&lt;/strong&gt;, such as backups failing across the service, even though each one is about a single project.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;status.snoutdata.com now sees an outage of a couple of minutes.&lt;/strong&gt; It checks each public address every minute instead of every fifteen, and short outages now appear in its history.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Resetting a database password no longer restarts the database.&lt;/strong&gt; The new password works within a few seconds and connections already open stay connected. It used to back up and restart the project, dropping every connection.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;snoutdata db restore&lt;/code&gt; moves an export into another of your projects.&lt;/strong&gt; It used to report dozens of errors and a failed restore, and a restored project could not switch Auth on afterwards. It now restores your own tables plus your users, buckets and push devices, and tells you which products to switch on first.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The SQL editor shows large rows without stalling.&lt;/strong&gt; A result now stops at 500 rows or 8 MB, whichever comes first, and still tells you how many rows there are in all. Selecting a table of images or documents shows the first rows that fit instead of trying to bring back all of them.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A function you deploy again answers as soon as its new build is ready.&lt;/strong&gt; It could keep refusing with "has not been prepared yet" until the service restarted.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;snoutdata gen types typescript --ref&lt;/code&gt; works without &lt;code&gt;psql&lt;/code&gt; installed.&lt;/strong&gt; It reads your hosted project's schema through your sign-in, so it runs on a machine with no Postgres tools.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A function whose imports cannot be fetched says why in plain text&lt;/strong&gt;, without terminal colour codes in the message.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A function that requires a key now checks the token it is called with.&lt;/strong&gt; The &lt;code&gt;Authorization&lt;/code&gt; token must be signed by your project and not expired: the anon key, the service key and a signed-in user's token all work, and anything else gets &lt;code&gt;401 Invalid JWT&lt;/code&gt;. Functions deployed with &lt;code&gt;--no-verify-jwt&lt;/code&gt; are unchanged.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;After you rotate keys, your functions get the new keys too.&lt;/strong&gt; &lt;code&gt;SNOUTDATA_ANON_KEY&lt;/code&gt; and &lt;code&gt;SNOUTDATA_SERVICE_ROLE_KEY&lt;/code&gt; inside a function kept the old ones, so a function calling its own project was refused until it was deployed again.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A burst of API requests is limited cleanly.&lt;/strong&gt; Past your plan's requests per minute you get &lt;code&gt;429&lt;/code&gt; with &lt;code&gt;retry-after&lt;/code&gt;, and other projects are unaffected. Before, a large burst could briefly drop connections for every project on the same server.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Rotating keys or changing an auth setting no longer restarts your database.&lt;/strong&gt; Connections stay up; the data API and auth pick up the change within a few seconds. It used to restart the whole project, about half a minute without a database.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;An upload refused for its size no longer breaks your next request.&lt;/strong&gt; After a &lt;code&gt;413&lt;/code&gt;, the next request on the same connection could fail with a connection reset.&lt;/li&gt;&lt;/ul&gt;</content>
	</entry>
	<entry>
		<id>https://docs.snoutdata.com/cloud/changelog/#2026-10-01</id>
		<title>SnoutData Cloud, 2026-10-01</title>
		<link href="https://docs.snoutdata.com/cloud/changelog/#2026-10-01"/>
		<updated>2026-10-01T00:00:00Z</updated>
		<content type="html">&lt;ul&gt;&lt;li&gt;&lt;strong&gt;You choose what Ask AI may see of your data&lt;/strong&gt;: nothing from your databases, or the schema of the project you are looking at (never its rows). Ask AI asks once; after that it is on your Account page, and a project can have its own setting on its Settings tab, for example nothing from production.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Rotating your API keys no longer interrupts Storage or Realtime.&lt;/strong&gt; Uploads failed and database changes stopped arriving after a rotation until the service restarted. Both now pick up the new keys on their own.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Production projects ask before every change.&lt;/strong&gt; The confirmation before a statement that changes data now recognises every way a statement can do that, not only the ones that start with the command's name. The same check guards Studio's read-only connections and its agent tools.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Tables anyone can reach are flagged.&lt;/strong&gt; A table in &lt;code&gt;public&lt;/code&gt; with row-level security off is readable and writable with your anon key once the data API is on. The table browser now marks it RLS off, and the Data API tab lists every such table with a one-click switch to turn row-level security on, and an example policy to start from.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The SQL tab handles long and large queries.&lt;/strong&gt; A statement is given its full 30 seconds and stops with the database's own message, where one over ten seconds used to fail with "This function could not be run". A very large result shows its first 500 rows and counts the rest without slowing anything down. A write says what it changed ("10 rows deleted", not "0 rows"), and a refusal says what is in the way, such as the table still using an extension you are switching off.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Cron jobs delete.&lt;/strong&gt; Delete on a job answered "could not find valid entry" and left it running. A schedule the database refuses is now explained inside the dialog.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The dashboard no longer goes blank after an update.&lt;/strong&gt; A page opened while a new version was going out could stay empty for hours. It now loads the new version.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Smaller fixes.&lt;/strong&gt; The activity log names every action in words, and what the CLI does is filed under CLI rather than You. Resetting the password and removing a push key or service account ask first. A refused extension says so where you clicked, and messages clear on their own. The Data API log tab knows when the API is on. The heaviest-statements list says which role ran a statement whose text is hidden. Time series shows dates, intervals and run times in plain units. &lt;code&gt;snoutdata products&lt;/code&gt; suggests enabling only a product that is off.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A project's first tab is now Overview&lt;/strong&gt;, in the dashboard and in Studio: its state, size, connections, keys and recent activity, where it said Dashboard before.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;API docs is now Data API&lt;/strong&gt; in the dashboard, under Services, with two tabs: Settings for the switch that turns REST and GraphQL on, and Docs for the reference to your own tables, whose snippets now use &lt;code&gt;@snoutdata/client&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The project menu is regrouped.&lt;/strong&gt; Extensions, Cron and Time series sit under Database, since they run inside Postgres; Services is the servers beside it (Auth, Storage, Data API, Functions, Realtime, Push); Manage is Logs, Domains and Settings.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Run the whole stack yourself.&lt;/strong&gt; Postgres, auth, the REST and GraphQL API, storage, Realtime and functions on one machine with Docker Compose, behind one gateway, from the same open-source servers Cloud runs. Three commands, keys made for your stack alone, and your client code works unchanged. &lt;a href="https://docs.snoutdata.com/stack/self-hosting"&gt;Run the stack yourself&lt;/a&gt;, source at &lt;a href="https://github.com/snoutdata/snout-stack"&gt;snoutdata/snout-stack&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The desktop app is now SnoutData Studio&lt;/strong&gt;, and the dashboard says so: your account, your plan and your team read Studio and Cloud. The &lt;code&gt;snoutdata&lt;/code&gt; CLI says it too from its next release, in its help, its sign-in and the tools &lt;code&gt;snoutdata mcp&lt;/code&gt; borrows. Nothing about either product changes. See &lt;a href="https://docs.snoutdata.com/studio/projects"&gt;Cloud projects in Studio&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;</content>
	</entry>
	<entry>
		<id>https://docs.snoutdata.com/cloud/changelog/#2026-09-30</id>
		<title>SnoutData Cloud, 2026-09-30</title>
		<link href="https://docs.snoutdata.com/cloud/changelog/#2026-09-30"/>
		<updated>2026-09-30T00:00:00Z</updated>
		<content type="html">&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Every function is given &lt;code&gt;SNOUTDATA_URL&lt;/code&gt;, &lt;code&gt;SNOUTDATA_ANON_KEY&lt;/code&gt; and &lt;code&gt;SNOUTDATA_SERVICE_ROLE_KEY&lt;/code&gt;&lt;/strong&gt;, so it can call its own project with no configuration. The variables functions were given before are still set, so a deployed function keeps working. See &lt;a href="https://docs.snoutdata.com/stack/functions#secrets"&gt;Snout Functions&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;snoutdata&lt;/code&gt; CLI 0.9.0.&lt;/strong&gt; &lt;code&gt;functions deploy&lt;/code&gt; reads a function from &lt;code&gt;functions/&amp;lt;name&amp;gt;/&lt;/code&gt;, or from the folder &lt;code&gt;--dir&lt;/code&gt; names. &lt;code&gt;gen types typescript&lt;/code&gt; writes the schemas and the helper types and nothing else; &lt;code&gt;--data-api-version&lt;/code&gt; is still accepted and does nothing.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Snout Functions run on a new runtime.&lt;/strong&gt; A warm call takes about 2 ms and a function holds any number of waiting requests at once, where 100 held for 20 seconds used to lose most of them. A function that runs out of memory, CPU or time is now told which one, and a changed secret reaches the very next request. It is our own, open source as &lt;a href="https://github.com/snoutdata/snout-functions"&gt;snout-functions&lt;/a&gt;. Nothing to change in your code: &lt;a href="https://docs.snoutdata.com/stack/functions"&gt;Snout Functions&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Your functions run in a process of their own.&lt;/strong&gt; Each project's functions now run apart from every other project's on the machine, confined to your project's code and secrets as a user of their own, so even code that escaped its sandbox could not reach another project. A first call to a project that has been idle takes a few milliseconds more. &lt;a href="https://docs.snoutdata.com/cloud/changelog/security"&gt;Security&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;One function that keeps growing no longer takes the others down.&lt;/strong&gt; When the functions on a host near their shared memory, the one holding the most is stopped and its caller is told why; the rest keep answering.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;An emailed sign-in code can no longer be guessed.&lt;/strong&gt; After five wrong tries a code stops working and answers as an expired code does, so your app needs no change; the person asks for a new one.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Keeping a session signed in is faster.&lt;/strong&gt; Refreshing a session now takes about 3 milliseconds on its own, and a project answers roughly twice as many refreshes a second as it did a day ago, so a busy app's sign-ins stay quick when many devices refresh at once. Nothing to change.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;GraphQL can do more, when you ask it to.&lt;/strong&gt; Filter by related rows (&lt;code&gt;some&lt;/code&gt;, &lt;code&gt;every&lt;/code&gt;, &lt;code&gt;none&lt;/code&gt;), order by a related field or by how many related rows there are, upsert with &lt;code&gt;onConflict&lt;/code&gt;, &lt;code&gt;distinctOn&lt;/code&gt;, keep a table off the root, read domains, composites, enum arrays and PostGIS columns (as GeoJSON, with spatial filters), reflect overloaded functions and computed fields that take arguments, cap what one document may ask for, run only registered documents for the public key (with persisted queries), see the SQL and plan behind a request, and ask why a table is not in the schema. Each is off until a comment on the table or schema switches it on, so nothing changes for a project that does not: &lt;a href="https://docs.snoutdata.com/stack/graphql#more-when-you-switch-it-on"&gt;GraphQL&lt;/a&gt; lists them.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;GraphQL checks every request against the specification before running it&lt;/strong&gt;, with the same error sentences as GraphQL's reference implementation. A document it used to answer despite a mistake is now refused with the reason, most often an enum value written as a string (&lt;code&gt;{plan: {eq: "free"}}&lt;/code&gt; instead of &lt;code&gt;{plan: {eq: free}}&lt;/code&gt;) or a variable declared with the wrong type. &lt;a href="https://docs.snoutdata.com/stack/graphql#requests-are-checked-before-they-run"&gt;GraphQL&lt;/a&gt; shows the fixes, and how a schema can switch the checks off while a client catches up.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;GraphQL refuses a document that spreads fragments over a million times&lt;/strong&gt;, where it used to work through all of them before answering.&lt;/li&gt;&lt;/ul&gt;</content>
	</entry>
	<entry>
		<id>https://docs.snoutdata.com/cloud/changelog/#2026-09-29</id>
		<title>SnoutData Cloud, 2026-09-29</title>
		<link href="https://docs.snoutdata.com/cloud/changelog/#2026-09-29"/>
		<updated>2026-09-29T00:00:00Z</updated>
		<content type="html">&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Authentication runs on our own server.&lt;/strong&gt; Sign-up, sign-in, sessions, email links, multi-factor, Google and GitHub sign-in and SAML single sign-on now run on &lt;a href="https://github.com/snoutdata/snout-auth"&gt;snout-auth&lt;/a&gt;, open source, for every project with auth on and for SnoutData itself. Nothing to change: the same endpoints, the same tokens, the same &lt;code&gt;auth&lt;/code&gt; schema and your existing users and sessions. It uses about a megabyte of memory where the previous server used over ten. What behaves better: a sign-up sent twice at once no longer fails with a server error, one emailed link or one authenticator code can no longer be spent twice at the same moment, a single sign-on that fails now returns to your app's own address with the error rather than to your site's home page, and a refused SAML response is no longer echoed back into the error.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;HTTP from SQL (pg_net) sends each request on its own.&lt;/strong&gt; A request queued behind a slow one no longer waits for it (a request now reaches the server in about a millisecond after COMMIT, where it could take a second or more), responses appear as they arrive, and an endpoint that never answers can no longer stop every later request in the project. A request to an internal address is refused with a sentence saying which address and why, a header containing a line break is refused rather than sent, and &lt;code&gt;headers&lt;/code&gt; now holds the final response's headers after a redirect. Same functions, same tables, nothing to migrate. See &lt;a href="https://docs.snoutdata.com/stack/extensions#how-a-request-is-sent"&gt;How a request is sent&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;GraphQL is faster, and has its own page.&lt;/strong&gt; A query after a schema change answers several times sooner, a connection's memory no longer grows with every change it lives through, and creating a temporary table or refreshing a materialized view no longer makes the next GraphQL request read the whole schema again. A &lt;code&gt;BigInt&lt;/code&gt; or &lt;code&gt;UUID&lt;/code&gt; argument that is not one is now refused with a GraphQL error naming the type, instead of reaching the database. A role granted to a user takes effect on their next request. &lt;a href="https://docs.snoutdata.com/stack/graphql"&gt;GraphQL&lt;/a&gt; documents the whole API, including how to switch introspection on for GraphiQL and code generators.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Each Snout Function has its own memory and concurrency.&lt;/strong&gt; On the dashboard's &lt;strong&gt;Functions&lt;/strong&gt; tab, choose the memory one worker may use and how many workers a function may run at once, within your plan (up to 2 on Free, 4 on Plus, 8 on Pro). Memory × workers may not exceed your project's memory, and the tab shows the total before you save. The same from the CLI (&lt;code&gt;snoutdata functions size &amp;lt;name&amp;gt; --memory 256 --concurrency 4&lt;/code&gt;, and &lt;code&gt;functions list&lt;/code&gt; shows each function's size), Studio's project tab, and the MCP tool &lt;code&gt;size_function&lt;/code&gt;. See &lt;a href="https://docs.snoutdata.com/stack/functions#memory-and-concurrency"&gt;Memory and concurrency&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;An access token can be limited to one project.&lt;/strong&gt; &lt;code&gt;snoutdata tokens create --project REF&lt;/code&gt;, or the Project picker under Access tokens in the dashboard, makes a token that reaches that project and nothing else, so a leaked CI secret costs one project rather than the account. &lt;code&gt;tokens list&lt;/code&gt; and the dashboard show which project each token reaches. See &lt;a href="https://docs.snoutdata.com/developers/cli#tokens"&gt;the CLI&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;An expiry set through the MCP &lt;code&gt;create_token&lt;/code&gt; tool is kept.&lt;/strong&gt; It was dropped, so those tokens never expired. Tokens made that way before today still do not; revoke and remake any that should.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Updating an extension works.&lt;/strong&gt; &lt;code&gt;alter extension &amp;lt;name&amp;gt; update&lt;/code&gt; on an extension the image carries (pgvector, pg_graphql, PostGIS and the rest) used to fail with &lt;code&gt;pgaudit stack is not empty&lt;/code&gt;; it now updates. See &lt;a href="https://docs.snoutdata.com/stack/extensions"&gt;Extensions&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Only the owner role manages extensions.&lt;/strong&gt; Other login roles you create follow Postgres's own rules and can no longer create or drop the extensions the image carries.&lt;/li&gt;&lt;/ul&gt;</content>
	</entry>
	<entry>
		<id>https://docs.snoutdata.com/cloud/changelog/#2026-09-28</id>
		<title>SnoutData Cloud, 2026-09-28</title>
		<link href="https://docs.snoutdata.com/cloud/changelog/#2026-09-28"/>
		<updated>2026-09-28T00:00:00Z</updated>
		<content type="html">&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The dashboard links to the status page.&lt;/strong&gt; Your account menu now has &lt;strong&gt;Status&lt;/strong&gt;, which opens &lt;a href="https://status.snoutdata.com"&gt;status.snoutdata.com&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href="https://status.snoutdata.com"&gt;status.snoutdata.com&lt;/a&gt; covers more.&lt;/strong&gt; Besides hosted databases and creating projects it now reports project APIs, sign-in, the dashboard, the AI assistant, app downloads and updates, the website and the docs, each checked from the outside every fifteen minutes, with 90 days of history per part. Scheduled maintenance and incident updates are posted there, and you can follow it with the &lt;a href="https://status.snoutdata.com/feed.xml"&gt;Atom feed&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Realtime runs on our own server&lt;/strong&gt;, &lt;a href="https://github.com/snoutdata/snout-realtime"&gt;snout-realtime&lt;/a&gt;, open source. Nothing to change on your side. Table changes now arrive as they are committed rather than by polling, the first subscription on a quiet project is no longer dropped, and a policy that raises an error for one subscriber no longer stops changes for everyone else. See &lt;a href="https://docs.snoutdata.com/stack/realtime"&gt;Realtime&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Push has its own section in the docs.&lt;/strong&gt; &lt;a href="https://docs.snoutdata.com/stack/push"&gt;Push notifications&lt;/a&gt; is now a page per job: switching it on, then browsers, iPhone and Android step by step (what you need, each step, how to tell it worked), devices, sending, the delivery log, and troubleshooting with every error each platform gives.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Realtime: table changes with a filter.&lt;/strong&gt; A subscription with a &lt;code&gt;filter&lt;/code&gt; (&lt;code&gt;done=eq.false&lt;/code&gt;, say) was refused with "invalid column for filter" on any table you made. It now subscribes and receives the rows the filter matches.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Realtime: broadcast over HTTP.&lt;/strong&gt; Sending on a channel you have not joined (the client sends it over HTTP then) failed with a 404. It now reaches everyone on the channel.&lt;/li&gt;&lt;/ul&gt;</content>
	</entry>
	<entry>
		<id>https://docs.snoutdata.com/cloud/changelog/#2026-09-27</id>
		<title>SnoutData Cloud, 2026-09-27</title>
		<link href="https://docs.snoutdata.com/cloud/changelog/#2026-09-27"/>
		<updated>2026-09-27T00:00:00Z</updated>
		<content type="html">&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;@snoutdata/client&lt;/code&gt; 0.3.0.&lt;/strong&gt; &lt;code&gt;db.push&lt;/code&gt;: register a device, subscribe a browser, join a topic, send, and report a notification received or opened. See &lt;a href="https://docs.snoutdata.com/stack/push"&gt;Push notifications&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;CLI 0.6.0.&lt;/strong&gt; &lt;code&gt;snoutdata products enable push&lt;/code&gt;, and &lt;code&gt;snoutdata push credentials&lt;/code&gt; to set and check a project's Apple and Firebase keys from a terminal.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Resizable dashboard sidebar.&lt;/strong&gt; Drag its right edge to adjust the width, just like the chat panel. Your width is remembered; double-click the edge to reset it.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Dashboard account menu.&lt;/strong&gt; Click your name in the sidebar to open Settings, visit snoutdata.com or Docs, choose Light, Dark or System appearance, or log out.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Your display name.&lt;/strong&gt; The dashboard shows your name instead of your email address. It starts as the name your sign-in provider gave, or a guess from your email address, and you can change it under Settings, Your profile.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Push notifications.&lt;/strong&gt; A project can send notifications to iPhone, Android and the web, from SQL (&lt;code&gt;push.send&lt;/code&gt;) and from &lt;code&gt;/push/v1&lt;/code&gt;. Switch it on from the dashboard's Push tab, on every plan. The devices, the queue, the delivery log and your Apple and Firebase keys are tables in your own database, and your row-level security decides who may send. See &lt;a href="https://docs.snoutdata.com/stack/push"&gt;Push notifications&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;CLI 0.5.1.&lt;/strong&gt; The npm package carries its licence, the Apache License 2.0, with a NOTICE file.&lt;/li&gt;&lt;/ul&gt;</content>
	</entry>
	<entry>
		<id>https://docs.snoutdata.com/cloud/changelog/#2026-09-26</id>
		<title>SnoutData Cloud, 2026-09-26</title>
		<link href="https://docs.snoutdata.com/cloud/changelog/#2026-09-26"/>
		<updated>2026-09-26T00:00:00Z</updated>
		<content type="html">&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Dashboard.&lt;/strong&gt; The Storage tab can make and delete buckets, make a bucket public or private, and upload, download and delete files. Upload takes several files at once, into an optional folder, or a drop onto the Files card. Each change goes through your project's storage API, the same one your app uses.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;@snoutdata/client&lt;/code&gt; 0.2.2.&lt;/strong&gt; A sign-in that leaves the page and comes back (SSO, GitHub, a magic link) completes when the session is kept in &lt;code&gt;cookieStorage&lt;/code&gt;. In 0.2.0 and 0.2.1 it did not.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;@snoutdata/client&lt;/code&gt; 0.2.1.&lt;/strong&gt; Without a &lt;code&gt;Database&lt;/code&gt; type, rows and function results are &lt;code&gt;any&lt;/code&gt;, as in the v2 client API, so moving an app over is changing its import. &lt;code&gt;insert(...).select()&lt;/code&gt; (and &lt;code&gt;update&lt;/code&gt;, &lt;code&gt;upsert&lt;/code&gt;, &lt;code&gt;delete&lt;/code&gt;) returns the table's rows. With a &lt;code&gt;Database&lt;/code&gt; type from &lt;code&gt;snoutdata gen types typescript&lt;/code&gt;, rows stay exact.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;@snoutdata/client&lt;/code&gt; 0.2.0.&lt;/strong&gt; A session can live in a cookie on your parent domain, so your subdomains share one sign-in (&lt;a href="https://docs.snoutdata.com/stack/auth#one-sign-in-across-your-subdomains"&gt;&lt;code&gt;cookieStorage&lt;/code&gt;&lt;/a&gt;). Adds &lt;code&gt;auth.signInWithIdToken&lt;/code&gt; (Google One Tap and similar), &lt;code&gt;auth.signInWithSSO&lt;/code&gt;, &lt;code&gt;auth.startAutoRefresh&lt;/code&gt;, and a &lt;code&gt;debug&lt;/code&gt; option that says why a session ended. Two tabs or two processes sharing one session no longer sign each other out when one refreshes it.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Dashboard.&lt;/strong&gt; A project's API tab starts its code with &lt;code&gt;@snoutdata/client&lt;/code&gt;. An app already written against the v2 client API still works unchanged.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Time series.&lt;/strong&gt; SnoutTime 0.1.6. Automatic sealing failed with "permission denied for schema snouttime_internal" once a series had a sealed partition, and the dashboard's Time series tab showed the seal job as failed. Partitions due for sealing were still sealed; what failed was the check for a sealed partition that has changed enough to seal again. It runs now.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Time series.&lt;/strong&gt; SnoutTime 0.1.5. With SnoutTime switched on, &lt;code&gt;DROP TABLE&lt;/code&gt; failed for every table in the database with "permission denied for schema snouttime_internal". Dropping a table, a series table and its partitions included, works again.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Time series.&lt;/strong&gt; SnoutTime 0.1.4. A &lt;code&gt;LATERAL&lt;/code&gt; join for "the latest reading at or before each event", over a table with many series, no longer slows down as the number of series grows.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Time series.&lt;/strong&gt; SnoutTime 0.1.3. A query over a few hosts or a short stretch of time reads only the part of a sealed partition it needs, and a &lt;code&gt;WHERE host IN (...)&lt;/code&gt; on the sort key seeks to each value instead of scanning. A filter written as &lt;code&gt;ts &amp;gt;= '2026-09-26 12:00+00'::timestamptz - interval '1 hour'&lt;/code&gt; now narrows to the partitions it reaches while the query is planned (&lt;code&gt;snouttime.plan_time_bounds&lt;/code&gt;, on by default). Projects move onto it on their own; see &lt;a href="https://docs.snoutdata.com/stack/snouttime/limits#versions-and-upgrades"&gt;Versions and upgrades&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;</content>
	</entry>
	<entry>
		<id>https://docs.snoutdata.com/cloud/changelog/#2026-09-25</id>
		<title>SnoutData Cloud, 2026-09-25</title>
		<link href="https://docs.snoutdata.com/cloud/changelog/#2026-09-25"/>
		<updated>2026-09-25T00:00:00Z</updated>
		<content type="html">&lt;ul&gt;&lt;li&gt;&lt;strong&gt;GitHub.&lt;/strong&gt; &lt;a href="https://github.com/snoutdata/snoutdata"&gt;snoutdata/snoutdata&lt;/a&gt; is the place to start: these docs, and runnable examples for &lt;a href="https://github.com/snoutdata/snout-client"&gt;&lt;code&gt;@snoutdata/client&lt;/code&gt;&lt;/a&gt; (a Node script, and a web page with sign-in and row-level security). "Edit this page" on any docs page opens its file there.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;CLI.&lt;/strong&gt; The source is on GitHub at &lt;a href="https://github.com/snoutdata/snout-cli"&gt;snoutdata/snout-cli&lt;/a&gt;, open source under the Apache License 2.0.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Client.&lt;/strong&gt; &lt;code&gt;@snoutdata/client&lt;/code&gt; is on GitHub at &lt;a href="https://github.com/snoutdata/snout-client"&gt;snoutdata/snout-client&lt;/a&gt;, under the Apache License 2.0 (version 0.1.0 was published under MIT and stays MIT).&lt;/li&gt;&lt;/ul&gt;</content>
	</entry>
	<entry>
		<id>https://docs.snoutdata.com/cloud/changelog/#2026-09-24</id>
		<title>SnoutData Cloud, 2026-09-24</title>
		<link href="https://docs.snoutdata.com/cloud/changelog/#2026-09-24"/>
		<updated>2026-09-24T00:00:00Z</updated>
		<content type="html">&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Dashboard.&lt;/strong&gt; A project's sections now sit in the side rail. The SQL editor and the table browser are one &lt;strong&gt;Database&lt;/strong&gt; section, and the table browser no longer lists the platform's own schemas beside yours.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Dashboard.&lt;/strong&gt; A &lt;strong&gt;Realtime&lt;/strong&gt; tab, and Snout Function calls charted from the project's own usage.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Auth.&lt;/strong&gt; Write your own subject and HTML for any of the five auth emails, with a preview, from the Auth tab or with &lt;code&gt;snoutdata auth template&lt;/code&gt;. See &lt;a href="https://docs.snoutdata.com/stack/auth"&gt;Auth&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Auth.&lt;/strong&gt; Setting up &lt;strong&gt;Sign in with Google&lt;/strong&gt; is now a step-by-step guide in the dashboard.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;CLI 0.5.0.&lt;/strong&gt; Knows about SnoutTime partition states.&lt;/li&gt;&lt;/ul&gt;</content>
	</entry>
	<entry>
		<id>https://docs.snoutdata.com/cloud/changelog/#2026-09-23</id>
		<title>SnoutData Cloud, 2026-09-23</title>
		<link href="https://docs.snoutdata.com/cloud/changelog/#2026-09-23"/>
		<updated>2026-09-23T00:00:00Z</updated>
		<content type="html">&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;@snoutdata/client&lt;/code&gt; 0.1.0&lt;/strong&gt; is on npm: our JavaScript client for a Cloud project (data API, auth, storage, realtime, functions).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Time series.&lt;/strong&gt; &lt;strong&gt;SnoutTime&lt;/strong&gt; is in every project: partitioned series tables, sealed columnar partitions, rollups, gap filling, as-of joins and tiering to S3. Switch it on from the dashboard's Time series tab or the desktop's table designer. See &lt;a href="https://docs.snoutdata.com/stack/snouttime/overview"&gt;Time series&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Products from the dashboard.&lt;/strong&gt; Auth, Storage and the data API each have an on/off switch on their tab, so none of them needs the CLI any more. A new project has its API keys and Realtime from the moment it is created.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Sign in with Google&lt;/strong&gt; for your project's own users, from the dashboard or the CLI.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Production.&lt;/strong&gt; Mark a project production, or stop, from Settings at any time (it used to be set only at create). On a production project, a statement that changes things now asks you to confirm instead of being refused, and the confirmation is on the audit log.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Auth emails&lt;/strong&gt; use a clean house template by default, on new projects and ones that already had auth on.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Realtime&lt;/strong&gt; now covers schemas you create after the project was made.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;CLI 0.4.1.&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;</content>
	</entry>
	<entry>
		<id>https://docs.snoutdata.com/cloud/changelog/#2026-09-22</id>
		<title>SnoutData Cloud, 2026-09-22</title>
		<link href="https://docs.snoutdata.com/cloud/changelog/#2026-09-22"/>
		<updated>2026-09-22T00:00:00Z</updated>
		<content type="html">&lt;ul&gt;&lt;li&gt;&lt;strong&gt;pg_cron works.&lt;/strong&gt; Scheduled jobs run, and a &lt;strong&gt;Cron&lt;/strong&gt; tab in the dashboard lists them and can switch pg_cron off. See &lt;a href="https://docs.snoutdata.com/stack/extensions"&gt;Extensions&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;pg_net&lt;/strong&gt; is available. Each project now gets short-lived storage credentials scoped to its own data, and its network cannot reach our infrastructure, which is what makes outbound HTTP safe to offer.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Request limit.&lt;/strong&gt; The HTTP API counts requests per minute per project: 600 on Free, 3,000 on Plus, 6,000 on Pro. See &lt;a href="https://docs.snoutdata.com/cloud/changelog/limits"&gt;Limits&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;CLI 0.4.0.&lt;/strong&gt; &lt;code&gt;products&lt;/code&gt;, &lt;code&gt;domains&lt;/code&gt;, &lt;code&gt;projects show&lt;/code&gt; and point-in-time restore, the same operations &lt;code&gt;snoutdata mcp&lt;/code&gt; gives an agent. No tool takes a secret as an argument.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Agent Skill.&lt;/strong&gt; The CLI is published as an Agent Skill any coding agent can install: &lt;code&gt;npx skills add https://snoutdata.com&lt;/code&gt;. See &lt;a href="https://docs.snoutdata.com/developers/agent-skill"&gt;the SnoutData skill&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;</content>
	</entry>
	<entry>
		<id>https://docs.snoutdata.com/cloud/changelog/#2026-09-20</id>
		<title>SnoutData Cloud, 2026-09-20</title>
		<link href="https://docs.snoutdata.com/cloud/changelog/#2026-09-20"/>
		<updated>2026-09-20T00:00:00Z</updated>
		<content type="html">&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Dashboard.&lt;/strong&gt; The navigation is grouped, opens on a phone, and the Ask AI dock can be resized.&lt;/li&gt;&lt;/ul&gt;</content>
	</entry>
	<entry>
		<id>https://docs.snoutdata.com/cloud/changelog/#2026-09-19</id>
		<title>SnoutData Cloud, 2026-09-19</title>
		<link href="https://docs.snoutdata.com/cloud/changelog/#2026-09-19"/>
		<updated>2026-09-19T00:00:00Z</updated>
		<content type="html">&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Dashboard Ask AI&lt;/strong&gt; knows your project's tables, runs read queries in place, and asks before anything destructive.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Dashboard.&lt;/strong&gt; Plan and team pages redesigned; you can change plan in the billing portal.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;CLI 0.3.0&lt;/strong&gt; on npm, and as a native binary that does not need Node. See &lt;a href="https://docs.snoutdata.com/developers/install-cli"&gt;install the CLI&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;</content>
	</entry>
	<entry>
		<id>https://docs.snoutdata.com/cloud/changelog/#2026-09-17</id>
		<title>SnoutData Cloud, 2026-09-17</title>
		<link href="https://docs.snoutdata.com/cloud/changelog/#2026-09-17"/>
		<updated>2026-09-17T00:00:00Z</updated>
		<content type="html">&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Sign-in&lt;/strong&gt; moved to &lt;code&gt;accounts.snoutdata.com&lt;/code&gt;. Nothing to change on your side. Signing out of a browser now signs out only that browser.&lt;/li&gt;&lt;/ul&gt;</content>
	</entry>
	<entry>
		<id>https://docs.snoutdata.com/cloud/changelog/#2026-09-14</id>
		<title>SnoutData Cloud, 2026-09-14</title>
		<link href="https://docs.snoutdata.com/cloud/changelog/#2026-09-14"/>
		<updated>2026-09-14T00:00:00Z</updated>
		<content type="html">&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Dashboard Ask AI.&lt;/strong&gt; A model picker, a context size, and a copy button on answers.&lt;/li&gt;&lt;/ul&gt;</content>
	</entry>
	<entry>
		<id>https://docs.snoutdata.com/cloud/changelog/#2026-09-13</id>
		<title>SnoutData Cloud, 2026-09-13</title>
		<link href="https://docs.snoutdata.com/cloud/changelog/#2026-09-13"/>
		<updated>2026-09-13T00:00:00Z</updated>
		<content type="html">&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Usage.&lt;/strong&gt; Snout Function calls are counted and shown with the rest of a project's usage.&lt;/li&gt;&lt;/ul&gt;</content>
	</entry>
	<entry>
		<id>https://docs.snoutdata.com/cloud/changelog/#2026-09-12</id>
		<title>SnoutData Cloud, 2026-09-12</title>
		<link href="https://docs.snoutdata.com/cloud/changelog/#2026-09-12"/>
		<updated>2026-09-12T00:00:00Z</updated>
		<content type="html">&lt;ul&gt;&lt;li&gt;&lt;strong&gt;One dashboard.&lt;/strong&gt; Your account, plan, billing and team moved from snoutdata.com into dashboard.snoutdata.com, which now opens on the account, with your projects under it.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Edge Functions are now Snout Functions.&lt;/strong&gt; Same thing, same API.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New projects&lt;/strong&gt; start with an empty &lt;code&gt;public&lt;/code&gt; schema.&lt;/li&gt;&lt;/ul&gt;</content>
	</entry>
	<entry>
		<id>https://docs.snoutdata.com/cloud/changelog/#2026-09-11</id>
		<title>SnoutData Cloud, 2026-09-11</title>
		<link href="https://docs.snoutdata.com/cloud/changelog/#2026-09-11"/>
		<updated>2026-09-11T00:00:00Z</updated>
		<content type="html">&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Plans.&lt;/strong&gt; Fewer projects per plan at the same prices: Free 1, Plus 2, Pro 5. Existing projects are untouched; an account over its new cap keeps everything and cannot create another.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Connections.&lt;/strong&gt; Every project runs with the same Postgres &lt;code&gt;max_connections&lt;/code&gt;, and your plan's connection limit is enforced at the front door. Plus now gets its full 100.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Backups&lt;/strong&gt; are also copied to a second AWS region. See &lt;a href="https://docs.snoutdata.com/cloud/changelog/durability"&gt;Durability&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;snoutdata start&lt;/code&gt;&lt;/strong&gt; runs a project on your own machine, Windows included, from a plain install. See &lt;a href="https://docs.snoutdata.com/stack/local"&gt;local development&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The data API&lt;/strong&gt; can be switched on by anyone on a paid plan, you can write your own storage policies, and Realtime &lt;code&gt;postgres_changes&lt;/code&gt; delivers events.&lt;/li&gt;&lt;/ul&gt;</content>
	</entry>
	<entry>
		<id>https://docs.snoutdata.com/cloud/changelog/#2026-09-10</id>
		<title>SnoutData Cloud, 2026-09-10</title>
		<link href="https://docs.snoutdata.com/cloud/changelog/#2026-09-10"/>
		<updated>2026-09-10T00:00:00Z</updated>
		<content type="html">&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The full stack is live&lt;/strong&gt;: Auth, Storage, Realtime, the REST and GraphQL data API and Snout Functions, at &lt;code&gt;&amp;lt;ref&amp;gt;.api.snoutdata.com&lt;/code&gt;. See &lt;a href="https://docs.snoutdata.com/stack/api"&gt;the API&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Snout Functions.&lt;/strong&gt; Deploy your own TypeScript, with its own secrets. See &lt;a href="https://docs.snoutdata.com/stack/functions"&gt;Snout Functions&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Extensions.&lt;/strong&gt; An allowlist of extensions you can create yourself.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;CLI 0.2.0.&lt;/strong&gt; &lt;code&gt;start&lt;/code&gt;, &lt;code&gt;stop&lt;/code&gt;, &lt;code&gt;status&lt;/code&gt;, &lt;code&gt;gen types typescript&lt;/code&gt; and &lt;code&gt;keys&lt;/code&gt;.&lt;/li&gt;&lt;/ul&gt;</content>
	</entry>
	<entry>
		<id>https://docs.snoutdata.com/cloud/changelog/#2026-09-07</id>
		<title>SnoutData Cloud, 2026-09-07</title>
		<link href="https://docs.snoutdata.com/cloud/changelog/#2026-09-07"/>
		<updated>2026-09-07T00:00:00Z</updated>
		<content type="html">&lt;ul&gt;&lt;li&gt;&lt;strong&gt;CLI on npm&lt;/strong&gt;, 0.1.0 to 0.1.2. &lt;code&gt;npx snoutdata init&lt;/code&gt; turns an empty folder into a working &lt;code&gt;DATABASE_URL&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Dashboard.&lt;/strong&gt; Lists page and search on the server.&lt;/li&gt;&lt;/ul&gt;</content>
	</entry>
	<entry>
		<id>https://docs.snoutdata.com/cloud/changelog/#2026-09-06</id>
		<title>SnoutData Cloud, 2026-09-06</title>
		<link href="https://docs.snoutdata.com/cloud/changelog/#2026-09-06"/>
		<updated>2026-09-06T00:00:00Z</updated>
		<content type="html">&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Pause emails.&lt;/strong&gt; You are told when a Free project pauses. Production is a paid feature.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Cold projects&lt;/strong&gt; are kept for six months after they go cold, not erased.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;CLI.&lt;/strong&gt; Migrations, and &lt;code&gt;snoutdata mcp&lt;/code&gt; for agents.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Sign a terminal in&lt;/strong&gt; by typing a code into the dashboard.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Security.&lt;/strong&gt; Your database password is the only way in as your user.&lt;/li&gt;&lt;/ul&gt;</content>
	</entry>
	<entry>
		<id>https://docs.snoutdata.com/cloud/changelog/#2026-09-05</id>
		<title>SnoutData Cloud, 2026-09-05</title>
		<link href="https://docs.snoutdata.com/cloud/changelog/#2026-09-05"/>
		<updated>2026-09-05T00:00:00Z</updated>
		<content type="html">&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Dashboard live&lt;/strong&gt; at dashboard.snoutdata.com: projects, the audit log, access tokens, the plan, a SQL editor, a table browser, Ask AI, light mode, and usage charts.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Backups&lt;/strong&gt; on a schedule, kept by plan, and restored and checked every night.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Point-in-time restore&lt;/strong&gt; into a new project beside the original, which is left untouched.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Export&lt;/strong&gt; a copy of a database and download it.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Share a project&lt;/strong&gt; with your team.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Storage quota&lt;/strong&gt; is enforced; a full project goes read-only and the dashboard says so first.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Access tokens&lt;/strong&gt; (&lt;code&gt;sdt_…&lt;/code&gt;) for CI and scripts, which do not expire.&lt;/li&gt;&lt;/ul&gt;</content>
	</entry>
	<entry>
		<id>https://docs.snoutdata.com/cloud/changelog/#2026-09-04</id>
		<title>SnoutData Cloud, 2026-09-04</title>
		<link href="https://docs.snoutdata.com/cloud/changelog/#2026-09-04"/>
		<updated>2026-09-04T00:00:00Z</updated>
		<content type="html">&lt;ul&gt;&lt;li&gt;&lt;strong&gt;SnoutData Cloud opens.&lt;/strong&gt; Hosted Postgres you create through the API, reachable from anywhere at &lt;code&gt;&amp;lt;ref&amp;gt;.db.snoutdata.com&lt;/code&gt; over TLS. Connecting to a paused project wakes it while you wait.&lt;/li&gt;&lt;/ul&gt;</content>
	</entry>
</feed>
