Daniel Salazar
8307e8c9f0
chore: bump up deps ( #3626 )
Maintain Release Merge PR / update-release-pr (push) Canceled after 0s
Notify HeyPuter / notify (push) Canceled after 0s
release-please / release-please (push) Canceled after 0s
2026-08-21 21:03:54 -07:00
Daniel Salazar
20b3b88e39
metering: big fixes to metering + jsdoc types ( #3547 )
...
Changes are:
- global egress metering
- remove file egress cost
- introduce file op cost for the per request cost s3 has
- enforce fs read/download etc to through 402 when out of usage; allow for subdomains
- enforce kv metering when out of usage through 402; allow for workers
- jsdoc as source of truth for puter.js types
- kv driver caching for get and batchget operations with decreased costs
2026-08-12 01:06:04 -07:00
Daniel Salazar
79d4201f12
fix: rate limits, AI routing, and a type-check gate ( #3529 )
...
- declare rate + concurrency limits on every route and driver that lacked one
- add acquireConcurrent for websocket connections and the DAV mount
- bucket AI models by identity key only; keep resold duplicates of any vendor
- skip recently-failed provider routes; cap the fallback chain at 3 attempts
- let full-access access tokens bind a worker to an app their own user owns
- cache resolved subscriptions so tiered limits don't add a round trip
2026-08-10 19:09:47 -07:00
Daniel Salazar
116d6e6663
tests: big test push for better coverage ( #3490 )
2026-08-01 14:29:59 -07:00
Nariman Jelveh
b55782f066
GUI: add npm start --server=<domain> to run the GUI against a remote backend ( #3481 )
...
- npm start --server=puter.com (or -- --server=...) skips the local backend
and serves the bundled GUI locally, pointed at the remote server's API.
Bare domains resolve to https://api .<domain>; full origins are used
verbatim. gui_origin points at the remote origin so /whoarewe, login,
anti-csrf, socket.io, and builtin apps hit the real backend (CORS-open).
- --extensions=<dir>[;<dir>...] bundles out-of-tree GUI extension
directories (sugar for PUTER_GUI_EXTENSION_PATHS). Their imports resolve
as if the files lived in src/gui/src/extensions, with the extension's own
files taking precedence, and bare imports fall back to the repo-root
node_modules.
- Fix the bit-rotted dev-server: Express 5 wildcard routes, pass gui()
params (previously called with none), inject the service_script shim,
load bundle.min.js + bundle.min.css in prod mode, serve /sdk, and
properly await the webpack build (it previously resolved immediately).
2026-07-30 16:29:54 -07:00
Daniel Salazar
5bad6a972f
fix: puter-js cleanup around docs and ai resolution ( #3459 )
...
* fix: puter-js cleanup around docs and ai resolution
* more jsdoc stuff
* fix: docs
* fix: doc types + misc hardening
* fix: harden auth
2026-07-27 22:31:05 -07:00
Daniel Salazar
928d5fec16
chore: cleanup AI module for puter-js ( #3423 )
2026-07-22 18:18:54 -07:00
Daniel Salazar and Claude Fable 5
0e1be72f92
test: tests for puter.js ( #3396 )
...
* test: tests for puter.js
* fix: ship lockfile for coverage devDeps; tolerate missing base coverage
npm ci failed on CI because package.json gained the babel/istanbul
devDependencies without the matching package-lock.json update. Also make
the coverage workflow's base leg best-effort so a base ref that predates
the coverage script reports without the comparison column instead of
failing the run.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
---------
Co-authored-by: Claude Fable 5 <noreply@anthropic.com >
2026-07-16 15:52:37 -07:00
Daniel Salazar
52e481128f
wip: puter js tests structure ( #3393 )
Maintain Release Merge PR / update-release-pr (push) Has been cancelled
Notify HeyPuter / notify (push) Has been cancelled
release-please / release-please (push) Has been cancelled
2026-07-15 19:09:35 -07:00
Neal Shah and Daniel Salazar
23e8705b03
Implement workers without cloudflare for local dev testing ( #3389 )
...
* typeify subdomains wip
* initial (untested) logic for LocalWorkerService
* Make it work, add lifecycle expiry since workers are process heavy in current implementation
* fix type errors
---------
Co-authored-by: Daniel Salazar <daniel.salazar@puter.com >
2026-07-15 01:01:42 -04:00
Aman Rai
70884c2e30
fix: rename start-gui script to start:gui ( #3346 )
2026-07-07 12:09:49 -07:00
Daniel Salazar
f1b94a5b69
fix: otel upgrade bump ( #3328 )
2026-07-06 08:42:25 -07:00
Daniel Salazar
4bcdeefe68
chore: bump up deps ( #3285 )
2026-06-22 13:58:45 -07:00
Daniel Salazar and Neal Shah
cd800148d5
feat: optional additional verification gates ( #3262 )
...
Maintain Release Merge PR / update-release-pr (push) Has been cancelled
Notify HeyPuter / notify (push) Has been cancelled
release-please / release-please (push) Has been cancelled
* phone number verificiation initial
* finish phone verification
* feat: add card gate for signups
* chore: npm
* fix: modal order and wording
* fix:wording
---------
Co-authored-by: Neal Shah <neal.shah@puter.com >
2026-06-15 09:16:00 -07:00
Ron Hernaus and Daniel Salazar
d2fee51844
Support PostgreSQL database backend ( #3167 )
...
Maintain Release Merge PR / update-release-pr (push) Has been cancelled
Notify HeyPuter / notify (push) Has been cancelled
release-please / release-please (push) Has been cancelled
* feat(database): add postgres database client
Adds the PostgreSQL database client, native bootstrap migration, SQL preparation helpers, and database config/factory wiring.\n\nRefs #3165 .
* feat(database): make backend queries postgres-aware
Updates runtime SQL call sites for database-specific booleans, identifiers, insert-ignore, upserts, JSON extraction, intervals, and Postgres insert ids.\n\nRefs #3165 .
* test(database): cover postgres client behavior
Adds unit coverage for SQL preparation, factory selection, write-result mapping, and transaction rollback/commit ordering, plus an env-gated PostgreSQL integration flow.\n\nRefs #3165 .
* docs(self-hosting): document postgres database setup
Adds PostgreSQL configuration examples and migration path guidance for self-hosted deployments.\n\nRefs #3165 .
* fix: harden postgres oidc tests
* fix(postgres): normalize query results and SQL prep
* fix(user): preserve normalized cache booleans
* test(postgres): run integration coverage with pgmock
* tests: add way to run all tests with postgres though slow
Also adding note that postgres is not in active use so might not work out the box
---------
Co-authored-by: Daniel Salazar <daniel.salazar@puter.com >
2026-05-28 14:12:17 -07:00
Daniel Salazar
6c19dfbafd
fix: linux build ( #2946 )
2026-05-07 11:23:10 -07:00
Daniel Salazar
775c9c49e2
test: add harness and some examples ( #2941 )
...
* test: add harness and some examples
* feat: tests ran on pr
2026-05-06 22:43:22 -07:00
Daniel Salazar
1e271f188e
fix: bring back old app names functionality and fix build ( #2937 )
2026-05-06 15:48:25 -07:00
Daniel Salazar
f9ac017faf
fix: fsEntry and tscofnig ( #2923 )
2026-05-05 16:18:09 -07:00
Daniel Salazar
2de8807942
selfhost: fullstack self host p1 ( #2902 )
...
* wip: self hosted full setup
* wip: self hoast modes
* more wip self host stuff
* wip: full release
* fix: custom apps
* fix: readme
* full-stack md
* docs update
* fix
* fix: commands
* remove comments
* fix: docs and migs
* mysql mig
* fix: docker changes
* fix: mysql checks
* fix: mysql mig
* fix: docker more
* fix: redis conn issues
2026-05-04 15:58:03 -07:00
Daniel Salazar
cb27fd1f98
Revert "Revert "remove exports ( #2885 )" ( #2887 )" ( #2888 )
...
Docker Image CI / build-and-push-image (push) Has been cancelled
Maintain Release Merge PR / update-release-pr (push) Has been cancelled
Notify HeyPuter / notify (push) Has been cancelled
release-please / release-please (push) Has been cancelled
This reverts commit 14cde26291 .
2026-05-02 10:20:01 -07:00
Daniel Salazar
14cde26291
Revert "remove exports ( #2885 )" ( #2887 )
...
This reverts commit 4e94cb07be .
2026-05-02 09:41:42 -07:00
Daniel Salazar
4e94cb07be
remove exports ( #2885 )
Docker Image CI / build-and-push-image (push) Has been cancelled
Maintain Release Merge PR / update-release-pr (push) Has been cancelled
Notify HeyPuter / notify (push) Has been cancelled
release-please / release-please (push) Has been cancelled
2026-05-01 23:52:52 -07:00
Daniel Salazar
1796fdb37b
fix: misc fs issues ( #2883 )
...
* fix: deps
* fix: FS issues
2026-05-01 18:54:10 -07:00
d4d78ac7db
rework: change backend and backend extensions to use simpler code structure and patterns ( #2815 )
...
* fix: dynamodb health checks and client recreation (#2789 )
* wip: no nanoServices groundwork
* feat: data clients in new shape
* wip: auth and perms in new system
* more wip
* middlewaters mainly done
* wip: fsv2 in new layout
* old fs v2 migration
* driver system
* driver and old fs fixes
* ai drivers wip
* stream support
* metering in ai chat driver
* wip: new auth
* rate limit and auth routes
* captcha and anti csrf
* fix: types
* auth store
* app logic
* wip most other dricvers
* fs
* mostly kill all legacy stuff
* fs finish
* fix: redis usage
* ai controller
* driver cleanup
* socket io in v2
* broadcast and crudq stuff
* subdomains
* notifcations and shares
* fix bad syntaxes
* auth wip
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
* extensions
* extension setup
* more routes
* sql migrations and default services
* home router
* tier 7
* everything else
* everything else
* remaining missing bits
* server health
* logs
* cleanup
* deps
* cleanup 2
* more cleanup 2
* boot
* fix launch
* config fix
* move file
* fix: tsconfig things
* fix: extension loading
* launching
* fix: drivers
* fix: others
* fix: icons
* fix: file uploads
* fs fixes
* fix: fs api
* fix: dev-center
* config
* add back telemetry
* lint stuff
* husky hooks
* fix: fs oss
* fix: config migration
* config migration
* migrate scripts + replicate
* runner
* fix: merge defafult config
* fix: default region
* fix: api domain
* fix paths in readfile
* fix fs entry default s3
* NS: Remove Referral && Entri Service
* dep cleanups
* fix: static assets
* fix: kv and perms
* fix: driver registrations
* fix: home mapping
* fix: rao
* adding back 500 alarm
* fix: build paths
* fix: fs and kv shapes
* fix: kv shape
* more kv coercing and ai chat matching format as prior
* fix: private app gates
* private app caches
* fix: whole bunch of legacy shape issues
* update template jsonc
* fix caching partial oidc and fs signed paths
* more oidc fixes
* fix: wip
* fix: private apps
* admin route fixes
* fix: last few things hopefully
* claude uploads
* fix security for app only routes
* fix kv system namespace
* stuff
* fix: app and kv and suggested apps
* fix:open item
* fix: FS operations
* fix: default app icons
* add back token-read and WSL support
* metering fixes
* fix: fsEntry
* perm scanners and implicators
* proper download endpoint
* fix: download
* fix anti csrft on v2
* fix file extensions, app icons
* fold in v1 fixes from origin/main into v2 equivalents
Re-applies the v1 fixes that landed on origin/main into their v2
counterparts since the v1 files were deleted on DS/wip during the v2
migration. v1 commits referenced below.
- SQLBatcher: flush immediately when queue hits maxBatchSize instead
of racing the timer (v1 12f48238).
- RedisClient: drop maxRetriesPerRequest from 2 to 1 to shrink failure
window (v1 b6776ab4 ).
- ChatCompletionDriver: default minimumCredits to 1 when unset/zero so
zero-cost precheck doesn't auto-pass (v1 36bd6073 ).
- OpenAiImageProvider: add gpt-image-2 support — open-ended size rules,
token-based cost estimator, arbitrary-size normalizer, isGpt prefix
broadened to gpt-image- (v1 f14f1bf4 ). models.ts auto-merged via
rename detection.
- AppStore: bump row cache TTL from 5m to 24h (v1 6b3196ed ).
Not ported: v1 app-object Redis cache (bdfa12b5/b886dde3) — v2's
#toClient recomputes filetype_associations/created_from_origin per
read; adding a second cache layer is a larger change for a follow-up.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
* remoe anti-csrf from auth routes that had not used them
* more icon fixes
* fix worker functionality
* fix: app and subdomain es
Co-authored-by: Copilot <copilot@github.com >
* fix PUT-761
* fix: PUT-748
* fix: rename fsService
* Add security back to WorkerDriver
* Migrate worker from fsEntry to fs. Fix cache issue
* remove ability to create symlinks
* strict webdav acl
* require auth for wisp
* chore: service renames
* Add metering back to puter peer api
* fix: PUT-760 PUT-749
* fix: PUT-746
* fix: peer cost
Co-authored-by: Copilot <copilot@github.com >
* fix: 771
* change order of peer controller
* fix: create appdata folder for app on get auth token
* fix: align delete site and list sites
* delete: putility
* fix subdomains
* Add support for tilde in subdomains, fix subdomain update
* cleanup PeerController.ts and fix billing oversight (#2844 )
* fix: PUT-786
* fix: bugs
* fix: issues with multiple subdomain queries, or permission checks
* fix: harden response shapes to not contain uneeded fields
* fix: move state to redis
* fix: missing kv methods + better sec
Co-authored-by: Copilot <copilot@github.com >
* fix: subdomainStore limit
* fix: missing path resolution
Co-authored-by: Copilot <copilot@github.com >
* fs fixes
* fix: undef error
* fix fs + cleanup
* fix: npm audit fixes
* heal path entries where missing
Co-authored-by: Copilot <copilot@github.com >
* fix: caching
Co-authored-by: Copilot <copilot@github.com >
* fix: cache inconsistencies
Co-authored-by: Copilot <copilot@github.com >
* fix: app driver metadata
Co-authored-by: Copilot <copilot@github.com >
* remove extraneous comma
* fix: associated app icons
* fix: bad tool call
* Add validation to WorkerDriver#getFilePaths
* misc fs and auth issues
Co-authored-by: Copilot <copilot@github.com >
* fix: oidc errors
Co-authored-by: Copilot <copilot@github.com >
* fix: PUT-797
* fix: legacy appdata_app
Co-authored-by: Copilot <copilot@github.com >
* fix: add alert logs
Co-authored-by: Copilot <copilot@github.com >
* fix: error handling
* Disable sharecontroller
* fix: remove private user identifier for ai
* fix: private app fixes
* Add backback signup_server
* fix: completionId size
Co-authored-by: Copilot <copilot@github.com >
* fix: revalidate path for oidc
* fix: revalidate path for oidc
* fix: email validation
Co-authored-by: Copilot <copilot@github.com >
* fix: user create query
* fix: middleware extensions
Co-authored-by: Copilot <copilot@github.com >
* use x-forwarded-for for req ip forwarded
* fix: missing last_activity ts
* feat: add cache broadcast to subdomains
* fix: update config typing
---------
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
Co-authored-by: ProgrammerIn-wonderland <3838shah@gmail.com >
Co-authored-by: Copilot <copilot@github.com >
Co-authored-by: Nariman Jelveh <nj@puter.com >
Co-authored-by: velzie <velzie@velzie.rip >
2026-04-30 12:13:43 -07:00
Shruc
6f4ec8bd1e
add replicate image provider ( #2806 )
...
* add replicate image
* docs replicate
* pkg lock
* maybe fix ci
2026-04-15 17:47:57 -04:00
Daniel Salazar
14f2da3206
cleanup: batcher to batch more appropriately ( #2794 )
Docker Image CI / build-and-push-image (push) Has been cancelled
Maintain Release Merge PR / update-release-pr (push) Has been cancelled
Notify HeyPuter / notify (push) Has been cancelled
release-please / release-please (push) Has been cancelled
test / test-backend (24.x) (push) Has been cancelled
test / API tests (node env, api-test) (24.x) (push) Has been cancelled
test / puterjs (node env, vitest) (24.x) (push) Has been cancelled
2026-04-10 00:27:14 -07:00
ProgrammerIn-wonderland
649db33763
Ns/simplify 1 ( #2764 )
...
* Rid devconsole
* lots of removals
* more commandservice
2026-04-06 14:05:48 -04:00
Daniel Salazar
95cbbc5de6
feat: enable singed uploads on oss and fix broken migration ( #2765 )
...
Docker Image CI / build-and-push-image (push) Has been cancelled
Maintain Release Merge PR / update-release-pr (push) Has been cancelled
Notify HeyPuter / notify (push) Has been cancelled
release-please / release-please (push) Has been cancelled
test / test-backend (24.x) (push) Has been cancelled
test / API tests (node env, api-test) (24.x) (push) Has been cancelled
test / puterjs (node env, vitest) (24.x) (push) Has been cancelled
* fix: proper shutdown
* feat: enable singed uploads on oss
* fix: s3 in oss
* fix: thumbnails in oss
2026-04-03 07:29:22 -07:00
Daniel Salazar
99d96edd9c
feat: s3 fs in oss ( #2761 )
...
* feat: s3 fs in oss
* feat: new endpoints in OSS
* fix: name of fs extension
* perf: signed uploads
* fix: await socket events to align fs events
* fix: default bucket names
* fix: backend tests
* fix: deps
* fix: order
2026-04-02 11:20:59 -07:00
Daniel Salazar
b3656fdaa1
fix: handle closing server nicer on shutdown signal ( #2741 )
...
* fix: handle closing server nicer on shutdown signal
* fix: bad check
2026-03-27 17:24:33 -07:00
Eric Dubé
814791872f
Manual package updates, npm audit --force, etc ( #2669 )
...
* chore: upgrade git-date (used for release notes generator)
* chore: update vitest, vitest plugins, and svgo
* chore: run `npm audit fix`
* chore: run `npm audit --force`
* meta: empty commit to run git tests
* fix: tests gone because of a... syntax error?
I question GitHub's judgement of handling a syntax error in the file
that defines tests to run on PRs by pretending everything is fine and
passing all PRs. That to me seems like the worst possible way to handle
that. I think they should have done it not like that.
2026-03-17 12:43:17 -07:00
Daniel Salazar
ec412eaff6
feat: cleanup cache invalidation and pull out keys to be easily used in other places that need the same cache ( #2515 )
...
fix: tests
2026-02-19 15:07:04 -08:00
Neal Shah
28cedec9de
chat_completions tool call fixes ( #2434 )
...
* chat_completions tool call fixes
* update chat completions test
2026-02-06 15:10:27 -08:00
Daniel Salazar
0234e34b46
Reapply: reverted redis migration changes ( #2403 )
2026-02-03 11:25:28 -08:00
Daniel Salazar
baceb05b48
Revert "feat: replace serializible caches with redis instead of kvjs 🚀 ( #2381 )"
...
This reverts commit 7a47047c0d .
2026-02-03 12:43:00 -05:00
Daniel Salazar
7a47047c0d
feat: replace serializible caches with redis instead of kvjs 🚀 ( #2381 )
...
* wip: redis move
* fix: redis in extensions
* fix: bad isEMpty assignment
* fix: bad redis client config
* wip
* fix: redis keys cache
* fix: redis batch delete
* fix: change bulk cache times to allow for more instaces
* fix: broken tests
2026-02-03 02:18:31 -08:00
Daniel Salazar
f360cf17e6
chore: update our required node version ( #2204 )
...
* feat: fix broken queue bench
* chore: update our required node version
2025-12-19 19:24:05 -08:00
Daniel Salazar
a1689c4ea3
feat: dynamo in oss ( #2195 )
...
Docker Image CI / build-and-push-image (push) Has been cancelled
Maintain Release Merge PR / update-release-pr (push) Has been cancelled
release-please / release-please (push) Has been cancelled
test / test-backend (20.x) (push) Has been cancelled
test / test-backend (22.x) (push) Has been cancelled
test / API tests (node env, api-test) (22.x) (push) Has been cancelled
test / puterjs (node env, vitest) (22.x) (push) Has been cancelled
* feat: dynamo in oss
* fix: service name mismatch for dynamo client
* fix: dynalite boot
* fix: tests
2025-12-18 17:22:49 -08:00
Nariman Jelveh
ef9f240a45
Remove terminal phoenix emulator ( #2141 )
...
* Remove terminal and phoenix built-in apps and emulator
This commit removes the terminal and phoenix built-in apps from the backend, database migrations, and permissions. It also deletes the entire emulator and phoenix/terminal app source directories, assets, and related configuration files. References to these apps in the backend module loader and router are removed, and related SQL migrations are updated to reflect their removal.
* Remove emulator references from SelfHostedModule
* Remove emulator integration and related references
* Remove parsers and pty modules
* Update package-lock.json
2025-12-11 16:53:21 -08:00
Daniel Salazar
e2ae313589
feat: refactor ai to have single entry point and follow defined model structure ( #2114 )
...
* feat: refactor ai to have single entry point and follow defined model structure
* fix: missing openrouter registration
* fix: dedupe models
* feat: provide usage in stream mode 🚀
2025-12-09 15:59:21 -08:00
Daniel Salazar
34134a2e35
chore: add typedefs for puter.js ( #2086 )
2025-12-02 13:04:26 -08:00
Daniel Salazar
c77272012d
ci: add test coverage ( #2073 )
...
* ci: add test coverage
* ci: add test coverage
2025-12-01 08:56:44 -08:00
Daniel Salazar
d978c37e0b
ci: package and docker fixes ( #2072 )
...
Docker Image CI / build-and-push-image (push) Has been cancelled
Maintain Release Merge PR / update-release-pr (push) Has been cancelled
release-please / release-please (push) Has been cancelled
test / test-backend (20.x) (push) Has been cancelled
test / test-backend (22.x) (push) Has been cancelled
test / API tests (node env, api-test) (22.x) (push) Has been cancelled
test / puterjs (node env, vitest) (22.x) (push) Has been cancelled
* ci: package and docker fixes
* ci: fix package conflicts
2025-12-01 02:10:36 -08:00
Daniel Salazar
cea94d16cb
fix: backend tests breaking with permision ( #2067 )
Docker Image CI / build-and-push-image (push) Has been cancelled
Maintain Release Merge PR / update-release-pr (push) Has been cancelled
release-please / release-please (push) Has been cancelled
test / test-backend (20.x) (push) Has been cancelled
test / test-backend (22.x) (push) Has been cancelled
test / backend (node env, api-test) (22.x) (push) Has been cancelled
test / puterjs (browser env, playwright) (22.x) (push) Has been cancelled
test / puterjs (node env, vitest) (22.x) (push) Has been cancelled
2025-11-29 13:50:27 -08:00
Daniel Salazar
cb66c56a6b
fix: tsconfig to ignore vite config files ( #2048 )
2025-11-26 13:26:09 -08:00
KernelDeimos
d6651498eb
fix: minor issue in root package.json
2025-11-26 14:52:31 -05:00
Daniel Salazar
e2f1200ad5
test: add test infra to run vitest on all of backend wip ( #2023 )
Docker Image CI / build-and-push-image (push) Has been cancelled
Maintain Release Merge PR / update-release-pr (push) Has been cancelled
release-please / release-please (push) Has been cancelled
test / test (20.x) (push) Has been cancelled
test / test (22.x) (push) Has been cancelled
test / backend (node env, api-test) (22.x) (push) Has been cancelled
test / puterjs (browser env, playwright) (22.x) (push) Has been cancelled
test / puterjs (node env, vitest) (22.x) (push) Has been cancelled
2025-11-24 19:20:09 -08:00
Daniel Salazar
11e057557d
fix: eslint autofixable errors ( #2002 )
Docker Image CI / build-and-push-image (push) Has been cancelled
Maintain Release Merge PR / update-release-pr (push) Has been cancelled
release-please / release-please (push) Has been cancelled
test / test (20.x) (push) Has been cancelled
test / test (22.x) (push) Has been cancelled
test / backend (node env, api-test) (22.x) (push) Has been cancelled
test / puterjs (browser env, playwright) (22.x) (push) Has been cancelled
test / puterjs (node env, vitest) (22.x) (push) Has been cancelled
2025-11-21 13:22:19 -08:00
KernelDeimos
8dafafa749
ci: mandatory eslint rules for build
...
This commit adds verification for statically identifiable definite
errors. Sometimes global variables used will be falsely reported as
undefined variables in which case the new file
`mandatory.eslint.config.js` should be updated to include these
definitions in the narrowest scope possible that has these definitions
2025-11-20 21:34:21 -05:00