Getting started
Installation
This page walks one app from nothing to a running screen: how forjr is run, a table, a query, a screen with its data, a link, a form, a sign-in, the seed and forjr dev. Every file below is whole, and the app it makes runs as it is written.
Running forjr
forjr comes with the package forjr of npm, which brings the Node.js it runs on:
npm install -g forjrEach command of these docs is then forjr <command>. A project names its own forjr in its package.json, and forjr builds and runs a project with the version it names. A program of your own that imports the framework, as topic.engine shows one, finds it in the forjr that the project holds.
A new project
forjr new my-app
cd my-appnpm create forjr my-app makes the same project with nothing installed first, by forjr new of the newest forjr. forjr new writes a bare project: forjr.ts, package.json, AGENTS.md, the mark of Forjr as the icon of the site in assets/icon.svg, one screen at / and the query it reads. The files below take their place. A definition is a top-level export const made by a word of forjr; forjr check after every change reports every mistake at once, each with its fix.
The project and its people
import { project } from 'forjr'
export const myApp = project('myApp', {
title: 'My App',
signInPath: '/sign-in',
})The engine reads id and roles of each row of users; the rest is the project's own. The password is stored as its hash, in a column that no rule lets anyone read.
import { list, table, text } from 'forjr'
export const users = table('users', {
columns: {
email: text({ unique: true, personal: true }),
name: text({ optional: true, personal: true }),
password: text({ optional: true, private: true }),
roles: list(text()),
},
access: { read: 'owner' },
})Every page
The same pages that forjr docs prints, in the version of Forjr that made this site.
Topics
70How a part of the framework works, walked through with whole examples.
- The build
- The check
- The commands
- db: the rows of the app, in code
- The engine in a program of your own
- What the engine counts
- What the engine tells and writes
- An app from a program
- The versions of a running app
- The web side
- Errors
- The guarded fetch, and parts that are fetched
- Flows
- When a step fails
- Flows on many machines
- Looking at runs
- The history
- History with an engine and on a server
- The members
- The inspect mode
- Your data, and the way out
- Live data
- The connection
- Many machines, tenants and programs
- The look of a screen
- Style files and CSS Modules
- Light and dark
- Fonts
- Icons, charts and large libraries
- Motion
- Tailwind CSS and component libraries
- MCP
- An outside MCP server
- A screen in a chat
- Sign-in for programs
- Tools, asking a person and streams
- Moving an app to another computer
- Code in other languages
- Plans: how rows are asked for
- Screen files and stubs
- The browser build and libraries
- The engine's own pages
- A list with a search and pages
- A page that streams its slow parts
- Signing people in
- A code by mail
- A sign-in from a package
- From a description back to text
- Installation
- A table, a query and a change
- The seed and forjr dev
- A screen with its data, and a link
- A sign-in
- Tests of an app
- A test in a real browser
- Rows, marks and the clock
- Tests made from the declarations
- A driver of your own
- A faked model
- A browser, with no browser
- Services, calls coming in, keys and the command line
- The types
- The table users
- The value words
- The words
- Heavy work on other machines
- Workspaces: apps that your users build
- The project tools
- The turn
- A workspace
Words
97Each word of forjr that makes a definition or works out a value.
- action
- agent
- allow
- anyone
- asset
- avg
- backfill
- between
- boolean
- calc
- caller
- ceil
- change
- choice
- chunks
- col
- command
- component
- concat
- contains
- count
- cron
- date
- day
- dayOf
- declared
- del
- each
- earlier
- emit
- evals
- event
- every
- expect
- fail
- file
- fingerprint
- floor
- flow
- get
- given
- incoming
- input
- join
- json
- judge
- later
- least
- link
- list
- lower
- max
- message
- messages
- min
- model
- most
- noOtherPeople
- noPersonal
- now
- number
- object
- optimistic
- patch
- post
- project
- put
- python
- query
- random
- range
- read
- request
- role
- round
- route
- s3
- sameSecret
- sampleOf
- screen
- secret
- seed
- service
- setting
- slice
- start
- startsWith
- sum
- table
- testApp
- text
- token
- trim
- upper
- vector
- verified
- where
Options
400Each option of a word, with its value and an example.
- about of action
- access of action
- background of action
- batch of action
- callerGone of action
- changes of action
- countBy of action
- danger of action
- deprecated of action
- follow of action
- input of action
- limits of action
- offer of action
- output of action
- plain of action
- remember of action
- rows of action
- run of action
- sends of action
- system of action
- uses of action
- was of action
- worker of action
- about of agent
- access of agent
- countBy of agent
- driver of agent
- guards of agent
- handsOver of agent
- instructions of agent
- key of agent
- knows of agent
- limits of agent
- memory of agent
- model of agent
- offer of agent
- on of agent
- onStop of agent
- output of agent
- pace of agent
- policy of agent
- questions of agent
- reasoning of agent
- score of agent
- sequence of agent
- tell of agent
- together of agent
- tools of agent
- trust of agent
- voice of agent
- was of agent
- words of agent
- fills of backfill
- page of backfill
- run of backfill
- system of backfill
- table of backfill
- was of backfill
- about of change
- access of change
- countBy of change
- danger of change
- deprecated of change
- everywhere of change
- input of change
- offer of change
- output of change
- plain of change
- run of change
- set of change
- system of change
- touches of change
- was of change
- messages of choice
- cut of chunks
- language of chunks
- overlap of chunks
- size of chunks
- about of command
- access of command
- args of command
- run of command
- was of command
- browser of component
- data of component
- layout of component
- personal of component
- props of component
- state of component
- view of component
- was of component
- by of count
- column of count
- of of count
- where of count
- zone of cron
- update of declared
- about of del
- body of del
- changes of del
- files of del
- headers of del
- input of del
- lists of del
- output of del
- query of del
- sends of del
- as of evals
- budget of evals
- name of evals
- pass of evals
- runs of evals
- data of event
- key of event
- where of event
- fields of fail
- kinds of file
- maxSize of file
- about of flow
- access of flow
- as of flow
- countBy of flow
- danger of flow
- follow of flow
- input of flow
- key of flow
- limits of flow
- moveRuns of flow
- offer of flow
- on of flow
- onFail of flow
- onStop of flow
- output of flow
- pace of flow
- plain of flow
- run of flow
- sealed of flow
- sends of flow
- stopOn of flow
- system of flow
- together of flow
- tries of flow
- was of flow
- about of get
- body of get
- changes of get
- files of get
- headers of get
- input of get
- lists of get
- output of get
- query of get
- sends of get
- limits of incoming
- open of incoming
- path of incoming
- then of incoming
- verify of incoming
- was of incoming
- pass of judge
- words of judge
- onRemove of link
- max of list
- min of list
- by of max
- column of max
- of of max
- where of max
- by of min
- column of min
- of of min
- where of min
- abilities of model
- call of model
- countBy of model
- fallback of model
- hosted of model
- input of model
- job of model
- key of model
- limits of model
- name of model
- options of model
- output of model
- provider of model
- takes of model
- tries of model
- units of model
- url of model
- voices of model
- was of model
- max of number
- min of number
- whole of number
- about of patch
- body of patch
- changes of patch
- files of patch
- headers of patch
- input of patch
- lists of patch
- output of patch
- query of patch
- sends of patch
- about of post
- body of post
- changes of post
- files of post
- headers of post
- input of post
- lists of post
- output of post
- query of post
- sends of post
- api of project
- backups of project
- build of project
- cache of project
- cli of project
- cookies of project
- countBy of project
- currency of project
- describeTo of project
- files of project
- head of project
- history of project
- hold of project
- hosts of project
- html of project
- icon of project
- identify of project
- images of project
- languages of project
- limits of project
- mail of project
- mcp of project
- onRequest of project
- privateHosts of project
- publish of project
- python of project
- redirects of project
- release of project
- removed of project
- roots of project
- settings of project
- signInPath of project
- state of project
- title of project
- trace of project
- trailingSlash of project
- unlock of project
- uploads of project
- vitals of project
- was of project
- workers of project
- zone of project
- about of put
- body of put
- changes of put
- files of put
- headers of put
- input of put
- lists of put
- output of put
- query of put
- sends of put
- about of python
- access of python
- atOnce of python
- background of python
- batch of python
- callerGone of python
- changes of python
- countBy of python
- danger of python
- deprecated of python
- file of python
- files of python
- follow of python
- gpu of python
- input of python
- limits of python
- lock of python
- offer of python
- output of python
- packages of python
- remember of python
- rows of python
- sends of python
- system of python
- uses of python
- was of python
- worker of python
- about of query
- access of query
- countBy of query
- deprecated of query
- heavy of query
- input of query
- live of query
- offer of query
- output of query
- plain of query
- reads of query
- refresh of query
- rows of query
- run of query
- system of query
- was of query
- needed of read
- refresh of read
- wait of read
- about of request
- body of request
- changes of request
- files of request
- headers of request
- input of request
- lists of request
- output of request
- query of request
- sends of request
- access of route
- limits of route
- method of route
- origins of route
- path of route
- run of route
- system of route
- was of route
- bucket of s3
- key of s3
- region of s3
- url of s3
- linked of sampleOf
- n of sampleOf
- about of screen
- access of screen
- cache of screen
- data of screen
- for of screen
- framedBy of screen
- head of screen
- layout of screen
- loading of screen
- offer of screen
- path of screen
- seo of screen
- server of screen
- state of screen
- title of screen
- view of screen
- was of screen
- auth of service
- calls of service
- connection of service
- from of service
- headers of service
- limits of service
- mcp of service
- onceOnlyHeader of service
- tries of service
- url of service
- use of service
- was of service
- webhook of service
- by of sum
- column of sum
- of of sum
- where of sum
- access of table
- columns of table
- indexes of table
- keepHistory of table
- kept of table
- lasts of table
- owner of table
- plain of table
- removed of table
- search of table
- shows of table
- tenant of table
- unique of table
- was of table
- clock of testApp
- folder of testApp
- randomSeed of testApp
- real of testApp
- room of testApp
- secrets of testApp
- lines of text
- max of text
- min of text
- pattern of text
- secret of text
- digits of token
- copy of vector
- model of vector
- old of vector
- size of vector
Tags
3The tags of forjr/ui: Link, Form and Image.
Hooks
12The hooks a view calls.
Handles
17The handles that code is given: mail, files, sessions and the others.
Adapters
15The interfaces by which a part of your own takes the place of one of ours.
Commands
37Each command of forjr, with its flags and what it prints.
- forjr access
- forjr add
- forjr api
- forjr build
- forjr check
- forjr cli
- forjr data
- forjr dev
- forjr docs
- forjr export
- forjr filled
- forjr history
- forjr impact
- forjr login
- forjr logs
- forjr machines
- forjr map
- forjr mcp
- forjr models
- forjr new
- forjr publish
- forjr pull
- forjr push
- forjr python
- forjr run
- forjr runs
- forjr secrets
- forjr service
- forjr settings
- forjr shot
- forjr start
- forjr take-over
- forjr test
- forjr uninstall
- forjr update
- forjr upgrade
- forjr workers
Codes
190Each code a finding or a failure carries, with its fix.
- F0001 not-found
- F0002 bad-input
- F0003 too-large
- F0004 wrong-origin
- F0005 rate-limited
- F0006 not-signed-in
- F0007 version-gone
- F0008 took-too-long
- F0009 internal
- F0010 no-engine
- F0011 bad-description
- F0012 read-only
- F0013 not-allowed-here
- F0014 no-users-table
- F0015 cannot-read
- F0016 part-not-fetched
- F0017 wrong-name
- F0018 cannot-open
- F0019 secret-missing
- F0020 no-mailer
- F0021 mail-not-sent
- F0022 address-refused
- F0023 fetch-cut-off
- F0026 update-refused
- F0027 cannot-work-out
- F0028 nested-too-deep
- F0029 not-current
- F0030 not-the-writer
- F0031 record-behind
- F0032 writer-runs
- F0033 copy-clash
- F0034 engines-differ
- F0035 not-allowed-out
- F0036 not-sent
- F0037 room-ended
- F0038 usage
- F1001 not-top-level
- F1002 name-mismatch
- F1003 unknown-option
- F1004 name-used-twice
- F1005 both-imports
- F1006 helper-exported
- F1007 two-forms
- F1008 missing-option
- F1009 reserved-name
- F1010 not-plain
- F1011 bad-word
- F1012 project-count
- F1013 bad-name
- F1014 bad-value
- F2001 rows-do-not-fit
- F2002 column-gone
- F2003 table-gone
- F2004 rename-not-stated
- F2005 link-to-missing-table
- F2006 search-not-text
- F2007 owner-not-users
- F2008 vector-size
- F2009 near-without-limit
- F2010 vector-misused
- F2011 sealed-misused
- F2012 vector-of-another-model
- F2013 tenant-misused
- F2014 tenant-rule-open
- F2015 filled-misused
- F2016 shown-table-misused
- F2025 count-across-files
- F2026 findable-sealed-misused
- F2027 link-to-memory
- F2028 no-archive
- F2029 index-advised
- F2030 heavy-on-memory
- F2101 not-unique
- F2102 link-in-use
- F2103 row-not-found
- F2104 link-missing
- F2105 vector-not-valid
- F2106 near-not-valid
- F2107 value-not-valid
- F2108 too-many-rows
- F2109 not-one-file
- F3001 no-access-rule
- F3002 anyone-on-write
- F3003 anyone-on-personal
- F3004 system-without-why
- F3005 unreachable-table
- F3006 private-in-output
- F3007 secret-in-browser
- F3008 incoming-not-verified
- F3009 system-skips-owner
- F3011 secrets-not-searched
- F3101 access-denied
- F4001 clock-in-query
- F4002 random-in-query
- F4003 network-in-query
- F4004 live-without-limit
- F4005 async-run
- F4101 query-not-pure
- F5001 work-outside-step
- F5002 step-not-awaited
- F5003 step-name-gone
- F5007 worker-misused
- F5008 heavy-work-note
- F5101 too-many-steps
- F5102 result-too-large
- F5103 wait-too-long
- F5104 run-too-long
- F5105 called-too-deep
- F5106 run-stopped
- F5107 no-worker
- F5108 old-try
- F5109 worker-refused
- F5110 out-of-memory
- F5111 event-two-shapes
- F6007 path-used-twice
- F6008 direct-call
- F6009 field-not-usable
- F6011 state-not-declared
- F6012 bad-screen-part
- F6013 address-not-allowed
- F6015 cannot-cache
- F6016 needs-an-engine
- F6018 lives-in-the-browser
- F6021 no-currency
- F6022 name-twice-in-view
- F6023 bad-data-entry
- F6025 size-not-known
- F6030 public-reads-visitor
- F6031 consent-in-address
- F6032 seo-image-not-public
- F7001 ability-missing
- F7002 three-marks
- F7003 limits-incomplete
- F7004 too-many-tools
- F7005 fallback-lacks-ability
- F7006 model-not-known
- F7007 memory-table
- F7008 tools-too-deep
- F7009 tool-not-described
- F7010 no-access
- F7011 vector-in-fill
- F7012 tool-not-as-starter
- F7013 api-file-broken
- F7014 plain-fetch
- F7015 secret-revealed
- F7016 held-way-out
- F7017 trusted-reaches-ask
- F7018 asks-in-the-middle
- F7019 tool-answer-open
- F7020 python-lock-stale
- F7021 not-for-a-chat
- F7101 thread-too-long
- F7102 limit-reached
- F7103 thread-busy
- F7104 provider-failed
- F7105 no-voice
- F7106 model-refused
- F7107 answer-cut-off
- F7108 answer-did-not-fit
- F7109 request-too-large
- F7110 request-not-accepted
- F7111 not-agreed
- F7112 tool-changed
- F7113 provider-missing
- F7114 driver-missing
- F7115 service-failed
- F7116 service-answer-did-not-fit
- F7117 not-connected
- F7118 not-verified
- F7119 python-failed
- F7120 nobody-to-ask
- F7121 sequence-refused
- F7130 no-typed-answer
- F7131 guard-refused
- F7132 stood-in
- F8000 type-error
- F8001 date-by-javascript
- F8002 list-by-javascript
- F9001 missing-message
- F9002 missing-asset
- F9003 unknown-message
- F9004 untested
- F9101 point-not-usable
- F9102 clash-left
- F9103 publish-refused
- F9104 no-right
- F9105 policy-refused
- F9106 edit-not-found
- F9107 history-missing
- F9108 not-gradual