v0.20.0: generators
New surface only, nothing breaking for existing apps.fymo generate grew page, remote, resource, component, layout, broadcast, and templates subcommands, and fymo destroy reverses the first three. See Generators.
The examples in the Fymo repo are now pure generator output, so reading examples/ is reading what the generators produce.
v0.19.1: fymo —version tells the truth
fymo --version now reports the installed package metadata instead of a stale hardcoded string. It used to print 0.1.0 no matter what was installed; if a script parsed that constant, it was being lied to. The new output is truthful:
v0.19.0: auth
The client identity store’s import specifier changed. One find-and-replace migrates you:dist/client/_fymo/auth.js to dist/client/_auth.js, in case any tooling referenced the old path.
v0.18.1: console.log during SSR
console.log in a component rendered on the server used to corrupt the sidecar’s stdout protocol and hang the request, silently. Fixed: component console output during SSR now surfaces in fymo dev’s terminal, prefixed [sidecar]:
Identity rework (~v0.18)
Fymo used to own a user model. It doesn’t anymore. Identity is now just auid string your app produces through resolvers you write in app/auth/.
Removed:
- The
Userdataclass, theUserStoreProtocol,SqliteUserStore,PostgresUserStore, and both hand-synced DDL files (fymo/auth/schema.sql,schema_postgres.sql). Thefymo_users/fymo_user_oauth_identitiestables are gone. - Every shipped auth provider (
fymo/auth/providers/: password, Clerk, OAuth, registry), the built-in signup/login/logout/me remotes (fymo/auth/remote.py), plusfymo/auth/email.pyandfymo/auth/session.py. current_user(),get_user_store()/set_user_store(), the legacy session-resolver chain,DECOY_HASH.- The
auth:block infymo.yml(enabled,user_store,providers). - The
fymo[clerk]extra, thepyjwtdependency, and theoidc/oauthplaceholder extras. (fymo[postgres]stays, jobs still use psycopg.)
fymo.yml that still has an auth: block fails at boot and in fymo build:
- Delete the
auth:block fromfymo.yml. - Run
fymo generate auth(or--clerk/--skeleton) and edit the generated code, it’s yours now. - Remotes keep
@require_auth; pages use route-levelrequire_auth:instead of anything in config. - Replace
current_user().email-style access withidentity_extras(), or the generated typed accessor,app/auth/extras.py’scurrent_extras().
examples/blog_app in the Fymo repo is the reference migration, a real app moved through this exact change. See the Authentication page for the full resolver, guard, and extras API.
This is not the same removal as the reserved-prefix warning below. Identity has nothing to do with
/dist/ or /static/, those only matter for storage.expose collisions, covered next.media: removed
Top-levelmedia: in fymo.yml is gone. Exposure now lives nested under storage:, as an expose list.
Fix: move each entry under storage.expose. The keys don’t change.
fymo.yml
storage.expose collision warnings are /dist/ and /static/, not /assets/. Overlapping one of those only prints a warning, it doesn’t fail the build. See Storage and media for the full expose pipeline.
/assets/ -> /static/
The URL prefix that served files out ofapp/static/ moved. It used to be /assets/, it’s /static/ now. The old prefix isn’t redirected and doesn’t dual-serve, it simply falls through to routing and returns a clean 404.
Fix: grep your app for /assets/ and change it to /static/. That’s the whole migration.
_global.css removed
The old magic auto-injectedapp/templates/_global.css file is gone. Any project still shipping it fails the build.
Fix: move the file to app/assets/app.css, then import it explicitly:
app/templates/_layout.svelte
.css file under app/templates/ (outside a component’s own <style> block) hits a similar hygiene error at build time, naming the offending path. Stylesheets live in app/assets/ now.
remote.mode replaces old flags
remote.explicit_optin and remote.allow_implicit still work, for one deprecation cycle, but they’re deprecated in favor of a single remote.mode key. Nothing breaks today if your fymo.yml still has the old booleans, but plan to move off them.
fymo.yml
strict only dispatches @remote-decorated functions. implicit-legacy dispatches every public, type-annotated function in app/remote/*.py, the old default behavior, kept around for projects migrating off it gradually. See Remote functions for the full picture.