Repository navigation
Releases: riducms/ridu
Release list
Ridu v0.25.0
Ridu 0.25.0
SQLite now counts filtered lists from its indexes and does less work for each write. On the new
Ridu/PocketBase SQLite benchmark in tests/performance/pocketbase, an anonymous list filtered by an
access rule fell from 5.1 ms to 0.73 ms of server CPU per request with 900 matching posts, and from
14 ms to 1.1 ms with 2,700. Deletes run about twice as fast as in 0.24.0, creates 22% faster and
updates 14% faster. These are measurements from one machine.
This release changes SQLite's index layout and migration planner, so SQLite migration histories and
the databases they migrated must be recreated. PostgreSQL and MongoDB are unchanged.
Changes
- SQLite filters, sorts, distinct values and field indexes share one typed expression: the stored
value when its JSON type matches the field, otherwise null. An equality or range filter on an
indexed field, and its total, is answered from the index without reading documents,
published-only reads included. A scalarinfilter is still checked against each candidate
document. - A value stored with a different JSON type from its field, such as an object under a text field,
still never matches a filter. It now sorts with missing values and reads asnullamong distinct
values. - SQLite indexes the columns through which tasks, edit locks and authentication tokens refer to a
document. Deleting a document no longer scans those tables: with 50,000 retained tasks, a delete
fell from 9.5 ms to 0.1 ms. - Each SQLite connection keeps up to 64 compiled statements, of at most 4 KiB of SQL each and 64 KiB
in all, so a repeated statement skips SQLite's compile step. Larger statements, such as filters
with longinlists, compile for each call as before. - SQLite writes skip unique-value and reference work for collections that have neither, and a delete
no longer repeats cleanup that foreign keys already perform. ridu devbrings an existing SQLite development database's indexes up to date before it checks
the recorded schema, adding the indexes an earlier Ridu did not create. A changed base index or
table is still reported as drift.
Upgrade
Update the Go module and all Ridu npm packages to 0.25.0 together, regenerate application contracts,
and rebuild the admin and application binary.
- SQLite's migration planner is now
1.4.0. A migration history written by an earlier Ridu is
rejected as an unsupported planner version, and a SQLite database it migrated fails readiness
because its index layout changed. Create a new history, for example by movingmigrations/aside
and runningridu migrate create --name initial, and recreate deployed SQLite databases from it.
Back up application data and uploads before recreating a database, and rehearse restoration with
the new schema before cutover. - SQLite databases that
ridu devsynchronizes, which have no migration history, gain the new
indexes on the next sync. - PostgreSQL and MongoDB planners, database layouts and migration histories are unchanged.
Ridu requires Go 1.26.9 or newer. Go 1.27.0 and 1.27.1 meet that minimum but still have the
standard-library vulnerabilities described in the 0.20.0 notes, so build and deploy with Go 1.26.9
or a later 1.26 release, or with Go 1.27.2 or later.
Ridu v0.24.0
Ridu 0.24.0
A binary built with ridu build now applies its own migrations, so a production container can run
the binary alone, with no Ridu CLI, Go or JavaScript runtime beside the server. The Railway guide
now migrates and starts with the binary.
Hosts such as Railway bill the memory a container holds, including the cache of files its processes
have read. Running ridu migrate up at startup compiled the project with Go under the package
manager before the server started. On one Railway service that left about 120 MB of file cache in
the container for as long as the server ran, beside a server using about 40 MB. A package script as
the start command, such as bun run start, also keeps the package manager running beside the server.
Changes
<binary> migrate upapplies the committed migrations frommigrations/in the working
directory, or from--directory. It applies them only when they are exactly the history the
binary was built with, the same history its/readyzcheck requires, and refuses any other. It
selects the database likeridu migrate up, fromDATABASE_URLorRIDU_SQLITE_PATHor the
--database-urland--database-pathflags, and takes the same--allow-maintenance,
--allow-insecure-database,--allow-unboundedand timeout flags.plan,status,verify
and stop boundaries stay in the CLI. See
Deploy migrations.- Generated projects register their adapter's migration driver in
cmd/server/main.go, for
exampleridu.WithProjectMigrations(postgres.ProjectMigrations()). The binary migrates through
it, and data transforms are passed to the same call. - The Railway guide sets the pre-deploy command to
./dist/<project> migrate upand the start command to./dist/<project>, and the SQLite start
command to./dist/<project> migrate up && exec ./dist/<project>. The
Build and run guide lists what a production
image needs: the binary,migrations/, trusted certificates and its environment. - The generated
buildscript runsridu build --output dist/<project>, so the binary's name no
longer depends on the directory it's built in. A platform that builds in/app, such as Railway,
otherwise getsdist/app, which thestartscript and the guides don't name. On Windows,
ridu buildadds.exeto an--outputpath without an extension. - The PostgreSQL and SQLite guides for switching adapters now swap the migration driver too, and the
MongoDB guide's example of convertingcmd/server/main.go, which highlighted the wrong two
readiness lines since 0.23.0, matches the generated file.
Upgrade
Update the Go module and all Ridu npm packages to 0.24.0 together, and rebuild the admin and
application binary.
cmd/server/main.go belongs to your project, so the migration driver isn't added for you. A
project that already passes data transforms to ridu.WithProjectMigrations has it. Otherwise, to
migrate with the binary, register it outside the len(os.Args) == 1 branch, using the sqlite or
mongodb package for those databases:
options := []ridu.ExecuteOption{
ridu.WithProjectMigrations(postgres.ProjectMigrations()),
}
if len(os.Args) == 1 {
options = append(options, runtimeOptions(applicationConfig)...)
}Then deploy migrations/ with the binary, run ./dist/<project> migrate up where you ran
ridu migrate up, and start ./dist/<project> itself rather than through a package script. If
your build script is plain ridu build, add --output dist/<project> so the binary has the name
your commands use. ridu migrate up keeps working unchanged.
Ridu requires Go 1.26.9 or newer. Go 1.27.0 and 1.27.1 meet that minimum but still have the
standard-library vulnerabilities described in the 0.20.0 notes, so build and deploy with Go 1.26.9
or a later 1.26 release, or with Go 1.27.2 or later.
Ridu v0.23.0
Ridu 0.23.0
Ridu gzips its JSON and HTML responses, can see each visitor's address behind proxies it can't
list, such as Railway's, and adds Fit: "inside" for image sizes that show a whole photo. WebP
uploads now work.
Fixes
- WebP uploads were refused. Ridu recognised WebP files but had no decoder for them, so a
collection that allowedimage/webpfailed every WebP upload with "decode image metadata: image:
unknown format". Ridu now decodes WebP and keeps the original as uploaded. Go can't write WebP, so
image sizes made from a lossy WebP without transparency are JPEG, and those made from a lossless
or transparent WebP are PNG."contain"sizes stay PNG for their transparent padding. - A trusted proxy's
Forwardedheader without aprotoparameter made Ridu treat the request as
plain HTTP, ignoringX-Forwarded-Proto. Some proxies, reportedly including Railway's, pass a
visitor's ownForwardedheader on, so a visitor who sent one couldn't sign in once those proxies
were trusted. Ridu now falls back toX-Forwarded-Proto. - The Go comment on
UploadConfig.Privatesuggested files without it were public. Every download is
already checked against the collection's read access and sent asprivate, no-store;Private
also requires a signed-in caller. The comment and the uploads guide now say so. See
Uploads.
Changes
- Ridu gzips
GETresponses of 1 KiB or more that are JSON, HTML, CSS, JavaScript, SVG or other
text, for clients that accept gzip, and sendsVary: Accept-Encoding. Compressed responses get a
weakETagand noContent-LengthorAccept-Ranges. Responses under/api/auth/and responses
to other methods stay uncompressed, because they can carry session or preview tokens, which
compression could reveal through the response's length (BREACH). Custom and plugin endpoints
follow the same rules, so return secrets fromPOSTendpoints. On a Railway deployment,
/api/schemawent from 60 KB to about 9 KB. See
Production. HandlerOptions.TrustedProxyHops, read fromRIDU_TRUSTED_PROXY_HOPSin generated projects,
counts the proxies a request passes through when only the one that connects to Ridu can be listed
inTrustedProxyCIDRs. Ridu then takes the client address from before them in
X-Forwarded-For, so sign-in rate limits apply to each visitor instead of the whole proxy. The
Railway guide now sets
RIDU_TRUSTED_PROXY_CIDRS=100.64.0.0/10andRIDU_TRUSTED_PROXY_HOPS=2. Account lockout
(MaxLoginAttempts) still limits guesses at one account from any number of addresses.Fit: "inside"fits an image size within itsWidth×Heightat the picture's own shape,
without padding, and never enlarges it. The size's storedwidthandheightare the picture's,
so they can be smaller than the box."contain"still pads to the full box, as sharp and Payload
do, and its padding is now documented. See Uploads.RequestObservation.ResponseBytesdocuments that it counts the bytes the handler wrote, before
compression.
Upgrade
Update the Go module and all Ridu npm packages to 0.23.0 together, and rebuild the admin and
application binary.
cmd/server/main.go belongs to your project, so the new setting isn't added for you. To use it,
add TrustedProxyHops: envInt("RIDU_TRUSTED_PROXY_HOPS"), after TrustedProxyCIDRs in
HandlerOptions, and copy the envInt helper from a project made with ridu new. On Railway, set
the two variables from the Railway guide.
Changing an image size's Fit affects new uploads; files uploaded earlier keep the sizes they were
made with.
Ridu requires Go 1.26.9 or newer. Go 1.27.0 and 1.27.1 meet that minimum but still have the
standard-library vulnerabilities described in the 0.20.0 notes, so build and deploy with Go 1.26.9
or a later 1.26 release, or with Go 1.27.2 or later.
Ridu v0.22.0
Ridu 0.22.0
Collection lists read only the fields they show, so a long rich-text body no longer travels with
every row. select no longer changes what field read rules and read hooks see, which closes a way
around rules that check another field. Lists read per-row permissions in batches.
Security
- A field read rule that checks another field of the same document, like the
membersOnlyexample
in the access-control guide, could be bypassed withselect. Ridu removed the unselected fields
before it ran read rules and read hooks, soselect={"url":true}hidmembersOnlyfrom the
rule. A rule that treats a missing value as allowed then returned the field. Related documents
loaded with a targetselectinpopulatehad the same gap. When a collection has read hooks or
field read rules, Ridu now reads the whole stored document, runs them, and only then keeps the
selected fields.
Breaking changes
- Custom list cells (
listCellRenderers) and list layouts (listResultsRenderers) receive
documents holding only the ID, timestamps, title field, visible columns and the fields they
declare. A cell or layout that reads any other field must name it in the newfieldsoption,
for examplefields: ['status']. Ridu checks the names when it builds the admin. See
Custom table cells and
Show collection results as cards.
Changes
- The admin collection list reads only what it shows: each document's ID, timestamps, title field
and visible columns, the parent field in a hierarchy, and the fields that custom cells or a list
layout declare. Search, filters and sorting still run in the database on any field. See
Browse content. - Relationship and upload fields named in
fieldsarrive as the related document's ID and title,
like a relationship column, whether or not their column is visible. A custom cell's ownvalue
is always the saved value. - A list page records the columns and fields it was read for. When a navigation brings a page read
for another column layout, for example after another tab saved its own, the list reads it again
instead of showing empty cells. - Lists with
includeAccessand the admin's select-all read per-row permissions in batches: one
read for the page's documents, and one for each distinct predicate a filtered access rule
returns, instead of reads for every row. A 10-row page whose update and delete rules return
filters makes 3 reads instead of about 30.readVersionson a versioned collection is still
counted for each row.
Upgrade
Update the Go module and all Ridu npm packages to 0.22.0 together, and rebuild the admin and
application binary.
If a custom list cell reads document fields other than its own column, or a list layout reads
anything besides the title, add those field names to the registration's fields. Reads that
select fields from a collection with read hooks or field read rules now read whole documents
internally; responses change only where a rule now sees the fields it checks.
Ridu requires Go 1.26.9 or newer. Go 1.27.0 and 1.27.1 meet that minimum but still have the
standard-library vulnerabilities described in the 0.20.0 notes, so build and deploy with Go 1.26.9
or a later 1.26 release, or with Go 1.27.2 or later.
Ridu v0.21.1
Ridu 0.21.1
The admin stops waiting for Svelte updates that have already reached the page. Editing, focus,
scrolling and navigation behave as before.
Changes
- The admin removes twelve
tick()waits that ran after the change they waited for was already in
the DOM. They followed saves, uploads and bulk edits that had finished updating the page, came
before scroll restoration and the navigation progress bar, which already wait for the next
frame, delayed the document lock request behind the form, deferred returning focus to list
column and filter controls after a navigation, and preceded opening the command menu.
Upgrade
Update the Go module and all Ridu npm packages to 0.21.1 together, and rebuild the admin and
application binary. No contract changes.
Ridu requires Go 1.26.9 or newer. Go 1.27.0 and 1.27.1 meet that minimum but still have the
standard-library vulnerabilities described in the 0.20.0 notes, so build and deploy with Go 1.26.9
or a later 1.26 release, or with Go 1.27.2 or later.
Ridu v0.21.0
Ridu 0.21.0
Image uploads take photos from current phones: Ridu reserves the memory image processing actually
uses, so 24- and 40-megapixel photos are no longer refused. MaxImageDimension stores a smaller
original, and remote image imports refuse IPv4-compatible IPv6 addresses.
Security
- Importing an image with
uploadFromURLrefused private and special-use addresses, but accepted
IPv4-compatible IPv6 addresses such as::127.0.0.1and::169.254.169.254, which reach the
same hosts. Remote fetches now accept IPv6 only inside the global unicast block,2000::/3,
without its special-purpose ranges.
Changes
UploadConfig.MaxImageDimensionscales a JPEG or PNG original wider or taller than that many
pixels down to fit before Ridu stores it, keeping its shape and never enlarging it. The scaled
image replaces the stored file with itswidth,height, andfilesize, the private source
that crops start from, and the image sizes made from it. It is stored upright, without the
camera's EXIF metadata. GIFs and smaller images keep their uploaded bytes. The value must be at
least the width and height of every image size. See
Limit large images.
Fixes
- Ridu reserved about twice the memory resizing an image used, so a photo over about 21
megapixels needed more than the whole 512 MiB budget and was refused. The reservation now
follows the work: for a JPEG, its chroma sampling, progressive coding and EXIF orientation. Image
sizes are resampled through an intermediate of four bytes a pixel instead of 32. With sizes of
800 and 1,600 pixels, a 24.5-megapixel photo reserves about 205 MiB instead of about 600 MB, and
photos up to the 40-megapixel limit are accepted. - The image budget is half of
GOMEMLIMITwhen you set it, and 512 MiB otherwise. - An image over the budget fails with a message that tells the person uploading the most the
server takes, ending, for example,upload an image of at most about 18.3 megapixels. An image
over the 20,000-pixel or 40-megapixel limit says which.
Upgrade
Update the Go module and all Ridu npm packages to 0.21.0 together, and rebuild the admin and
application binary. No contract changes.
Generated image sizes are resampled by a different library, so their pixels can differ slightly
from earlier versions'; their dimensions and crops are unchanged. Set GOMEMLIMIT a little below
your service's memory, for example GOMEMLIMIT=900MiB for 1 GB.
Ridu requires Go 1.26.9 or newer. Go 1.27.0 and 1.27.1 meet that minimum but still have the
standard-library vulnerabilities described in the 0.20.0 notes, so build and deploy with Go 1.26.9
or a later 1.26 release, or with Go 1.27.2 or later.
Ridu v0.20.1
Ridu 0.20.1
The embedded admin signs in behind a hosting platform's TLS proxy, such as Railway's, without
listing its own origin in RIDU_ALLOWED_ORIGINS.
Fixes
- Behind a proxy that terminates HTTPS and forwards plain HTTP from addresses outside
RIDU_TRUSTED_PROXY_CIDRS, Ridu saw every request ashttp. The browser sent the page's
httpsorigin, so Ridu refused the admin's own sign-in and every other write with
origin_denied. When a request arrives as plain HTTP from an address Ridu doesn't trust, Ridu
now accepts the HTTPS origin of the host the request names: only a page served over HTTPS from
that host sends it. Ridu still follows the scheme a trusted proxy reports, refuses an HTTP origin
on an HTTPS request, and accepts no other host or port this way. See
Proxies and HTTPS. - Ridu refused browser writes from unlisted origins without logging anything. It now logs the
first refusal of each origin, withrequest_origin, the origin it computed for the request, for
up to 32 origins.
Upgrade
Update the Go module and all Ridu npm packages to 0.20.1 together, and rebuild the admin and
application binary. No contract changes.
On Railway and similar platforms, you can remove your application's own HTTPS origin from
RIDU_ALLOWED_ORIGINS if you added it to work around this. Keep the origins of other browser
applications that call the API.
Ridu requires Go 1.26.9 or newer. Go 1.27.0 and 1.27.1 meet that minimum but still have the
standard-library vulnerabilities described in the 0.20.0 notes, so build and deploy with Go 1.26.9
or a later 1.26 release, or with Go 1.27.2 or later.
Ridu v0.20.0
Ridu 0.20.0
Ridu now requires Go 1.26.9, which fixes standard-library vulnerabilities that Ridu's servers
reach. S3 upload storage works with Railway buckets, the Railway guide's configuration passes
Railway's healthcheck, and date-time queries match stored values however they were written.
Security
Go 1.26.9 and 1.27.2 fix eleven standard-library vulnerabilities that Ridu's code reaches: in
HTTP/2 and HTTP/1 serving and proxying, Range and MIME header parsing, TLS Encrypted Client Hello
and, on Windows, os.Root (GO-2026-6603,
6604, 6605,
6607, 6608,
6609, 6610,
6611, 6612,
6613 and 6617). No
Go 1.25 release fixes them. Ridu's minimum Go version and its release builder move from 1.25.13 to
1.26.9. The ridu binaries of 0.19.0 and earlier were built with Go 1.25.13 and are affected, and
so is any application built with a Go release before 1.26.9, or with Go 1.27.0 or 1.27.1.
Fixes
- The S3 storage adapter addressed every bucket path style,
https://<endpoint>/<bucket>/<key>.
Railway buckets (Tigris) refuse that style, so the readiness check failed with403 Forbidden
and the deploy never became ready. Buckets are now addressed virtual-hosted style by default,
https://<bucket>.<endpoint host>/<key>, which AWS S3, Railway buckets and Cloudflare R2
accept.s3.Config.PathStylekeeps the path form. See
S3-compatible storage. - S3 requests were signed for a path without its leading slash when the endpoint had no path, so
the service computed a different signature. Requests are now signed for the path they are sent
to. - The Railway guide set
RIDU_ALLOWED_HOSTSto the public domain alone. Railway's healthcheck
sendsHost: healthcheck.railway.app, and Ridu checks the host before it routes/readyz, so
every deploy failed its healthcheck. The guide now sets
RIDU_ALLOWED_HOSTS=${{RAILWAY_PUBLIC_DOMAIN}},healthcheck.railway.app. See
Set production variables. - Ridu refused unlisted hosts without logging anything. It now logs the first refusal of each
host the allowed hosts omit, naming the host andRIDU_ALLOWED_HOSTS, for up to 32 hosts. - Date-time fields stored values as written.
query.DateTimesends UTC with milliseconds, so it
missed values saved without milliseconds or with an offset, and range filters and sorting could
put values out of time order. Ridu now stores every date-time value in one form, UTC with
milliseconds such as2026-09-08T10:00:00.000Z, on SQLite, PostgreSQL and MongoDB. See
Defaults, timezones, and sorting. - Custom field examples and the text editor that
ridu newscaffolds bind with a Svelte function
binding,bind:value={() => field.value ?? "", (next) => field.set(next)}.
Breaking changes and upgrade
Update the Go module and all Ridu npm packages to 0.20.0 together, regenerate application contracts,
and rebuild the admin and application binary.
- Ridu requires Go 1.26.9 or newer.
go get github.com/riducms/ridu@v0.20.0raises an existing
project'sgoline to 1.26.9, and new projects start there. Go 1.27.0 and 1.27.1 meet that
minimum but still have the vulnerabilities, so build and deploy with Go 1.26.9 or a later 1.26
release, or with Go 1.27.2 or later. - S3 storage addresses buckets virtual-hosted style by default. Set
PathStyle: truein
s3.Configfor MinIO and other emulators addressed by IP address or a single host name, and for
a bucket whose name contains a dot. Without it,s3.Newrefuses an IP-address endpoint, or a
dotted bucket over HTTPS.Endpointnever includes the bucket. - REST, the local API and the SDK return date-time values in the stored form: a value written as
2026-09-08T11:00:00+01:00reads back as2026-09-08T10:00:00.000Z. Values stored before
0.20.0 keep their text until their document is saved again, so save documents again if you
filter or sort on their date-time fields. - On Railway, add
healthcheck.railway.apptoRIDU_ALLOWED_HOSTS.
This is a pre-1 release with breaking contracts; keep the coordinated packages aligned. Production
still runs as a Go binary with its static admin embedded, without a JavaScript server.
Ridu v0.19.0
Ridu 0.19.0
Collections and globals that already store documents can now turn on versions. On Windows, SQLite
projects start, the admin loads, ridu migrate create succeeds, and Ctrl+C stops every process
ridu dev started.
Changes
-
Setting
Versions: trueon an existing collection or global no longer fails with
RIDU_VERSIONS_ENABLE_UNSUPPORTED. A migration records what the documents it already stores
become:published: each document is published with a first version and a matching draft, so readers
keep seeing it.draft: each document stays an unpublished draft with a first version, and public reads stop
returning it until it is published. This needs drafts.require-empty:ridu migrate upstops while the collection stores any document.
ridu migrate createtakes the choice from--versions-existingor asks in a terminal.
ridu devenables versions without asking while the collection stores nothing. Otherwise it asks
published, draft or cancel, then writes and applies the migration like an accepted rename. SQLite,
PostgreSQL and MongoDB apply the choice in the migration's transaction, andridu migrate verify
replays it. See Enabling versions.
Fixes
- On Windows, every command that opened a SQLite file by path failed with
parse SQLite path: … invalid port, includingridu dev,ridu migrate plan,upandverify,
and the server. Paths now becomefile:///C:/…URIs, and UNC shares work too. - On Windows, the admin never loaded under
ridu dev: no@admin/import resolved, because Vite's
module IDs start with a drive. A Windowsridu buildalso split@riducms/uiinto many small
chunks. - On Windows,
ridu migrate createwrote the migration and then exited with "Access is denied", and
the local storage adapter's health check, uploads and deletes failed the same way. Ridu no longer
syncs directories on Windows, where the file system already makes those changes durable. - On Windows, Ctrl+C on
ridu devleft the admin's Vite processes running and holding port 5173.
Each processridu devstarts now runs in a job object that ends its whole tree when Ridu stops,
even if Ridu itself is killed. Through the npm launcher, the first Ctrl+C lets Ridu shut down
cleanly and a second ends it at once.
Windows remains a source-build target without release qualification.
Breaking changes and upgrade
Update the Go module and all Ridu npm packages to 0.19.0 together, regenerate application contracts,
and rebuild the admin and application binary.
sqlite.CreateArtifact,postgres.CreateArtifactandpostgres.BuildArtifacttake an
ArtifactOptionsvalue in place of positional renames, destructive approval and transforms, as
mongodb.CreateArtifactalready did.sqlite.CreateArtifactWithRenamesis removed; pass
ArtifactOptions{Renames: …}. The CLI commands are unchanged.- Migration artifacts gain the
enable_versionsstep kind. Planner versions are unchanged, so
existing histories replay as before. - On PostgreSQL and MongoDB, a migration that enables versions needs
ridu migrate up --allow-maintenance. - The generated SQLite server now accepts Windows
file:URIs inRIDU_SQLITE_PATH. To use them
in an existing project, copysqliteDatabasePathfromcmd/server/main.goin a new project.
This is a pre-1 release with breaking contracts; keep the coordinated packages aligned. Production
still runs as a Go binary with its static admin embedded, without a JavaScript server.
Ridu v0.18.0
Ridu 0.18.0
Rich text gains plain-text and Markdown converters, the editor works as a form field, and two
editor bugs from 0.17.0 are fixed.
Changes
- Typing a list with
*or+, a checklist with* [ ], a tab in a code block, a line break
written as two trailing spaces or a backslash, or a code fence of four backticks made a document
the editor couldn't save: the admin couldn't save the entry, and in an application the bound
value kept the previous document. The editor now saves them. Lexical 0.49 records the Markdown it
read on each node, which the stored document doesn't accept, so the editor now leaves it out. - In an application, CSS outside a cascade layer, such as a reset like UnoCSS's preflight, no longer
restylesRichTextEditoror its menus and dialogs: lists keep their bullets, headings their
sizes and buttons their colors, and focus draws one outline. convertLexicalToPlaintextfrom@riducms/sdk/richtextreturns a document's text, for previews,
search, notifications or a language model. Custom blocks, uploads and relationships take
converters, as withrenderRichTextHTML.@riducms/plugin-richtext/markdownexportsconvertMarkdownToLexical, which turns Markdown, such
as a language model's answer, into the document the editor's Markdown shortcuts make. It runs on
a server without a browser. Pass the Go field'sfeatures; Markdown for anything else stays
text.RichTextEditorwith anamesubmits its document with a form, as JSON in a hidden field,
including without JavaScript.- The editor guide shows saving with a form action,
converting Markdown, and restyling the editor through Ridu'sapplayer. The
display guide shows plain text.
Breaking changes and upgrade
Update the Go module and all Ridu npm packages to 0.18.0 together, regenerate application contracts,
and rebuild the admin and application binary. This release changes no Go APIs, authoring config,
manifest or protocol versions, REST behavior, migration planners, or database layouts, so existing
databases and migration histories need no changes.
- In an application, CSS outside a cascade layer no longer restyles the editor's inner elements or
its popups unless its selector is more specific than two classes. Move such overrides into Ridu's
applayer, and declare Ridu's layers after a framework's own, such as Tailwind's:
@layer ridu, ridu-plugins, app;. Custom properties and a class passed to the editor work as
before. RichTextEditor'snamenow also adds a form field. Remove a hidden input you added with the
same name.@riducms/plugin-richtextadds@lexical/code-coreand@lexical/extension0.49.0 as
dependencies.
This is a pre-1 release with breaking contracts; keep the coordinated packages aligned. Production
still runs as a Go binary with its static admin embedded, without a JavaScript server.