Customizing River

Custom Apps

A Custom App is a full application that runs inside River — with its own UI, its own entity types, its own tools, and its own intelligence. Build one when you have an ongoing process that deserves a dedicated surface, not just a one-off Custom View.

You build Custom Apps in App Builder, River's AI-native IDE. You can describe what you want and have it generated, or write the code yourself with the AI as a pair-programmer.

The kinds of apps people build#

This is where River gets really expressive. Some real patterns:

  • A patient management app for a private medical practice — intake forms, appointment scheduling, balance tracking, encrypted records, all running locally.
  • A property tracker for a real-estate investor — deals, properties, leases, maintenance tickets, all linked to documents and photos.
  • A vehicle fleet manager — vehicles, drivers, maintenance schedules, fuel logs.
  • A fan-club app for a creator — subscribers, posts, drops, comments, with Stripe integration.
  • A research repository — papers, claims, citations, contradictions, with AI synthesis baked in.
  • A dropshipping ops app — products, orders, suppliers, automated reorder workflows.
  • A vertical CRM — for the unique workflow of one specific kind of business.

Anything that would normally require finding (or building) a SaaS app can be a Custom App in River — with the difference that it's local-first, multiplayer, AI-native, and shares your Dataspace's entity system.

What a Custom App gets for free#

Because every App in River is built on the same primitives, your Custom App inherits a lot of the system out of the box:

  • The Entity System — define Patient, Appointment, Vehicle, whatever — they get permanent homes, search, history, and edges
  • Real-time multiplayer — anyone in the Dataspace co-edits in real time via Y.js
  • Local-first sync — works offline, merges automatically when reconnected
  • AI access — SpaceChat can read and write your App's entities like any other type
  • Tools — register custom tools and any Agent or Workflow can use them
  • Permissions — inherits your Dataspace's ACL model
  • Search — your entities are indexed automatically
  • Notifications, Activity, Jobs — all work without extra wiring

You're not building a SaaS app from scratch. You're building the parts that are unique to your problem.

How you build one#

Option A — describe it to the AI#

The fastest path. Open SpaceChat in App Builder and describe the app:

"Build me a private medical practice manager. Patients have a name, DOB, balance, last visit, and contact info. Appointments belong to patients and have a date, type, and notes. I need a list view, an appointment calendar, and a single-patient detail page. AI should be able to draft post-visit notes."

The AI:

  1. Defines the entity types (Patient, Appointment)
  2. Generates the React UI for list, detail, and calendar views
  3. Wires up data access through the entity system
  4. Registers the App so it appears in your dock and search

You see the result running live in a sandboxed iframe within seconds. Iterate on it: "add a balance summary to the patient detail page", "let me filter appointments by status."

Option B — write the code yourself#

App Builder is a full IDE: CodeMirror editor, file tree, multi-file support, real npm packages, hot reload. Write the React code, use real npm libraries, and let the AI help you with anything you don't know how to do.

This is the right path when you want pixel-level control or are integrating something tricky.

Custom entity types#

A Custom App often defines new entity types specific to your domain. These become first-class citizens of your Dataspace:

  • They appear in search
  • They're queryable by AI
  • They link to other entities via edges
  • They participate in Activity, Notifications, and the Event Stream
  • Agents can extract them from unstructured content via Entity Extraction

This is what makes River's Custom Apps fundamentally different from "no-code" tools. You're not making a glorified spreadsheet — you're extending the OS's vocabulary.

Publishing#

Custom Apps can be:

  • Personal — only you (or your Dataspace) sees and uses them
  • Published to your team — shared across a team Dataspace
  • Published publicly — listed in River's app catalog, hosted on a subdomain, optionally monetized

Publish is one click in App Builder when you're ready.

E-commerce, hosting, more#

App Builder also supports:

  • Stripe integration — encrypted, per-app credentials. The AI can create products and prices automatically.
  • Public hosting — claim a subdomain and ship a public-facing page or app (great for landing pages, customer portals, marketing sites).
  • Secrets management — environment variables and API keys per app.
  • GitHub integration — sync your code repo to a published App.

When to use what#

Best tool
One-off "show me X" Custom View
Recurring view used daily Custom View pinned to a Space
Complete domain app with custom entities Custom App
Public-facing site or product Custom App + subdomain hosting

Tips#

  • Start with a Custom View. Promote it to a Custom App only when the surface is earning daily use.
  • Define your entity types early — they're the schema your whole app depends on.
  • The AI builds working code. Treat early generations as a draft and iterate; perfection isn't a one-shot.
  • If you ship something useful internally, consider publishing it. Other River users may have the same problem.