Compare commits

...
5242 Commits
Author SHA1 Message Date
Daniel Salazar dda6b82f0f fix: missing english i18n (#3176) 2026-05-27 16:31:40 -07:00
ProgrammerIn-wonderland 6c757c3fc8 Don't use passed in authorization in workers (#3175) 2026-05-27 18:09:59 -04:00
Daniel Salazar eba194936e tests: more tests for session and auth (#3174) 2026-05-27 12:32:15 -07:00
Daniel Salazar a7bdac16da tests: Add unit tests for XAISpeechToTextDriver (#3173)
closes #3002
2026-05-27 11:49:16 -07:00
Daniel Salazar 716a8d06e2 fix: session store kind column + duplicate error handling (#3172) 2026-05-27 11:44:08 -07:00
Daniel Salazar e95cf44fec fix: small fixes for perf and username checks (#3169) 2026-05-27 03:10:56 -07:00
Daniel Salazar 8f8efcb349 feat (PUT-1025 PUT-1026 and PUT-1017): better handling old token auth required in gui (#3166)
* feat (PUT-1025 PUT-1026 and PUT-1017): better handling old token forcing in gui

* fix: misc issues with token inval project
2026-05-27 02:26:35 -07:00
Daniel Salazar b188942436 feat (PUT-1016 & PUT-1020) (#3164)
* feat (PUT-1016 & PUT-1020)
temp account preservation on forced relogin
hosted asset cookies to v2 token too

* fix: remove llm dashes and ugly comments

* update agents
2026-05-26 23:35:16 -07:00
Daniel Salazar 9b7e9a98c8 fix: session revocation (#3163) 2026-05-26 22:13:12 -07:00
Daniel Salazar d6f7fb6155 chore: package-lock update (#3161) 2026-05-26 20:33:11 -07:00
Daniel Salazar bd91f5e192 feat: worker sessions get their own kind + per-(user, app, worker_name) row (#3160)
* feat: worker sessions get their own kind + per-(user, app, worker_name) row

Schema
------
- mysql_mig_11.sql + sqlite 0054: add idx_sessions_user_worker_active,
  a partial unique index over (user_id, app_uid, meta.worker_name) for
  kind='worker' rows. Active worker sessions are deduped by that triple
  so each named worker gets its own session row and they don't fight
  the existing idx_sessions_user_app_active (which still constrains
  kind='app' only). app_uid is allowed NULL for user-scoped workers
  with no app binding.

SessionStore
------------
- getOrCreateWorker(userId, { appUid, workerName, ... }): mirrors the
  getOrCreateApp pattern — cache lookup, partial-unique re-SELECT on
  insert-ignore, all keyed on the worker triple. expires_at lands at
  WORKER_WINDOW_SECONDS (~99y) so the worker doesn't have to re-mint
  on any cadence.
- #cacheKeyWorker + #allCacheKeysForRow worker branch so revoke /
  update invalidates the worker cache view alongside the by-uuid one.

AuthService
-----------
- createWorkerSessionToken(user, workerName, meta?) now takes the
  workerName explicitly and routes through getOrCreateWorker. Emits
  the same { session, token, gui_token } shape but both JWTs carry
  { worker: true, worker_name }.
- createWorkerAppToken(actor, appUid, workerName) likewise — JWT
  carries the worker_name claim so a verifier can tell two workers
  under the same app apart without a DB round-trip.
- Both methods 400 on empty workerName.

WorkerDriver
------------
- Five auth-mint call sites swapped over: app-bound deploy (3x:
  appId branch, actor.app fallback, hot-reload redeploy), user-bound
  fallback (2x: cold deploy, hot-reload). All pass `workerName` so
  the worker's session row is naturally idempotent across redeploys.

GUI manage-sessions
-------------------
- sessionTitle adds a kind='worker' branch ("name (app)" for
  app-scoped workers, just "name" for user-scoped), pulling worker_name
  from the meta-spread that listSessions already surfaces.
- en.js adds ui_session_kind_worker.

* fix(workers): MySQL JSON_EXTRACT quoting + revoke cache invalidation +
SQLite NULL-distinct in worker index

Three real bugs in the worker session plumbing from the prior commit,
plus a misleading comment. Schema design kept (worker_name lives in
`meta` rather than a dedicated column) per offline review:

1. `#selectWorkerRow` compared `JSON_EXTRACT(meta, '$.worker_name')`
   directly to a bind parameter. MySQL's `JSON_EXTRACT` returns a
   JSON-typed value with embedded quotes (`"name"`, not `name`), so
   the comparison never matched. After the first INSERT, every
   follow-up getOrCreateWorker call missed the existing row in the
   SELECT, hit INSERT-IGNORE, then missed again in the re-SELECT —
   the caller would receive whatever the INSERT-IGNORE returned (a
   no-op row in conflict cases). Wrap with `JSON_UNQUOTE` on MySQL
   via `db.case`; SQLite's `json_extract` already returns the
   unwrapped scalar so it keeps the literal form.

2. mig_11's generated `worker_unique_key` had the same JSON-quoting
   bug. Mirror the fix: `IFNULL(JSON_UNQUOTE(JSON_EXTRACT(...)), '')`
   so the concatenated unique key is a plain string that lines up
   with what `#selectWorkerRow` now binds against.

3. SQLite UNIQUE indexes treat NULL columns as distinct (per the SQL
   standard), so two user-scoped workers (app_uid NULL) with the same
   worker_name would both insert. Wrap the index expression with
   `IFNULL(app_uid, '')` so they correctly conflict — matches the
   MySQL side's `IFNULL` in the generated column.

4. `removeByUuid` / `revokeCascade` SELECTed only the identity
   columns (no `meta`), so `#allCacheKeysForRow`'s worker branch
   couldn't read `meta.worker_name` and the composite
   `sessions:v2:worker:<user>:<app>:<name>` cache key survived
   revocation. Up to CACHE_TTL_SECONDS (15min) afterwards,
   getOrCreateWorker would short-circuit to the cached (revoked) row.
   Add `meta` to both SELECTs; the existing meta-parsing logic in
   `#allCacheKeysForRow` handles the rest.
2026-05-26 20:05:31 -07:00
Daniel SalazarandClaude Opus 4.7 971a1b5071 chore: drop linear/issue ticket references from source comments (#3159)
54 references across 18 files (PUT-1010, PUT-1014, PUT-1019, PUT-1021,
PUT-1022, PUT-1023, PUT-1024 + sub-tags AUTH-2/4/5, SDK-1, PJS-1/2,
GUI-1/2, ROLLOUT-1) removed from inline comments, doc comments,
test describe blocks, and SQL migration headers. The substantive
explanations stay; only the ticket pointers go.

No behavior change. Full backend test suite: 2172 passed / 16 skipped.

Co-authored-by: Claude Opus 4.7 (1M context) <[email protected]>
2026-05-26 18:50:43 -07:00
Daniel SalazarandClaude Opus 4.7 ac5eecb7f3 feat (put-1019 put-1021): v2 auth revoke endpoints + silent v1->v2 to… (#3158)
* feat (put-1019 put-1021): v2 auth revoke endpoints + silent v1->v2 token migration

PUT-1019 (AUTH-5): full revoke-endpoint coverage
- /logout: soft-revoke web session + its asset cookies via revokeCascade
  (app sessions and access tokens survive)
- POST /auth/revoke-session: cascade per row kind (web/app/access_token/asset)
- POST /auth/revoke-all-sessions: revoke all web rows for user; optional
  include_apps=true nuclear option; gated by userProtected (cookie-only)
- revokeAccessToken: soft-revoke matching access_token row in addition to
  removing access_token_permissions
- All revokes are UPDATE revoked_at = now(); no DELETE statements remain

PUT-1021 (SDK-1): backend POST /auth/migrate-token
- v1 access_token/app -> mint matching-kind v2 token, idempotent on
  (auth_id, kind, token_uid)
- v1 web/session -> 409 { code: "reauth_required" } (interactive relogin only)
- Same-origin / signed-referer hardening; rate-limited per IP and auth_id
- Gated by auth.allow_v1_tokens; emits puter_token_v2 cookie for app-in-browser

DB migrations: mysql_mig_10, sqlite 0053 (sessions.access_token_uid column)

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>

* fix(put-1019): reject self-revoke; enrich list-sessions response

- handleRevokeSession refuses uuid === req.actor.session.uid (use /logout
  instead). The cookie that authenticated the call should never be the
  target of a self-revoke — the response can't write fresh auth state
  and the client ends up with an ambiguous identity. revoke-all-sessions
  still has the explicit include_current opt-in for the nuclear case.

- AuthService.listSessions now joins the apps table for kind='app' rows
  (returning { uid, name, title, icon } so the manage-sessions UI can
  render the authorizing app without a second round trip), surfaces
  kind / expires_at / label / last_ip / created_via, and filters out
  asset rows (per-cookie children of web rows, revoked transitively via
  cascade — surfacing them as standalone entries would be confusing).

- Sort order: current session first, then most-recently-active. UI
  relies on this to anchor "you are here" at the top.

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>

* fix(put-1019 put-1021): review nits — origin normalization, cookie fallback, types, migration order

B1: createAccessToken.options.expiresIn widened to string | number.
    The impl (#hardExpiryFromExpiresIn) and existing callers/tests use
    jsonwebtoken-style strings ('1h', '30d'); narrowing to number forced
    unsafe casts at every call site. Cast at the single sign() boundary
    where jsonwebtoken's typed template-literal SignOptions clashes
    with the wider runtime contract.

B2: Inline comment on the DELETE in access_token_permissions. The
    AUTH-5 "no DELETE on revoke" rule scoped to the `sessions` table
    (where the cascade graph + audit trail matter). Permissions rows
    are the grant manifest for an active token — once its session is
    soft-revoked they're dead-weight cache entries. A future audit
    requirement would land as a `revoked_at` column on this table,
    not a behavior change in this PR.

B3: handleMigrateToken now sets the puter_token_v2 cookie (with the
    shared sessionCookieFlags + httpOnly) when the migration result
    is kind='app'. The endpoint is already gated on Origin so the
    caller is by definition in a browser; access tokens deliberately
    skip the cookie since they're programmatic.

B4: #isMigrateTokenOriginAllowed normalizes both incoming origin and
    config.origin / allowlist entries (trim + strip trailing slash +
    lowercase) before equality. A misconfigured `config.origin =
    "https://puter.com/"` would otherwise reject every same-origin
    browser call.

B5: Replaced 4x `this.config.cookie_name!` non-null assertions in
    AuthController with `(this.config.cookie_name ?? 'puter_token')`.
    IConfig is `Partial<IConfigOptional>` so cookie_name is undefined
    at runtime in some deployments / test setups; the fallback matches
    the pattern in userProtected / OIDCController / puterSite.

B6: MySQLDatabaseClient sorts migrations numerically by trailing
    integer instead of lexically. Existing files use unpadded names
    (`mysql_mig_<N>.sql`), so plain `.sort()` ran mysql_mig_10 before
    mysql_mig_2 — a future migration that depended on _2..9 running
    first would break. Non-numeric filenames fall through to
    localeCompare for determinism.

B7: Restored the docstring for SessionStore.getOrCreateApp's
    `opts.auth_id` ("Stable per-user identity (survives re-login);
    carried on every v2 JWT so manage-sessions can group by identity")
    — the previous edit truncated it to a fragment.

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>

* test + feat: backend test coverage for PUT-1019/1021 review fixes + worker session methods

Tests
-----
- compareMigrationFilenames (new) covering B6 numeric-sort: confirms
  mysql_mig_10.sql lands after mysql_mig_9.sql; non-numeric files sort
  after numbered ones; stable for already-ordered input.
- listSessions (AuthService.test.ts): excludes kind="asset" rows;
  enriches with kind/expires_at/last_ip/created_via; joins kind="app"
  rows with the apps table; sorts current first then by last_activity
  desc.
- handleRevokeSession (AuthController.test.ts): refuses self-revoke
  with 400; still allows revoking a sibling session.
- handleMigrateToken (AuthController.test.ts): rejects missing/
  disallowed Origin; tolerates trailing slash and uppercase Origin
  (B4 normalization); returns 409 reauth_required for v1 web tokens;
  does NOT set the cookie for access-token migration; DOES set the
  puter_token_v2 cookie (httpOnly + sessionCookieFlags) for
  app-under-user migration.
- SessionStore tests updated to import APP_WINDOW_SECONDS /
  WEB_WINDOW_SECONDS rather than hardcoded 30/90 day values — the
  windows just got bumped to 1y and the assertions need to follow
  the constant.

Refactor
--------
- MySQLDatabaseClient exports compareMigrationFilenames so the sort
  logic is unit-testable in isolation.

Worker tokens
-------------
- AuthService.createWorkerSessionToken(user, meta?): mints a new
  kind="web" row tagged meta.worker=true, expires_at =
  WORKER_WINDOW_SECONDS, returns { session, token, gui_token }
  with worker: true on each JWT.
- AuthService.createWorkerAppToken(actor, appUid): mints a new
  kind="app" row tagged meta.worker=true, expires_at =
  WORKER_WINDOW_SECONDS, returns an app-under-user JWT with
  worker: true. Note the existing idx_sessions_user_app_active
  unique index will collide with an existing non-worker app
  session for the same (user, app) — future schema work can
  carve workers out of that uniqueness.

SessionStore.js: WEB/APP_WINDOW_SECONDS now 1y;
WORKER_WINDOW_SECONDS = 99y added for the worker path.

Full backend suite: 2172 passed / 16 skipped / 0 failed.

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <[email protected]>
2026-05-26 18:49:36 -07:00
Daniel SalazarandClaude Opus 4.7 3ae076b73e feat (put-1022 put-1023 put-1024): puter.js reauth handling + GUI v2 modal + silent v1 migration (#3157)
* feat (put-1022 put-1023 put-1024): puter.js reauth handling + GUI v2 modal + silent v1 migration

PUT-1022 (PJS-1): puter.js handles 401 reauth_required
- Single apiCall wrapper intercepts 401 { code: "reauth_required" }
- Clears local token, emits puter.auth.reauth_required { reason, auth_id }
- Queues in-flight requests, re-issues after re-auth completes
- web/app: opens puter.com login popup forwarding auth_id
- gui: no-op (handled by GUI-1 modal)
- workers: surfaces as structured exception
- All token writes go through setAuthToken() (future-proofed for PJS-2)

PUT-1023 (GUI-1): web GUI reauth modal + v2 token storage
- Detects 401 reauth_required across http + websocket connect paths
- Soft modal preserves URL/window state; auth_id forwarded into login form
- Storage key migrated: auth_token -> auth_token_v2
- Cookie cleared on logout: puter_token (legacy) cleared, backend writes puter_token_v2
- Cross-tab propagation via localStorage storage events
- WebSocket revocation surfaces as same modal (no silent failure)

PUT-1024 (PJS-2): puter.js storage versioning + silent v1->v2 migration
- New storage key puter.auth.token.v2
- On SDK init: prefer v2 key; else legacy v1 -> silent POST /auth/migrate-token (SDK-1)
- On success: store v2, clear v1. On failure: fall back to PJS-1 reauth flow
- URL-param tokens (?puter.auth.token=, ?auth_token=) also run through silent migration
- Logout clears both keys; setAuthToken writes v2 only

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>

* fix(put-1023): manage-sessions polish — hide self-revoke, fix modal stack, richer rows

Three issues surfaced during local testing of the manage-sessions UI:

1. The session row representing the caller's own cookie had a Revoke
   button that, if used, left the client in an ambiguous identity state
   (backend now rejects it too — see put-1019 backend fix). The button
   is now omitted entirely when session.current=true; /logout remains
   the right path for ending the active session.

2. The confirm-revoke prompt rendered behind the manage-sessions
   window because both share the dominant z-index pool. UIAlert calls
   now pass parent_uuid (the manage-sessions window's data-element_uuid)
   plus stay_on_top, so the prompt stacks above its parent.

3. Each row only showed the bare uuid. Now renders: title (app
   title for app sessions, label / "Browser session" / "Access token"
   otherwise), app icon when applicable, kind / current badges,
   created / last-active / expires (timeago, with absolute on hover),
   and last_ip. App metadata is joined server-side per the backend
   listSessions change.

Adds en.js strings for the new labels (ui_session_*).

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>

* fix(put-1022): tighten reauth replay + iframe postMessage hygiene

driverCall_ replay (G1): on 401 reauth_required, re-enter driverCall_
instead of calling replayXhrAfterReauth. The generic helper wires the
retried XHR through setupXhrEventHandlers which resolves with the
parsed response and silently skips driverCall_'s streaming detection,
usage-limit / email-confirmation handling, settings.transform, and
resp.result unwrapping — i.e. it would change the driver call API
contract on retry. One-shot via settings._reauthReplayed so a
fresh-token rejection bubbles up instead of looping.

responseType drift (G2): driverCall_ sets xhr.responseType from
settings AFTER initXhr (which captured the stale value into
xhr._puterReq). Mirror the mutation onto _puterReq so any replay path
builds the retry with the live config rather than the snapshot.

targetOrigin lockdown (G3): triggerReauth's parent.postMessage now
targets this.defaultGUIOrigin instead of '*'. The payload carries
reauth metadata + auth_id and is only meaningful to the GUI; '*'
would leak the signal to whatever frame happened to be embedding us.

event.source pinning (G4): the reauth wait listener also matches
event.source against globalThis.parent, not just event.origin —
origin alone admits any same-origin frame on the GUI domain.

event name alignment (G5): the SDK now emits and listens for
'puter.auth.reauth_required' (matches the documented name in the
PR / commit description). The old 'auth.reauth_required' key isn't
yet consumed externally so this is a safe rename.

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <[email protected]>
2026-05-26 18:49:17 -07:00
Daniel Salazar 5394ccc45c feat: add verification for v2 auth (#3155) 2026-05-26 15:34:54 -07:00
Daniel Salazar 3649109f40 fix: add back AGENTS.md (#3154) 2026-05-25 16:01:35 -07:00
Daniel Salazar 0ff0ea7743 fix: fs event emissions (#3153) 2026-05-25 14:25:27 -07:00
Daniel Salazar 8be115096f feat (put-1012 put-1014): new tokens version signature and logic (#3152) 2026-05-25 14:19:23 -07:00
Daniel Salazar e66fd2373f feat: start adding support for token expiry and invalidation (#3151)
* feat: new expirable + revokable session

* fix: msql migration
2026-05-25 12:30:20 -07:00
jelveh 0e2cce152d Update PuterAlert.js 2026-05-24 17:03:34 -07:00
Daniel Salazar 101e0bc930 fix: search leaking metadata (#3150) 2026-05-24 16:21:33 -07:00
jelveh ea078250bf Strip non-essential media from docs' markdown 2026-05-24 16:15:24 -07:00
jelveh db79f8e484 Add note: serve Puter.js via HTTP server 2026-05-24 15:48:21 -07:00
Daniel Salazar 6422f2d513 fix: associated app ids as input (#3149) 2026-05-23 13:01:03 -07:00
ProgrammerIn-wonderland c60626f772 Add preamble versioning (#3147)
* Add preamble versioning

* update migrations index
2026-05-23 01:15:58 -04:00
ProgrammerIn-wonderland cafdaf7b50 fix bug with signed url directory listings (#3146) 2026-05-22 18:48:41 -04:00
Daniel Salazar bb0f56d758 fix: bring back puter site config logic (#3145) 2026-05-22 11:15:45 -07:00
NighttandReynaldi Chernando 7438db7a90 Add OpenRouter model release dates (#3144)
* Add OpenRouter model release dates

* simplify implementation

---------

Co-authored-by: Reynaldi Chernando <[email protected]>
2026-05-22 12:58:59 -04:00
Daniel Salazar 948f771838 feat: ai limits tightning and add severity alert (#3142) 2026-05-21 20:46:19 -07:00
Nariman Jelveh 82e34f014d Warn on file:// loads using PuterDialog 2026-05-21 19:15:21 -07:00
Nariman Jelveh 9e4c3f8ba3 Merge branch 'main' of https://github.com/HeyPuter/puter 2026-05-21 14:39:44 -07:00
Nariman JelvehandClaude Opus 4.7 e6acd7386a Bump @heyputer/puter.js to 2.4.2
Record the 2.4.2 release in the repo. The version was published to npm
(via prepublishOnly's `npm version patch`) but the bump was never
committed, leaving package.json stuck at 2.4.1 on GitHub.

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
2026-05-21 14:39:18 -07:00
Daniel Salazar b04e8b046a fix: fixing misc issues around alerting and bugs (#3141)
- decrease ai related alerts and make errors not 500
- decreased bad fs controller checks to be 404s instead of 500s
- force bucket regions for now
- validate webdav perms for locking/unlocking
2026-05-21 14:26:47 -07:00
Nariman Jelveh 3262b984b7 Unify Email/Usage dialogs with Puter dialog style 2026-05-21 14:26:26 -07:00
Nariman Jelveh 71af88c73c Bump @heyputer/puter.js to 2.4.1 2026-05-21 14:06:48 -07:00
Nariman Jelveh 2275f65169 Centralize auth popup handling and consent dialog 2026-05-21 12:06:47 -07:00
ProgrammerIn-wonderland 71b7d6367f fix together provider issues (#3140) 2026-05-21 08:58:48 -04:00
Nariman Jelveh 08369d840b Add cssstyle to docs dependencies (#3139) 2026-05-20 17:41:02 -07:00
Daniel Salazar 94236133b5 fix: event types (#3138)
* fix: agents.md

* fix weird names

* fix: weird names again

* fix: event types

* cleanup types
2026-05-20 16:26:16 -07:00
Daniel Salazar 84b48541bd fix: event types + emit subdomain serve event (#3137)
* fix: agents.md

* fix weird names

* fix: weird names again
2026-05-20 12:47:56 -07:00
Daniel Salazar a33d02f522 fix: agents.md name (#3136) 2026-05-20 12:18:35 -07:00
Reynaldi Chernando f94d4aa7d9 Update gemini 3.5 flash release date (#3135) 2026-05-20 13:25:46 -04:00
Daniel Salazar 89cfb0c634 fix: subdomain htmls (#3134) 2026-05-19 22:04:57 -07:00
ProgrammerIn-wonderland c9096e9eed more validation for signed URLs (#3133) 2026-05-19 19:04:42 -04:00
Daniel Salazar 859ca207c5 feat: new gemini 3.5 flash model (#3131) 2026-05-19 15:16:07 -07:00
Daniel Salazar 58fc122f0d fix: app creation dupped names limit (#3130)
* fix: app creation dupped names limit

* fix: app dupped names
2026-05-19 12:18:59 -07:00
ProgrammerIn-wonderland 0e990da961 import ESM by URL instead of path (#3129) 2026-05-18 19:31:03 -04:00
db8236cc97 update Indonesian section (Indonesian language) (#3117)
* Update id.js

* Update id.js

* Update id.js

* Update id.js

* Update README.id.md

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <[email protected]>

* refine indonesia i18n

---------

Co-authored-by: Copilot Autofix powered by AI <[email protected]>
Co-authored-by: Reynaldi Chernando <[email protected]>
2026-05-18 17:15:01 +07:00
jelveh d731ccf873 Bump puter.js version to 2.3.4 2026-05-17 23:20:41 -07:00
Daniel Salazar 6493d66901 fix: misc write issues with fs + openrouter refresh (#3125)
* feat: refresh openrouter models every 15 min

* fix: if no extensions, skip build step

* fix: misc write issues with fs
2026-05-17 12:34:08 -07:00
Daniel Salazar 9e7f38f473 fix: validate private apps token too (#3124) 2026-05-17 12:28:32 -07:00
Daniel Salazar a568ca0f99 fix: expose upstream ai errors as not 500s (#3123) 2026-05-17 12:01:22 -07:00
Nariman Jelveh 41e7228a9f Update PuterDialog.js 2026-05-16 17:01:40 -07:00
Nariman Jelveh 4568639718 Adjust PuterDialog footer and button spacing 2026-05-16 16:57:35 -07:00
Nariman Jelveh 73ecff0bd7 Tweak PuterDialog spacing and button widths 2026-05-16 16:50:31 -07:00
Nariman Jelveh f2f023880f Remove mobile column-reverse for dialog buttons 2026-05-16 16:42:27 -07:00
Nariman Jelveh f2093e9204 PuterDialog: UI/style tweaks and button reorder 2026-05-16 16:36:53 -07:00
Nariman Jelveh 23497dd371 Add dark mode for puter.js login prompt 2026-05-16 16:04:29 -07:00
Nariman Jelveh 37619fb2a3 Remove embedded background image from PuterDialog 2026-05-16 15:43:15 -07:00
Nariman Jelveh f976686eba Update index.md 2026-05-16 13:12:31 -07:00
ProgrammerIn-wonderland 7af3721543 Make confirming an email unconfirm any other accounts using that email (#3121) 2026-05-16 15:07:38 -04:00
ProgrammerIn-wonderland 93edec0d01 assert normalized (#3119) 2026-05-15 17:01:32 -04:00
Daniel Salazar 54b61f2e24 fix: bad cookie parse test (#3120)
* fix: deepseek alias

* fix: bad cookie parse test
2026-05-15 13:40:43 -07:00
Nariman Jelveh 184ed77493 Use fixed colors for OIDC login divider 2026-05-14 20:26:46 -07:00
Nariman Jelveh 8234b72fc3 Improve login UI: logo, forgot link, OIDC divider 2026-05-14 20:20:21 -07:00
Nariman Jelveh cc9921945e Make auth logo clickable for cover pages 2026-05-14 20:13:33 -07:00
Daniel Salazar ac6f23a41f Update README.md (#3116) 2026-05-14 13:01:34 -07:00
Nariman Jelveh 973d046d33 Remove legacy TabFiles component
Delete the large TabFiles.js file (file browser tab) and update dashboard, styles, helpers, and init logic accordingly. Related changes in UIDashboard.js, dashboard.css, style.css, helpers.js and initgui.js remove or adapt references to the removed component and adjust UI/initialization and styling to account for the file-tab extraction. This reduces duplicate/legacy code and centralizes file browser functionality; review UIDashboard and helper updates to ensure file management features (navigation, upload, context menus, previews) are migrated or re-implemented as needed.
2026-05-14 12:13:48 -07:00
Miika Kuisma dcb50cde8f Merge pull request #3115 from HeyPuter/puter-js-update260514-2
PuterJS - Fix submenu behavior on mobile devices in Menubar web component
2026-05-14 11:45:47 +03:00
Miika Kuisma 08beb55853 PuterJS - Fix submenu behavior on mobile devices in Menubar web component 2026-05-14 11:43:47 +03:00
Miika Kuisma bb0220e163 Merge pull request #3114 from HeyPuter/puter-js-update-260514
Puter JS MenuBar Web Component improvements
2026-05-14 09:14:19 +03:00
Miika Kuisma f3e4c8c6d0 menu item focus tweak 2026-05-14 09:09:40 +03:00
Miika Kuisma 44254671bb - When navigating with keyboard the main level of menubar (file, edit etc) is should also open the menus, now it just highlights the opener
- When hovering main menu items, it must clear hover effects
- Two submenus under each other and diagonal moving
- separator hovering removes highlight but disabled item should do the same
- better way to remove focus
- when mouse leaves context menu highlight should be removed
2026-05-14 08:26:36 +03:00
Daniel Salazar bcc6cc8f00 fix: express proxy chain (#3112) 2026-05-13 18:13:39 -07:00
jelveh 84549a1c31 Add Authorization header to deletion request 2026-05-13 17:21:40 -07:00
Daniel Salazar 0276420213 fix: treat access tokens as non-auth unless opted in (#3111)
* fix: treat access tokens as non-auth unless opted in

* fix: tests
2026-05-13 14:20:15 -07:00
ProgrammerIn-wonderland 6353a08fd5 accept web input in speech2txt (#3110) 2026-05-13 15:53:16 -04:00
Daniel Salazar c265fa308a fix: double rate limits across the board (#3108)
* fix: sqlite auto create path if missing

* fix: double rate limits across the board
2026-05-13 09:30:08 -07:00
Miika Kuisma d3f72bc33a Merge pull request #3105 from HeyPuter/puter-js-menubar-fixes
Puter JS UI Component updates
2026-05-13 11:51:42 +03:00
ProgrammerIn-wonderland 700fc4d27e alibaba provider (#3103)
* Add alibaba provider

* add tests
2026-05-13 03:21:15 -04:00
Miika Kuisma 9c7f30a150 Add theme attribute for each web component, which can be used for forcing dark or light theme (in case the application doesn't have dark mode support it might be odd if just menubar turns dark) 2026-05-13 10:08:59 +03:00
Miika Kuisma 85e45b30f5 fixes https://github.com/HeyPuter/puter/issues/3102 2026-05-13 09:52:21 +03:00
Miika Kuisma 5483e32eab fixes https://github.com/HeyPuter/puter/issues/3101 2026-05-13 09:37:36 +03:00
Miika Kuisma f63c7d8142 - Fixes https://github.com/HeyPuter/puter/issues/3100
- Also fixes similar issues with navigating top level menubar items and submenus
2026-05-13 09:27:44 +03:00
Miika Kuisma 5a2071f852 fix https://github.com/HeyPuter/puter/issues/3099 2026-05-13 09:01:57 +03:00
Miika Kuisma 238ed12e28 - add dark mode support for UI components
- fix https://github.com/HeyPuter/puter/issues/3098
2026-05-13 08:54:23 +03:00
Daniel Salazar d1afe6c3cf fix: puter site redirect for non paid apps (#3104)
* fix: puter site redirect for non paid apps

* add tests
2026-05-12 21:03:33 -07:00
Nariman Jelveh e58dd48e80 Fix link formatting in BUG-BOUNTY.md (#3097) 2026-05-12 17:19:10 -07:00
Daniel Salazar 69f87d4dcd fix: return code (#3096)
* fix: return code

* fix: http error
2026-05-12 16:54:00 -07:00
Daniel Salazar 7b0dd11f7f fix: dev accounts not showing (#3095) 2026-05-12 16:39:42 -07:00
Daniel Salazar 620934fbf4 fix: add user_agent to email signup (#3094) 2026-05-12 15:51:30 -07:00
Daniel Salazar 182fc723f1 expose hasDevAccountAccess at top level (#3093) 2026-05-12 13:56:00 -07:00
Daniel Salazar 5d3c5b6873 fix: whoami (#3092) 2026-05-12 13:44:02 -07:00
slashdevcorpseandCodex f20445bab7 Restrict cross-origin session-cookie auth (#3088)
* Restrict cross-origin cookie auth

Block the auth probe from using ambient session cookies when a browser Origin does not match the request Host. Explicit bearer, body, and x-api-key tokens continue to work for cross-origin SDK calls.

Co-authored-by: Codex <[email protected]>

* Normalize origin checks for cookie auth

Compare normalized origins for browser cookie authentication so default ports and protocol mismatches are handled consistently. Add coverage for default-port and protocol-mismatch cases.

Co-authored-by: Codex <[email protected]>

---------

Co-authored-by: Codex <[email protected]>
2026-05-12 13:40:25 -07:00
Nariman Jelveh 8ad1a58f98 Reorder OIDC Apple and Microsoft buttons 2026-05-12 13:35:18 -07:00
Daniel Salazar 17e475236a fix: mistral ai tests from renames (#3091) 2026-05-12 12:28:32 -07:00
Daniel Salazar b948eaaaa6 chore: update mistralAi providers (#3090) 2026-05-12 12:12:24 -07:00
Nariman Jelveh 9b0c034247 fix: correct xAI TTS pricing to $15.00/1M characters (#3089)
xAI's Voice pricing table lists Text to Speech at $15.00 / 1M characters,
but we were charging $4.20 / 1M characters (420 microcents/char), undercharging
by ~72%. Update the cost constant, listEngines pricing, and test expectation
to 1500 microcents/char.
2026-05-12 11:57:11 -07:00
Miika Kuisma b0dc9c7f1b Merge pull request #3086 from HeyPuter/puter-js-update-260512
PuterJS menubar web component improvements
2026-05-12 12:01:08 +03:00
Miika Kuisma e79abd43e3 PuterJS menubar web component improvements 2026-05-12 12:00:15 +03:00
Miika Kuisma 36c9c478ec Merge pull request #3073 from HeyPuter/puter-js-tests
Puter JS Web Component update
2026-05-12 09:56:58 +03:00
Daniel Salazar 90d01b87ea fix: potential fix for some linux distros (#3085) 2026-05-11 23:28:59 -07:00
Daniel Salazar b0823449bc fix: don't allow dav access control credentials (#3084) 2026-05-11 19:11:02 -07:00
ProgrammerIn-wonderland 760d5d346d add missing GPT 5.4 models (#3083) 2026-05-11 21:34:23 -04:00
Daniel Salazar 4e11d1dd0f fix: updaet deepseek models (#3082) 2026-05-11 18:01:35 -07:00
ProgrammerIn-wonderland 5e8c66142d ai image video fs output (#3079)
* Add puter_output_path

* Fix error reporting in puterjs. Add precheck for puterOutputPath

* add tests

* add tests

* frontend puterjs tests
2026-05-11 20:55:45 -04:00
Daniel Salazar f80016e4e6 feat: rate limit all ai requests (#3081)
* chore: cleanup types for metering

* fix: error responses

* wip: rate limit refactor

* rate-limit for some drivers

* fix: ai driver limits

* tests: rate limiting
2026-05-11 16:18:21 -07:00
Daniel Salazar c8fdbdf8c9 fix: self host mysql (#3080) 2026-05-11 15:36:16 -07:00
ProgrammerIn-wonderland a04267a4e3 Add login with microsoft (#3077) 2026-05-11 15:40:44 -04:00
Daniel Salazar 80a081d62a fix: sql migrations (#3078) 2026-05-11 12:29:56 -07:00
Daniel Salazar bb131c6690 fix: oss icons for new apps (#3076) 2026-05-11 10:52:52 -07:00
Daniel Salazar 4a4a131226 fix: add validation for bad username password input (#3075) 2026-05-11 10:35:12 -07:00
Daniel Salazar 26cff23af4 chore: cleanup types for metering (#3074)
* chore: cleanup types for metering

* fix: error responses
2026-05-11 08:58:13 -07:00
Miika Kuisma 189dae25ef remove hover effect from menubar shortcut labels 2026-05-11 17:58:23 +03:00
Miika Kuisma b2f4a86224 Hide keyboard shortcuts from mobile phone menubar 2026-05-11 11:47:10 +03:00
Miika Kuisma 122811eb7a Puter JS menubar web component now accepts shortcut attribute, improven submenu ux 2026-05-11 11:41:30 +03:00
Miika Kuisma bc98dacf65 Merge branch 'main' into puter-js-tests 2026-05-11 09:55:35 +03:00
Daniel Salazar f00445254d oss: add more apps into oss (#3072) 2026-05-10 22:38:47 -07:00
Daniel Salazar 6686e3a0d7 tests: add tests for SpeechToTextDriver (#3071)
closes #3001
2026-05-10 22:27:35 -07:00
ProgrammerIn-wonderland 5bcb425926 Add tests for Peer, WebDAV, Workers, and WISP. (#3070) 2026-05-10 21:44:30 -04:00
Nariman Jelveh b4e9fa7688 Add dark mode colors to dev console CTA 2026-05-10 17:43:06 -07:00
Daniel Salazar 594cbe03ef tests: big test push with lots of missing areas (#3067)
- Strengthen Broadcast tests
- strengthen oidc tests
- add middleware tests
- add extensions test
- add puter hosting tests
- add Chat Completion Driver tests
2026-05-10 15:06:48 -07:00
Daniel SalazarandClaude Opus 4.7 ec04afe0ad tests: add unit tests for XAITTSProvider (#3060)
Adds offline XAITTSProvider.test.ts covering voice/format selection,
request shape, error paths, and cost reporting. Spies on global fetch
(the provider's egress point) against a real PuterServer + live
MeteringService.

Closes #2998

Co-authored-by: Claude Opus 4.7 (1M context) <[email protected]>
2026-05-10 14:28:04 -07:00
Daniel SalazarandClaude Opus 4.7 539c928920 tests: add unit tests for ElevenLabsTTSProvider (#3066)
Adds offline ElevenLabsTTSProvider.test.ts covering voice/format
selection, request shape, error paths, and cost reporting. Spies on
global fetch (the provider's egress point) against a real PuterServer
+ live MeteringService. The companion integration test stays untouched.

Closes #2999

Co-authored-by: Claude Opus 4.7 (1M context) <[email protected]>
2026-05-10 14:27:55 -07:00
Daniel SalazarandClaude Opus 4.7 a470857d4e tests: add unit tests for OpenAITTSProvider (#3057)
Adds offline OpenAITTSProvider.test.ts covering voice/format selection,
request shape, error paths, and cost reporting. Mocks the OpenAI SDK at
the module boundary against a real PuterServer + live MeteringService.
The companion integration test stays untouched.

Closes #3000

Co-authored-by: Claude Opus 4.7 (1M context) <[email protected]>
2026-05-10 14:27:45 -07:00
Daniel SalazarandClaude Opus 4.7 dea40ca8be tests: add unit tests for TogetherVideoProvider (#3058)
Adds offline TogetherVideoProvider.test.ts covering parameter mapping
(togetherai: prefix stripping, seconds default vs no_extra_params,
width/height/fps/steps, reference_images / frame_images filtering),
polling for queued → in_progress → completed jobs (under fake timers),
failure / cancellation / missing-url error paths, and per-video
metering. Mocks together-ai at the module boundary against a real
PuterServer + live MeteringService.

Closes #2994

Co-authored-by: Claude Opus 4.7 (1M context) <[email protected]>
2026-05-10 14:27:37 -07:00
Daniel SalazarandClaude Opus 4.7 3d593f7cd7 tests: add unit tests for OpenAIVideoProvider (#3059)
Adds offline OpenAIVideoProvider.test.ts covering parameter mapping
(size and seconds snapping to allowed values, input_reference
forwarding), polling for queued/in_progress jobs (under fake timers),
sora-2-pro size tiers (xl/xxl per-second pricing), per-second metering
on default tier, failure handling, and error paths. Mocks the OpenAI
SDK at the module boundary against a real PuterServer + live
MeteringService.

Closes #2993

Co-authored-by: Claude Opus 4.7 (1M context) <[email protected]>
2026-05-10 14:27:30 -07:00
Daniel SalazarandClaude Opus 4.7 1d36811dd6 tests: add unit tests for GeminiTTSProvider (#3061)
Adds offline GeminiTTSProvider.test.ts covering voice/format selection,
request shape (transcript framing + speechConfig), error paths, and
cost reporting (token-priced input + output:audio batching, including
the PCM-to-WAV wrapping path). Mocks @google/genai at the module
boundary against a real PuterServer + live MeteringService.

Closes #2997

Co-authored-by: Claude Opus 4.7 (1M context) <[email protected]>
2026-05-10 14:27:21 -07:00
Daniel SalazarandClaude Opus 4.7 4d53faf5b6 tests: add unit tests for GeminiVideoProvider (#3065)
Adds offline GeminiVideoProvider.test.ts covering parameter mapping
(size → aspectRatio/resolution, isHighRes forcing 8s, reference_images
clamping to 3 with image/lastFrame suppression, data-URL parsing,
negative_prompt), polling the long-running operation (under fake
timers), tier-aware metering (default / :1080p / :4k suffixes),
content-filter handling, and error paths. Mocks @google/genai at the
module boundary against a real PuterServer + live MeteringService.

Closes #2992

Co-authored-by: Claude Opus 4.7 (1M context) <[email protected]>
2026-05-10 14:27:14 -07:00
Daniel SalazarandClaude Opus 4.7 c101fe74ab tests: add unit tests for TTSDriver (#3064)
Adds offline TTSDriver.test.ts covering provider selection/dispatch
(args.provider, legacy driverAlias via Context.driverName, registered
fallback), voice/format param validation, error mapping, and metering
propagation (provider failures must not bill). Mocks each provider's
SDK / fetch boundary against a real PuterServer wired with credentials
for every TTS provider.

Closes #2995

Co-authored-by: Claude Opus 4.7 (1M context) <[email protected]>
2026-05-10 14:27:08 -07:00
Daniel SalazarandClaude Opus 4.7 b4fad80a8c tests: add unit tests for AWSPollyTTSProvider (#3063)
Adds offline AWSPollyTTSProvider.test.ts covering voice/format
selection (caller-supplied, language-derived, default-per-engine
fallback), SSML handling (TextType=ssml routing), request shape to the
AWS SDK SynthesizeSpeechCommand, engine validation, error paths, and
cost reporting. Mocks @aws-sdk/client-polly at the module boundary
against a real PuterServer + live MeteringService.

Closes #2996

Co-authored-by: Claude Opus 4.7 (1M context) <[email protected]>
2026-05-10 14:27:02 -07:00
Daniel SalazarandClaude Opus 4.7 41e0049045 tests: add unit tests for VideoGenerationDriver (#3062)
Adds offline VideoGenerationDriver.test.ts covering provider
selection/dispatch (args.provider, model-id resolution across the
unified catalog, Context.driverName fallback), parameter validation
(seconds + dimension snapping to model.durationSeconds /
model.dimensions, string coercion), error mapping (provider
HttpErrors pass through, SDK errors don't bill), and metering
propagation (driver-level dispatch reaches the provider's
incrementUsage). Mocks each provider's SDK boundary against a real
PuterServer wired with credentials for every video provider.

Closes #2991

Co-authored-by: Claude Opus 4.7 (1M context) <[email protected]>
2026-05-10 14:26:56 -07:00
Daniel Salazar 4aaa09bb04 tests: more tests for drivers and perm service (#3056) 2026-05-10 13:46:52 -07:00
Daniel Salazar 3f2c45be26 cleanup: authcontroller with testable methods and tests (#3054)
* cleanup: authcontroller with testable methods and tests

* fix: types

Tested this on zenpacket, seems to all be working
2026-05-10 13:24:17 -07:00
jelveh f7202955ef Move TOS blurb and update copy 2026-05-09 19:08:17 -07:00
jelveh 07432b0967 Update UIWindowSignup.js 2026-05-09 19:00:42 -07:00
jelveh 065eeda72a Add 'Sign up with email' option for OIDC 2026-05-09 18:55:18 -07:00
jelveh 65ce9a67ef Include user-agent in OIDC payload 2026-05-09 15:50:40 -07:00
Nariman Jelveh 4996d7f37f Include user_agent in auth request data (#3053) 2026-05-09 09:25:57 -07:00
Daniel Salazar 86adf4ebc0 fix message at end of selfhost script (#3052) 2026-05-08 23:46:54 -07:00
Daniel Salazar 9a4a0ac9f1 tests: add unit tests for XAIImageProvider (#3045)
Mocks the OpenAI SDK at the module boundary, boots a real PuterServer
for the wired MeteringService, and exercises construction (xAI base
URL, missing-key throw), model catalog (default + verbatim list),
test_mode bypass, prompt validation, the credit gate (402 before SDK),
model resolution (alias and unknown-id fallback), and the success
path covering URL/b64_json branches plus per-image metering with the
expected microcent override.

closes #2988
2026-05-08 23:34:39 -07:00
Daniel Salazar 2543179ae7 tests: add unit tests for OpenAiImageProvider with mocked client (#3050)
Mocks the OpenAI SDK at the module boundary, boots a real PuterServer
for the wired MeteringService, and covers the three model families
the provider treats differently. Exercises construction, model catalog
(dall-e-2 default + verbatim list), test_mode bypass, prompt
validation, the credit gate (402 before SDK), DALL-E request shape
(allowedRatio snap, hd-only-on-DALL-E-3, per-size metering, url and
b64_json output), gpt-image-* token-priced metering (input + output
batched line items at the model rates), and the gpt-image-2 size
normalizer (pixel-budget snap to multiples of 16, 3:1 ratio clamp,
3840 edge cap).

closes #2990
2026-05-08 23:33:52 -07:00
Daniel Salazar 07a049c8ac tests: add unit tests for TogetherImageProvider (#3049)
Mocks the together-ai SDK at the module boundary, boots a real
PuterServer for the wired MeteringService, and exercises construction
(missing-key throw), model catalog (default + verbatim list), test_mode
bypass, prompt validation, the credit gate (402 before SDK), all three
pricing branches (per-MP × ratio, per-image, per-tier with resolution
map rewrite), request shape (togetherai: prefix stripping, dimension
snap to multiples of 8 with min 64, optional knob clamping/forwarding,
input_image → image_base64 aliasing), and output handling for both
url/b64_json branches plus the wrapped error message.

closes #2987
2026-05-08 23:33:46 -07:00
Daniel Salazar 0990fc2667 tests: add unit tests for ReplicateImageGenerationProvider (#3048)
Mocks the replicate SDK and util/secureHttp at the module boundary
(real network egress points), boots a real PuterServer for the wired
MeteringService. Covers construction (missing-key throw), model
catalog (flux-schnell default + verbatim list), test_mode bypass,
prompt validation, the credit gate (402 before SDK), per-image
billing (replicateId routing, aspect_ratio gcd formatting,
single-output metering, string vs array output extraction, missing
URL → 400), megapixel billing (run + output_mp batched components),
the param-aliasing/transform/filter machinery (drops disallowed
keys, renames steps→num_inference_steps + response_format→output_format,
injects go_fast=true default for flux-2-dev, appends ' MP' suffix to
flux-2-pro resolution), and the costs_go_fast pricing branch.

closes #2986
2026-05-08 23:33:39 -07:00
Daniel Salazar 98bb203c84 tests: add unit tests for GeminiImageProvider (#3047)
Mocks @google/genai at the module boundary, boots a real PuterServer
for the wired MeteringService, and covers both the generateContent
(Flash) and generateImages (Imagen) code paths. Exercises
construction (missing-key throw), model catalog (default + verbatim
list), test_mode bypass, prompt validation, the credit gate (402
before SDK), Flash request shape (aspect ratio, allowedRatio fallback,
inlineData → base64 data URL extraction), Flash 3-line metering
(input + output:text + output:image with the IMAGE-modality token
count), Imagen routing (generateImages, per-image metering,
empty-response and rai-filtered failure modes).

closes #2989
2026-05-08 23:33:34 -07:00
Daniel Salazar 0e82a0aed6 tests: add unit tests for ImageGenerationDriver (#3046)
Boots a real PuterServer with API keys for every image provider
configured (so the driver indexes them all), drives
server.drivers.aiImage directly, and mocks each provider SDK at the
module boundary so the driver's routing is exercised without real
network egress. Covers 401 without actor, 400 on unknown model,
catalog dedup + sort, list() and getReportedCosts shape, provider
routing (id-based, lowercased lookups, args.provider override,
Context.driverName fallback), ratio normalization (width/height and
aspect_ratio "w:h" forms), and the ai.log.image audit event firing
both before the upstream call and even when it fails.

closes #2984
2026-05-08 23:33:28 -07:00
Daniel Salazar 3dc9d521b4 tests: add unit tests for CloudflareImageProvider (#3051)
Boots a real PuterServer for the wired MeteringService, stubs global
fetch (the provider talks to the Cloudflare REST API directly with no
SDK). Covers construction, model catalog, test_mode bypass, prompt
validation, the credit gate (402 before fetch), request shape (JSON
body, account-scoped /ai/run/<model> endpoint, apiBaseUrl override,
multipart routing for requiresMultipart models, steps clamping
[1,50]), output extraction (binary image/* → base64 data URL, JSON
envelope image with output_format → MIME, http(s) URL passthrough,
success:false 400, non-2xx 400, missing image 400), and per-scheme
cost components (tile-plus-step and flux2-klein-9b-mp split).

closes #2985
2026-05-08 23:33:21 -07:00
Daniel Salazar 4dbbc7c7c9 tests: add unit tests for GroqAIProvider with mocked client (#3042)
Mocks the groq-sdk at the module boundary, boots a real PuterServer
for the wired MeteringService, and exercises construction, model
catalog/resolution, request shape (max_completion_tokens rename, tools
passthrough, content blanking when paired with tool_calls), non-stream
+ streaming output (including Groq's x_groq.usage envelope deviation),
error mapping, and moderation.

closes #2977
2026-05-08 23:06:23 -07:00
Daniel Salazar 31f22bc339 tests: add unit tests for ClaudeProvider with mocked Anthropic SDK (#3038)
Mocks @anthropic-ai/sdk at the module boundary, boots a real
PuterServer for the wired MeteringService/stores/FSService, and
exercises construction (long timeout for Opus 4.7 thinking), model
catalog/resolution, request shape (tool_choice locking, system message
extraction, OpenAI-shape tool_calls → Claude tool_use blocks, tool
role → user tool_result, opus-4.7 temperature drop, adaptive thinking
config, enabled budget thinking + temperature=1 for older Sonnet),
non-stream output (input/output/cache token metering), streaming via
the message_start/content_block_*/message_delta/message_stop event
graph for both text_delta and input_json_delta tool_use, and the
moderation throw.

closes #2958
2026-05-08 23:06:05 -07:00
Daniel Salazar 87f0294f73 tests: add unit tests for OpenAiChatCompletionsProvider (#3036)
Mocks the OpenAI SDK at the module boundary, boots a real PuterServer
for the wired MeteringService/stores/FSService, and exercises
construction, model catalog (responses_api_only filtering), argument
validation (messages-array gate, web_search routing — error when no
sibling, delegation when one is set), request shape (max_completion_
tokens rename, gpt-5 vs non-gpt-5 reasoning_effort/verbosity gating,
stream_options gating), non-stream + streaming output (cached-token
splitting), the moderations.create flagging branch (above and at the
0.8 threshold), and error mapping.

closes #2959
2026-05-08 23:04:55 -07:00
Daniel Salazar df9c55daf9 tests: add unit tests for OpenAiChatResponsesProvider (#3037)
Mocks the OpenAI SDK at the module boundary, boots a real PuterServer
for the wired MeteringService/stores/FSService, and exercises
construction, the responses_api_only-filtered model catalog (with
no_restrictions toggle), argument validation (messages-array gate),
request shape (input messages, max_output_tokens rename, function-tool
unraveling, Responses-only knobs, gpt-5 vs non-gpt-5 reasoning controls),
model resolution, non-stream output (output_text → message.content,
function_call items → tool_calls, empty-response 400 gate), streaming
(response.output_text.delta text events, response.completed usage,
response.output_item.done function_call → tool_use), moderation, and
error mapping.

closes #2960
2026-05-08 23:01:45 -07:00
Daniel Salazar 9246aff4e4 tests: add tests for VoiceChangerDriver (speech2speech) (#3039)
Boots a real PuterServer with an ElevenLabs apiKey configured, drives
server.drivers.aiSpeech2Speech, and stubs global fetch (the real
network egress for ElevenLabs). Covers getReportedCosts mirroring
costs.ts, argument validation (test_mode bypass, missing actor 401,
missing audio 400), the credit gate (402 before fetch), the success
path (POST URL with voice id, default + override voice/model, optional
knobs forwarded via FormData and search params, audio stream return
shape), per-second metering math, and error mapping when ElevenLabs
returns a non-2xx body.

closes #2963
2026-05-08 23:01:36 -07:00
Daniel Salazar 21c37e6d35 tests: add unit tests for DeepSeekProvider with mocked client (#3040)
Mocks the OpenAI SDK at the module boundary, boots a real PuterServer
for the wired MeteringService, and exercises construction, model
catalog/resolution, request shape (max_tokens, tools, stream_options,
DeepSeek's content-blanking and tool-result system-message workarounds),
non-stream + streaming output paths, error mapping, and moderation.

closes #2976
2026-05-08 23:01:28 -07:00
Daniel Salazar cbdad4a65e tests: add unit tests for TogetherAIProvider with mocked client (#3041)
Mocks the together-ai SDK at the module boundary, boots a real
PuterServer for the wired MeteringService, and clears the kv-cached
model list between tests. Covers construction, model catalog (kv
caching, embedding-type filtering, alias flattening, synthetic
model-fallback-test-1), request shape (togetherai: prefix stripping,
max_tokens omission, tools/stream_options gating), model resolution,
non-stream + streaming output (with input/output cost-key remap),
error mapping, and moderation.

closes #2981
2026-05-08 23:01:20 -07:00
Daniel Salazar 91ecf54746 tests: add unit tests for OpenRouterProvider with mocked client (#3043)
Mocks both the OpenAI SDK and axios at the module boundary, boots a
real PuterServer for the wired MeteringService, and clears the
kv-cached model list between tests. Covers construction (default and
custom apiBaseUrl), model catalog (axios fetch + kv caching, openrouter:
prefix on ids, openrouter/auto filtering), the openrouter/auto disallow
gate, request shape (prefix stripping, usage:{include:true}, stream
options, retry-without-max_tokens on context-length errors, rethrow on
unrelated errors), both cost-calculator branches (cost-bearing vs
per-token fallback) for non-stream and streaming, and moderation.

closes #2980
2026-05-08 23:01:12 -07:00
Daniel Salazar 4bcfe6c7f4 tests: add unit tests for GeminiChatProvider with mocked client (#3044)
Mocks the OpenAI SDK at the module boundary (Gemini speaks the
OpenAI-compat dialect at the v1beta/openai endpoint), boots a real
PuterServer for the wired MeteringService, and exercises construction,
model catalog/resolution, request shape (max_completion_tokens rename,
cache_control stripping, stream_options gating), non-stream + streaming
output (cached-token splitting in the metered usage shape), error
mapping, and moderation.

closes #2961
2026-05-08 23:01:08 -07:00
Daniel SalazarandClaude Opus 4.7 3ada6f1569 tests: XAIProvider uses setupTestServer + real metering:[#2982] (#3035)
Drops the local makeMeteringStub in favour of a live PuterServer-wired
MeteringService. The OpenAI SDK is still mocked at the module boundary
(the real network egress point); the mock now also exposes a default
export so the test server can boot every chat provider (some import
the default and read .OpenAI off it). Aligns with AGENTS.md: "Prefer
test server over mocking deps."

Co-authored-by: Claude Opus 4.7 (1M context) <[email protected]>
2026-05-08 19:21:52 -07:00
Daniel SalazarandClaude Opus 4.7 64402b01db tests: add tests for OCRDriver: [#2964] (#3028)
* tests: add tests for OCRDriver: [#2964]

Adds offline OCRDriver.test.ts covering both providers:

  • test_mode short-circuit; argument validation (missing actor, missing
    source, unknown provider, AWS/Mistral not configured)
  • aws-textract: raw-bytes vs S3Object source selection (regional
    client when fsEntry has a bucket), block normalisation (PAGE/WORD/
    TABLE filtered, LINE/LAYOUT_TITLE → text/textract:* blocks),
    402 on insufficient credits, per-page metering
  • mistral: image vs PDF chunk packaging (image_url with base64 data
    URL vs document_url with documentName), pass-through of pages /
    annotation / image-limit options, markdown → LINE-block
    normalisation with page indices, per-page metering, additional
    annotations metering when bbox/document annotation formats are set
  • default-provider selection (AWS preferred → Mistral fallback →
    500 when neither is configured)
  • getReportedCosts mirrors costs.ts

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>

* tests: OCRDriver uses setupTestServer + real fs/metering

Drops the manual config/clients/stores/services stub apparatus and
the loadFileInput mock in favour of the live wired driver from
server.drivers.aiOcr. The Textract and Mistral SDKs are still mocked
at the module boundary (the real network egress points); inputs go
through the real loadFileInput against real fs/store wiring (data
URLs for most cases; FSService.write produces a real fsEntry for the
PDF documentName test). Aligns with AGENTS.md: "Prefer test server
over mocking deps."

The S3Object-source/regional-client assertion was dropped because it
isn't deterministic against the in-memory S3 store and the driver's
per-region TextractClient cache leaks across tests. That branch is
better exercised by a real-cloud integration test.

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <[email protected]>
2026-05-08 19:15:57 -07:00
Daniel SalazarandClaude Opus 4.7 6226db73d4 tests: add unit tests for MoonshotProvider with mocked client: [#2979] (#3030)
* tests: add unit tests for MoonshotProvider with mocked client: [#2979]

Adds offline MoonshotProvider.test.ts covering construction, model
resolution and aliasing, request shape (hardcoded max_tokens=1000,
stream_options gating, tool_use → tool_calls hoisting), vision-model
image-inlining hook, non-stream and streaming output, error logging
and rethrow, and metering. Existing integration test is left
untouched.

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>

* tests: MoonshotProvider uses setupTestServer + real metering

Drops the local makeMeteringStub in favour of a live PuterServer-wired
MeteringService. The OpenAI SDK is still mocked at the module boundary
(the real network egress point); inlineHttpImageUrls is mocked because
verifying the provider invokes it for vision-capable models is the
unit's concern. Aligns with AGENTS.md: "Prefer test server over
mocking deps."

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <[email protected]>
2026-05-08 19:15:45 -07:00
Daniel SalazarandClaude Opus 4.7 6ab2a2a6cc tests: add unit tests for MistralAiProvider with mocked client: [#2978] (#3032)
* tests: add unit tests for MistralAiProvider with mocked client: [#2978]

Adds offline MistralAiProvider.test.ts covering construction, model
resolution and aliasing, request shape (camelCase maxTokens, tool_calls
→ toolCalls and tool_call_id → toolCallId rewrite, complete-vs-stream
routing), non-stream output with the camelCase usage coercion,
streaming with the chunk.data unwrap and toolCalls deviation, error
mapping, and metering. Existing integration test is left untouched.

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>

* tests: MistralAiProvider uses setupTestServer + real metering

Drops the local makeMeteringStub in favour of a live PuterServer-wired
MeteringService. The Mistral SDK is still mocked at the module
boundary (the real network egress point); everything else runs through
the real wired graph. Aligns with AGENTS.md: "Prefer test server over
mocking deps."

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <[email protected]>
2026-05-08 19:15:34 -07:00
Daniel SalazarandClaude Opus 4.7 ba03fd7965 tests: add unit tests for PuterAIController: [#2965] (#3031)
* tests: add unit tests for PuterAIController: [#2965]

Adds offline PuterAIController.test.ts with stubbed drivers covering:
route registration (paths and per-route auth options), app-actor
gating across all four chat-proxy routes, body validation (messages
must be an array; openaiCompletions prompt must be a string;
openaiResponses provider must be openai-responses), driver delegation
and request shaping (model + messages + provider defaults), response
shaping for OpenAI chat-completion / text-completion / Responses
envelopes and Anthropic message envelope (text + tool_use blocks),
SSE streaming with [DONE] terminator, model-listing endpoints with
hidden-id filtering and 501 when list() is unavailable, and the
HMAC-gated video proxy's input/expiry/secret guards.

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>

* tests: PuterAIController uses setupTestServer + spy on aiChat.complete

Drops the manual driver/controller stub apparatus (makeStubDriver,
makeController, custom dep builders) in favour of the live wired
controller from server.controllers.puterAi. Each test that needs a
canned chat completion result spies on server.drivers.aiChat.complete,
which keeps the unit-of-test focused on the controller (validation,
response shape, SSE streaming) without dragging in chat-driver model
resolution and credit checks. Aligns with AGENTS.md: "Prefer test
server over mocking deps."

The "500 when URL signature secret missing" assertion was dropped —
the default config wires a secret, so the branch is unreachable in
the live test server. Replaced with the equivalent 403-on-invalid-
signature assertion which actually exercises the HMAC gate.

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <[email protected]>
2026-05-08 19:15:23 -07:00
Daniel SalazarandClaude Opus 4.7 1c188d6325 tests: add unit tests for ZAIProvider with mocked client: [#2983] (#3029)
* tests: add unit tests for ZAIProvider with mocked client: [#2983]

Adds offline ZAIProvider.test.ts covering construction, model
resolution and aliasing, GLM-specific request shape (custom params,
cache_control stripping, user_id derivation, stream_options gating),
non-stream output with reasoning_content normalisation, streaming
deltas (text and tool_use), error mapping, and metering. Existing
integration test is left untouched.

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>

* tests: ZAIProvider uses setupTestServer + real metering

Drops the local makeMeteringStub in favour of a live PuterServer-wired
MeteringService. The OpenAI SDK is still mocked at the module boundary
(the real network egress point); everything else — config, Context,
metering recording — runs through the real wired graph. Aligns with
AGENTS.md: "Prefer test server over mocking deps."

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <[email protected]>
2026-05-08 19:14:15 -07:00
ProgrammerIn-wonderland 8b1226aa1b OIDC referrer (#3034)
* oidc referrer

* optionally infer referrer from window.openerOrigin

* infer referrer from openerOrigin if there

* add log in signupCb

* remove excess logs

* remove FSEntry.js
2026-05-08 22:05:09 -04:00
Daniel Salazar 2c1d320bba ci: push to dockerhub too (#3033) 2026-05-08 17:36:21 -07:00
Daniel Salazar b6414442dd fix: contributing (#3027) 2026-05-08 16:58:05 -07:00
Daniel Salazar f5470f123f tests: add tests for xaiProvider: [#2982] (#3026) 2026-05-08 16:09:25 -07:00
Nariman Jelveh ea9a44c9ad Implement inline 2FA UI, remove old components (#3025)
* Implement inline 2FA UI, remove old components

* Re-enable login button on window close
2026-05-08 15:59:40 -07:00
jelveh 881ee90e76 Remove stray fullscreen hint from translations 2026-05-08 15:16:47 -07:00
jelveh fbb570fb36 Reapply "Remove toolbar clock feature (#3024)"
This reverts commit e781b60bcb.
2026-05-08 15:15:03 -07:00
jelveh e781b60bcb Revert "Remove toolbar clock feature (#3024)"
This reverts commit 78a071ae54.
2026-05-08 15:11:55 -07:00
Nariman Jelveh 78a071ae54 Remove toolbar clock feature (#3024) 2026-05-08 15:08:15 -07:00
Daniel Salazar 9bcd77c85b chore: add legacy codes back to all errors (#3022) 2026-05-08 13:51:55 -07:00
Daniel Salazar 960bbb6965 doc: code architecture doc + contributing guide for backend (#2953)
* architecture doc

* agents and contributor md guides

* fix: userStore
2026-05-08 13:51:41 -07:00
Nariman Jelveh 46a56e474b README edit (#3012)
* Add 'For Users' and 'For Developers' sections

* Update README.md

* Update README.md

* Update README.md
2026-05-08 13:30:33 -07:00
Reynaldi Chernando 666b60bd29 Use GA version of gemini 3.1 flash lite (#3013)
* Use GA version of gemini 3.1 flash lite

* add model name alias
2026-05-08 13:51:56 -04:00
Daniel Salazar 63f128457e remove driver usage endpoint (#3017) 2026-05-08 10:18:26 -07:00
Daniel Salazar 5e8e9a852d test: add unit tests for ai-chat utils (#3016)
Covers `Messages` (normalize_single_message / normalize_messages /
extract_and_remove_system_messages / extract_text), `FunctionCalling`
(normalize_json_schema / normalize_tools_object /
make_openai_tools / make_claude_tools), and `Streaming`
(AIChatStream / AIChatMessageStream / AIChatTextStream /
AIChatToolUseStream). All three are pure data transforms — Streaming
is exercised against a real `AIChatStream` wired to a buffering
Writable, so no method-level spies are needed.

Closes #2956
2026-05-08 10:17:46 -07:00
Daniel Salazar 3166ad933c test: add unit tests for OpenAIUtil shape normalization (#3015)
Covers the Puter↔OpenAI shape conversion (`process_input_messages`,
`process_input_messages_responses_api`), usage extraction
(`extractMeteredUsage`, `create_usage_calculator`), the streaming
handlers (`create_chat_stream_handler` and the responses-API variant),
and the non-stream `handle_completion_output[_responses_api]` paths
including moderation, missing-content, and per-provider deviations.
Streaming is exercised via a real `AIChatStream` wired to a buffering
Writable so no method-level spies are needed.

Closes #2955
2026-05-08 10:17:42 -07:00
Reynaldi Chernando 7e5f64e04b Fix minor typo for tls cert in self hosting docs (#3014) 2026-05-08 09:23:06 -07:00
jelveh 908c02fd99 fix ASCII art for PUTER.JS 2026-05-08 08:04:21 -07:00
jelveh 38fcc6d6bd Detect fullpage apps early and skip desktop load 2026-05-07 22:17:27 -07:00
Daniel Salazar 16652347c6 test: add tests for HomepageController (#3010)
Covers the early-return guard when the homepage service is unwired,
shell rendering at /, /settings, /dashboard, /action, /@:username,
canonical_url + meta inheritance from gui_params, /app/:name (404 +
shell, embedded app metadata, JSON / object metadata, malformed JSON),
and /show/* launching the explorer with the trimmed path.

Closes #2973
2026-05-07 21:41:16 -07:00
Daniel Salazar 5f28b988ec test: add tests for SystemController (#3009)
Covers /healthcheck (live status, 503 on failure, fallback when service
unavailable), /version (semver parsing, env defaults), /contactUs
(validation, persistence, email best-effort, default support address),
/whoarewe, /lsmod (interface grouping + driverName fallback), and the
prepareShutdown drain-flag flip.

Closes #2971
2026-05-07 21:40:27 -07:00
Daniel Salazar 160631b158 test: add tests for OIDCController (#3008)
Covers the provider listing route, the auth-start redirect (404 / 400 /
500 / 302), all three callback flows (login / signup / revalidate)
including state validation, suspended accounts, unconfirmed-email
linking refusal, redirect_uri origin clamping, and the
revalidate-done landing page. Routes are collected via PuterRouter and
invoked with stubbed services that return prefab data.

Closes #2966
2026-05-07 21:38:47 -07:00
Daniel Salazar 3ab9923f0c fix: ai provider integration tests (#3011)
* fix: ai provider integration tests

* change name for ai test
2026-05-07 21:38:40 -07:00
Daniel Salazar cc799e069f test: add unit tests for fileInput driver utility (#3007)
Covers `loadFileInput` (validation, data-URL decoding, FS-path resolution,
maxBytes enforcement, ACL gating) and `inferFilenameFromUrlOrPath`. Stubs
stores/fsService with prefab data so tests don't require a real server.

Closes #2957
2026-05-07 21:38:27 -07:00
Daniel Salazar 9a7d3bac5f test: add tests for DesktopController (#3006)
Covers /set-desktop-bg (partial updates, null clearing, type validation),
/update-taskbar-items (JSON serialization), /set_layout (layout
allowlist, ownership gate, path/uuid resolution), and /set_sort_by
(sort_by/sort_order allowlists, default ordering). Routes are
collected via PuterRouter and driven with stub stores returning
prefab fsentry rows.

Closes #2970
2026-05-07 21:37:34 -07:00
Daniel Salazar 0a9a4f629d test: add tests for StaticPagesController (#3005)
Covers /robots.txt (bot disallow + sitemap), /sitemap.xml (docs +
approved-listing apps), /unsubscribe (missing/invalid uuid, idempotent
re-runs), and /confirm-email-by-token (token mismatch, already-confirmed
short-circuit, duplicate-email rejection, success path with verified-
group promotion + best-effort side channels). Stub stores hold prefab
user rows; the DB stub returns canned EXISTS / SELECT results.

Closes #2975
2026-05-07 21:36:50 -07:00
Daniel Salazar 32c2c0c1a5 test: add tests for AppController (#3004)
Covers /apps, /apps/nameAvailable, /rao, /apps/:name (single + batch),
/query/app (max-entries cap, marketplace shape, hidden-app gating), and
/app-icon (default fallback, data-URL decoding, MIME allowlist, CDN
redirect). Routes are collected via PuterRouter; AppDriver is injected
through the shared `driversContainers` registry, and stub stores return
prefab app rows.

Closes #2969
2026-05-07 21:35:49 -07:00
Daniel Salazar 508d652194 test: add tests for StaticAssetsController (#3003)
Covers each config-gated branch (client_libs_root, puterjs_root,
gui_assets_root, builtin_apps) using real temp directories so the
existsSync checks see real files instead of mocked module behavior.
Asserts both registration outcomes (which routes appear, on which
subdomains) and the file resolution rules for the puter.js / puter.dev.js
fallback.

Closes #2974
2026-05-07 21:35:17 -07:00
jelveh 471ba94ba2 Update index.js 2026-05-07 20:04:43 -07:00
jelveh 66e24a07d4 Update console banner and messaging 2026-05-07 19:49:01 -07:00
jelveh 5ffac54c86 experimental cute CTA 2026-05-07 19:39:06 -07:00
ProgrammerIn-wonderland c5b12b61d9 Unconditionally send Access-Control-Allow-Private-Network, fix LNA fix in GUI (#2954) 2026-05-07 16:38:04 -07:00
Daniel Salazar 8d5e9ef9cf fix: types for open ai driver (#2950)
* fix: types for open ai driver

* fix: add extra time to tests

* fix: test

* fix: together ai tests

* fix: tests
2026-05-07 14:48:47 -07:00
Daniel Salazar 25fe9a3cdf fix: add coverage reports for changes (#2949)
* tests: ai integraton tests

* fix: add coverage reports for this too
2026-05-07 13:55:09 -07:00
Daniel Salazar 05425d20a7 chore: cleanup types for tests (#2948) 2026-05-07 13:40:58 -07:00
Nariman Jelveh ff10e47d67 Show fullscreen overlay when signup is blocked (#2947) 2026-05-07 11:37:23 -07:00
Daniel Salazar 6c19dfbafd fix: linux build (#2946) 2026-05-07 11:23:10 -07:00
Nariman Jelveh 360cbf48af feat: support code in puter.signup.validate error responses (#2945)
Extensions listening on the `puter.signup.validate` event can now set a
`code` field (in addition to `message`) when blocking signups. The code
is forwarded through HttpError and appears in the JSON error response,
giving clients a stable, machine-readable signal to act on.

Covers both the AuthController (password signup) and OIDCService paths.
Adds tests for the new field.
2026-05-07 10:11:08 -07:00
Daniel Salazar bbe93defe9 tests: add some more driver tests (#2944) 2026-05-07 10:04:39 -07:00
Reynaldi Chernando 5e01c13b31 Fix duplicate textract result (#2943) 2026-05-07 09:15:28 -07:00
Daniel Salazar 4b37f35803 test: tests for fs endpoints (#2942) 2026-05-06 22:55:53 -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
Nariman Jelveh e35260924e Scope .myapps-search to input and tweak UI styles 2026-05-06 17:59:54 -07:00
Nariman Jelveh 90aad8918c Support light/dark sidebar logo 2026-05-06 17:54:37 -07:00
Nariman Jelveh 46974beba1 Replace gradients with flat colors in system buttons 2026-05-06 17:47:45 -07:00
Shruc 5e9dc33be1 expose costs in ai chat response (#2921)
* expose costs

* microcents
2026-05-06 15:59:16 -07:00
Daniel Salazar 1e271f188e fix: bring back old app names functionality and fix build (#2937) 2026-05-06 15:48:25 -07:00
jelveh f333597754 Update IPC.js 2026-05-06 15:40:38 -07:00
jelveh 3b33d16356 Merge branch 'main' of https://github.com/HeyPuter/puter 2026-05-06 15:33:21 -07:00
jelveh 2289d61d3c Update UIPrompt.js 2026-05-06 15:33:13 -07:00
Daniel Salazar 8e02f38bad fix: templates (#2936) 2026-05-06 15:31:41 -07:00
angelinazzz1809 5b65a6bc78 Update UIPrompt.js (#2930)
In the app environment, the prompt input was initialized using `options.value`, so `defaultValue` was not reflected.

This change ensures that `defaultValue` is used when provided, while keeping backward compatibility with `options.value`.
2026-05-06 15:27:28 -07:00
ProgrammerIn-wonderland 872d2c01d4 Add support for log in with Apple (#2935)
* Add experimental login with Apple support

* Fix revalidate URL

* Fix OIDC provider revalidate in whoami as well
2026-05-06 16:47:24 -04:00
jelveh b7f199ddbc Normalize string options to object 2026-05-06 11:59:28 -07:00
jelveh 906c00af97 Support options.defaultColor in color picker 2026-05-06 11:48:47 -07:00
Shruc f00d52f879 per model allowed params on replicate image, normalize ratio (#2898)
* replicate allowed params, normalize ratio

* update docs
2026-05-06 14:16:30 -04:00
Devendra Reddy Pennabadianddevareddy05 7a1a885e89 fix: inline http(s) image URLs for Moonshot vision models (#2929) (#2931)
Co-authored-by: devareddy05 <[email protected]>
2026-05-06 13:53:52 -04:00
Daniel Salazar ff8c275317 chore: package-lock.json (#2934) 2026-05-06 10:52:22 -07:00
Devendra Reddy Pennabadianddevareddy05 b3bf979cac fix: support defaultValue in showColorPicker app env (#2895) (#2932)
Co-authored-by: devareddy05 <[email protected]>
2026-05-06 10:46:32 -07:00
Reynaldi Chernando eb9e316ed5 Update Z.AI vision model id to z-ai/z-ai for consistency (#2928) 2026-05-06 02:41:04 -04:00
Daniel Salazar 224ea5f7f8 fix: extensions (#2926) 2026-05-05 20:55:53 -07:00
Daniel Salazar c1dacab4c2 extension events after boot fixes (#2925) 2026-05-05 17:42:55 -07:00
Daniel Salazar 8d0b8d4905 fix: app errors (#2924) 2026-05-05 17:20:31 -07:00
jelveh e7190f442e Update README.md 2026-05-05 16:49:01 -07:00
Nariman Jelveh 95e1b7d171 New README.md (#2915)
* Update README branding, screenshot, and links

* Update README: rephrase intro and add goals

* Update README.md

* Update README.md

* Rename self-hosting docs and add Windows installer

* Update self-hosting headings and README link

* Update README.md

* Update README.md

* Update README.md
2026-05-05 16:35:07 -07:00
Daniel Salazar f9ac017faf fix: fsEntry and tscofnig (#2923) 2026-05-05 16:18:09 -07:00
Daniel Salazar 4252b7f76f fix: email (#2922) 2026-05-05 15:21:15 -07:00
Daniel Salazar 58a7459e45 fix: broken apps in self hosted (#2920) 2026-05-05 12:45:17 -07:00
ProgrammerIn-wonderland 5dd601a90b add back web input into OCR (#2919) 2026-05-05 14:44:54 -04:00
Daniel Salazar 50fe867e0d fix: fs issues [PUT-846] (#2918)
* fix: fs issues

* windows install script
2026-05-05 10:49:04 -07:00
Daniel Salazar 98bdaf0c42 add email into metering alert (#2917) 2026-05-05 10:18:45 -07:00
Nariman JelvehandClaude Opus 4.6 1f1149e32e Block unconfirmed users from API endpoints server-side (#2916)
Add a default-on email confirmation gate that rejects users with
`requires_email_confirmation && !email_confirmed` on all authenticated
routes, returning 403 with `email_confirmation_required`.

Previously this was only enforced client-side via a GUI modal, meaning
direct API calls could bypass the check entirely.

Essential routes are exempted via `allowUnconfirmed: true`:
  `/whoami`, `/logout`, `/send-confirm-email`, `/confirm-email`,
  `/save_account`, `/get-anticsrf-token`, `/get-gui-token`,
  `/session/sync-cookie`, `/auth/revoke-session`,
  `/user-protected/delete-own-user`

No impact on temp users (`requires_email_confirmation` is false),
self-hosted deployments without email (flag is never set), or
unauthenticated routes (login, signup, password recovery, OIDC).

Co-authored-by: Claude Opus 4.6 <[email protected]>
2026-05-05 10:08:50 -07:00
jelveh 51b81c82bf Update keyboard.js 2026-05-05 06:24:49 -07:00
Daniel Salazar 15201b7a3c fix: nginx missing in self host script (#2911) 2026-05-05 00:42:54 -07:00
Daniel Salazar ad3f0f6c2e fix: handle fs duplicates on write (#2910) 2026-05-05 00:33:55 -07:00
Daniel Salazar 838d6a7178 docker-compose from index (#2909) 2026-05-05 00:22:25 -07:00
Daniel Salazar a5cb484e52 cleanup config (#2908) 2026-05-04 23:12:34 -07:00
jelveh 3a252fb948 Rename moonshot provider key to moonshotai 2026-05-04 21:43:31 -07:00
jelveh 69365cbae4 Standardize Moonshot provider ID to moonshotai 2026-05-04 21:40:38 -07:00
jelveh 2f1b9aad06 Update UIDesktop.js 2026-05-04 21:09:48 -07:00
jelveh 9e8371bde6 Update UIDesktop.js 2026-05-04 21:03:53 -07:00
Daniel Salazar 704fcecbdf fix: selfhosted thumbnails extensions (#2905) 2026-05-04 19:56:10 -07:00
jelveh 785d8b0cc5 Remove recovery warning block from 2FA setup 2026-05-04 19:45:52 -07:00
jelveh eaa68c243a Remove fullscreen button and handlers 2026-05-04 18:56:51 -07:00
Daniel Salazar a24246bfbc selfhosting: p3 cleanup docs + small fixes again (#2904)
* fix: Perms and configs

* rm broken editor for now

* selfhosting cleanup
2026-05-04 18:47:37 -07:00
Daniel SalazarandCopilot 50679e6a01 selfhosting: p2 fixed default configs and guide + some other errors (#2903)
* fix: ollama support

* fix: more self host cleanup

* fix: bad auth

* fix: more session cookie stuff

* allow emailclient

Co-authored-by: Copilot <[email protected]>

* fix: broken migration

* fix: full-stack comment

* fix: hardcoded perms

* new docker build steps

---------

Co-authored-by: Copilot <[email protected]>
2026-05-04 18:14:23 -07:00
jelveh d8cc884f01 Revamp 2FA setup UI with new wizard 2026-05-04 17:49:38 -07:00
jelveh 6a534b8479 Add pending state for 2FA toggle 2026-05-04 17:13:23 -07:00
jelveh 4048dfbaf1 Remove 'Show Desktop' toolbar button 2026-05-04 16:26:59 -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 8642a5b58c fix: subdomain cache invalidaton (#2901) 2026-05-04 15:17:20 -07:00
Nariman Jelveh 36de2b9aa4 Remove settings UI & service; redirect to dashboard (#2900) 2026-05-04 14:11:56 -07:00
jelveh c6bacca7f6 Open dashboard in new tab from UI clicks 2026-05-04 12:26:39 -07:00
Reynaldi Chernando da0255a805 Update UI docs and types (#2854) 2026-05-04 14:43:24 +07:00
jelveh dee193502f Add txt2speech.listEngines and listVoices docs 2026-05-03 22:12:49 -07:00
jelveh b9458497fb Update package-lock.json 2026-05-03 19:17:44 -07:00
jelveh 52d2c8574f Update build.js 2026-05-03 18:53:37 -07:00
jelveh 3da16e98e3 Produce llms.txt and llms-full.txt outputs for docs 2026-05-03 18:48:29 -07:00
Nariman Jelveh 85336f3c0e Add Moonshot AI (Kimi) chat completion provider (#2893) 2026-05-03 15:15:41 -07:00
jelveh 9720516185 Bump puter.js version to 2.3.2 2026-05-03 11:38:40 -07:00
jelveh 2a0efcff87 Bump puter.js version and update homepage 2026-05-03 11:34:11 -07:00
jelveh f9143a05c2 Add Gemini/xAI TTS and xAI STT examples 2026-05-03 11:24:38 -07:00
Nariman Jelveh bd30cda4a9 Add xAI (Grok) TTS and STT providers and integrate client/docs (#2890)
- Add XAITTSProvider calling POST /v1/tts with 5 voices (eve, ara, rex,
    sal, leo), speech tags, and configurable output format
  - Add XAISpeechToTextDriver calling POST /v1/stt with support for
    diarization, multichannel, text formatting, and xAI's native URL
    param for remote audio files
  - Register both providers in TTSDriver and driver index using existing
    xAI API key from config
  - Update puter.js client to route provider:'xai' for both txt2speech
    and speech2txt, including listVoices/listEngines
  - Add TypeScript types for new STT options (provider, format, diarize,
    multichannel, etc.)
  - Update txt2speech.md and speech2txt.md with xAI options and examples
  - Add playground examples for both TTS and STT

  Cost metering:
    TTS: 420 microcents/char ($4.20/1M chars)
    STT: 2778 microcents/sec ($0.10/hr)
2026-05-03 11:00:31 -07:00
Nariman Jelveh 33d5c0737e Add Gemini TTS provider and integrate client/docs (#2889)
Introduce a new Gemini TTS provider and wire it through the driver, client, docs, and examples. Adds src/backend/drivers/ai-tts/providers/gemini/GeminiTTSProvider.ts (Google GenAI client usage, PCM->WAV wrapping, metering, model/voice validation) and a costs table in providers/gemini/costs.ts. Registers the provider in TTSDriver, exposes the alias gemini-tts, and prefers it in provider selection. Updates puter-js client to recognize "gemini" provider/engine and route driver calls to gemini-tts. Documentation updated with Gemini options, a usage example, and a playground example HTML file.
2026-05-03 09:33:50 -07:00
Daniel Salazar cb27fd1f98 Revert "Revert "remove exports (#2885)" (#2887)" (#2888)
This reverts commit 14cde26291.
2026-05-02 10:20:01 -07:00
Nariman Jelveh d4ef956660 Remove RecoveryCodeEntryView and inline UI 2026-05-02 10:14:27 -07:00
Nariman Jelveh 789c62ef71 Remove RecoveryCodesView and inline in 2FA setup 2026-05-02 09:55:12 -07:00
Nariman Jelveh b2a70a6a38 Remove ConfirmationsView and inline checkboxes 2026-05-02 09:52:09 -07:00
Nariman Jelveh dd9607b54e Remove StepHeading component and inline headings 2026-05-02 09:46:44 -07:00
Daniel Salazar 14cde26291 Revert "remove exports (#2885)" (#2887)
This reverts commit 4e94cb07be.
2026-05-02 09:41:42 -07:00
jelveh 388577a799 Update style.css 2026-05-02 08:30:27 -07:00
jelveh d0310ac211 Add Upgrade/Manage Plan button to Usage tab 2026-05-02 08:28:46 -07:00
jelveh 99babf3879 Remove System Information window 2026-05-02 08:03:05 -07:00
jelveh ffae2a1d0a Remove PuterDialog and ExportRegistrantService 2026-05-02 07:58:12 -07:00
jelveh ce69bc14a8 Remove groups manager UI extension 2026-05-02 07:53:38 -07:00
Daniel Salazar 4e94cb07be remove exports (#2885) 2026-05-01 23:52:52 -07:00
jelveh 4395c8bea5 Handle OIDC popup flow: skip session list 2026-05-01 23:49:35 -07:00
Daniel SalazarandCopilot 5b35a5db69 errors for fs (#2884)
* remove bloated tests and

* errors for fs

Co-authored-by: Copilot <[email protected]>

---------

Co-authored-by: Copilot <[email protected]>
2026-05-01 23:24:05 -07:00
jelveh c1ff8a3a9a Enable email confirmation code and style modal 2026-05-01 23:23:31 -07:00
jelveh c352dfe284 Send confirmation code and hide close button 2026-05-01 23:06:18 -07:00
jelveh 9f2ec29586 Prefer app upgrade prompt on storage errors 2026-05-01 21:07:49 -07:00
jelveh 63be2308d3 Show upgrade dialog on storage limit errors 2026-05-01 20:24:09 -07:00
jelveh e509f8ab46 Remove obsolete theme.css and its reference 2026-05-01 19:54:38 -07:00
jelveh b481753526 Remove obsolete GUI docs and .idx files 2026-05-01 19:46:20 -07:00
Daniel Salazar 1796fdb37b fix: misc fs issues (#2883)
* fix: deps

* fix: FS issues
2026-05-01 18:54:10 -07:00
jelveh 25f02378cb Update StaticPagesController.ts 2026-05-01 17:29:07 -07:00
jelveh e95e2f5187 Use full HTML template for static pages 2026-05-01 17:18:06 -07:00
jelveh 3f8365ad7e Add logout handler and disable modal dragging 2026-05-01 17:00:22 -07:00
ProgrammerIn-wonderland 8bd0d7c8c9 invalidate subdomains on delete (#2882) 2026-05-01 16:49:22 -07:00
Daniel SalazarandCopilot 2c261fc6c0 fix: extensions (#2881)
Co-authored-by: Copilot <[email protected]>
2026-05-01 16:36:15 -07:00
jelveh 0ffb7d3d1e Remove Amplify config; add nwsapi dep 2026-05-01 15:39:50 -07:00
jelveh 1305bf16e8 Add Amplify build config and update docs deps 2026-05-01 15:27:46 -07:00
jelveh d9cbdf3394 Update package.json 2026-05-01 15:00:40 -07:00
Daniel SalazarandCopilot a3b11de1a2 fix: better error codes + unlimited local credit (#2880)
* fix: better error codes

Co-authored-by: Copilot <[email protected]>

* fix: add in local unlimited metering again

Co-authored-by: Copilot <[email protected]>

---------

Co-authored-by: Copilot <[email protected]>
2026-05-01 14:43:13 -07:00
Nariman Jelveh cf3f943177 Delete license_header.txt (#2879) 2026-05-01 14:06:55 -07:00
Nariman Jelveh 267f464232 Add AGPL license headers to source files (#2877) 2026-05-01 13:50:42 -07:00
ProgrammerIn-wonderland b70aabdeae zai --> z-ai (#2878) 2026-05-01 13:39:25 -07:00
ProgrammerIn-wonderland 8936f79716 Ns/return better together video error (#2876)
* Return better together video error
2026-05-01 13:13:08 -07:00
ProgrammerIn-wonderland 968452a45e Add grok 4.3 (#2875) 2026-05-01 13:00:02 -07:00
jelveh 05c4b40497 Merge branch 'main' of https://github.com/HeyPuter/puter 2026-05-01 12:59:08 -07:00
Nariman Jelveh 60ea48dbaa Remove gross legacy tools and docs (#2873) 2026-05-01 12:58:36 -07:00
Nariman Jelveh 284ca86b7c Remove gross retarded legacy tools and docs (#2873)
* Remove gross retarded legacy tools and docs

* Remove tools scripts

* nuke the bs

* Remove contributor/self-hosting docs, update license

* Remove src/useapi package and update configs

* remove source map files

* Remove wiki submodule

* ok not everything is retarded, for example this one (v86) is cool but has to go for now

* Remove puter-wisp module

* Remove install.md

* Remove twisp submodule

* Remove epoxy-tls submodule

Remove the epoxy-tls submodule and its configuration: delete the gitlink at submodules/epoxy-tls and remove the corresponding entry from .gitmodules.
2026-05-01 12:32:41 -07:00
ProgrammerIn-wonderland 7cd762afa2 Add z.ai chat completions (#2874) 2026-05-01 12:23:23 -07:00
Daniel Salazar 1b39bd2a4a fix: app autocreation (#2872) 2026-05-01 09:03:42 -07:00
Daniel Salazar e8fbb88102 puter models list fix (#2869) 2026-05-01 01:41:56 -07:00
Daniel SalazarandCopilot f6e1f90225 fix: dbConfigs and ai routes (#2868)
* fix: db configs

Co-authored-by: Copilot <[email protected]>

* fix: ai routes

Co-authored-by: Copilot <[email protected]>

---------

Co-authored-by: Copilot <[email protected]>
2026-04-30 23:56:18 -07:00
Daniel SalazarandCopilot 0e53edafa3 fix: send right error codes (#2867)
Co-authored-by: Copilot <[email protected]>
2026-04-30 21:42:48 -07:00
Daniel Salazar 4a10124574 fix: oidc and chat validation events (#2866) 2026-04-30 21:05:07 -07:00
Nariman Jelveh d2555835c7 Remove email confirmation requirement in feedback 2026-04-30 21:04:39 -07:00
Nariman Jelveh 73d26e02b3 Only reset URL/title for owning windows 2026-04-30 20:54:17 -07:00
Daniel Salazar 48a85998ad fix: sync ips for validation (#2865)
* oidc email validate

* fix: sync ips for validation
2026-04-30 17:53:25 -07:00
Daniel Salazar 1a6b02999b fix: more clean ip (#2864) 2026-04-30 16:45:54 -07:00
Daniel Salazar 976f1de806 fix: event (#2863) 2026-04-30 16:37:27 -07:00
Daniel Salazar 1546e0e02f fix: auth checks (#2862)
* rename validate email

* fix: authService
2026-04-30 16:32:22 -07:00
ProgrammerIn-wonderland ce18b914b4 backport devwatcher (#2861) 2026-04-30 16:23:34 -07:00
Nariman Jelveh a54d6ceee5 Merge branch 'main' of https://github.com/HeyPuter/puter 2026-04-30 16:03:51 -07:00
Nariman Jelveh a32ac4e672 Add dynamic usage-bar colors and refine layout 2026-04-30 16:03:39 -07:00
Daniel SalazarandCopilot 93ed2068de fix: fail unauthed sessions nicely (#2860)
Co-authored-by: Copilot <[email protected]>
2026-04-30 16:01:23 -07:00
Daniel SalazarandCopilot 6b8152d3bc fix: cleanup some errors (#2859)
Co-authored-by: Copilot <[email protected]>
2026-04-30 15:10:19 -07:00
Daniel SalazarandCopilot eaa3d8c83c fix: no default gemini image quality (#2858)
Co-authored-by: Copilot <[email protected]>
2026-04-30 15:03:53 -07:00
Nariman Jelveh d772b557a0 Replace 2FA buttons with toggle switch 2026-04-30 15:01:06 -07:00
Nariman Jelveh 867d967b37 Use 'Current' badge and style active plan pill 2026-04-30 14:13:10 -07:00
Daniel SalazarandCopilot 56eef339a8 fix: ai driver errors (#2857)
Co-authored-by: Copilot <[email protected]>
2026-04-30 13:41:41 -07:00
Nariman Jelveh 15b93abe04 Set body overflow to hidden in dashboard CSS 2026-04-30 13:02:55 -07:00
Daniel Salazar 208abda841 fix: bad ai endpoint (#2856) 2026-04-30 12:38:39 -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) <[email protected]>

* 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) <[email protected]>

* 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 <[email protected]>

* 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 <[email protected]>

* 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 <[email protected]>

* fix: subdomainStore limit

* fix: missing path resolution

Co-authored-by: Copilot <[email protected]>

* fs fixes

* fix: undef error

* fix fs + cleanup

* fix: npm audit fixes

* heal path entries where missing

Co-authored-by: Copilot <[email protected]>

* fix: caching

Co-authored-by: Copilot <[email protected]>

* fix: cache inconsistencies

Co-authored-by: Copilot <[email protected]>

* fix: app driver metadata

Co-authored-by: Copilot <[email protected]>

* 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 <[email protected]>

* fix: oidc errors

Co-authored-by: Copilot <[email protected]>

* fix: PUT-797

* fix: legacy appdata_app

Co-authored-by: Copilot <[email protected]>

* fix: add alert logs

Co-authored-by: Copilot <[email protected]>

* 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 <[email protected]>

* fix: revalidate path for oidc

* fix: revalidate path for oidc

* fix: email validation

Co-authored-by: Copilot <[email protected]>

* fix: user create query

* fix: middleware extensions

Co-authored-by: Copilot <[email protected]>

* 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) <[email protected]>
Co-authored-by: ProgrammerIn-wonderland <[email protected]>
Co-authored-by: Copilot <[email protected]>
Co-authored-by: Nariman Jelveh <[email protected]>
Co-authored-by: velzie <[email protected]>
2026-04-30 12:13:43 -07:00
Miika Kuisma b593eb5630 Tests update 2026-04-29 16:45:09 +03:00
Daniel Salazar 255dde9e96 fix: oidc errors again (#2853) 2026-04-28 16:20:20 -07:00
Daniel Salazar 3b6ae2d06b fix: oidc errors (#2852) 2026-04-28 16:15:34 -07:00
Nariman Jelveh 4c096f2af7 Remove file sharing UI and related code (#2817)
RIP
.
.
.
for now!
2026-04-28 15:59:19 -07:00
jelveh 23f45532d6 Avoid stacking panels/invisible windows; reset URL 2026-04-28 12:49:51 -07:00
jelveh ce39c7f734 Sync profile picture updates across UI 2026-04-28 11:57:27 -07:00
jelveh 5e667e21f8 Refactor dashboard bento colors & welcome styles 2026-04-28 11:06:30 -07:00
jelveh 8297cbec99 Use i18n welcome text and adjust UI styles 2026-04-28 10:41:01 -07:00
jelveh a781776b38 Introduce bento theme and remove gradients 2026-04-28 10:05:58 -07:00
jelveh cc21a33a31 Make copy-token window responsive and closable 2026-04-28 09:57:14 -07:00
Nariman Jelveh d344d9e5a5 Remove dashboard window style override 2026-04-27 19:24:47 -07:00
Miika Kuisma aa5e398e8b Fixing issues with mobile contextMenu (#2848)
* Fixing issues with mobile contextMenu in puter env app where user couldn't tap on menu items and there was checkmark in wrong place

* context menu mobile version - handle submenus

* context menu mobile icon placement tweak
2026-04-27 12:18:04 -07:00
Nariman Jelveh 66fa5fd569 Flush cache after username change 2026-04-27 12:13:26 -07:00
Reynaldi Chernando acf84a7929 Update docs setMenubar (#2845) 2026-04-27 12:51:08 +07:00
jelveh d55c3c1637 Add UI playground examples and update docs 2026-04-26 19:23:12 -07:00
Miika Kuisma 5e9a0f0a70 Puter JS - Web Components for UI API (#2808)
* Web Components for Puter SDK UI API

* Rest of the components

* component docs

* Revert file and directory picker changes

* style matching with puter.com and support for custom styling

* item divider style tweak

* Puter JS - Web Components tweaking

* alert default image fix

* context menu mobile style fix

* Fix app iframe height when app is in fullpage mode and has puter-js menubar

* menubar web component tweak

* Action sheet behavior for contextmenu on mobile also in env app

* replace alert icons

* context menu and menubar keyboard navigation, submenu mouse navigation improvements

* package-lock

* Improve submenu mouse hovering
2026-04-26 19:02:11 -07:00
jelveh 3e21479f17 Add content background var; remove card shadow 2026-04-25 19:01:33 -07:00
jelveh bb08d5b53b Adjust myapps grid to 4 columns 2026-04-25 13:55:41 -07:00
jelveh 0905095bc8 Enforce 5-column myapps grid with responsive wrap 2026-04-25 13:51:29 -07:00
jelveh 8188d2b58b Increase myapps-grid gap to 30px 2026-04-25 13:43:59 -07:00
jelveh 67f14db74a Use anchor tags for dashboard sidebar items 2026-04-25 11:25:03 -07:00
jelveh 7f1c13183b Disable dialog dragging in TabHome 2026-04-25 11:19:13 -07:00
jelveh 2e2f85fea5 Hide horizontal overflow; move apps CSS 2026-04-25 11:17:47 -07:00
jelveh 50a0073fc8 Revert "Hide horizontal overflow in apps tab"
This reverts commit d3c4aa1cfd.
2026-04-25 11:13:36 -07:00
jelveh d3c4aa1cfd Hide horizontal overflow in apps tab 2026-04-25 11:12:52 -07:00
jelveh 0b3de54a37 Use pushState for dashboard tab hashes 2026-04-25 10:45:09 -07:00
shashank shubham 53291fb8c6 chore: improve validation error messages for clarity (#2833) 2026-04-25 08:33:56 -07:00
jelveh e8c566bf3d Update TabAccount.js 2026-04-25 08:14:01 -07:00
jelveh 5174f90ed4 Hide dialog header in account tab 2026-04-25 08:11:12 -07:00
jelveh 700854e3f5 Refactor auth token card markup, disable drag 2026-04-25 08:09:17 -07:00
jelveh 2449c3f385 Scroll dashboard content to top on change 2026-04-24 23:18:50 -07:00
jelveh 205a8bbbc5 Replace lodash _.replace and _.pullAll usage 2026-04-24 22:36:31 -07:00
jelveh 0ae3f4dcfa Remove lodash from GUI vendor lib lists 2026-04-24 22:23:17 -07:00
jelveh ba31f8e533 Make app search header sticky with blur 2026-04-24 22:16:41 -07:00
Nariman Jelveh 1cfdf79e05 GUI cleanup (#2842)
* Remove deprecated helper functions from helpers.js

* Remove Croppie library and references

* Remove bundled jQuery UI assets

* Remove vendored socket.io client files

* Remove lodash and replace with native utils

Replace common lodash usages with native JS alternatives: _.isEmpty -> null/empty checks via Object.keys, _.size -> Object.keys(...).length, _.uniqBy -> Map-based dedupe/spread. Remove bundled lodash file and its About/license entry. Updated files include UIDashboard.js, UIDesktop.js, UIWindow.js, launch_app.js, update_title_based_on_uploads.js, initgui.js, UITabAbout.js, and static-assets.js to reduce dependency and bundle size.
2026-04-24 21:52:47 -07:00
ProgrammerIn-wonderland cb7e5a475e add gpt 5.5-pro (#2843) 2026-04-25 00:34:29 -04:00
jelveh e1d082fc48 Remove getUsage helper in GUI 2026-04-24 21:16:12 -07:00
ProgrammerIn-wonderland 4e0ff1992c add gpt 5.5 (#2841) 2026-04-25 00:13:12 -04:00
Nariman Jelveh 231bfbd8a9 Replace QRCodeView with UIQRCode helper 2026-04-24 17:57:45 -07:00
Nariman Jelveh 1aa51b7371 Remove puter audio assets 2026-04-24 17:42:52 -07:00
Nariman Jelveh 57f296a6cb Remove def(UIAlert, 'ui.window.UIAlert') 2026-04-24 14:44:04 -07:00
Nariman Jelveh b78565a6fa Remove commented putility import 2026-04-24 14:07:03 -07:00
Nariman Jelveh 1b4308c624 Comment out putility import and def 2026-04-24 13:59:24 -07:00
Daniel Salazar 36bd60731b fix: AIChatService.ts (#2836) 2026-04-23 20:20:16 -07:00
Daniel Salazar 968831c729 Revert "fix: anticsrf to store tokens in redis (#2834)" (#2835)
This reverts commit 1a6009c00c.
2026-04-23 19:12:47 -07:00
Daniel Salazar 1a6009c00c fix: anticsrf to store tokens in redis (#2834)
* fix

* fix: anticsrf to store tokens in redis
2026-04-23 18:46:43 -07:00
Nariman Jelveh f22206fe5a Import and register putility in async init 2026-04-23 16:52:07 -07:00
Nariman Jelveh 4a37e44d38 remove putility dependence from GUI 2026-04-23 15:27:04 -07:00
Daniel Salazar b6776ab47e shrink redis failure (#2831) 2026-04-22 13:27:34 -07:00
Shruc f14f1bf49e add gpt image 2 (#2829)
* add gpt image 2

* index cost key

* docs + default low
2026-04-22 14:00:18 -04:00
jelveh b886dde3d6 Await DB write and add UID cache key
Make the DB update in AppES awaitable so the write completes before proceeding (avoids race conditions). Also add invalidation of the Redis object key for the app UID in AppInformationService to ensure cached entries keyed by uid are cleared after updates.
2026-04-21 19:32:19 -07:00
jelveh bdfa12b566 Add app object Redis cache and use in AppES 2026-04-21 18:52:17 -07:00
jelveh 6b3196ed0c Increase cached app TTL to 24 hours. Cause, where is your sense of adventure? 2026-04-21 17:41:35 -07:00
jelveh e9a80d0834 Update dashboard.css 2026-04-20 16:17:25 -07:00
Daniel Salazar 7f9873edd2 fix: cdn cache invalidation (#2826) 2026-04-20 11:59:35 -07:00
jelveh 4de724c996 Update UIItem.js 2026-04-19 21:41:24 -07:00
jelveh 7bb27ffbb4 fix #2803 2026-04-19 21:40:14 -07:00
jelveh 4c578acce2 Update dashboard.css 2026-04-19 20:14:22 -07:00
jelveh a3fd275783 Remove Beta badge from dashboard sidebar 2026-04-19 19:56:29 -07:00
jelveh 2a1f0da04b Add bottom padding to .myapps-container 2026-04-19 19:50:43 -07:00
jelveh 1260bd506b Pass parent to context menu; keep icon scaled 2026-04-19 19:44:41 -07:00
jelveh d66b70e05e Request 128px icons and prefer iconUrl 2026-04-19 19:34:00 -07:00
Shruc eaad07e002 adjust and refactor together models costs (#2811)
* adjust, refactor together costs

* aliases follow rule
2026-04-17 17:28:26 -04:00
jelveh f6c1991068 Remove referral UI and related logic 2026-04-17 12:25:29 -07:00
jelveh 4adf7b41b9 Remove Drivers docs and sidebar entry 2026-04-17 12:05:10 -07:00
jelveh b1a5c41028 Remove custom domain UI and Entri integration 2026-04-17 11:58:04 -07:00
Subhrabaran P b34f69512e fix: update knowledge date for Claude Opus 4.7 model (#2816) 2026-04-17 10:44:09 +07:00
Trevin Chow 4130fc4104 fix: close start menu popover on repeated click (#2784)
When the Start button is clicked while the popover is already open,
close it instead of doing nothing. This fixes the toggle behavior
on Android Chrome where the menu stays open on repeated taps.

The `.popover-launcher` removal triggers the UIPopover remove event
handler which automatically cleans up the `has-open-popover` class.

Fixes #1681
2026-04-16 09:44:00 -07:00
Shruc 6f54edbc76 add opus 4.7, adjust thinking (#2813) 2026-04-16 09:23:06 -07:00
Miika Kuismaandjelveh 2790879fc1 Dashboard Update (#2788)
* Consistent header with files

* custom order with draggable app icons

* mobile style tweak

* Drag apps to sidebar

* uninstall

* Add desktop switch button to home tab
Drag sidebar apps order

* Display app storage use in Usage tab

* Add context menu options to apps: open in new tab, open in window

* Sidebar apps section with taskbar/dock behavior

* add close button to sidebar app item

* prevent dashboard files items from being selected when dragging

* File contextmenu shows filename
Keep dashboard URL when opening items

* Fixed issue with mobile selecting

* sidebar toggling

* sidebar tooltips

* done!

* Files tab statusbar width fix

* Consistent header with files

* custom order with draggable app icons

* mobile style tweak

* Drag apps to sidebar

* uninstall

* Add desktop switch button to home tab
Drag sidebar apps order

* Display app storage use in Usage tab

* Add context menu options to apps: open in new tab, open in window

* Sidebar apps section with taskbar/dock behavior

* add close button to sidebar app item

* prevent dashboard files items from being selected when dragging

* File contextmenu shows filename
Keep dashboard URL when opening items

* Fixed issue with mobile selecting

* sidebar toggling

* sidebar tooltips

* done!

* Files tab statusbar width fix

* Remove desktop switch button from Home tab

* App uninstall fix

* mobile style tweaks for dashboard sidebar

* Usage tab header fixes

* style tweaks

* Disable Uninstall for certain system apps

* Use app title in uninstall modal

* Remove delete-data option from uninstall modal

* Update dashboard.css

* Update TabApps.js

---------

Co-authored-by: jelveh <[email protected]>
2026-04-15 19:46:25 -07:00
ProgrammerIn-wonderland 90a4970a03 remove glitched submodule (#2810) 2026-04-15 18:05:49 -04: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
ProgrammerIn-wonderland e863240ad9 Add WSL support for signed uploads (#2809) 2026-04-15 13:36:09 -04:00
ProgrammerIn-wonderland 389e11f33b Ns/simplify 2 (#2790)
* Remove mostly unused TechnicalError and featureflag. Fold Group into GroupService.

* move modutil to util

* remove unused public/assets

* Remove anomaly service, fold logic into groups

* remove unused modules

* Remove AnomalyService import from tests

* remove shutdownservice

* remove unused filetracker service

* [will break prod] remove Puter AI Module, inline to coremodue

* MariaDB compatibility
2026-04-15 12:03:51 -04:00
Shruc edf1736292 add gemini image models in .chat (#2771)
* add gemini image models in .chat

* update docs for gemini image .chat

* actually snake case

* fix multi-turn thoughtsignature
2026-04-10 17:33:52 -04:00
Daniel Salazar 7f7c01956e fix: origin app Ids (#2801) 2026-04-10 13:47:53 -07:00
Daniel Salazar 9c38c43f82 fix: app canonization for puter.com apps (#2800) 2026-04-10 13:00:59 -07:00
Shruc 18e909f1a3 fix veo video with proxy link (#2799) 2026-04-10 13:37:34 -04:00
Daniel Salazar 14f2da3206 cleanup: batcher to batch more appropriately (#2794) 2026-04-10 00:27:14 -07:00
Daniel Salazar 1cfe69faa1 fix: redis max retries and fail fast timeouts (#2793) 2026-04-09 14:08:35 -07:00
Reynaldi Chernando 72430a1939 Minor fix docs and update puter resource unit (#2792)
* Minor fix docs and update puter resource unit

* change to 1 cent -> 1 mio microcents
2026-04-09 15:13:49 +07:00
jelveh 481a1a1d90 Prevent redirect to /action/login after login 2026-04-08 18:47:04 -07:00
Daniel Salazar 9a6c414f9d fix: dynamodb health checks and client recreation (#2789) 2026-04-08 15:47:09 -07:00
Shruc 32be3a0a88 better error reports for chat fallbacks (#2783) 2026-04-08 17:47:02 -04:00
HemantandReynaldi Chernando 69bb7e4a38 Close #2718 : added querying with prefix patterns example and documentation (#2778)
* feat: add querying with prefix patterns example and documentation

* refine

---------

Co-authored-by: Reynaldi Chernando <[email protected]>
2026-04-08 13:49:00 +07:00
Subhrabaran P 8cc29724b2 fix: add showSpinner and hideSpinner to docs sidebar (#2779)
The pages existed but were missing from the sidebar navigation,
causing 404s when clicking their links under /UI/#additional-ui-elements.
2026-04-08 13:36:46 +07:00
jelveh adc28ac7e8 Delete structure.md 2026-04-07 17:06:56 -07:00
jelveh d03303a3b1 Delete batch-and-symlinks.md 2026-04-07 17:03:13 -07:00
jelveh 94c4fcb242 Remove backend drawio diagram 2026-04-07 16:58:49 -07:00
jelveh 9bbb3af0bb Remove filesystem API spec doc 2026-04-07 16:56:42 -07:00
Shruc dbf87753c5 derive aliases from puterid (#2777) 2026-04-07 19:55:59 -04:00
Daniel Salazar f21dd4160c delete command service files? (#2782) 2026-04-07 14:45:37 -07:00
Daniel Salazar 4f468dcda8 chore: delete remaining "command" service (#2781) 2026-04-07 14:00:32 -07:00
ProgrammerIn-wonderland c1da2c3aaa Fix openrouter enumeration (#2780) 2026-04-07 16:54:42 -04:00
jelveh 81a0d721eb Remove alpha notice from Peer docs
Remove the alpha notice banner and spacer from Peer documentation pages (Peer.md, connect.md, ensureTurnRelays.md, connect.md, serve.md). This updates the docs to stop advertising the Peer API as alpha and cleans up redundant banner markup.
2026-04-06 15:09:39 -07:00
Daniel Salazar 2368b2bc8f fix: missing subdomains and worker flags in readdir (#2772) 2026-04-06 11:08:03 -07:00
ProgrammerIn-wonderland 649db33763 Ns/simplify 1 (#2764)
* Rid devconsole

* lots of removals

* more commandservice
2026-04-06 14:05:48 -04:00
jelveh b0bd8a12a7 Replace inline Google SVG with WebP image 2026-04-05 17:34:51 -07:00
jelveh f867519a1c Use root URL as default signup redirect
When reload_on_success is set, use '/' as the fallback redirect URL instead of the current page (window.location.href). This prevents redirecting back to the signup page after a successful signup while preserving any explicit options.redirect_url value.
2026-04-05 16:59:25 -07:00
jelveh 2dd991700e Make esbuild platform dep optional; update lock
Move @esbuild/linux-x64 from dependencies to optionalDependencies in src/docs/package.json so the platform-specific esbuild binary is treated as optional. Update package-lock.json to reflect that change (adds platform-specific @esbuild entries, marks various packages as peer/optional, bumps @emnapi/wasi-threads to 1.2.1 and removes obsolete @emnapi core/runtime entries).
2026-04-05 15:32:06 -07:00
jelveh 67d941a7af Add @esbuild/linux-x64 dependency 2026-04-05 11:56:06 -07:00
jelveh 5840348dec Move esbuild entry in docs package.json to dependencies rather than devdependencies 2026-04-05 11:48:09 -07:00
Daniel Salazar 5319940156 fix: app id shortcut batch (#2768) 2026-04-04 17:21:58 -04:00
jelveh b99d7be510 Preserve existing disable_temp_users value
Do not unconditionally overwrite window.disable_temp_users during GUI init. If window.disable_temp_users is already set, keep it; otherwise fall back to options.disable_temp_users (or false). Added a clarifying comment explaining the behavior.
2026-04-03 11:48:09 -07:00
Daniel Salazar 95cbbc5de6 feat: enable singed uploads on oss and fix broken migration (#2765)
* 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
Trevin ChowandReynaldi Chernando e23df0b589 Add kv.list() pagination playground example (#2760)
* Add kv.list() pagination playground example

Create an interactive playground example for kv.list() that
demonstrates cursor-based pagination with sample data (6 items,
2 per page). Also wire the pagination docs example to the playground
by changing the code fence from plain html to html;kv-list.

Fixes #2755

* fix: address review feedback - restore code example, create new pagination playground

* minor refactor

---------

Co-authored-by: Reynaldi Chernando <[email protected]>
2026-04-03 17:23:42 +07:00
Shruc 5e6aff63c4 add google video native provider, imagen models (#2759)
* update gemini .chat models, add imagen, add gemini veo

* add models

* update documentation

* add veo 3.1 lite, 1080p pricing
2026-04-02 16:03:38 -04:00
Daniel Salazar 0505a5df1f fix: no shutdown outside of puter servers (#2762) 2026-04-02 11:36:49 -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
Reynaldi Chernando ed7c18bffa Update prompt caching example (#2758) 2026-04-01 18:18:31 +07:00
Raffy LeongandReynaldi Chernando 0e83af7e2b docs(kv): add sorting section with examples to list() API reference (#2739)
* docs(kv): add sorting section with examples to list() API reference

Added sorting section with examples for lexicographic order and zero-padding for numbers.

* docs(kv): add sorting note to list() description

* feat(playground): add kv-list-sort example

* feat(playground): add kv-list-padding.html

* add Sorting examples to kv list on doc/src/examples.js

* docs(kv): add sorting examples to list.md examples section

* Refine copy and code example

* remove extra newline

---------

Co-authored-by: Reynaldi Chernando <[email protected]>
2026-03-31 18:04:12 +07:00
Daniel Salazar 83985318fb feat: thumbnail event for gui (#2754) 2026-03-30 18:29:01 -07:00
Daniel Salazar ef243c9854 feat: signed upload urls (#2753)
* feat: signed upload urls

* fix: make sessions write to dynamo

* fix: add logs for failures
2026-03-30 16:27:29 -07:00
John Costa 00b34d7329 Add context field to OpenRouter, MistralAI, and OpenAI models (#2653)
* Map context_length for OpenRouter models

OpenRouter's API returns context_length for each model, but it was not
being mapped to the context field in the model list response. This
caused the context window size to be missing for all OpenRouter models.

Closes #2347

* Add context field to MistralAI and OpenAI model definitions

Addresses reviewer feedback to support the context field in more
providers. All 9 providers now consistently expose context window
sizes via the context field.

- MistralAI: 16 models (context matches known window sizes)
- OpenAI: 27 models (128k for GPT series, 200k for o-series,
  1M+ for GPT-4.1 and GPT-5.4)
2026-03-30 16:46:08 -04:00
ProgrammerIn-wonderland ad85026a8c Getting rid of Endpoint (#2732)
* Get rid of Endpoint and ExpectationService

* Migrate user-protected endpoints to eggspress

* eggspress better typedefs
2026-03-30 16:23:41 -04:00
Shruc cea40b3e78 support video inputs in .chat (#2740)
* support video inputs in .chat

* update docs for .chat
2026-03-30 10:26:34 -04:00
Reynaldi Chernando 7fc9a97269 Fix prompt caching example broken character (#2750) 2026-03-30 11:21:41 +07:00
Leandre Chamberland-DozoisandReynaldi Chernando 55bdd50de4 docs: update code examples from gpt-5-nano to gpt-5.4-nano (#2738)
* docs: update code examples from gpt-5-nano to gpt-5.4-nano (#2716)

* Remove unrelated changes

* remove more unrelated

---------

Co-authored-by: Reynaldi Chernando <[email protected]>
2026-03-30 10:56:57 +07:00
jelveh 6c1019a1a8 Add recover-password window, its action URL, and styles 2026-03-29 17:18:50 -07:00
jelveh add9b1e774 Update dashboard.css 2026-03-29 13:59:08 -07:00
jelveh 54dbd57811 Update dashboard.css 2026-03-29 13:45:26 -07:00
jelveh 7c092d1a22 Increase dashboard grid gap and icon size 2026-03-29 13:36:29 -07:00
Daniel Salazar 107521e45a fix: remove recommended app caching in favour of stronger caching at app fetch layer (#2748) 2026-03-29 13:07:00 -07:00
jelveh 8c47f12aa5 Update recommended apps list 2026-03-29 10:51:34 -07:00
jelveh bf3bbab468 Increase dashboard sidebar width to 250px
Bump the .dashboard-sidebar width from 200px to 250px to provide more room for navigation items and improve layout spacing. min-width, background, and border styles remain unchanged.
2026-03-29 10:26:13 -07:00
jelveh 0a6dd0c611 Add prependHeadContent and optional autofocus flags 2026-03-29 10:10:09 -07:00
jelveh bfea3bbce9 Pass req and relocate extension body content 2026-03-28 15:19:34 -07:00
jelveh 1ab73d8726 Make dashboard card headers clickable 2026-03-28 13:02:43 -07:00
jelveh 813e78843a Remove debug log; update captcha modal styles 2026-03-28 11:04:10 -07:00
jelveh 8a33c663cd Always enable cover_page in window options 2026-03-27 19:01:30 -07:00
Daniel Salazar 3e0829474e fix: incrememnt ddb sharding to 10k (#2744) 2026-03-27 18:59:48 -07:00
Nariman JelvehandDaniel Salazar 92ac05e4f2 Display logged-in banner on homepage (#2742)
* Display logged-in banner on homepage

Pass auth_user from the router into PuterHomepageService and show a logged-in banner when a user is present. _default.js now includes auth_user in the svc_puterHomepage.send call. PuterHomepageService.send signature was updated to accept auth_user; the service stores logged_in_user, forwards it to generate_puter_page_html, and injects a styled "Logged in as <username>" banner into the top of the page when available. This surfaces the current user on the GUI and exposes logged_in_user to page generation and addons.

* Include request path and logged in user in GUI params; remove banner

* fix: bad auth_user check for homepage

---------

Co-authored-by: Daniel Salazar <[email protected]>
2026-03-27 18:48:05 -07:00
Daniel Salazar 677bc29658 fix: remove dynamo health check for now (#2743) 2026-03-27 18:34:40 -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
jelveh 89a67a4a6f Update dashboard.css 2026-03-27 15:23:13 -07:00
jelveh 266b3ae3d4 Add sidebar separator to dashboard 2026-03-27 14:14:10 -07:00
Reynaldi ChernandoandCopilot 14ed1b6db8 Add claude cache control docs (#2737)
* Add claude cache control docs

* refine

* Update src/docs/src/AI/chat.md

Co-authored-by: Copilot <[email protected]>

* Update src/docs/src/AI/chat.md

Co-authored-by: Copilot <[email protected]>

* Update src/docs/src/examples.js

Co-authored-by: Copilot <[email protected]>

---------

Co-authored-by: Copilot <[email protected]>
2026-03-27 17:35:53 +07:00
jelveh c20ef3c98c Remove dynamic dashboard CSS injection 2026-03-26 21:14:19 -07:00
jelveh 829295228a Adjust dashboard grid spacing and tile size 2026-03-26 21:03:31 -07:00
jelveh ae33f6f42b Remove static myapps loading placeholder 2026-03-26 20:40:47 -07:00
jelveh e1e2cad31d Hide apps grid until icons finish loading
Prevent a visual flash by hiding the apps grid until all app icons have loaded. Adds revealWhenLoaded($container) which removes the myapps-grid-loading class when images finish (or error). TabApps now caches the .myapps-container lookup and calls revealWhenLoaded after initial render, after search results, and after loading installed apps. CSS changes: add .myapps-grid-loading (opacity:0 + transition) and a small padding-right tweak for the search input.
2026-03-26 20:29:35 -07:00
velzie 017308a741 Small tweaks to puter.peer (#2734)
* small tweaks to puter.peer

* document connections field
2026-03-26 19:34:07 -04:00
jelveh 5c913fc359 Add search bar to My Apps tab 2026-03-26 16:31:08 -07:00
jelveh 5eddd0949f Merge launch & installed apps, tweak app tile CSS
Fetch both the installedApps and get-launch-apps endpoints in parallel, normalize recommended + recent launch items, and merge them with installed apps while deduplicating by name (launch items are prioritized). Update this._apps and render the combined list. Also simplify the app tile icon styling by removing border-radius and box-shadow for a flatter icon appearance. Error handling for failed loads is preserved.
2026-03-26 15:43:09 -07:00
Daniel Salazar b857fc8743 fix: return fallback icons if no icon present (#2731) 2026-03-25 16:50:34 -07:00
jelveh 02bc010989 Include dashboard.css in GUI assets
Add /css/dashboard.css to the GUI asset lists so dashboard styles are served and bundled. Updated src/gui/puter-gui.json and src/gui/src/static-assets.js to include the new stylesheet.
2026-03-25 16:31:14 -07:00
jelveh 94395cd539 Add Apps tab UI and installed apps fetch 2026-03-25 16:10:10 -07:00
Daniel Salazar ec766eecc2 fix: syntax issue with sql (#2730) 2026-03-25 15:05:43 -07:00
Daniel Salazar 187b14dacd fix: remove last opened (#2729) 2026-03-25 14:43:06 -07:00
Shruc 2da083e7c1 use case sensitive together video model ids (#2728) 2026-03-25 16:21:16 -04:00
Daniel Salazar 393f4b70d4 fix: remove flaky event loop check (#2727) 2026-03-25 11:59:18 -07:00
Daniel Salazar d292c1e4e4 fix: healtcheck improvements (#2726)
* fix: decrease logs

* fix: healtcheck improvements
2026-03-25 11:10:58 -07:00
Daniel Salazar 08fa2d7a41 fix: installed apps api (#2725) 2026-03-25 09:41:53 -07:00
Daniel Salazar 25b9911651 fix: extension type import (#2723) 2026-03-24 23:32:12 -07:00
Daniel Salazar 9511323cdf fix: init installed apps controller (#2722) 2026-03-24 23:17:46 -07:00
Daniel Salazar 68985e9f47 fix: letter case issue (#2721)
* fix: letter case

* fix: name
2026-03-24 22:46:19 -07:00
Daniel Salazar 0a3ac7b035 Revert "feat: root level kv accesses, and installed app listing + server health check fix (#2719)" (#2720)
This reverts commit e75ccb0a41.
2026-03-24 20:28:36 -07:00
Daniel Salazar e75ccb0a41 feat: root level kv accesses, and installed app listing + server health check fix (#2719)
* feat: root level kv accesses, and installed app listing

* fix: revert server health check
2026-03-24 19:18:42 -07:00
ProgrammerIn-wonderland c52fa351a5 WIP openai responses support (#2715) 2026-03-24 06:12:13 -04:00
iamsrishanthandProgrammerIn-wonderland 4fe255347a feat: Add Anthropic Messages API compatibility layer (#2704)
* feat: add Anthropic Messages API compatibility layer

Add a new endpoint at /puterai/anthropic/v1/messages that implements the
Anthropic Messages API wire format, allowing clients using the Anthropic
SDK to point directly at Puter.

- New router translates between Anthropic format and Puter's internal
  svcAiChat.complete() pipeline
- Supports non-streaming, SSE streaming (proper Anthropic event sequence),
  and tool use round-trips
- Translates system field, tool definitions (input_schema -> parameters),
  and tool_result content blocks
- Integration tests covering non-streaming, streaming, tool use,
  Anthropic SDK compatibility, and system parameter

Closes #2554

* Fix authentication middleware

---------

Co-authored-by: ProgrammerIn-wonderland <[email protected]>
2026-03-24 06:08:25 -04:00
Shruc bed84cad76 refactor ai video gen (#2711)
* refactor ai video generation into one service

* use old duration and dimension keys

* use costoverride billing like the others
2026-03-24 05:42:52 -04:00
Daniel Salazar 76f5a26d84 fix: issue with tokens not being received by puter app (#2713) 2026-03-23 17:37:54 -07:00
Daniel Salazar 931507e74e chore: remove dead code and docs (#2705)
* chore: remove dead code and docs

* fix: healthService caching
2026-03-22 23:58:02 -07:00
Dailin 3451bab09f docs: add ai-voice-changer playground example (#2708) 2026-03-23 13:23:30 +07:00
jelveh 34bf2799b6 Fix App Store links and remove install stub 2026-03-22 16:29:13 -07:00
jelveh c99e23d737 change default credits 2026-03-21 20:17:01 -07:00
jelveh a4be42a390 Exclude login/signup from temp user creation
Prevent creating temporary users on unauthenticated first visits when the current action is the login or signup flow. The initgui else-if was expanded to include explicit checks for action !== 'login' and action !== 'signup', avoiding interference with explicit authentication routes and Turnstile challenges.
2026-03-21 19:15:01 -07:00
jelveh f89079f907 Fix login form layout and window options 2026-03-21 18:39:38 -07:00
jelveh c434af7c71 Center auth forms; add Google icon; set cover_page 2026-03-21 18:14:46 -07:00
jelveh e6726a1a94 Add peer icon and update sidebar reference 2026-03-21 11:42:42 -07:00
Vusal Huseynov c31d665fff docs: fix 404 in CreateAppResult documentation due to case sensitivity (#2702) 2026-03-20 22:15:09 +07:00
Nandini Kashyap f9511e42a4 Fix double slash in canonical URL (#2690) 2026-03-20 21:21:09 +07:00
Daniel Salazar b526c08ffe fix: ws double messages (#2700) 2026-03-19 20:56:04 -07:00
Nariman Jelveh ba1f9669d2 Peer docs (#2699) 2026-03-19 20:11:18 -07:00
jelveh 4a4a92ccaf Simplify plan name localization in dashboard
Use a single expression to derive the plan key (offering.name or 'free') and pass it to i18n when updating .bento-plan-name. This removes the previous ternary and duplicates, allowing dynamic offering names to be localized consistently.
2026-03-19 18:28:42 -07:00
jelveh a6b18ff844 Add basic/professional/business/free translations
Add missing English translations for plan tiers (free, basic, professional, business) to src/gui/src/i18n/translations/en.js and perform a minor formatting cleanup near billing messages to ensure keys are available for UI display.
2026-03-19 18:23:25 -07:00
jelveh 815b0424a3 Use subscription.offering.name for plan display
Update TabHome to read the plan name from subscription.offering.name instead of subscription.plan_name. This adapts to the updated subscription object shape while keeping the fallback to the 'pro' translation and the 'free' label when no active subscription exists.
2026-03-19 17:16:50 -07:00
Charlie Tonneslan 3628cf4909 fix(gui): account for iOS safe area inset on taskbar/dock (#2682)
The taskbar uses position:fixed with bottom:5px, which gets hidden
behind the iOS Safari bottom toolbar on devices with home indicators.

Use env(safe-area-inset-bottom) to push the dock above the safe area.
The viewport-fit=cover meta tag is already present in initgui.js.

Fixes #2517
2026-03-19 16:56:43 -07:00
Daniel Salazar ee3a3e79f2 chore: decrease uneeded logging (#2697) 2026-03-19 15:28:24 -07:00
Daniel Salazar b87f4988e1 fix: socket io sockets (#2696) 2026-03-19 14:32:20 -07:00
Daniel Salazar c2e77d3503 fix: broadcast pubsub + cleanup old code (#2695) 2026-03-19 13:13:01 -07:00
Daniel Salazar 5e2c7e0495 Revert "fix: tighten cors logic for socket io (#2688)" (#2694)
This reverts commit a94620de49.
2026-03-19 12:24:14 -07:00
Daniel Salazar a94620de49 fix: tighten cors logic for socket io (#2688)
* fix: tighten up cors for socket io

* fix: allow socket io to push to rooms in redis

* fix: various socket io issues to improve cross session stability
2026-03-19 12:08:24 -07:00
ProgrammerIn-wonderland ff126d12b1 turn metering support (#2689) 2026-03-18 23:26:00 -07:00
Daniel Salazar bb733e72c8 fix: websocket credentials (#2687)
* fix: websocket syncing on redis

* fix: websocket syncing on redis
2026-03-18 16:09:05 -07:00
ProgrammerIn-wonderland 4fb0977105 Change turn customIdentifier fully (#2685) 2026-03-18 00:36:55 -07:00
ProgrammerIn-wonderland 6a8be1505d change turn customIdentifier seperator (#2684) 2026-03-17 23:59:57 -07:00
ProgrammerIn-wonderland 817c30739b change capitalization of inviteCode (#2683) 2026-03-17 23:40:38 -07:00
velzieandProgrammerIn-wonderland 8d38e07e98 feat: add puter.peer to sdk, create PeerService in backend (#2664)
* feat: add puter.peer to sdk, create PeerService in backend

* cloudflare turn, typedefs, fallback ice, bugfixes

* minr tweak

* restrict peerservice to api.puter.com, make customIndentifier more detailed

---------

Co-authored-by: ProgrammerIn-wonderland <[email protected]>
2026-03-17 23:08:44 -07:00
Daniel Salazar 9347644f81 feat: redis pubsub for multiple connected clients in broadcast service and webhook fixes (#2681)
* debug: logs for webhook broadcasts

* fix: broadcast webhook calls

* fix: add error log with body

* fix: fetch form

* feat: redis pubsub for multiple connected clients in broadcast service

* test: add pubsub tests
2026-03-17 18:45:23 -07:00
Eric Dubé ef93ed4572 fix: change_email and user-protected endpoints (#2680)
Update check for suspended users on change_emeail and user-protected
endpoints. The `change_email` endpoint isn't using the auth middleware
because it infers from the token that was passed - this means it needs
explicit logic to check suspended users; before suspended users were
able to complete a a flow for changing their username if they already
started it before being suspended.

Update user-protected endpoints and configurable_auth so endpoints that
make sensitive account changes do not rely on cached information about a
user.
2026-03-17 14:54:29 -07:00
jelveh 2bafa03a74 Add 'Add to Desktop' English translation
Introduce a new i18n key `add_to_desktop` with value 'Add to Desktop' to the English translations file. This provides a label for UI actions that add items or apps to the desktop.
2026-03-17 13:52:26 -07:00
Daniel Salazar e6d125e17c feat: notify prod (#2679) 2026-03-17 13:48:57 -07:00
Daniel Salazar 6352bc6a9a fix: webhook message to peer (#2678) 2026-03-17 13:33:01 -07:00
Daniel Salazar 8118582496 fix: add console log to webhook for debugging (#2677) 2026-03-17 13:07:06 -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
ProgrammerIn-wonderland c7a481118f add reasoning to claude models (#2676) 2026-03-17 12:26:53 -07:00
Miika Kuisma 53f8d67679 Merge pull request #2675 from HeyPuter/darkmode-fix
darkmode fix
2026-03-17 09:50:34 +02:00
Miika Kuisma c325eed3af darkmode fix 2026-03-17 09:49:26 +02:00
Daniel Salazar c96bb9acb1 feat: add hook on merge for deployments (#2673)
* fix: tests

* fix: add logging for webhook events for debug
2026-03-16 22:34:39 -07:00
Daniel Salazar 573d5a3ff4 fix: limit referralCodeService (#2670)
* fix: limit referralCodeService

* fix: ECMAP unlink
2026-03-16 17:33:28 -07:00
ProgrammerIn-wonderland 55dd9841c5 add x-puter-no-auth option to puter.workers.exec (#2668) 2026-03-16 10:59:11 -07:00
Eric Dubé 0af0eb127e chore: update package-lock.json (#2667) 2026-03-16 08:56:34 -07:00
ProgrammerIn-wonderland ce9c8341d1 Interpret mpga as mp3 for OpenAI transcriptions (#2666) 2026-03-15 22:01:26 -07:00
Shruc b3787ac0e0 fix flash image quality level (#2665) 2026-03-15 16:47:14 -07:00
Shruc 89904ca563 fix coercion service not selecting correct conversion path (#2660) 2026-03-13 17:37:21 -07:00
Nariman Jelveh e28a5b01d8 Use ClickHouse for app open stats (#2662)
When a global ClickHouse client is available, run two parallel ClickHouse queries (JSONEachRow) to fetch per-app open_count and distinct user_count, parse results into Maps (parsing counts as integers). If ClickHouse is not present, fall back to the original MySQL aggregate queries. Apps list still comes from MySQL as before. This enables using ClickHouse for analytics performance while preserving the existing behavior as a fallback.
2026-03-13 14:46:44 -07:00
Eric Dubé 9506c537ab fix(security): shell escape paths in HostDiskUsageService; null-prototype objects in batch parser (#2659)
* fix(core): escape path in HostDiskUsageService

* fix: always use null prototypes on operation specs

* fix: update test.yml so that tests work again
2026-03-13 14:17:36 -07:00
Daniel Salazar 9169114e60 fix: tests oom breaking (#2661)
* fix: healthcheck route visible in subdomains

* fix: tests oom breaking

* fix: don't spawn many dynalites

* fix: possible loop when merging self owned apps
2026-03-13 13:41:07 -07:00
ProgrammerIn-wonderland 87672802fe mute puterjs error (#2657) 2026-03-12 11:17:59 -07:00
Daniel Salazar 5505da027d fix: app merging (#2654)
* fix: only set authToken if present for apps

* fix: keep bootstrap in url for app to do whatever

* fix: tests

* fix: app merging

just cleaning up how merging subdomain and canon apps work, namely, persisting data better and making sure its temp alias are deleted when appropriate

* fix: tests oom
2026-03-12 10:18:02 -07:00
Eric Dubé d086e4961c feat(puter-js): add Batch builder class (#2651)
Usage example:
  const b = new puter.fs.Batch();
  b.move('file_1.txt', '~/Trash');
  b.move('file_2.txt', '~/Trash');
  await b.end();

Chaining is also supported:
  await new puter.fs.Batch()
    .move('file_1.txt', '~/Trash')
    .move('file_2.txt', '~/Trash')
    .end();

This commit provides `move` and `delete` methods for Batch.
2026-03-11 22:33:51 -04:00
ProgrammerIn-wonderland 721af2a9b1 Ns/worker global public fetch (#2652)
* add global_fetch_strictly_public compatibility flag

* add comma
2026-03-11 19:27:28 -07:00
Daniel Salazar fc273d436d feat: scope index_url uniqueness to hosted domains (#2644)
* feat: scope index_url uniqueness to hosted domains

Allows duplicate non-hosted origins while enforcing hosted-origin uniqueness and joining new app creation into an existing owner-matching hosted app UUID.

Restricts hosted index_url joins to unowned conflict apps, persists old-to-canonical app UID aliases in kvstore via sudo, and resolves aliases on read with parallel lookup to minimize latency.

* fix: allow merge for owned origin bootstrap apps

Restores hosted update/create merge when the conflicting app is the same-user auto-created origin bootstrap app while still blocking merges into normal same-owner apps to avoid multi-join behavior.
2026-03-11 18:21:09 -07:00
Eric Dubé 9a78b6bffa fix(fs) optimize stat operation. (#2649) 2026-03-11 20:18:42 -04:00
Eric Dubé 7ff1ecfcd7 dev(fs): fetch subdomains using join in readdir (#2647)
* dev(fs): fetch subdomains using join in readdir

* fix(fs): handle readdir of root directory
2026-03-11 20:06:13 -04:00
Daniel Salazar 34fdd94767 feat: phase 3 public hosted actor cookie bootstrap (#2626)
Adds non-blocking public hosted actor cookie mint/verify flow for non-private apps, sets actor context when available, and includes focused middleware/auth tests for security and performance-sensitive paths.
2026-03-11 16:15:03 -07:00
Daniel Salazar a4aea52322 fix: keep bootstrap in url for app to do whatever (#2648)
* fix: only set authToken if present for apps

* fix: keep bootstrap in url for app to do whatever
2026-03-11 15:27:30 -07:00
Eric Dubé 8c9c476969 dev(extension): [+] test-actions (#2575)
Adds an extension that presents an unauthenticated page for testing
various actions of Puter when it's under development. This action is
only meant to be used in development and is not loaded by default.
2026-03-11 14:20:03 -04:00
Eric Dubé 58738ebbb1 dev: get system user from SUService in AppIconService (#2601)
* dev: get system user from SUService in AppIconService

* fix: accidental addition
2026-03-11 14:18:45 -04:00
Eric Dubé e56d8f6889 dev(fs): add move command to batch executor (#2646)
Effectively this makes it possible to perform multiple move operations
in a batch request.
2026-03-11 14:15:49 -04:00
Daniel Salazar bba0533078 feat: checkName api for puter apps (#2643) 2026-03-11 00:23:35 -07:00
Eric Dubé ebb9015045 fix(core): handling of refer code storage add (#2642) 2026-03-10 22:39:02 -04:00
Eric Dubé 05b047c8b9 Revert "perf(core): very simplistic minifier for homepage (#2630)" (#2641)
This reverts commit ae96912699.
2026-03-10 21:36:14 -04:00
Eric Dubé ae96912699 perf(core): very simplistic minifier for homepage (#2630) 2026-03-10 21:24:13 -04:00
Daniel Salazar e96221b0b6 feat: phase 2 enforce index url ownership and uniqueness (#2625)
* feat: phase 2 enforce index url ownership and uniqueness

Adds write-time index URL uniqueness checks, expands hosted subdomain ownership enforcement to private hosting domains, and updates AppService tests for duplicate-index behavior.

* test: align app service comp fixtures with index url uniqueness

Updates regression test fixtures that intentionally exercise name conflicts and selection paths to use unique index_url values under the new one-index-per-app constraint.

* fix: exempt placeholder index url from uniqueness checks

Skips index_url uniqueness enforcement for the shared dev-center coming-soon URL in both AppService and AppES, and adds unit/comp regressions to keep one-index-per-app behavior for all other URLs.
2026-03-10 18:18:01 -07:00
jelveh 1052d4d51d Avoid reload when embedded in popup
Set reload_on_success explicitly when invoking UIWindowLogin so the UI does not trigger a page reload if the GUI is embedded in a popup. Previously the call forwarded a reload_on_success variable; now it uses !window.embedded_in_popup to prevent unwanted reloads in popup embeds.
2026-03-10 18:10:23 -07:00
Daniel Salazar 156d571b10 feat: limit concurrent request for ai chat (#2640) 2026-03-10 16:13:20 -07:00
ProgrammerIn-wonderland 14f218ef72 fix assets_url bug in GUI buildstep (#2638)
* fix assets_url bug in GUI buildstep

* add await
2026-03-10 13:55:06 -07:00
ProgrammerIn-wonderland 26a7ae9d4c s/mv/cp/ for gui buildstep (#2637) 2026-03-10 13:47:40 -07:00
ProgrammerIn-wonderland 031a3da7f1 s/icons/assets/ for building GUI (#2636) 2026-03-10 13:38:32 -07:00
ProgrammerIn-wonderland c297715875 add support for building with custom icons (#2635) 2026-03-10 13:21:05 -07:00
Eric Dubé c9787c1d4b devex(core): avoid email verification on dev (#2634)
Add guard to check if `env` in the backend configuration is set to
`'dev'`. When it is set to `'dev'`, do not invoke email verification
extensions.
2026-03-10 15:56:00 -04:00
Eric Dubé cc70e49472 Fix missing password entry (#2632)
* Revert "dev(oidc): hide unnecessary div"

This reverts commit 468558f8dc.

* fix(oidc): remove the "You will be asked to..." box properly

Earlier this was removed with a simple `display: none` in CSS to avoid
changing any logic, and the reason for that was OIDC had already gone
through significant testing, re-testing, and bug fixes; it became clear
that changes to the auth flow are fragile and the test surface is very
large. Now unfortunately what seemed like a smart decision to fix a
cosmetic issue with CSS instead of updating logic actually wound up
breaking the change username/password flow for non-OIDC users. This
commit removes this box properly and hopefully does not introduce a
subsequent terrible bug. Why would it? There's absolutely no reason I
can see that it would, but it would seem that nothing is safe, not even
CSS.

* temp: disable LRU cache of homepage for now

This is working fine but we're disabling it temporarily so we can test
specific future changes in isolation without managing two separate
branches.

* fix: put verify password text in the box

There's always something...
2026-03-10 03:08:29 -04:00
ProgrammerIn-wonderland 9d82f333e5 revert puterjs gui ordering (#2631) 2026-03-09 21:41:53 -07:00
Eric Dubé 34d4f491b3 perf(core): LRU cache PuterHomepageService (#2627)
LRU cache the output of PuterHomepageService with a cache key based on
metadata that affects the output of the homepage (if an app was
specified, and if so what app was specified).

With this change in place we can afford more time processing this
output, for example to minify the output and reduce outbound bandwidth.
2026-03-09 22:11:48 -04:00
ProgrammerIn-wonderland b687ba0456 Ns/configurable gui bundle (#2629)
* add configurable GUI bundle

* also support CSS and puterjs custom location

* simplify ternary

* used bundled instead of use_bundled_gui

* Quote the string

* close script tag
2026-03-09 19:08:24 -07:00
Daniel Salazar 57a29999e3 feat: phase 1 canonical app origin resolution (#2624)
* feat: phase 1 canonical app origin resolution

Adds cache-first canonical app uid resolution for origin-based auth flows with oldest-app selection and deterministic fallback, plus regression tests for hosted/non-hosted canonicalization behavior.

* refactor: use kv singleton for origin local cache

Replaces AuthService app-origin local canonicalization Map cache with kvjs singleton keys, applies TTL via EX on writes, and rotates local cache namespace on version bumps to avoid broad clears.

* refactor: target origin cache invalidation

Removes global app-origin cache version bumps and invalidates canonical origin cache entries by affected app index URLs from app.changed payloads. Also emits app and old_app data on update events for targeted invalidation.

* fix: avoid invalid old_app owner field in app change event

Removes owner_user_id access from AppES old_entity event payload because the entity model does not expose that property, fixing AppService comp upsert regression tests.
2026-03-09 16:32:32 -07:00
Daniel Salazar e4a52947fe fix: private app token (#2623) 2026-03-09 12:49:14 -07:00
5e7c2c3ddd Update Hosting API description #2612 (#2620)
* Update Hosting API description #2612

* Update copy and fix minor formatting

* Update copy 'deployment'

---------

Co-authored-by: artyz <[email protected]>
Co-authored-by: Reynaldi Chernando <[email protected]>
2026-03-09 14:19:24 +07:00
Michael LipandReynaldi Chernando 19df50bcba Add Networking examples to docs index page (#2613)
* Add Networking examples to docs index page

Fixes #2611

* Add icons and fix playground link

---------

Co-authored-by: Reynaldi Chernando <[email protected]>
2026-03-09 13:52:19 +07:00
Shruc 06b66719fe fix gemini image provider implementation (#2569)
* implement proper calls to gemini image

* remove hardcoded image prices

* fix model selection

* add flash 3.1 image, fix pricing

* also handle uris with data prefix

* more efficient uri parsing

* fix token calculation

* re-add some costs for models page
2026-03-08 23:25:11 -07:00
jelveh 62df3df6a9 Add nl2br Handlebars helper and use in template
Convert newline characters in email reason text to <br /> tags and ensure proper escaping. Replaced {{reason}} with {{{nl2br reason}}} in the rejection template and registered an nl2br Handlebars helper that escapes HTML entities, transforms newlines to <br /> and returns a SafeString so line breaks render correctly in emails.
2026-03-08 15:51:54 -07:00
ProgrammerIn-wonderland 004777824d use openrouter provided USD cost when present (#2619) 2026-03-08 12:12:24 -07:00
Eric Dubé 0fa0340ca2 clean(apps): merge fns only called by get_app_icon_url (#2617)
Each of these methods is only being called by get_app_icon_url. By
changing that ternary operator into an `if` block with an early return
we can move the bodies of these functions here. If one of the former
functions ever needs to be used in more than one place, it's easy to
extract it out of here agian - for now though let's not pay the cost of
jumping to another function definition while trying to understand this
code if we're not gaining anything from it.
2026-03-06 20:07:14 -05:00
Eric Dubé 2a027ed410 fix(puterfs): await queue items for fsentry action (#2616)
* style(puterfs): update adherence to linter rules

* fix(puterfs): await queue items for fsentry actions

This will ensure some operations always function as expected in a
sequence, although it may incur some performance costs.
2026-03-06 20:04:18 -05:00
ProgrammerIn-wonderland a0fc1bca30 add gpt 5.3 codex and gpt 5.4 (#2618)
* add gpt 5.3 codex and gpt 5.4

* add gemini 3.1 pro preview
2026-03-06 16:59:39 -08:00
Daniel Salazar a861c3e27a chore: typeFixes (#2615) 2026-03-06 00:04:39 -08:00
Miika Kuisma 8e794faf06 Merge pull request #2595 from HeyPuter/miika/put-611
Fix border colors in Settings panel
2026-03-06 10:03:25 +02:00
Eric Dubé f167da9a0a clean: remove a log (#2610) 2026-03-04 22:02:36 -05:00
Daniel Salazar 4aab06611e feat: redirect away cookie (#2609) 2026-03-04 17:54:58 -08:00
ProgrammerIn-wonderland 9a6178e66f Make credentialless false by default 2026-03-04 20:54:04 -05:00
Daniel Salazar 237973f227 fix: fetching user from session token (#2607)
old bug was causing issues trying to use sessions as auth checks for tighter security for private apps. missed it without more detailed logs
2026-03-04 17:29:52 -08:00
Daniel Salazar 3f0b0bfd1d feat: more robust error logs (#2605) 2026-03-04 16:47:01 -08:00
Daniel Salazar d28cc46e02 fix: add logs to debug on prod (#2604) 2026-03-04 16:20:52 -08:00
Eric Dubé 0864b9ece1 dev(apps): add configuration to not use app icon subdomain (#2603)
* dev(apps): add configuration to not use app icon subdomain

For some local configurations of Puter, such as using ngrok or a hosting
service that has limited subdomains or limited subdomain depth, the
static hosting subdomain for app icons is difficult to configure and may
not be viable. Since this is only done so an external geo-replicated
cache can be used, and it's always possible for Puter's backend to
generate an app icon, it should be possible to configure Puter's backend
to use icons from a URL hosted on the default subdomain.

Add a configuration parameter to the service "app-icon" called
"no_subdomain" which prevents Puter's backend from sending puter-icons
subdomain URLs or redirecting to them.

Also perform some small cleanup changes to make the existing code easier
to understand, including:
- rename `buildAppIconUrl` to `buildAppIconSubdomainUrl` to make it
  clear which of the two types of icon URLs are being generated.
- replace `withAppIconUrl` with `get_app_icon_url` so it is possible to
  get an icon URL without mutating an app object.
- make the `get_taskbar_items` helper use the same code for getting app
  icons as the `get_apps` helper.

* fix(apps): test initializes a service with no config
2026-03-04 19:10:32 -05:00
jelveh d802d12a05 Add UI notify API and notification handling 2026-03-04 15:29:50 -08:00
Daniel Salazar 9721943040 fix: prioritize new token thant anything outdated stored in localstorage (#2600) 2026-03-04 14:49:05 -08:00
KernelDeimos fc29e57730 fix(oidc): request object reference in oidc signup
The request object was not being passed to OIDC signup because it is
called by createUserFromOIDC which doesn't take a request object as a
parameter. It was decided to have `create_user` take the request object
from context if it's not specified rather than change the signature of
createUserFromOIDC.
2026-03-04 14:33:36 -05:00
Daniel Salazar 1720c97851 fix: origin canonization (#2597) 2026-03-04 11:09:25 -08:00
Daniel Salazar 8a14871dde fix: bad token generation for private apps (#2596) 2026-03-04 10:09:16 -08:00
Miika Kuisma f887c56e61 Restored previously used border colors 2026-03-04 10:32:39 +02:00
jelveh 6248a89a59 Add autoplay to iframe allow list 2026-03-03 22:20:31 -08:00
Daniel Salazar 6b6f9b4743 fix: puter site middleware host (#2594) 2026-03-03 22:18:47 -08:00
Daniel Salazar 8380b28d8a fix: reset subdomain if empty (#2593) 2026-03-03 21:07:55 -08:00
Daniel Salazar adf034b120 feat: add subdomain to private asset tokens (#2591) 2026-03-03 20:37:17 -08:00
KernelDeimos 468558f8dc dev(oidc): hide unnecessary div
I decided not to remove it because I really don't want to introduce a
bug right now while everything is finally working smoothly... I'm making
a note to properly clean this up later when it can be more easily tested
in isolation from everything else.
2026-03-03 23:08:05 -05:00
Daniel Salazar dbdead9ad1 fix: remove redis cache scan in favour of direct key invalidation (#2589) 2026-03-03 19:55:41 -08:00
jelveh 80cabca7ad Add Google SVG icon to sign-in button 2026-03-03 19:31:39 -08:00
Baptiste Lyet f0d0e1d8ca docs : udpdate current year (#2585) 2026-03-04 10:30:42 +07:00
Daniel Salazar 911c163fc8 feat: private app config to use app urls + app routing (#2587)
* feat: private app config to use app urls

* fix: launch app

* fix: cookie origin
2026-03-03 18:34:33 -08:00
KernelDeimos 3cd5268379 fix(oidc): login flow with puter.ui.authenticateWithPuter
It turns out there are nuances between `puter.ui.authenticateWithPuter`
vs `puter.auth.signIn` - these don't do the same thing. The primary
difference is that `puter.ui.authenticateWithPuter` will display an
override if it's not triggered by a user action, whereas
`puter.auth.signIn` will not. This definitely suggests
`puter.ui.authenticateWithPuter` should be a caller of
`puter.auth.signIn` instead of implementing its own logic for handling
the popup - that makes this part of the code more fagile - but that
refactor is out-of-scope for this bug fix.
2026-03-03 21:20:46 -05:00
Daniel Salazar 1f975b9d19 fix: private app config to use app urls (#2586) 2026-03-03 15:49:33 -08:00
Daniel Salazar 4f5fec5ee4 feat: resolve private app hosts by index_url fallback (#2583)
* feat: resolve private app hosts by index_url fallback

Adds a private-app lookup fallback for hosted subdomains without associated_app_id by matching owner-scoped index_url candidates built from request host and configured protocol.

* fix: redirect path

* fix: add new domains too

* fix, bootstrap url

* fix: bootstrap url

* fix: auto sign in puter pirvate app
2026-03-03 13:52:12 -08:00
KernelDeimos 930cbfb770 fix(ai): additional auth guard (corrected 676b6c3) 2026-03-02 19:55:07 -05:00
KernelDeimos 91b9aa014a Reapply "fix(auth): add explicit check for access token suspension (#2576)" (#2579)
This reverts commit 8349b0d692.
2026-03-02 19:45:11 -05:00
KernelDeimos 9fd1d0a2e2 Revert "fix(ai): additional auth guard (#2577)"
This reverts commit 676b6c31e1.
2026-03-02 19:37:18 -05:00
Eric Dubé 8349b0d692 Revert "fix(auth): add explicit check for access token suspension (#2576)" (#2579)
This reverts commit f6b9c69ce6.
2026-03-02 19:24:15 -05:00
Eric Dubé 8073f73032 Eric/26323 revert 26322 (#2578)
* fix(ai): additional auth guard

* Revert "fix(ai): additional auth guard"

This reverts commit 03d4e66e3b.
2026-03-02 19:12:41 -05:00
Eric Dubé 676b6c31e1 fix(ai): additional auth guard (#2577) 2026-03-02 18:45:33 -05:00
Eric Dubé f6b9c69ce6 fix(auth): add explicit check for access token suspension (#2576) 2026-03-02 17:10:42 -05:00
Miika Kuisma c0583a9095 Fix: When a maximized window gets resized, Puter apps should be resized as well (#2498)
* Fix: When a maximized window gets resized, Puter apps should be resized as well

* Fix maximixed selector to match any window with data-is_maximized (not just apps)
2026-03-02 10:48:47 -08:00
jelveh 43b313972c Revert "Permission modal now displays application's icon and title. Read and write access requests have their own text strings. (#2499)"
This reverts commit 0f33e49335.
2026-03-01 21:59:10 -08:00
Miika Kuisma 0f33e49335 Permission modal now displays application's icon and title. Read and write access requests have their own text strings. (#2499) 2026-03-01 20:02:20 -08:00
Eric Dubé f2926c948e fix(oidc): bring "Add Existing User" to working state (#2572) 2026-02-28 16:39:20 -05:00
Daniel Salazar 314c671778 fix: redis startup (#2571)
add event logging and handling to deal with redis startup
2026-02-28 13:25:42 -08:00
Daniel Salazar bb02fc6e6b fix: hardcode default perm (#2570) 2026-02-28 13:13:05 -08:00
Daniel Salazar 537f3957ed feat: add private app direct-login bootstrap page (#2566)
* feat: add private app direct-login bootstrap page

Serves a lightweight puter.js sign-in interstitial when private app identity is missing, then retries with a bootstrap token query param while preserving entitlement redirect behavior for authenticated denies.

* fix: allow private app subdomain
2026-02-28 13:04:14 -08:00
Daniel Salazar 2eb16ceab6 chore: switch private hosting domain to puter.dev (#2565)
Updates private app hosting defaults and middleware/test expectations from puter.app to puter.dev for current rollout needs.
2026-02-27 16:24:54 -08:00
Eric Dubé 2cc8cb22f8 [OIDC] allow user deletion for accounts without a password (#2567)
* fix: user deletion for OIDC accounts

* clean(backend): update copied license header

* clean(backend): replace previously removed comments

* fix: double-encoding
2026-02-27 18:55:12 -05:00
Eric Dubé 9d4e990b92 dev(oidc): switch login/signup flows where applicable (#2550)
For convenience, switch flow if the user's action doesn't match the
system state when signing up or logging in with Google:
- If the user chooses "signup" but they already have an account, log
  them into that account.
- If the user chooses "login" but they do not have an account yet,
  create an account where their authenticated email address.
2026-02-27 18:30:17 -05:00
Daniel Salazar 7e07c3d937 feat: add private access rollout gate and auditing (#2560)
Adds a config flag to disable private app gate enforcement, structured middleware audit logs for private access decisions, and regression coverage for the disabled-gate path.
2026-02-27 13:55:15 -08:00
Eric Dubé 866825767b fix(backend): default rate-limit scope instead of error (#2564)
When a rate-limit scope is not configured, use a default configuration
instead of throwing an error. Display a warning about the unconfigured
rate-limit scope when the default is used.
2026-02-27 15:58:36 -05:00
Anshuman Tripathi 7c437fabf3 fix: corrected service reference (#2559) 2026-02-27 13:45:01 -05:00
Reynaldi Chernando 613b0482e8 Add nano banana 2 (#2562) 2026-02-27 13:00:36 -05:00
Daniel Salazar 784847b1b1 feat: enforce private app hosting access gate (#2557)
Add private app access gating in PuterSiteMiddleware with entitlement event checks, bootstrap/private cookie token flow, and camelCase helper/test updates.
2026-02-26 23:42:32 -08:00
Daniel Salazar 23089901dd perf:remove recents cache (#2558) 2026-02-26 16:38:58 -08:00
Daniel Salazar adce8c64db feat: add private app access extension event contract (#2556)
* feat: add private app access extension event contract

Define app.private-access.check in extension API typings with mutable allow/redirect decision fields for entitlement handlers.

* refactor: camelCase private access event contract

Rename private access extension event and payload fields to camelCase for consistency with repo conventions.
2026-02-26 15:04:23 -08:00
Daniel Salazar 15e7a3503b feat: add private app asset token auth helpers (#2555)
* feat: add private app asset token auth helpers

Add mint/verify helpers and hardened cookie option helpers for app-private-asset tokens in AuthService.
Add focused tests for claims validation, mismatch denial, and cookie option defaults.

* fix: add prvate app config for new subdomain
2026-02-26 14:19:59 -08:00
Daniel Salazar f8560cf0f9 fix: delete redis keys in parallel, don't grant both read and write if just write needed (#2552) 2026-02-26 14:03:21 -08:00
Daniel Salazar 1887352301 fix: don't await cache invalidation for grant app permission (#2551)
* fix: disable broadcast for cache invalidation

* fix: remove broadcast for redis events for now

* fix: don't await cache invalidation for grant app permission
2026-02-25 17:26:42 -08:00
Daniel Salazar 2c1b21e197 feat: type extension cache update events (#2548)
* feat: type extension cache update events

Expose outer.cacheUpdate in extension API typings and consolidate extension service typing via ServicesMap.

* fix: batch broadcast events

* fix: bad import

* fix: import socket io

* fix: bad undefined call

* fix: simplify await for broadcast processing
2026-02-25 17:05:05 -08:00
Daniel Salazar aa04dfabb4 feat: add is_private to apps (#2546) 2026-02-25 13:26:16 -08:00
Eric Dubé c4346df24e fix(gui): defer login event until listener registered (#2547)
Fixes an error introduced in 4b8c46e where the page load is attempted to
be triggered by dispatching the login event, however the listener which
handles loading the page has not yet been registered.
2026-02-25 14:22:06 -05:00
Daniel Salazar 7a1468d070 fix: app icons via subdomain on localhost (#2544) 2026-02-25 10:14:39 -08:00
jelveh 71f7698a46 Await update_auth_data to avoid races 2026-02-24 18:33:30 -08:00
jelveh 0515b65138 Await update_auth_data to avoid race conditions 2026-02-24 18:24:33 -08:00
Daniel Salazar 66f1cd0bc3 fix: remove broadcast for cache updates (#2542)
* fix: disable broadcast for cache invalidation

* fix: remove broadcast for redis events for now
2026-02-24 16:45:32 -08:00
Eric Dubé 6658a90b6a fix(backend): invalidate app permission debounce (#2541)
* fix(backend): debounce app permission invalidation

* fix(backend): debounce app permission invalidation
2026-02-24 19:00:34 -05:00
Daniel Salazar 4c863cc5bc fix: make invalidations more robust (#2529) 2026-02-24 15:45:46 -08:00
Daniel Salazar 6544e8c250 cleanup,:remove debugger calls in our code (#2535) 2026-02-24 15:42:39 -08:00
Eric Dubé ce3c9bff34 Fix OIDC in popups (#2539)
* fix(oidc): OIDC login with puter.js popup auth

Bring login through OpenID Connect to a working state in the puter.js
popup authentication flow. This allows OIDC login to work with
third-party websites and apps.

* fix(oidc): error handling, use const (initgui)

Remove a condition that can be handled by the control flow logic
already implied by a try...catch, which also allows a variable to become
const, and log errors in this catch block.

* doc(oidc): make this comment a little more helpful

* clean(oidc): remove out-of-scope puter.js change

Remove a change that gives explicit overrides of the `defaultGUIOrigin`
paramter precedence over other sources of this value. This was necessary
when testing but might not be the correct fix for this issue.
2026-02-24 17:17:18 -05:00
Neal Shah 267713481c fix desktop gui error handling for workers (#2538) 2026-02-24 16:32:14 -05:00
Neal Shah 1e3193366a dont forward data urls through cors proxy and fix core.validation (#2537)
* exempt data urls from using cors proxy

* disallow unlimited use

* make core.validation defined again
2026-02-24 16:11:00 -05:00
Daniel Salazar 052e3f9dcb cache: extend cache invalidation to emit events out too (#2532) 2026-02-23 22:24:57 -08:00
Neal Shah c14dd5ae78 WIP: use cors proxy for outbound requests (#2533) 2026-02-24 01:10:23 -05:00
jelveh eaaeb4e6a4 Await update_auth_data before continuing
Await the window.update_auth_data call in initgui.js so subsequent logic (such as popup spinner hiding and timing) runs after authentication data has been updated. This prevents race conditions where later UI code executes before auth state is fully applied.
2026-02-23 18:19:35 -08:00
jelveh 8f4a38ae0b Load user preferences with error handling
Read user preference keys (show_hidden_files, language, clock_visible) into local variables with try/catch and sensible defaults, instead of fetching/parsing them inline. This prevents exceptions from missing or malformed KV entries and centralizes parsing for show_hidden_files. Also remove an extra blank line in initgui.js's AJAX complete callback.
2026-02-23 16:52:56 -08:00
Eric Dubé 4554331eff dev(oidc): redirect to login/signup on error (#2531)
Redirect to the login or signup page when there is an error signing in
or creating an account using OIDC, instead of displaying the error on a
new page. Alter the flow in cases where the suggested action is not the
same as the initial action taken by the user (based on the error case).
2026-02-23 17:56:38 -05:00
Daniel Salazar eda9f117c7 fix: default timeout on user caches of 15 min (#2530) 2026-02-23 14:21:24 -08:00
Daniel Salazar e60f55f20e fix: stricter invalidation for 2fa and confirm email codes (#2528) 2026-02-23 09:01:59 -08:00
P3il4 779321d334 fix nano banana pro pricing and resolutions (#2501)
* fix nano banana pro pricing and resolutions

* move gemini resolution map into models.ts

* require gemini 3 model for specific resolution and price logic

* fix usageamount for mp models
2026-02-23 03:39:48 -05:00
samarthmishra46 0ee2ebd7b4 added keyboard shortcut in the setting for better ui navigation (#2484) 2026-02-22 18:31:15 -08:00
Eric Dubé 96be8707b8 Merge pull request #2526 from HeyPuter/eric/262L0_PUT-533
fix: bad copy with reference in UIItem
2026-02-21 20:19:59 -05:00
KernelDeimos 7ba40f8062 fix: bad copy with reference in UIItem
UIItem makes a recursive call when there are multiple matching elements
in the `options.appendTo` argument. When calling recursively, the
`appendTo` property of the `options` object is mutated to a specific
element before the call, which expects that each call to UIItem occurs
synchronously. UIItem was made asynchronous by
9d598f7965
which resulted in a bug causing duplicate item icons in one directory
window instead of one item icon in each directory window after a file
upload when multiple instances of a window at the same directory
location exist.

Resolves #2514
2026-02-21 20:14:08 -05:00
Neal Shah 1ed765cb86 Clarify expiration time unit in getReadURL.md (#2525)
Updated the documentation to specify that the expiration time is in milliseconds instead of seconds.
2026-02-21 04:15:27 -05:00
Daniel Salazar 9f87ccb460 fix: cleanup some app es and app service validation (#2523)
we saw some errors with icons not allowed when being objects, this likely user error, but this adds some validation to at least avoid nulls being flagged wrong
2026-02-21 00:10:55 -08:00
Daniel Salazar 3a89deaf02 fix: wrong icon for workers (#2524) 2026-02-20 19:20:18 -08:00
Daniel Salazar 3834571ab8 fix: don't call stat on each file in dir (#2522)
* fix: decrease metering service gloabl rate of change check

* fix: don't call stat on each file in dir
2026-02-20 19:07:16 -08:00
Daniel Salazar d418976ee4 perf: batching get_apps cache look ups (#2521)
should not be slow in any case, but this should help a bit more with speed in trade of more ram and cpu usage
2026-02-20 18:02:47 -08:00
Daniel Salazar 22c1cd8be4 lint: fix eslint indentation for switch cases (#2520)
also trying to preserve call indentations, but afraid its not exactly the same, but fairly close
2026-02-20 17:22:00 -08:00
Daniel Salazar 3b32b4a437 fix: don't await for cache writes (#2519)
* fix: allow healthcheck from other hosts

* fix: don't await for cache writes

we think some awaiting on redis writes was causing issues, we shouldn't need to await really, so removing now. will have optimistic caching for these

some style changes from a recently changed rule that seems to clash with prior one
2026-02-20 17:19:01 -08:00
Miika Kuisma 808b78c234 Fixed: puter.chat button has weird gradient when browser is dark mode (#2516)
Fixed: The gradient and progress bar on the usage details page is not very pleasant and looks inverted
Fixed: The billing card on the billing tab is still light mode
2026-02-19 19:43:20 -08:00
Eric Dubé 21185cdb3f Merge pull request #2460 from HeyPuter/eric/262A0_PUT-453
Login/Signup with OIDC

Wellp... this is not a rebase, this is merge. My hands were tied this time.
2026-02-19 22:39:44 -05:00
KernelDeimos ef0a665a5f fix(oidc): add code lost due to editing a .js
This code was previously lost because I edited `outcomeutil.js` instead
of `outcomeutil.ts`. We're not building into a `dist/` directory and
`tsc` has a most peculiar lack of generating a comment at the top of
output files stating something like "// GENERATED - DO NOT EDIT" as I've
seen from every other code generator or transpiler I've worked with.

This caused the bug with duplicate confirmed emails and "account not
found" during testing on the staging server.
2026-02-19 21:25:24 -05:00
Daniel Salazar b39bbe0a0a Merge remote-tracking branch 'origin/main' into eric/262A0_PUT-453 2026-02-19 16:45:10 -08:00
Daniel Salazar 2e7765004c fix: redis cache deletions (#2518) 2026-02-19 16:43:56 -08:00
Daniel Salazar 0cca9d5535 fix : import 2026-02-19 16:08:48 -08:00
KernelDeimos 1be3eca335 fix: rate limits for oidc too extreme 2026-02-19 19:00:01 -05:00
Daniel Salazar 7493573c61 Merge remote-tracking branch 'origin/main' into eric/262A0_PUT-453 2026-02-19 15:28:14 -08: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
KernelDeimos 0112f097db style(oidc): if instead of return with ternary expression 2026-02-19 17:18:48 -05:00
KernelDeimos 4e01608e4a dev: remove guarded debug log 2026-02-19 17:02:33 -05:00
KernelDeimos b3b32980db clean(oidc): remove jwt remap in ESM code 2026-02-19 16:32:41 -05:00
KernelDeimos f3bf40a3c0 style(oidc): rename httpPowers to hasHttpOnlyCookie 2026-02-19 16:29:19 -05:00
KernelDeimos 4de6d38604 style(oidc): make this a private method 2026-02-19 16:23:40 -05:00
KernelDeimos 4c518830ea clean(oidc): remove "ghost files" 2026-02-19 16:23:40 -05:00
KernelDeimos b5d719e110 lint: [+] no-useless-computed-key:error 2026-02-19 16:23:38 -05:00
KernelDeimos c97a499bc9 style(oidc): private members in OIDCService 2026-02-19 16:21:43 -05:00
KernelDeimos 16f2f5bf5f style(oidc): address PR rev on oidcCallbackPreamble_ 2026-02-19 16:21:42 -05:00
KernelDeimos 720277c9bd style(oidc): migrate cjs to esm 2026-02-19 16:21:42 -05:00
KernelDeimos 7ca0fe2ac4 clean: remove commented code 2026-02-19 16:21:42 -05:00
KernelDeimos ccecf0a86e fix(oidc): remove generated source file
I forgot that our transpile tooling requires manually gitignoring
individual javascript files because we don't actually create a full
generated build of backend.
2026-02-19 16:21:42 -05:00
KernelDeimos 8d18ee527c refactor(oidc): address review comment
https://github.com/HeyPuter/puter/pull/2460/changes#r2819861213
2026-02-19 16:21:42 -05:00
KernelDeimos 7858f5ba3e fix(oidc): add error log for QR login flow 2026-02-19 16:21:42 -05:00
KernelDeimos a2b9193287 clean(oidc): remove temporary debugging logs
These logs were temporary. I have a pre-merge TODO list item that says
to remove these. They were caught in review so I'm removing them early.
2026-02-19 16:21:42 -05:00
KernelDeimos d0c2e9b7fc fix(oidc): rate-limit identity for username 2026-02-19 16:21:41 -05:00
KernelDeimos 2b802143fc fix(oidc): add missing awaits 2026-02-19 16:21:41 -05:00
KernelDeimos 42d3f9e816 fix(oidc): http-only cookie sync for switch user 2026-02-19 16:21:41 -05:00
KernelDeimos b5a3323811 fix: incorrect parameters in UIWindowChangeEmail 2026-02-19 16:21:41 -05:00
KernelDeimos 2cdc211b29 fix: incorrect parameters in UIWindowChangePassword 2026-02-19 16:21:41 -05:00
KernelDeimos 298f1cdb42 fix: incorrect accessor reference in OIDCService
During development a property named `success` was inverted to a property
named `failed` which resulted in an incorrect accessor reference with a
referring piece of code that wasn't updated. This is type error.
2026-02-19 16:21:41 -05:00
KernelDeimos e145f5dcc3 dev(oidc): rewrite "Disable 2FA" window
In lieu of knowing exactly what happened (probably more than one thing),
the "Disable 2FA" window was very broken. It was blank, but then after
fixing that all the actions were broken. There wasn't much value in
keeping the implementation though, because it was already inconsistent
with other flows - instead of fixing what was there it made more sense
to re-use the pattern of UIWindowChangeUsername and UIWindowChangeEmail,
creating UIWindowDisable2FA. After testing this, it works much better
(it actaully works), but there is a caching issue unrelated to the UI
implementation.
2026-02-19 16:21:39 -05:00
KernelDeimos 4d49f5dfa6 fix: allow html property in UIComponentWindow
A component was removed and an html property was passed to
UIComponentWindow. This makes sense because UIWindow accepts an html
property, so rather than update the calling code it made more sense to
update UIComponentWindow to be more intuitive.
2026-02-19 16:13:45 -05:00
KernelDeimos 8ecd6cd13e dev(oidc): confirm email by default for OIDC 2026-02-19 16:13:45 -05:00
KernelDeimos 21e959bbaa dev(oidc): remove button to manually invoke re-auth
This button was useful during manual testing, but the re-authentication
flow for protected endpoints with OIDC users reliably invokes the popup,
so this is no longer necessary. Removing this button reduces clutter on
these screens and might make the flow easier for users to understand.
2026-02-19 16:13:44 -05:00
KernelDeimos e2068e7b9c fix(oidc): fix QR code login issues caused by OIDC
In implementing OIDC it became necessary to introduce the separation of
"GUI Tokens" and "Session Tokens". This breaks QR login because Puter
does not set the HTTP-only session cookie when logging in with this
flow.

Add a middelware to WebServerService to detect QR Code logins and set
the appropriate HTTP-only session cookie.
2026-02-19 16:13:44 -05:00
KernelDeimos 8923bdac95 refactor(oidc): update UIWindowChangePassword
Use the openRevalidatePopup function in util/openid.js within
UIWindowChangePassword instead of re-implementing that functionality.
Additionally, normalize some of the code so it is more similar to
UIWindowChangeUsername and UIWindowChangePassword.
2026-02-19 16:13:44 -05:00
KernelDeimos df1f5c44cc refactor(oidc): extract common (email + username)
There is common functionality between all of the GUI code for actions on
protected endpoints. Update UIWindowChangeEmail and
UIWindowChangeUsername to both use a new utility function called
openRevalidatePopup in util/openid.js.

This file is called `openid.js` instead of `oidc.js` so that it's more
easily recognized by contributors who might be more familiar with the
name of the organization than the name of the standard itself.

After these changes, UIWindowChangePassword and the "disable 2FA" button
in UITabSecurity still need to be updated to use `util/openid.js`
instead of duplicating this functionality.

The justification for following DRY here instead of leaving the
implementation as-is is because these flows are particularly error
prone and will be difficult to maintain without this consistency. Some
subtle bugs I previously wasn't aware of got fixed in the process.
2026-02-19 16:13:44 -05:00
KernelDeimos 0b8eafa128 dev(oidc): re-auth remaining protected endpoints
The OIDC re-authentication flow, which replaces password confirmation
for accounts that were created with OIDC and do not have a password, was
previously added to "change username" for manual testing of the
backend-side implementation. Add the re-authentication flow to the
remaining user-protected endpoints, which are:
- change password
- change email
- disable two-factor authentication

When using "change password" on a new account created via OIDC, the
account changes state to a passworded account which causes these flows
to use password confirmation as before instead of re-authentication.
2026-02-19 16:13:41 -05:00
KernelDeimos 142d745f0a fix: "Popup Closed" message, + excess logs 2026-02-19 16:10:22 -05:00
KernelDeimos 3a9a345600 tweak: make monthly username changes configurable
The monthly number of username changes was hardcoded as `2`. Being able
to configure this value makes it easier to test the username change
flow. Hosters of OSS Puter may also find this configuration beneficial.
2026-02-19 16:10:21 -05:00
KernelDeimos d532b3d47b fix(oidc): session token vs gui token issues 2026-02-19 16:10:21 -05:00
KernelDeimos 5d22ee0517 tweak: re-enable re-auth popup closing 2026-02-19 16:10:21 -05:00
KernelDeimos 4374281070 dev: add re-authentication flow for protect actions
When users make sensitive changes to their account they are asked to
re-enter their password. This prevents a hijacked session from causing
futher damage.

Users created with the new OIDC flow do not necessarily have a password
set on their account, and they need to also be able to make these
changes. While removal of the password entry requirement for these users
would solve this problem, it would also make their accounts more
vulnerable. To solve this problem while maintaining the same security
standard for OIDC users, we need them to confirm via either 2FA or
re-authentication via OIDC. Since users aren't required to have 2FA, the
re-authentication via OIDC approach is also the minimum viable solution.

This commit adds OIDC re-authentication support for all endpoints under
UserProtectedEndpointsService, and makes updates to the
UIWindowChangeUsername dialog for manual testing.

Currently this implementation fails at the final submission to change
the username because of a separate issue with the correct authentication
token not being set; this is related to the separation of GUI tokens vs
http-only tokens.
2026-02-19 16:10:21 -05:00
KernelDeimos 7c8f0d5572 dev(backend): OIDC continued [1]
This commit is rather monolithic. An attempt to split it up into smaller
changes proved too difficult (as well as frustrating) and I realized it
would absolutely increase the chance of having a broken commit (making
bisects more difficult) unless a lot of testing effort between commits
was performed, which would have very little benefit.

The changes in this commit include:
- Outcome utility used by SignupService for error handling
- SignupService, whichs implements re-usable create_user function
- Signup method in OIDCService
- flow-specific callbacks in OIDC (separates login from signup)
- **SEPARATE SESSION COOKIE AND GUI COOKIE**
  - this change "rocks the boat" the most and has the highest likelihood
    of causing problems
2026-02-19 16:10:21 -05:00
KernelDeimos 47b133d512 dev(backend): incomplete oauth2 OIDC impl 2026-02-19 16:10:20 -05:00
Neal Shah 78a4ccb9a4 make image models case insensitive for backwards compatibility reasons (#2512) 2026-02-18 17:01:50 -05:00
Miika Kuisma 1ec2aec66c Dashboard: Files tab fixes (#2508)
* Fixed issues where file list wasn't scrollable on mobile device, and tap'n'hold on file opened wrong context menu.

* Fixes text color of selected row
- [x] Fixes path navigation button transitions
- [x] Fixes path navigation button colors
- [x] Hide AppData folder
- [x] Hide hidden files
2026-02-18 12:19:46 -08:00
KernelDeimos cecb63b372 fix(backend): ESM/CJS interop is sad
Fix ESM/CJS interop issue in unit tests with a hack that checks the
class name as a string instead of just doing an `instanceof` check. This
is assuming that the "rewriter must be a PermissionRewriter" error I'm
seeing on GitHub is because there are two different "copies" of
PermissionWriter due to ESM/CJS interop issues. If this is not the case,
then you're not reading this commit message on `main`; if this commit is
on `main` then that's exactly what went down.
2026-02-17 22:19:52 -05:00
KernelDeimos 05cc4ad477 dev(puter.js): add support to request app dir
Add support for requesting access to the root directory of an app's
associated subdomain.
2026-02-17 22:19:52 -05:00
KernelDeimos bfff2d20f9 dev(backend): add /auth/request-app-root-dir
Add the ability to request an app's root directory. A permission
rewriter is provided so that apps may refer to a permission when
requesting this access without knowing the path of the app's root
directory.
2026-02-17 22:19:52 -05:00
KernelDeimos d21ed31d67 dev(backend): add debug mode for 403 responses 2026-02-17 22:19:52 -05:00
Daniel Salazar 5df1ca88ca feat: sonnet-4.6 support (#2506)
* feat: sonnet-4.6 support

* fix: tests
2026-02-17 12:10:50 -08:00
9d598f7965 Files tab for dashboard view (#2331)
* Dashboard - Added files tab with basic folder and files listing.

* clearing out some linter errors

* Removed Public folder for now

* Added "modified" column
Subfolder are listed before the files

* Dashboard - files tab: context menu basics

* Dashboard - Files tab: subfolders can be opened. Items can be opened from more-menu or by double clicking on them

* Dashboard - Files tab: use UIContentMenu instead of custom menu for "more menu"

* Dashboard - Files tab: Delete implemented, Trash folder added

* refactored context menu rendering

* Implemented UIItem context menu functionalities
Added path

* Rename files and folders

* Rename fix

* tweaks and fixes

* WIP: Multiple selection, drag and drop, trash folder improvements

* clean

* Files handling improvements

* empty trash fix

* grid view

* grid view improvements

* update icons
context menu for multiple items shows file counts such as: Delete (9)

* Path navifation buttons

* better way to get user's directories

* Added icons for various file types

* Use puter.kv instead of window.user_preferences

* sorting and column resizing

* documentation of the functions

* Style update. Dashboard colors now as CSS variables

* refactored restoring from trash and emptying trash with proper callbacks & refreshing

* select documents folder by default
style tweaking

* Drag to select files and folders

* dark mode

* style tweaks

* removed some dead code..

* Keyboard shortcuts (copied from UIWindow - untested & in progress)

* Add drag-and-drop file upload support to Dashboard

Implement native file drag-and-drop from local filesystem to Dashboard:
- Add dragster handlers for main content area, sidebar folders, and folder rows
- Create uploadFiles() method with progress modal and directory refresh
- Add visual feedback CSS for drop zones (highlight on hover)
- Fix subfolder drop detection to prevent duplicate uploads
- Add callback support to unzipItem/untarItem for directory refresh

Co-Authored-By: Claude Opus 4.5 <[email protected]>

* style tweaks

* Fix cut/paste functionality in Dashboard

The cut operation was storing clipboard items as plain path strings, but
window.move_clipboard_items() looks for .item DOM elements which don't
exist in Dashboard (it uses .row elements). Added a Dashboard-specific
moveClipboardItems() method that calls puter.fs.move() directly with UIDs,
and updated cut to store objects with path and uid like copy does.

Co-Authored-By: Claude Opus 4.5 <[email protected]>

* Add mobile phone layout optimizations for Dashboard

- Add responsive CSS for screens ≤480px with two-row file list layout
- Wrap item-size and item-modified in item-metadata div for mobile grid
- Hide directories sidebar on mobile (use breadcrumbs for navigation)
- Reorganize header with breadcrumbs on top row, nav buttons below
- Add single-tap to open folders on touch devices
- Fix context menu "Open" action in Dashboard by adding onOpen callback
- Hide column headers on mobile since metadata is shown per-item

Co-Authored-By: Claude Opus 4.5 <[email protected]>

* Add CSS variables to Dashboard bento elements for dark mode support

Replace hardcoded color values with CSS custom properties throughout
the bento card components to enable proper dark mode theming. Adds new
variables for icon shadows, fancy headers, gradients, and usage bars
with appropriate values for both light and dark color schemes.

Co-Authored-By: Claude Opus 4.5 <[email protected]>

* Add spacebar image preview feature to Dashboard Files

Pressing spacebar on a selected image file now shows a full-size preview
popover centered over the files container. Features include:
- Toggle behavior: press spacebar again to close
- Auto-switch: selecting another file updates the preview
- Click outside to dismiss
- Works in both grid and list view

Co-Authored-By: Claude Opus 4.5 <[email protected]>

* Add floating action bar for multi-file selection in Dashboard Files

When 2+ files are selected, a floating action bar appears above the footer
with quick access buttons for common operations:
- Download, Cut, Copy, Delete for normal files
- Restore and Delete Permanently for items in Trash

The bar slides up with a smooth animation and disappears when clicking
the background to deselect. Includes mobile-responsive styling with
icon-only buttons on smaller screens.

Co-Authored-By: Claude Opus 4.5 <[email protected]>

* Add mobile select mode for multi-file selection in Dashboard Files

On mobile devices, users can now tap a select button in the path actions
to enter select mode. In this mode, tapping files toggles their selection
instead of opening them, with checkboxes appearing next to each item.
The floating action bar appears with 1+ selected items (vs 2+ on desktop)
and includes a Done button to exit select mode.

Co-Authored-By: Claude Opus 4.5 <[email protected]>

* Center empty directory message in Dashboard Files

Replace row-based layout with centered flex positioning for the
"No files in this directory" message, improving visual presentation.

Co-Authored-By: Claude Opus 4.5 <[email protected]>

* Fixed issue where clicking on files background created blue dot (drag rectangle selection bug)

* Image preview size tweak

* Add URL-based routing to Dashboard with hash fragments

Enable shareable/bookmarkable URLs for Dashboard tabs and file paths.
The URL hash reflects current location (e.g., #files/username/Documents,
#usage, #account). Browser back/forward navigation now works for folder
navigation, and direct URL entry loads the correct tab and path.

Co-Authored-By: Claude Opus 4.5 <[email protected]>

* fixing draggable styles

* drag clone fixes

* Add smart column resizing and filename truncation to Dashboard Files

- Add middle-truncation for filenames preserving extensions (e.g., "longfile…name.txt")
- Double-click column resize handles to auto-fit content width
- Reset saved column widths to defaults if they don't fit smaller screens
- Apply truncation to both list and grid views

Co-Authored-By: Claude Opus 4.5 <[email protected]>

* Separated dashboard styles into dashboard.css and loading it dynamically only when navigating to /dashboard

* Files and folders can be dropped over path items in order to move them. This is useful when you want to move items into parent folders.

* Use custom context menu component for item-more menu on mobile devices

* Created callback system to undo_last_action so that dashboard file list would always refresh after undo operation

* gray update

* hovering folder while dragging items opens the folder

* Fixed issue with hover-dropping

* Fixed chained drag-over-folder-and-hover system

* dark mode tweak

* - [x] Right clicking on background of an empty folder doesn't trigger context menu
- [x] Right clicking on path should keep path item active
- [x] Sidebar folder don't have context menu
- [x] Drag item should be opaque so I can see through it
- [x] Transition animation issue when hovering path action buttons
- [x] Double clicking on column resizer: add padding
- [x] Load dashboard.css before loading the page content
- [x] Mobile: opening menu, clicking outside menu should close it
- [x] Mobile: on smaller screen there should be still two columns
- [x] Mobile: file name truncation in grid view doesn't work

* Added missing badges

* WIP has_worker

* display worker icon on the .js files which are workers

* Display worker badge on worker files, hovering badge shows worker URL.
Worker URL added to file properties modal.

* disable "publish as website" from context menu for folders that are already published

* Loading spinner for Files

* tweaks and fixes

* Files clean loading spinner

* Files: worker URL in the properties modal is clickable link

* use custom tooltip to display worker URL

* refactored renderDirectory

* Fix Sidebar folder highlighting

* add Beta badge on Files tab

* Implemeting socket based item updating

* Put newly added items into the position where they would land when list is sorted

* restore from trash refresh fix

* Revert "Revert "Adds worker badge to .js files which have been registered as workers. Hovering badge shows popover with worker URL. File properties modal also shows clickable worker URL. (#2462)""

This reverts commit c2750f2ca1.

* worker in stat

* update puterjs and frontend code to support returnWorkers in stat

* Better way of handling worker info

* Fixed issue where right clicking on background opened two instances of a context menu

* Fixes issue where while renaming a file, double clicking on word opened the file

* fixes issue where while dragging multiple items the top-most item was transparent resulting blurry mess

* when opening a folder, update view instantly

* Improved drag-to-select items

* Added feature where typing selects matching file items
Fixed issue where keyboard listener for file list was active when context menu was open

* Fixed issues with File -> New in context menu
Fixes issue where files-selection-actions menu didn't disappear after deleting items

* Improved drag to select behavior
Improved drag items
Improved worker badge handling

* Cancel zone for dragging items (when spring-loading subfolders)

* context menu's submenu tweak

* Fixed issue where resizing window didn't work (when using "Open in New Window" from context menu)

* Disabled buttons on .files-selection-actions while drag-to-select is happening

* Fixes issue where creating new items using right-clicking re-rendered the directory view

---------

Co-authored-by: Claude Opus 4.5 <[email protected]>
Co-authored-by: ProgrammerIn-wonderland <[email protected]>
2026-02-17 10:50:08 -08:00
Neal Shah 4279cd92df WebDAV don't fetch thumbs or associated apps (#2505) 2026-02-17 01:53:59 -05:00
Neal Shah 2fe4ed50c3 WebDAV don't fetch subdomains (#2504) 2026-02-17 01:47:43 -05:00
Neal Shah 562671e498 add extra permission check for granted apps (#2503) 2026-02-17 01:29:54 -05:00
Daniel Salazar 00befdc192 fix: allow b64 srings without mime type for app icons (#2502) 2026-02-16 19:28:44 -08:00
Daniel Salazar 44bb5953b4 fix: app icon origin (#2500)
* fix: app icon origin

* fix: app icon origin size
2026-02-16 12:35:30 -08:00
Daniel Salazar 32682e73eb perf: improve app open time (#2490) 2026-02-16 11:00:32 -08:00
KernelDeimos d9167744ef patch(puterfs): limit directory depth to 35
This is a temporary measure while we fix a production issue.
2026-02-13 20:53:56 -05:00
Neal Shah c87506c7d8 workers ai realias - to dot (#2493) 2026-02-13 16:40:10 -08:00
Neal Shah 0f97653b4c fix stat options when stat(path, options) (#2492) 2026-02-13 15:38:56 -08:00
Neal Shah a211aa04bc add more alises (#2491) 2026-02-13 13:46:42 -08:00
Neal Shah f65ab05b40 Add workers AI image model support (#2489) 2026-02-13 13:07:50 -08:00
Jatin SharmaandReynaldi Chernando 9a47bf16da Bundle docs CDN assets locally for full offline support (#2473)
* docs: bundle CDN assets locally for full offline support

* fix

* fix

* fix

* revert accidental package-lock.json changes

---------

Co-authored-by: Reynaldi Chernando <[email protected]>
2026-02-14 02:14:46 +07:00
Daniel Salazar 809d375854 fix: don't stream back bytes for icons (#2486)
* decrease global check alerts

* fix: don't stream back bytes for icons
2026-02-12 23:34:37 -08:00
Daniel Salazar 4136cb1d24 fix: do not await for puter icon write in db (#2485) 2026-02-12 22:43:23 -08:00
jelveh f1a8fdb5c8 Trigger in-app upgrade flow for app env
Handle upgrade flow when running in the app environment by calling await puter.ui.requestUpgrade() in driverCall_. Added app-specific branches in two places where usage/insufficient-funds were previously handled only for web (which showed a web dialog). This ensures the in-app UI is used for upgrade requests and awaits the result.
2026-02-12 21:45:03 -08:00
jelveh b4c58c4f5c Update UITabUsage.js 2026-02-12 18:09:52 -08:00
jelveh 286895ff66 Disable publish worker UI badge updates
Temporarily comment out code in UIWindowPublishWorker that updates item UI after publishing: hiding the lines that show the item website badge, show per-item website-url badges, and set the data-website_url attribute. This prevents the publish worker from automatically modifying those DOM elements/attributes (kept commented for potential rollback or debugging).
2026-02-12 16:45:23 -08:00
Neal Shahandjelveh a23f272fd2 add sandboxing by default in god mode created workers (#2481)
* add sandboxing by default in god mode workers

* closes #2481

* Update UIWindowPublishWorker.js

* Add sandbox option to worker publish UI

Add a collapsible 'Advanced' section with a 'Sandboxed' checkbox (checked by default) to UIWindowPublishWorker. On publish the code reads the checkbox state and builds createOptions ({ sandbox: true } or { sandbox: false }) and passes it to puter.workers.create as an argument so workers can be created in sandboxed or non-sandboxed mode. Small UI styling and markup for the details/summary block included.

---------

Co-authored-by: jelveh <[email protected]>
2026-02-12 16:06:40 -08:00
Daniel Salazar 354ac314a9 feat: subdomain error redirect (#2483) 2026-02-12 15:39:18 -08:00
Daniel Salazar 1292148b41 fix: app-icons protocol (#2480) 2026-02-12 13:47:23 -08:00
jelveh 9991d58613 Refine 'listing-rejected' email copy 2026-02-12 12:49:13 -08:00
Daniel Salazar 8a6d07ec1f fix: app icon again (#2478) 2026-02-12 12:07:03 -08:00
Daniel Salazar bfd8a4e16d fix: app icons saving (#2477) 2026-02-12 11:55:27 -08:00
Neal Shah 36b1499819 Ns/workers in stat attempt 2 (#2476)
* worker in stat

* add returnWorkers to stat

* workers in readdir
2026-02-12 10:45:22 -08:00
Neal Shah b209a94a80 dedup image models (#2475) 2026-02-12 10:39:23 -08:00
Het Savani 5cd731db3d feat(start-menu): add "Add to Desktop" option for all apps (#2386) 2026-02-11 21:59:14 -08:00
Daniel Salazar 1d22ab5fb7 cleanup: remove thumbnail service for client side thumbnails (#2468)
* cleanup: remove thumbnail service for client side thumbnails

* fix: emit thumbnail create event and not just use raw data

* fix: broken test
2026-02-11 17:12:47 -08:00
jelveh cbab7a30e2 Emit user signup success event 2026-02-11 16:53:31 -08:00
Daniel Salazar d7a3f61902 fix: false alarm from openrouter (#2470) 2026-02-11 16:49:42 -08:00
Neal Shah d024fdda0d Add cache tokens for grok 3 mini fast (#2469) 2026-02-11 16:49:12 -08:00
jelveh 292603af96 Merge branch 'main' of https://github.com/HeyPuter/puter 2026-02-11 15:14:02 -08:00
jelveh c2750f2ca1 Revert "Adds worker badge to .js files which have been registered as workers. Hovering badge shows popover with worker URL. File properties modal also shows clickable worker URL. (#2462)"
This reverts commit 50e2d275bc.
2026-02-11 15:13:56 -08:00
Daniel Salazar 0a594bdfc3 fix: metering alerts for missing costs (#2466) 2026-02-11 15:03:23 -08:00
Neal Shah 81c88c1434 add extra model details, update grok models (#2465) 2026-02-11 13:55:20 -08:00
Daniel Salazar afeac494ac feat: remove file cache service (#2464) 2026-02-11 12:57:10 -08:00
Miika Kuisma 50e2d275bc Adds worker badge to .js files which have been registered as workers. Hovering badge shows popover with worker URL. File properties modal also shows clickable worker URL. (#2462) 2026-02-11 12:02:10 -08:00
Daniel Salazar 512986880b feat: app icons in subdomain (#2461)
* feat: app icons in subdomain

* fix: imports

* fix: icon location
2026-02-10 19:04:15 -08:00
Neal Shah 56ee3d23df Ns/web dav range fixes (#2459)
* better calculation for ContentLength

* lets try that again
2026-02-10 16:11:01 -08:00
Neal Shah 4f84decdec fix tool call blank content (#2458) 2026-02-10 14:14:27 -08:00
Neal Shah e55829623f Revert "allow empty message (#2455)" (#2457)
This reverts commit 7880ade5d7.
2026-02-10 14:01:31 -08:00
Daniel Salazar 5e8ce3a021 fix: decrease large error log from wrong model (#2456)
* [PUT-471] feat: estimate and bill input for gemini imgaes :dev:

* fix: decrease large error log from wrong model
2026-02-10 13:36:35 -08:00
Neal Shah 7880ade5d7 allow empty message (#2455) 2026-02-10 12:53:56 -08:00
Daniel SalazarandProgrammerIn-wonderland 91afa2c356 [PUT-471] feat: estimate and bill input for gemini imgaes :dev: (#2453)
* [PUT-471] feat: estimate and bill input for gemini imgaes :dev:

* [PUT-472] add input/output costs to openai image models too

* npm version bump

* remove second url log

* fix gemini pro image

---------

Co-authored-by: ProgrammerIn-wonderland <[email protected]>
2026-02-10 12:52:33 -08:00
Reynaldi Chernando febcceb042 Fix auth type typo (#2454) 2026-02-10 10:00:53 -08:00
Neal Shah 4fb84bc117 add configurable backend (#2452) 2026-02-09 21:47:12 -08:00
jelveh 4a4ca331e5 Persist api_origin during auth flow if provided in url 2026-02-09 21:15:01 -08:00
KernelDeimos e5750d8eb7 fix: add explicit handling for access token in ACL
For reasons still unknown, there are circumstances where the permission
scanner denies permission to access tokens that should have been granted
permission. This change de-abstracts/flattens the logic for checking
access tokens so that it is easier to understand and maintain. The newly
implemented code does not suffer from the same issue.
2026-02-09 18:26:03 -05:00
Reynaldi Chernando e2ccaadf2f Fix gemini 3 pro image model name (#2450) 2026-02-09 12:24:40 -08:00
jelveh 102592bc18 Increase dialog popup height to 700 2026-02-08 23:10:05 -08:00
Daniel Salazar f9805dfffb fix: decrease log usage (#2449) 2026-02-08 22:26:23 -08:00
Daniel Salazar 380e72cad2 fix: axiosRequest log dumping b64 urls (#2448) 2026-02-08 21:47:04 -08:00
jelveh 53647a0f5b Update UIWindowEmailConfirmationRequired.js 2026-02-08 21:04:43 -08:00
stuffbymax 7c9bbd4336 Add shell reload instructions for nvm setup (#2446)
Added instructions to reload the shell after loading nvm. 
i forgot to add it because i am stupid
2026-02-08 19:31:46 -08:00
Nariman Jelveh 362e4d4636 Merge branch 'main' of https://github.com/HeyPuter/puter 2026-02-08 18:39:47 -08:00
Nariman Jelveh 32b83bae58 Preserve full redirect URL and forward reload flag 2026-02-08 18:39:36 -08:00
Daniel Salazar 7d84d7a46b fix: dev center emails (#2447) 2026-02-08 18:37:32 -08:00
stuffbymax 2eff1386d1 Create installation guide for Node.js and npm
Added comprehensive installation guide for Node.js and npm across various Linux distributions.
2026-02-08 15:31:48 -05:00
stuffbymax ac35b672de Add npm and node installation instructions
Added installation instructions for npm and node.
2026-02-08 15:31:48 -05:00
KernelDeimos f429d5f76a chore: fix eslint issues 2026-02-08 15:27:11 -05:00
Nariman Jelveh 74c23f609e Set email confirmation default to false
Change default behavior for email confirmation by initializing email_confirmation_required to 0 (not required) instead of 1. Remove the duplicate declaration and clarify the comment; existing logic still overrides this default (sets to 0 for matching pseudo_user/uuid_user and to 1 when event.requires_email_confirmation). Minor whitespace cleanup.
2026-02-08 12:02:23 -08:00
Nariman Jelveh d8a586ad66 Update UIWindowSignup.js 2026-02-08 10:56:59 -08:00
Zachary a875524a85 Update french translations (#2445) 2026-02-08 10:53:36 -08:00
Nariman Jelveh f9c35b4fae Improve email confirmation window layout and options 2026-02-08 10:32:01 -08:00
Daniel Salazar de7e831eff fix: gemini via openrouter models (#2438)
* fix: gemini

* feat: let logservice log to console

* fix: log

* feat: dev-center emails
2026-02-08 01:42:31 -08:00
Nariman Jelveh 4e88d28ecb Reload on signup unless embedded popup 2026-02-07 19:18:27 -08:00
Nariman Jelveh cfc56877e2 Store email confirmation flag on signup 2026-02-07 19:15:59 -08:00
Nariman Jelveh 873da5ae61 Honor event.requires_email_confirmation flag 2026-02-07 19:00:19 -08:00
Neal Shah ce96fb54ae Update error message for email confirmation (#2442) 2026-02-07 18:51:49 -08:00
Nariman Jelveh 934886d861 Add email confirmation dialog & checks 2026-02-07 18:51:11 -08:00
Neal Shah 8e3d285671 merge users (#2441) 2026-02-07 18:44:31 -08:00
Nariman Jelveh f6531d29f0 Send app token to opener and close popup
After a successful flow, fetch the user app token for the opener origin, cache the returned app_uid on window.host_app_uid, and post a 'puter.token' message to the opener containing success, msg_id, token, username, and app_uid. If the action is absent or equals 'sign-in', close the popup window. This enables parent windows to receive credentials in popup/embedded auth flows.
2026-02-07 17:58:24 -08:00
Nariman Jelveh 6be60f6973 Hide Turnstile captcha when showing signup 2026-02-07 17:39:22 -08:00
Neal Shah 262e31a6a6 Ns/service guard (#2440)
* add enforcer mechanism

* update better-sqlite3
2026-02-07 17:24:09 -08:00
Nariman Jelveh 48e37251df Return JSON errors for signup and handle in GUI 2026-02-07 16:41:59 -08:00
Neal Shah 03827e4197 Increase opus 4.6 max tokens (#2439) 2026-02-07 13:05:07 -08:00
KernelDeimos 020a64dbbd fix: ensure cache invalidation when verifying OTP
It is possible this broke after redis caching was employed because it
broke the expectation that assignments to attributes on cached objects
would remain for future accesses on said objects. This has not been
confirmed as the cause.
2026-02-06 23:42:47 -05:00
Neal Shah ac8456f8d3 Restrict apps from using /puterai/openai/v1 (#2435) 2026-02-06 18:43:18 -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
Sanjeev 06fe07e384 fix: auto-collapse playground menu on mobile (#2430) (#2431)
* fix: auto-collapse playground menu on mobile (#2430)

* style: remove unused code reference after review
2026-02-07 01:30:19 +07:00
Reynaldi Chernando 10e1999304 Update puter-js readme for getAuthToken (#2417) 2026-02-06 17:49:30 +07:00
Daniel Salazar fbb2080a66 fix: don't use ai aggregators if we have the model ourselves (#2424)
* cleanup: eslint changes

* fix: don't use ai aggregators if we have the model ourselves
2026-02-05 16:30:45 -08:00
Daniel Salazar 5fdfae6087 fix: usage limited error handling (#2423) 2026-02-05 15:15:27 -08:00
Reynaldi Chernando da0907d3c5 Document getAuthToken for web based login (#2418) 2026-02-06 01:59:39 +07:00
Neal Shah 15bd2ec5ac opus 4.6 fix billing (#2422) 2026-02-05 10:21:09 -08:00
Neal Shah e3db664690 Ns/opus 4.6 (#2420)
* add opus 4.6

* remove log from webserver service
2026-02-05 10:08:52 -08:00
Neal Shah f8f134412f web-cdn-test (#2414)
* web-cdn-test

* fix tests
2026-02-04 16:29:27 -08:00
Daniel Salazar e9d0bdf19b feat: add alerting for usage abuse (#2413) 2026-02-04 13:08:18 -08:00
KernelDeimos b8bdc16a03 fix: move readdir-subdomains to ESM
This also causes the filename to have the extension `.mjs` instead of
`.js`, as well as an await added in FilesystemAPIService. Luckily
lifecycle events are async so this didn't cause any problems.

I add this change somewhat reluctantly because this _should_ be a
non-functional change. Technically adding the `await` in
FilesystemAPIService makes it possible (albiet incredibly unlikely) for
some subtle bug or change in behavior to be introduced.
2026-02-04 14:13:43 -05:00
KernelDeimos acb5fa512c clean: log removal and formatting changes 2026-02-04 14:13:43 -05:00
KernelDeimos 13fc737ca0 clean: remove debug logs added to /readdir-subdomains 2026-02-04 14:13:43 -05:00
KernelDeimos 1cda9b7ba8 dev: implement GUI behavior to fetch subdomains later
This change makes GUI invoke readdir without fetching subdomains, and
then fetch subdomains after. This allows displaying the directory items
sooner and then later populating the icons with glyphs to indicate if
there is an associated subdomain.

This was AI-assisted with manual modifications and bug fixes as
necessary.
2026-02-04 14:13:43 -05:00
KernelDeimos 0a694154b1 dev: add /readdir-subdomains endpoint
This endpoint can be called to get subdomain information after
performing a readdir without fetching subdomains.

This was AI-assisted with modifications and bug fixes as necessary.
2026-02-04 14:13:43 -05:00
KernelDeimos d94e3f45ac dev: add readdirSubdomains 2026-02-04 14:13:43 -05:00
KernelDeimos a4088023a3 dev: add parameter to exclude fetching subdomains
This parameter will allow readdir requests to not include subdomain
fetching, which will allow for the later effort of fetching subdomains
for directory listings in the gui with a separate request.
2026-02-04 14:13:43 -05:00
Daniel Salazar eead0fdfa9 fix: redis cache for user (#2409) 2026-02-03 17:47:43 -08:00
KernelDeimos 5433dde6d7 dev(extensions): [+] dev-socket
This extensions brings back the dev-socket functionality, which is
really important when testing things like broadcast, alarms, events, etc
; it saves a lot of time if you can invoke a command directly to the
backend.

This is an optional extension that will not be included in production
deployments. This is for development purposes only.
2026-02-03 19:39:07 -05:00
KernelDeimos de7fbced6b log: add debug logs for BroadcastService
These will be more important now that we're changing the transport for
broadcast messages between instances from websockets to webhooks.
2026-02-03 19:39:07 -05:00
KernelDeimos 3a7314d119 dev(backend): add send support for webhook broadcast
This still needs to be tested. I was going to test this using the `test`
command registered by BroadcastService that exists for this purpose but
`dev.sock` doesn't seem to be working anymore.

Why wasn't `dev.sock` working? Well... we deleted all the code that
makes it work. Why did we delete it? That question isn't a setup for my
next statement; I genuinely do not know. The whole point of dev.sock was
so we could remove the dev console but still maintain support for this
commandline interface that's absolutely needed for testing things that
aren't accesible directly from Puter's GUI.
2026-02-03 19:39:07 -05:00
KernelDeimos a40ec79d66 dev(tools): script to manually test broadcast webhooks
This tool makes it possible to manually test webhook support in
BroadcastService without running multiple Puter instances. This helps to
verify the functionality without setting up multiple Puter peers
locally.
2026-02-03 19:39:07 -05:00
KernelDeimos 47432853c4 dev(backend): add broadcast webhook endpoint
This commit adds the "receive" side of webhook support for
BroadcastService, which will eventually make broadcasting stateless and
not requiring of persistent connections.

Some specific considerations taken into account include:
- incremental nonce to prevent replay attacks
- request timestamp to prevent nonce-reuse after restarting
- HMAC signature to ensure authorized peer

Known limitations:
- if instances run indefinitely, eventually the nonce value would wrap
  around to zero and broadcasts would stop working. It is assumed that
  9 quintillion requests in the lifetime of an instance is reasonably
  impossible.
2026-02-03 19:39:07 -05:00
Daniel Salazar e938d5183a fix: limit open router expensive models for now (#2407)
* fix: limit open router expensive models for now

* fix: import extension
2026-02-03 14:43:15 -08:00
Neal Shah 665aee735b dav.puter.com CORS headers (#2406)
* webdav cors stuff

* if OPTIONS request just let it through
2026-02-03 14:13:42 -08:00
KernelDeimos cbde123aa1 fix(backend): undo part of 35461a0
It turns out this part of `35461a0` was not necessary to fix this issue,
and the code is still more correct if it falls true when the token's
authorizor has a permission granted.
2026-02-03 15:46:30 -05:00
KernelDeimos 8cd0a7f76b dev(backend): clear cache when revoking tokens 2026-02-03 15:46:30 -05:00
KernelDeimos 5fd1e9b6a6 dev(puter.js): add revokeReadURL 2026-02-03 15:46:30 -05:00
KernelDeimos 3ffe8eaf30 dev(backend): add revoke_access_token endpoint 2026-02-03 15:46:30 -05: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 a4b90083e0 Revert "fix: missing redis changes (#2401)"
This reverts commit 07a389798d.
2026-02-03 12:43:00 -05:00
Daniel Salazar 07a389798d fix: missing redis changes (#2401) 2026-02-03 02:55:44 -08: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
KernelDeimos 5250671b01 fix: range headers in file.js
Range header support was mostly incorrect, which brought to surface
undefined behavior in OnlyOffice which resulted in a request hanging.
This was the cause of the `pdf-editor` app hanging for a while when
opening it with a new file.
2026-02-02 20:08:02 -05:00
Daniel Salazar e2e4794bbc fix: alerting for metering (#2399) 2026-02-02 15:38:45 -08:00
Neal Shah fa76c21300 WebDAV post migration fixes (#2398) 2026-02-02 11:48:16 -08:00
jelveh 7aedeae991 Pass redirect_url to UIWindowSessionList 2026-02-02 09:24:21 -08:00
Neal Shah bf233c8fe0 Add X-EXPECTED-ENTITY-LENGTH for HTTP/2 connections on webdav for predictive file length (#2396) 2026-02-02 07:52:56 -08:00
Neal Shah 3d34b36159 Add more coersions to responses toolcalling support (#2395) 2026-02-02 07:45:56 -08:00
jelveh 6bd64808df Add redirect_url handling and adjust auth flow
Set and propagate a redirect_url for auth flows and use it when navigating after login/signup to avoid leaking sensitive data.
2026-02-02 00:16:35 -08:00
Neal Shah 7cce0705d3 Add back worker redeploy notification (#2394) 2026-02-01 21:57:23 -08:00
Daniel Salazar afbb76f95f fix: ai metering (#2393)
* fix: expose getUserService in extension typings

* fix: ai metering
2026-02-01 18:14:14 -08:00
Nariman Jelveh b15b466d36 Update TabAccount.js 2026-02-01 17:48:57 -08:00
Neal Shah 5216cccbce More Anthropic tool calling coercions (#2392) 2026-02-01 17:29:22 -08:00
Neal Shah 9e9a7b4dcf Fix tests for ChatAPIService (#2391)
* Fix tests for chatapiservice

* Anthropic Claude Provider fixes for toolcalling in OpenAI completions compatible service
2026-02-01 17:04:16 -08:00
Neal Shah 3a0f466ef6 OpenAI chat interface API concept (#2390) 2026-02-01 15:46:23 -08:00
Nariman Jelveh 6fbe83d982 Show cancelled state in auth window
When the user clicks Cancel in the authorization window, the code now disables action buttons and replaces the window body with a cancellation UI (header with icon, title, description and a message). Added corresponding English i18n keys (authorization_cancelled, authorization_cancelled_desc, authorization_cancelled_message) to provide localized text for the new cancelled state.
2026-02-01 15:34:02 -08:00
Neal Shah be290e2d3c fix typo gemini service (#2389) 2026-02-01 14:24:48 -08:00
Nariman Jelveh a92bbc4ec2 Disable dragging for AuthMe window 2026-02-01 13:43:46 -08:00
Nariman Jelveh 1e6521927f Add UIWindowAuthMe authorization dialog
Introduce a new UIWindowAuthMe component that displays a security-focused consent dialog for redirecting to third-party URLs with the user's auth token. Adds related i18n strings and integrates the dialog into initgui, replacing the previous UIAlert confirm flows; when approved (resolves true) the token is appended to the redirect URL and navigation proceeds. Changes: adds src/gui/src/UI/UIWindowAuthMe.js, updates src/gui/src/i18n/translations/en.js, and imports/uses the new dialog in src/gui/src/initgui.js.
2026-02-01 13:26:13 -08:00
Nariman Jelveh 4b8c46efc8 Add UI to view and copy auth token
Introduce a new UIWindowCopyToken component to display the user's auth token with a copy-to-clipboard button and confirmation message. Integrate the token UI into the account dashboard (TabAccount) by adding an auth token card and click handler to open the window. Add corresponding i18n keys (auth_token, token_copied, copy_token_message, copy_token_description) and import the new window in initgui. Also wire the global action 'copyauth' to show the token dialog and adjust session/login flow so the session list/login windows respect the action (avoid auto-reload when showing the token dialog). Minor UI string cleanup to use i18n('approve') directly.
2026-02-01 13:02:25 -08:00
Nariman Jelveh bfea66a1d6 Serve HTML success page on auth callback
Replace the plain text response with a styled HTML confirmation page for the local authentication callback. The handler now sets Content-Type to text/html and returns a responsive, animated "Authentication Successful" page (with checkmark graphic and Puter branding) while preserving the existing token extraction from the callback URL's search params.
2026-02-01 12:34:26 -08:00
Neal Shah 22606f29b2 getAuthToken on node package (#2388) 2026-02-01 12:03:30 -08:00
Nariman Jelveh 97cf80b068 Support authme action from URL query
Read the 'action' value from URL query params and handle a new 'authme' action. When 'authme' is present, prompt the user to approve redirecting to the provided redirectURL; if approved, append the current auth token as a 'token' query parameter and navigate to that URL. The prompt is shown in two places (after auth data is updated and before loading the desktop) to cover different entry flows. Also removed a stray blank line.
2026-02-01 11:51:29 -08:00
Daniel Salazar 114fbff2cd fix: expose getUserService in extension typings (#2385) 2026-01-31 13:19:28 -08:00
Daniel Salazar 7a9302f479 [PUT-487] fix: set max-min on app-user-count queries 🐛 (#2384) 2026-01-31 00:52:53 -08:00
Neal Shah af62835d48 video model costs (#2383) 2026-01-30 12:03:36 -05:00
Neal Shah aa508a74dc puter x-expected-entity-length for site (#2379) 2026-01-30 11:34:32 -05:00
Daniel Salazar e1b52a9828 cleanup: remove informationService in favour of existing helper methods and logic (#2374) 2026-01-29 17:25:28 -08:00
velzieandNeal Shah 1e1de413c5 Add canonical puterId to image provider models (#2322)
* add canonical puterId to image provider models

* return fully qualified puterIds in AIImageGenerationService.list()

* add aliases to openai image models

---------

Co-authored-by: Neal Shah <[email protected]>
2026-01-29 14:47:51 -05:00
Daniel Salazar de14bf7273 fix: match override properly (#2373) 2026-01-28 22:45:11 -08:00
Devansh DubeyandReynaldi Chernando fecd67a196 fix(resume-analyzer): add preprocessing for DOCX and TXT files (#2359)
* Update ai-resume-analyzer.html

* Cleanup comments and update to haiku 4.5

---------

Co-authored-by: Reynaldi Chernando <[email protected]>
2026-01-29 13:38:35 +07:00
Daniel Salazar 5a8e9063ec fix: map again (#2372) 2026-01-28 22:34:45 -08:00
Daniel Salazar 4aa2039956 fix: cost mapping for together ai from openai sdk (#2371) 2026-01-28 22:20:59 -08:00
Daniel Salazar 40f805f64b [PUT-475] fix togetherai chat being broken + deprioritize them 🐛 (#2369) 2026-01-28 22:04:06 -08:00
Daniel Salazar 6daac664c6 fix: remove rate limit await on writes (#2368)
* otel: logs and spans for dynamo db

* fix: imports

* fix: add more logging

* fix: import paths

* fix: console log

* fix: better logs

* fix: logging

* fix: remove rate limit await on writes

* cleanup, remove uneeded spans in ddb client
2026-01-28 16:13:53 -08:00
KernelDeimos 35461a0345 fix: app-under-user access token ACL
There were a couple issues with ACL where access would be denied to app
tokens within access tokens, caused by:
- incorrect recursion: only `false` was considered when in fact the
  result from the recursive call is appropriate
- files without a known path are incorrectly handled, which can happen
  when iterating over parent directories
2026-01-28 16:00:01 -05:00
Arya DasguptaandReynaldi Chernando 0028b41fe3 docs: add example for streaming with function calling (#2365)
* docs: add example for streaming with function calling

* Minor fix and add example to playground

---------

Co-authored-by: Reynaldi Chernando <[email protected]>
2026-01-28 18:01:28 +07:00
jelveh fc8117df1e add login indicator with animated spinner 2026-01-27 23:39:18 -08:00
Daniel Salazar 89c49902b6 otel: add spans to all kv methods (#2358) 2026-01-27 19:16:04 -08:00
Daniel Salazar 4183d5de06 [PUT-466] fix: count request costs in openrouter models with request cost present (#2356) 2026-01-27 18:32:43 -08:00
Daniel Salazar cc5285f88a fix: only rate limit login when failed (#2355) 2026-01-27 18:24:05 -08:00
KernelDeimos e7443338fb fix: more reliable 404 responses for .api endpoint
This fix avoids some situations where a non-existing route hangs instead
of responding with 404.
2026-01-27 15:46:28 -05:00
KernelDeimos a8dc62ef80 fix: header resend issue with catch-all handler
WebDAVService catches `/*`, which shouldn't be a problem because it is
on the `dav.` subdomain - however, other middlewares were being invoked
before the subdomain check. Thanks to the `'route'` parameter for the
`next` function we can handle subdomain checks in a more reliable way
2026-01-27 15:46:28 -05:00
Lui DuarteandDaniel Salazar bbe6f9dc27 Feat: Add system info (Client + Server metrics) (#2311)
* Add ststem info to user options extensions - Add UIWindowSystemInfo, add ui sections for client and server, add basic getClientinfo function

* Fix typo

* Replace accidentally deleted es.js file

* Refactor client information to be consistant with project standard

* Complete Client information in ststem information window

* Remove console logs

* Add basic api functionality for getting server system information

* Structure return data from system server information endpoint | Add copyright to UIWindowSystemInfo

* Add function to format server system api data | Add loading element to server container while waiting for data | Complete System Information

* fix: disallow non admin for backend + move to extensions

---------

Co-authored-by: Daniel Salazar <[email protected]>
2026-01-27 10:29:02 -08:00
ProgrammerIn-wonderland bbe1242eff Move webdav to dav.puter.com 2026-01-27 20:31:32 +05:30
KernelDeimos 404a5e9050 dev: fix issues with dns lookup, remove fallback
This is the effort remaining to bring back URL parameters to drivers
which support them. This fixes the implementation for DNS resolution
resulting in errors for undefined IP addresses when DNS resolution is
successful.
2026-01-26 15:01:22 -05:00
KernelDeimos 72078d3bc1 wip: try to resolve DNS with cloudflare DNS 2026-01-26 15:01:22 -05:00
KernelDeimos b935006ee7 Revert "fix: disable requests from server in two services"
This reverts commit de77b11954.
2026-01-26 15:01:22 -05:00
Daniel Salazar 66a3af69c9 fix: suggested apps breaking (#2343) 2026-01-26 10:17:48 -08:00
Seril Evanjaline S 70454521ef fix: skip CI tests when only docs are changed (#2335) (#2338) 2026-01-25 00:05:31 +07:00
Daniel Salazar 8bb4dec231 perf: don't fetch b64 icon for apps always, and lru suggestedApps (#2336)
* perf: don't fetch b64 icon for apps always, and lru suggestedApps

* fix: fallback to default file icon if present
2026-01-23 20:57:12 -08:00
Reynaldi Chernando 143cbdce23 Add info about usage data scope for docs (#2334) 2026-01-24 10:18:54 +07:00
Daniel Salazar 2402e49cce fix: log format (#2333) 2026-01-23 13:47:02 -08:00
Daniel Salazar 2287704102 perf: batch readdir suggested apps into single big query (#2332)
* perf: batch readdir suggested apps into single big query

* fix: cleanup fucntions to go through single entry
2026-01-23 12:24:02 -08:00
KernelDeimos de77b11954 fix: disable requests from server in two services 2026-01-23 08:40:00 -05:00
ProgrammerIn-wonderland 5922f36358 fix gemini cost key 2026-01-23 18:45:10 +05:30
ProgrammerIn-wonderland 17e5edd643 Video model details 2026-01-23 16:01:50 +05:30
Nariman Jelveh 894bb939b1 Add aspect ratio resize options to window menu
Introduced a resize_window_to_aspect_ratio function and added 'Advanced' menu items to allow resizing the window to 16:9, 4:3, or 9:16 aspect ratios. This enhances user control over window dimensions for specific use cases.
2026-01-22 15:59:07 -08:00
Daniel Salazar d42f9b0e10 fix: disable bad token checks? (#2326) 2026-01-22 15:38:26 -08:00
Daniel Salazar d3a27be88e fix: dedup get_apps app requests (#2325)
* fix: dedup get_apps app requests

* fix: WSPushService errors

* fix: error messages
2026-01-22 11:07:42 -08:00
ProgrammerIn-wonderland 2a8ec97c09 add safety checks for worker updates 2026-01-22 18:53:59 +05:30
Daniel Salazar e9631b5a04 perf: dedup and cache get_apps in puter gui, also add more app batching in backend (#2319)
* perf: dedup and cache get_apps in puter gui

* feat: batch more apps
2026-01-21 23:31:49 -08:00
Daniel Salazar fbe87369f5 fix: add back test (#2317) 2026-01-21 21:37:36 -08:00
KernelDeimos b98f1be5fb Revert "feat(data-access): move puter.js read to app driver"
This reverts commit 2139551abf.

It looks like this breaks dev-center because the file associations
aren't properly sent. I will need to investigate this.
2026-01-22 00:35:56 -05:00
jelveh 70f58b08eb Update label from 'Publish Web Pages' to 'Hosting API' 2026-01-21 20:50:52 -08:00
KernelDeimos 20b5662704 dev(backend): make data-access an essential module 2026-01-21 23:00:45 -05:00
KernelDeimos 2139551abf feat(data-access): move puter.js read to app driver
This is the first functional migration from ths `es:app` driver to the
`app` driver. Any call to `puter.apps.get` will go through `es:app`
after this change.
2026-01-21 23:00:45 -05:00
jelveh 0b55d19f89 Add initial Puter.js documentation site 2026-01-21 19:39:01 -08:00
Daniel Salazar 6e9e5371c8 fix: batch fetch get apps for launch apps and recommended apps (#2315)
* wip: batch fetch get apps for launch apps and recommended apps

* fix: boot issues

* fix: bad refresh app cache

* tmp: remove test for now since can't mock db call
2026-01-21 18:17:15 -08:00
KernelDeimos 17b5ff4cb5 Revert "feat(data-access): move puter.js read to app driver"
This reverts commit f3100eca59.
2026-01-21 12:33:25 -05:00
KernelDeimos f3100eca59 feat(data-access): move puter.js read to app driver
This is the first functional migration from ths `es:app` driver to the
`app` driver. Any call to `puter.apps.get` will go through `es:app`
after this change.
2026-01-21 12:25:59 -05:00
Daniel Salazar 929fc6956e [PUT-456] fix: delete apps from marketplace when deleting anywhere else (#2310) 2026-01-20 23:42:24 -08:00
Daniel Salazar 4e6d9c9f33 perf: improve tel + decrease logs (#2309)
* perfmon: lower healthcheck status cache, add kv health signal

* perf: improve tel + decrease logs

* logs
2026-01-20 20:21:08 -08:00
KernelDeimos bf84ff4b10 config(perms): allow apps service to all users 2026-01-20 16:28:22 -05:00
KernelDeimos 3fe304ebac dev(data-access): re-add protected app support
Adds support for the "protected apps" feature to the new `apps` driver
that will replace the existing `es:apps` driver.
2026-01-20 16:28:22 -05:00
KernelDeimos d08a828226 test(data-access): avoid SQL error in app:es
It turned out this error was not coming from `app`, but it was coming
from `app:es` due to a pre-existing issue. Since these tests are meant
to compare the resulting behavior and `app` can handle this case while
`app:es` cannot, the best course of action is to avoid invoking the
issue and only test the intended behavior.
2026-01-20 16:28:22 -05:00
KernelDeimos 768a35e9b5 fix(data-access): read response regression
In `es:app`, attempting to read an app that doesn't exist results in an
error being thrown. This commit updates `app` to have the same behavior.
2026-01-20 16:28:22 -05:00
KernelDeimos 5b33beb6a1 test(data-access): check for error, not undefined
Check for error when an app doesn't exist, because this is the behavior
`es:app` already exhibits.
2026-01-20 16:28:22 -05:00
KernelDeimos 519ad336ba test: differences between es:app and app
Add tests for all the CRUD operations and related edge cases in `app` to
ensure the behavior is the same as `es:app`. These tests detect 3 issues
across 4 failing tests.
2026-01-20 16:28:22 -05:00
KernelDeimos bd416b0190 test: ensure kv global is always available
This is comitted separately from the commit for AppService.comp.test.js
that will follow because it interacts with all other test cases. It did
not cause any issue based on what I observed, but I'm still wrapping it
in a separate commit in case we need to revert or change it later.
2026-01-20 16:28:22 -05:00
KernelDeimos 503c1a4bb8 test: refactor AppService comparison test 2026-01-20 16:28:22 -05:00
KernelDeimos 1c438107aa test(data-access): verify and fix database state compare
An "anti-test" (test that should fail) was created to verify that a test
fails when apps are different. This revealed a problem in the original
logic of comparing the database state (UUIDs don't need to be, and will
not be, identical; they need to be excluded from comparison). This
commit contains the new test and fixes the existing test case, which was
passing because this problem caused a false-negative.
2026-01-20 16:28:22 -05:00
KernelDeimos b17486b1b4 fix(backend): fix context dual-instance problem
The file `context.js` causes problems in unit tests because vitest does
not play nice with CJS, especially when both CJS and ESM are in use such
as in our repository.

Given that it is not feasible to solve the underlying interoperability
issue, I have elected to make `context.js` a singleton in `Symbol.for`.
This worked very well with `helpers.js`.
2026-01-20 16:28:22 -05:00
KernelDeimos be8b5ef70a fix(backend): singleton in helpers for testability
The `helpers.js` file has two instances when testing with vitest.
Usually this can be solved by creating an "import bridge" file - another
CJS file that imports the desired CJS file and re-exports it so that the
`require` mechanism for caching modules is used instead of the `import`
mechanism for caching modules. Unfortunately in my most recent test
cases this does not work. I do not know why this does not work. However,
without doing a deep-dive into the internals of vitest I can at least
see that the only state in helpers is for providing `services` as a
pseudo-global, so a hack with `Symbol.for` solves everything.
2026-01-20 16:28:22 -05:00
KernelDeimos 7531a94687 clean(data-access): remove bad fixes and simplify 2026-01-20 16:28:22 -05:00
KernelDeimos 01b50b66f2 test(data-access): regression test for es:app vs app
This test was very difficult to get working because of issues
initializing the context under vitest. After a lot of effort and trying
to narrow down the issue in many ways that didn't work, I eventually
found that manually setting the storage and calling run on the
AsyncLocalStorage object got it working. I'm currently unsure if this is
specific to vitest or not. We don't seem to do this in Puter's kernel
but everything works fine in the typical runtime. Maybe this is
side-effect of otel's own use of AsyncLocalStorage.
2026-01-20 16:28:22 -05:00
KernelDeimos 3a268e6f16 test(data-access): add tests for delete method 2026-01-20 16:28:22 -05:00
KernelDeimos 3fab0ca6a2 dev(data-access): implement .delete() method 2026-01-20 16:28:22 -05:00
KernelDeimos 1e3b704ea8 fix(data-access): add guard for app actors 2026-01-20 16:28:22 -05:00
KernelDeimos 25d23d687c dev(data-access): add simplified upsert method
This is a naive implementation of the `.upsert()` method that simply
calls `.create()` or `.update()` depending on whether or not the app
already exists.
2026-01-20 16:28:22 -05:00
KernelDeimos c47c52a298 test(data-access): test .create() and .update()
Primarily these tests were AI generated an then checked over for sanity.
These tests are good unit tests to avoid regressions as a result of
changes to this code but are not sufficient to test for regressions
introduced by this new implementation that will replace `es:app`.
2026-01-20 16:28:22 -05:00
KernelDeimos bec39e578f dev(data-access): implement .create() method 2026-01-20 16:28:22 -05:00
KernelDeimos fc03fafab9 dev(data-access): misc improvements to .update()
DRY some redundant code and use guard clauses where applicable.
2026-01-20 16:28:22 -05:00
KernelDeimos 464241e743 dev(data-access): implement .update() method 2026-01-20 16:28:22 -05:00
KernelDeimos 7c5639005b test(data-access): app .select() and .read()
Fixes are also included for a couple issues that were found:
- `null` being included in extensions list
- property called `user_owner` instead of `owner`
2026-01-20 16:28:22 -05:00
KernelDeimos ec0b333ad7 dev(data-access): implement .read() method
Most of this implementation matched `.select()` which saved time. The
common behavior can be factored out, but since the purpose of this
refactor is to flatten everything as much as possible I'm going to leave
the duplicated code and make a note to do this later.

The challenging part was `#build_complex_id_where()`, which is the
equivalent to the `fetch_based_on_complex_id_()` method in
EntityStoreService. This allows `uid: app-UUID-OF-APP` and `id: { name:
'editor' }` to both work.
2026-01-20 16:28:22 -05:00
KernelDeimos 2bb036616f dev(data-access): app select icon_size` param
Adds the `icon_size` parameter to the `.select()` method on the new
non-ES/OM implementation.

When adding the necessary `params` parameter to the `.select()`
method, it was noticed that the `predicate` parameter did not have a
default value - potentially causing a regression; a default value was
set for both `params` and `predicate`.
2026-01-20 16:28:22 -05:00
KernelDeimos 7cd7be7af5 dev(data-access): add filetype associations 2026-01-20 16:28:22 -05:00
KernelDeimos 3839afd805 dev(data-access): add app owner relationship
It turns out self-referencing tables add some nuances to what is and
what isn't ambiguous in SQL queries, so getting this right took a little
longer than expected. Following the entire chain doesn't seem to be
possible so a compromise is made by only traversing one level of depth.
(you can the uid of the owner of the app, but not the uid of the owner
app's own owner)
2026-01-20 16:28:22 -05:00
KernelDeimos 1a8130b8fd dev(data-access): add owner object to app select 2026-01-20 16:28:22 -05:00
KernelDeimos 6592f87882 dev(data-access): coerce boolean values from db
Adds `as_bool` utility function for boolean values from MySQL and
Sqlite, based on the previous implementatoin for ES/OM.
2026-01-20 16:28:22 -05:00
KernelDeimos a85d2b7098 fix(perms): fix revokePermission for "flat" impl
The "flat" implementation of permissions was broken because
revokePermission tried to delete entries by calling `.set` with an
option called "delete". I'm not sure if this has ever existed on the
puter-kvstore interface, so it's weird that it was called like that.
2026-01-20 16:07:10 -05:00
KernelDeimos 79fda7b8c2 fix(backend): update protected app perm implicator
The permission implicator for protected apps was written before changes
to the permission system that affect the conditions under which a user
is allowed to grant and revoke permissions; specifically this is the
`manage:` set of permissions, which now needs to be granted to the owner
of a protected app.

Additionally, the "level" component of the permission is ignored because
the owner of a protected all is implied to have all the permissions
pertaining to that protected app.
2026-01-20 16:07:10 -05:00
jelveh 6805c90252 Remove unnecessary logging in get_app function
Eliminated redundant cache and info log statements from the get_app helper to reduce log noise and improve code clarity.
2026-01-20 11:45:06 -08:00
Neal Shah 13578e81e6 gemini 2.5/3 no preview (#2306) 2026-01-20 11:43:01 +05:30
KernelDeimos 3da318129c fix(puter.js): check for uuid before relative path 2026-01-19 19:55:04 -05:00
Daniel Salazar 35797536ba feat: usage endpoints, allow appName (#2303) 2026-01-19 15:15:06 -08:00
KernelDeimos c715057065 feat(puter.js): make home directory default cwd
Make the home directory (AKA "~") the default CWD for puter.js, making
relative paths work in environments other than app environments (i.e.
gui or worker environments).
2026-01-19 13:29:28 -05:00
Neal Shah e95aa81e00 OpenAI web_search support (#2299) 2026-01-19 00:01:47 +05:30
Daniel Salazar f9888e6705 feat: paginated list (#2296)
* feat: paginated list

* fix: kv list
2026-01-16 16:16:47 -08:00
Neal Shah bd57f7a221 Add GPT 5.2 Codex (#2293) 2026-01-16 22:52:28 +05:30
Nariman Jelveh 6b45667220 Revert "feat(gui): add keyboard shortcuts guide dialog (#2278)" (#2288)
This reverts commit 340d932ae1.
2026-01-15 15:35:13 -08:00
Rahul aswal 340d932ae1 feat(gui): add keyboard shortcuts guide dialog (#2278)
* feat(gui): add keyboard shortcuts guide dialog

* feat(gui): add dedicated keyboard shortcuts dialog
2026-01-15 15:34:40 -08:00
KernelDeimos 21d02e7dae fix(backend): status code check and handle HLMkdir
Fix the status code handling in hl_mkdir and handling to the HLMkdir
operation itself. This effectively fixes #1603.

Resolves #1603
2026-01-15 18:32:08 -05:00
KernelDeimos 452d1de92e refactor: MkTree and QuickMkdir parent dir check
Extract common behavior from MkTree and QuickMkdir to a separate method
which is user by both operations.
2026-01-15 18:32:08 -05:00
KernelDeimos f125830fba fix(backend): handle ll_mkdir exists race condition
Handle a race condition affecting mkdir operations with the
`createMissingParents` option enabled. When creating a directory because
this option was specified, errors because the directory already exists
are likely due to a race condition and should not be propagated to the
client but instead handled by using the directory that's already there.
2026-01-15 18:32:08 -05:00
KernelDeimos f9a3e86fe9 fix: normalize file object in /writeFile 2026-01-14 18:21:46 -05:00
KernelDeimos 5e4dfbc963 fix: attempt coercion to fix vscode corruption 2026-01-14 15:05:17 -05:00
sn-o-w c367d00ce4 Revise README.ro.md for updates and corrections (#2280) 2026-01-14 10:03:50 -08:00
Daniel Salazar 0b9863814c fix: shard app usages properly by user (#2279) 2026-01-13 20:32:46 -08:00
Sauhbagya Prasad 529a3d026b Improve UI for App Deployment Options in Dev Center (#2266)
* Improve UI for App Deployment Options in Dev Center

- Added CSS styling for deployment option cards
- Implemented active state switching between deployment methods with guardrails
- Abstracted saveEditApp for reuse across Deploy and Edit tabs
- Added error handling for invalid URLs in the Deploy tab

* updated mode's description and fixed function's error

* updated by npm install

* Revert "updated by npm install"

This reverts commit 82cd962f62.

* in url mode the deploy button is enabled by default
2026-01-13 10:54:08 -08:00
jelveh 07f3387363 Add CAPTCHA required message to English translations
Introduced a new translation key 'captcha_required' with the message 'Please complete the CAPTCHA verification' in the English locale file.
2026-01-13 10:19:31 -08:00
Daniel Salazar cdb422659c feat: more extension controller decorators (#2272) 2026-01-13 00:32:03 -08:00
Neal Shah f4c37d4cf4 prevent signout from workers (#2276) 2026-01-13 13:18:06 +05:30
Neal Shah edcfe63131 no_extra_params in together service to prevent defaults from being specified (#2275) 2026-01-13 13:08:30 +05:30
Neal Shah 989ee58f05 Retry for openrouter on max_tokens overage (#2274) 2026-01-13 12:30:05 +05:30
dependabot[bot] 237a96c706 chore(deps): bump qs and body-parser
Bumps [qs](https://github.com/ljharb/qs) and [body-parser](https://github.com/expressjs/body-parser). These dependencies needed to be updated together.

Updates `qs` from 6.13.0 to 6.14.1
- [Changelog](https://github.com/ljharb/qs/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ljharb/qs/compare/v6.13.0...v6.14.1)

Updates `body-parser` from 1.20.3 to 1.20.4
- [Release notes](https://github.com/expressjs/body-parser/releases)
- [Changelog](https://github.com/expressjs/body-parser/blob/master/HISTORY.md)
- [Commits](https://github.com/expressjs/body-parser/compare/1.20.3...1.20.4)

---
updated-dependencies:
- dependency-name: qs
  dependency-version: 6.14.1
  dependency-type: indirect
- dependency-name: body-parser
  dependency-version: 1.20.4
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>
2026-01-12 19:43:04 -05:00
Neal Shah bb6b40be7b Support getDeveloperProfile with no arguments (#2270) 2026-01-12 16:06:45 +05:30
Neal Shah 8e6d3d8d9f Make puter boot on windows (#2269) 2026-01-12 15:26:53 +05:30
Neal Shah 04901a7cd1 provide safety_identifier in addition to user (#2268) 2026-01-12 13:24:30 +05:30
Talasu_DeepakandNariman Jelveh 44b2a0bd9a Add README for Puter localization and setup (#2043)
* Add README for Puter localization and setup

This README provides an overview of Puter, including installation instructions, system requirements, and support information.

* Update README.od.md

---------

Co-authored-by: Nariman Jelveh <[email protected]>
2026-01-11 16:41:50 -08:00
Nariman Jelveh c051a6caa6 Add automatic thumbnail generation to file uploads in GUI (#2261)
Introduces thumbnail generation for image files during upload operations. Thumbnails are generated client-side if enabled via the `generateThumbnails` option, and are included in file metadata and operation payloads. This enhances file previews and user experience in the file system.
2026-01-11 09:38:33 -08:00
KernelDeimos 8e418a11a1 fix(backend): race condition in hashing_stream
Based on a stack trace from production and manual static analysis, it
appears that a race condition occurs within hashing_stream
intermittently. The conditions that cause this issue might be heavy
backpressure. The source stream emits the 'end' event before
stream.Transform's transform callback has had a chance to process all of
the chunks, which results in an incorrect order in calling methods on
the `typeof crypto.createHash()` object.

It would appear that `source.pipe(stream)` is not able to propagate
errors from Transform because the chain was simply broken and upload
would get stuck (if this was indeed the cause of upload getting stuck,
which seems likely but not conclusive)
2026-01-09 20:02:50 -05:00
Daniel Salazar d64bd21a99 feat: give referrals (#2262) 2026-01-09 16:48:49 -08:00
Neal Shah 5aa25bae5f Model singularity (#2255)
* model naming singularity

* model singularity pt2

* Remove incorrect assumption check which breaks openrouter:openai/gpt-5-image
2026-01-09 16:18:54 -08:00
Daniel Salazar 13f7d7b502 fix: husky (#2260) 2026-01-09 15:41:37 -08:00
Daniel Salazar f88ca5d4bd feat: kv.remove feature to remove nested elements or list indices (#2258)
* chore: update npm version

* feat: kv.remove feature to remove nested elements or list indices

* chore: update npm version
2026-01-09 15:10:02 -08:00
KernelDeimos 353f163f46 chore(backend): upgrade nodemailer 2026-01-09 17:54:38 -05:00
KernelDeimos e07d1ae4af dev(backend): limit thumbnail size from client
There was a configuration parameter for this but it isn't being used and
has the incorrect name in `config.js`. I decided to keep the old check
here anyway because having support to configure a lower size limit could
come in handy.

I set the limit to 2MiB through the following logic:
- largest icon size I've ever heard of is 512px
- 512*512*4 (4 color channels) is 1048576 (1MiB)
- increase to next MiB just to be safe
2026-01-09 16:36:47 -05:00
KernelDeimos b5ae9181f1 dev(puterjs): add thumbnail parameter to puter.js 2026-01-09 16:36:47 -05:00
KernelDeimos 645d60a84b dev(filesystem): add thumbnail parameter 2026-01-09 16:36:47 -05:00
Daniel Salazar 23d7b751b9 feat: new kvstore operatios for more granular updates 🚀 (#2254) 2026-01-09 12:20:54 -08:00
dependabot[bot] 53133e2623 chore(deps): bump qs and express
Bumps [qs](https://github.com/ljharb/qs) to 6.14.1 and updates ancestor dependency [express](https://github.com/expressjs/express). These dependencies need to be updated together.


Updates `qs` from 6.13.0 to 6.14.1
- [Changelog](https://github.com/ljharb/qs/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ljharb/qs/compare/v6.13.0...v6.14.1)

Updates `express` from 4.21.2 to 4.22.1
- [Release notes](https://github.com/expressjs/express/releases)
- [Changelog](https://github.com/expressjs/express/blob/v4.22.1/History.md)
- [Commits](https://github.com/expressjs/express/compare/4.21.2...v4.22.1)

---
updated-dependencies:
- dependency-name: qs
  dependency-version: 6.14.1
  dependency-type: indirect
- dependency-name: express
  dependency-version: 4.22.1
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <[email protected]>
2026-01-09 14:12:33 -05:00
Nariman Jelveh 092d8fe632 Revert "doc: add README.md for GUI directory (#2021)" (#2253)
This reverts commit 8b324a8950.
2026-01-08 10:06:30 -08:00
SuryaGanesh284 8b324a8950 doc: add README.md for GUI directory (#2021)
Added README.md for the Puter GUI with details on structure, development, contributing, and resources.
2026-01-08 10:06:04 -08:00
Nariman Jelveh a0c2ac4d07 Add 'Open in AI' option to item context menus (#1974)
* Add 'Open in AI' option to item context menus

* Add new AI-related English translations
2026-01-07 22:49:31 -08:00
jelveh dade7a6cba Add preview images upload for app listings 2026-01-07 17:32:24 -08:00
Nariman Jelveh 3f934c5f16 Remove ComplainAboutVersionsService and related code (#2179)
Deleted the ComplainAboutVersionsService and its registration in SelfHostedModule, as well as cleaned up related service mappings in DriverService. This streamlines the codebase by removing the version complaint feature.
2026-01-07 16:55:55 -08:00
Eswar Venkata Ram Charan Seeram 77fc14b743 i18n(de): polish German translations & fix typos (Fixes #1532) (#2009)
* i18n(nn): fix typos & finalize translation cleanup

* i18n(de): polish German translations & fix typos (Fixes #1532)
2026-01-07 15:30:06 -08:00
dependabot[bot] 05a2c69d43 chore(deps): bump jws from 4.0.0 to 4.0.1
Bumps [jws](https://github.com/brianloveswords/node-jws) from 4.0.0 to 4.0.1.
- [Release notes](https://github.com/brianloveswords/node-jws/releases)
- [Changelog](https://github.com/auth0/node-jws/blob/master/CHANGELOG.md)
- [Commits](https://github.com/brianloveswords/node-jws/compare/v4.0.0...v4.0.1)

---
updated-dependencies:
- dependency-name: jws
  dependency-version: 4.0.1
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>
2026-01-07 16:23:04 -05:00
Daniel Salazar b1e7bc5fca feat: method for updating users metering directly (#2252)
* chore: cleanup ts extensions controller

* feat: method for updating users metering directly
2026-01-07 12:53:00 -08:00
Het Savani e20daf276b Fix/explorer cursor grab on click (#2176)
* Fix sidebar cursor grabbing on click

* Final commit
2026-01-07 10:33:04 -08:00
Daniel Salazar 754e820403 fix: openrouter costs always being 0 (#2250) 2026-01-07 09:11:44 -08:00
Daniel Salazar 7f76bff3f3 fix: more strict metering limits, disable ambigious openrouter one (#2249) 2026-01-06 23:57:03 -08:00
Daniel Salazar 2ef9aa3fb1 fix: add catch all for minimum usage amounts (#2248)
* ts: extension type updates

* fix: add catch all for minimum usage amounts
2026-01-06 23:09:29 -08:00
Reynaldi Chernando 2c84cd4cfa Remove flux schnell-free (#2243) 2026-01-06 22:39:01 -08:00
Daniel Salazar 93afbe4dd9 fix: ts extensions (#2247) 2026-01-06 18:03:38 -08:00
Daniel Salazar 1642431615 lint: hook for precommit (#2245) 2026-01-06 16:45:05 -08:00
Om vataliya 677426cbe7 fix: Enable godmode for dev-center to open worker files in editor (#2224)
Fixes #2218

The DEV Center was unable to open worker files in the text editor because
it lacked godmode permissions. The file_paths parameter in puter.ui.launchApp
requires the calling app to have godmode=1 in order to work.

Changes:
- Added database migration 0044_dev-center-godmode.sql to set godmode=1
  for the dev-center app (uid: app-0b37f054-07d4-4627-8765-11bd23e889d4)
- Updated SqliteDatabaseAccessService.js to include the new migration

This allows DEV Center to successfully pass file paths when launching the
editor app, fixing the issue where clicking on a worker file path resulted
in an empty editor window.
2026-01-06 16:19:29 -08:00
KernelDeimos a5bbc7e95b fix: issues creating shortcuts
There were two different things here:
- invalid requests have an ambiguous error message
- migration of PuterFSProvider to an extension caused an issue
  for shortcut creation in some flows

Closes #2200
2026-01-06 19:09:48 -05:00
KernelDeimos 0ecae43d2f clean: remove dead code in hl_mkdir
Remove a method in hl_mkdir which was determined to not be referred to
anywhere. hl_mkdir was re-tested to verify that this did not cause a
regression.
2026-01-06 19:09:48 -05:00
KernelDeimos d091b20b6a dev: improve error message for dest_does_not_exist
This error message was ambiguous for mkdir operations where a shortcut
target is specified for hl_mkdir. The message looks like it's referring
to the shortcut target but really it is referring to the parent
directory for the new directory that will be created.
2026-01-06 19:09:48 -05:00
KernelDeimos 630f76d8b4 test: add automated test for subdomain redirect
This merits a test because changes to how `puter.site` works in the
future could easily break this redirection, and maintaining this
redirect is important to us.
2026-01-06 18:31:39 -05:00
KernelDeimos 4d60168d2f feat!: implement redirect for hosting base domain
Redirect the subdomains `""` and `"www"` to a configurable URL, which is
by default `https://developer.puter.com/static-hosting/`.

This is potentially a breaking change for local instances that have a
subdomain called "www". Users hosting their own Puter may want to be
aware of this.

Closes #2214
2026-01-06 18:31:39 -05:00
Reynaldi Chernando 678363b0ba Init fix FS types (#2201) 2026-01-06 10:18:01 -08:00
jelveh 7ef57d5052 Increase PENDING_QUERY_TTL to 10 seconds 2026-01-05 12:50:34 -08:00
jelveh fa402f9785 Add gpt-5.1-codex-max support 2026-01-03 21:28:09 -08:00
jelveh f9925c0337 Increase PENDING_QUERY_TTL to 5 seconds 2026-01-03 20:02:08 -08:00
jelveh 987effc5ec Revert "Remove debug logs and improve query coalescing timeout (#2241)"
This reverts commit 71bee556f6.
2026-01-03 19:34:30 -08:00
Nariman Jelveh 71bee556f6 Remove debug logs and improve query coalescing timeout (#2241)
Removed unnecessary console.log statements from PuterFSProvider.js and WebServerService.js. Increased PENDING_QUERY_TTL to 3 seconds and added a timeout mechanism for coalesced queries in get_app to prevent indefinite waiting.
2026-01-03 19:28:40 -08:00
Soumyabrata Bhattacharjee 363b798026 Update first-run-issues.md with dnf5 instructions (#2239)
* Update first-run-issues.md with dnf5 instructions

Add installation instructions for Development Tools on dnf5.

* Fixing the command to install it on Fedora 41+
2026-01-03 18:35:59 -08:00
Neal Shah f8997b7d75 Responses API support for OpenAI (#2226)
* Responses API support for OpenAI

* Fix toolcalling in Responses API
2026-01-01 16:25:57 +05:30
Daniel Salazar aafdec9b81 perf: make app entries more scalable, avoid writing global entries since its just puter itself and isn't relevant (#2233) 2025-12-30 19:26:46 -08:00
jelveh 58c8ec7f43 Increase auth popup height to 600px 2025-12-29 23:24:09 -08:00
jelveh 98d0c25ce8 Adjust auth popup size and style for embedded mode 2025-12-29 23:12:52 -08:00
jelveh 773b82638a Update helpers.js 2025-12-29 22:54:38 -08:00
jelveh 8b1bcfa601 Reduce PENDING_QUERY_TTL to 10 seconds 2025-12-29 22:45:33 -08:00
jelveh d7c56472c5 Add request coalescing to get_app with pending query cache
Introduces a TTL-based pending query cache to the get_app function to prevent duplicate database queries for the same app lookup. This change improves efficiency by coalescing concurrent requests for the same app and ensures only one database query is performed per unique lookup within the TTL window.
2025-12-29 20:37:26 -08:00
Daniel Salazar f3b5e1b03f fix: don't cache nor fetch raw b64 url for app icons (#2230) 2025-12-29 18:09:56 -08:00
Daniel Salazar 174e6130ee fix: cache get_app result with expiry to lessen load on db (#2229)
* fix: cache get_app result with expiry to lessen load on db

* fix: use EX instead
2025-12-29 16:38:57 -08:00
jelveh a4afc41a1c Remove global access route for cloud.js 2025-12-25 17:27:56 -08:00
Daniel Salazar 6cc86ff58b feat: support extension divs headers and tags being inserted to puter homepage load (#2221)
* feat: support extension divs headers and tags being inserted to puter homepage load

* wip: demo div

* fix: extension typing

* fix: extension typing

* feat: hompage gui add on
2025-12-24 13:48:36 -08:00
Reynaldi Chernando a32a16d306 Fix workers types (#2198) 2025-12-23 12:35:25 -08:00
Reynaldi Chernando eb23863b6e Fix apps types (#2197)
* Fix apps types

* Remove get overload
2025-12-23 12:34:58 -08:00
Reynaldi Chernando 99220b5b18 Add optional requestCallbacks options to getUser (#2186) 2025-12-23 12:34:41 -08:00
Daniel Salazar 91e12f6886 fix: don't load bench.js files (#2207)
* fix: autoloader grabbing bench.js files

* fix: errors failing

* fix: extension cache typ

* cache: app icons
2025-12-22 15:52:24 -08:00
KernelDeimos f8bdcf8470 dev: [+] DataAccessModule > AppService > select()
This commit adds the DataAccessModule, which is where replacement
"flatter" implementations for what is currently implemented via
EntityStorage/OM will be developed.

This commit also adds AppService, which is where the `crud-q`
implementor for apps will be implemented.

This commit adds the `select()` implementation for AppService. Currently
it is missing many behaviors for parity with the current ES/OM
implementation including:
- coercion of boolean values
- nested objects and their properties
- `icon_size` parameter support
2025-12-22 17:13:07 -05:00
KernelDeimos 3c1a4cd31a dev: specify 'es:app' in puter.js apps module
The EntityStorage/OM mechanism for data access is being replaced.
Specifying 'es:app' in puter.js calls will allow the ES/OM mechanism and
its replacement to be tested together to check for regressions. When the
replacement is done, we can change 'es:app' to the new service name.
2025-12-22 16:08:35 -05:00
KernelDeimos 7786deefb7 lint: sync Apps.js with linter rules
This is comitted separately because it should not have any functional
changes. Do not skip this in a `git bisect`, but do not revert this when
testing commits for functional changes.
2025-12-22 16:08:35 -05:00
jelveh dc5f61b438 Add screen-wake-lock to iframe allow attribute 2025-12-22 08:32:51 -08:00
jelveh 85877259a6 Update initgui.js 2025-12-20 18:26:02 -08:00
jelveh 0520251249 Remove spinner display in popup during temp user creation
Eliminated the spinner shown when creating a temporary user in popup mode and removed the corresponding hideSpinner call. This streamlines the user experience during account setup.
2025-12-20 18:13:27 -08:00
jelveh abd28d8935 Improve captcha modal styling and messaging 2025-12-20 18:03:00 -08:00
jelveh a058912c1f Style captcha modal for embedded popup context 2025-12-20 17:40:48 -08:00
KernelDeimos c43f3990d9 fix: import issues on run form benchmarks (somehow) 2025-12-19 23:16:17 -05:00
KernelDeimos c737a28c34 Revert "Revert 2206 eric/25 cj0 more benchmarks (#2208)"
This reverts commit 2be2dcaea0.
2025-12-19 23:16:17 -05:00
Daniel Salazar 2be2dcaea0 Revert 2206 eric/25 cj0 more benchmarks (#2208)
* Revert "perf: more benchmarks (2)"

This reverts commit 2c60faf516.

* Revert "perf: more benchmarks"

This reverts commit d3c1fc3103.
2025-12-19 19:57:22 -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
KernelDeimos 2c60faf516 perf: more benchmarks (2) 2025-12-19 17:02:20 -05:00
KernelDeimos d3c1fc3103 perf: more benchmarks 2025-12-19 17:02:20 -05:00
KernelDeimos 75f3092077 bench: extract and benchmark CircularQueue
- Move CircularQueue class from AntiCSRFService to util directory
- Add benchmark to ensure we don't slow it down
2025-12-19 15:49:38 -05:00
KernelDeimos 49b90bde12 test: add benchmark config and first unit bench
Adds the necessary configuration and the `npm run bench` script, as well
as the first benchmark to verify everything is working. The first
benchmark is permissionUtils. This is important to benchmark because
permission strings are used often and there is some non-trivial logic
such as escaping of full-colon characters. Other overheads like database
access will be much more significant, but it may be useful to know how
much more significant in quantifiable terms.
2025-12-19 15:49:38 -05:00
Daniel Salazar a1689c4ea3 feat: dynamo in oss (#2195)
* feat: dynamo in oss

* fix: service name mismatch for dynamo client

* fix: dynalite boot

* fix: tests
2025-12-18 17:22:49 -08:00
Neal Shah 9aefed5515 add user iteration to all methods which return an App object (#2203) 2025-12-18 17:03:31 -05:00
jelveh af066356cf Show AI button regardless of email confirmation 2025-12-17 20:36:31 -08:00
jelveh 9d307d54ed Adjust font size in UsageLimitDialog message 2025-12-17 20:14:49 -08:00
jelveh 6d5b8e45c0 Remove email confirmation check before launching AI app 2025-12-17 17:25:53 -08:00
KernelDeimos 7228e63c8b perf(es): generate client-safe objects in parallel 2025-12-17 17:12:33 -05:00
KernelDeimos 6edd7debb8 perf: improve parallelization in SQLES
It turns out SQLES was doing some things very sequentially when this was
not necessary. This should make SQLES a lot faster in general.
2025-12-17 17:12:33 -05:00
Reynaldi Chernando 3b646328f7 Add gemini 3 flash to models (#2191) 2025-12-17 14:11:14 -08:00
KernelDeimos eea9d8b27e perf: split implied user-app permissions
It took a long time to figure out why this was happening, but
user-to-app permissions and dev-to-app permissions were being checked in
sequence instead of concurrently. It turns out it was a recursive call
in user-to-app permissions that was blocking. This recursive call was
not actually a dependency of the query for user-to-app permissions; it
was only needed for determining if default user-to-app permissions are
held by the user. This was fixed by simply splitting up these
non-dependent queries into two separate scanners.
2025-12-17 16:17:07 -05:00
KernelDeimos 576900ebcc clean: readdir optimization 2025-12-17 16:17:07 -05:00
Daniel Salazar a6617527db fix: types and tests? (#2193) 2025-12-17 13:11:51 -08:00
Neal Shah d76adcf831 add typescript transpilation for legacy node support ☹️ (#2190)
* add typescript transpilation for legacy node support ☹️

* add typescript as devdep
2025-12-17 02:56:56 -05:00
Reynaldi Chernando 28526eb6b7 Add flux.2 max for together provider (#2189) 2025-12-16 21:34:06 -08:00
Neal Shah 21fb86752a App telemetry user iteration (#2188)
* add app-telemetry interface, and user-iteration feature

* Rid app-user-count.ts from workspace imports

* Remove semicolon at the end of query :(
2025-12-16 19:26:27 -05:00
jelveh 2d5fb8576e Update OpenAiImageGenerationProvider.ts 2025-12-16 16:19:03 -08:00
jelveh 49ab36d8be Add GPT Image 1.5 model and cost mapping 2025-12-16 15:55:33 -08:00
jelveh a3bcc488de Update usage limit dialog to indicate insufficient funds 2025-12-16 11:15:50 -08:00
Nariman Jelveh dc78af3590 Add usage limit dialog and integrate with driverCall_ (#2185) 2025-12-16 10:37:26 -08:00
jelveh 1e864b4bd5 Update UIDashboard.js 2025-12-15 20:50:59 -08:00
Daniel Salazar ed51a042b4 telemetry: config telemetry to run by default (#2184) 2025-12-15 18:49:49 -08:00
jelveh 358b64124e Add extension events to dashboard initialization 2025-12-15 17:43:05 -08:00
KernelDeimos 9bac2cba07 perf: [+] readdirstat_uuid optimized implementation 2025-12-15 20:28:34 -05:00
Reynaldi Chernando dc827f90c4 Fix more puter.js typescript types (#2181)
* Fix networking types

* Fix os types

* Fix UI types

* Remove constructor in util.d.ts

* Fix worker types

* Fix puter.d.ts

* Fix apps types

* Change socket and tlssocket back to psocket and ptlssocket
2025-12-15 19:29:04 -05:00
Reynaldi Chernando 85c548d0d3 Fix speech2speech options (#2133) 2025-12-15 16:11:25 -08:00
jelveh 66cf679aab Delete devlog.md 2025-12-15 13:59:53 -08:00
KernelDeimos 6d36c90032 fix: add missing 'tel' runtime module 2025-12-15 14:35:05 -05:00
jelveh 5ba94092f7 Map 'xai' provider to 'xai-image-generation' 2025-12-14 16:05:50 -08:00
jelveh a030fcd9b8 Add xAI image generation provider integration 2025-12-14 15:46:28 -08:00
Daniel Salazar 54dd60d44b fix: missing video gen ai services in ai module (#2180) 2025-12-14 11:08:52 -08:00
Nariman Jelveh 560307d587 Remove unused putility features (#2168)
* Remove smol utility library and update usage

Deleted the smol utility library from putility, removed its documentation, and refactored code in linux.js to use native string methods instead of smol.split. This simplifies the codebase by eliminating a redundant utility.

* Remove `putility.libs.time` and inline time utilities

* Update imports and time constant usage in core modules

Replaced usage of time.SECOND with a local SECOND constant in ServerHealthService for clarity and removed unused import. Updated all service imports in TestCoreModule to explicitly include the .js extension for compatibility with ES module resolution.

* Remove unused `wrap_text` and `ansi_visible_length` functions

Deleted the wrap_text and ansi_visible_length utility functions from string.js, as they are no longer needed or used in the codebase.

* Remove `format_as_usd` utility and related docs

The format_as_usd function and its documentation have been removed from the codebase and README files. This cleans up unused or deprecated currency formatting utilities.

* Remove osclink utility and update references

The osclink function and its documentation have been removed from putility. All usages in backend modules have been updated to use plain URLs instead of OSC 8 hyperlinks. This simplifies string utilities and avoids terminal-specific formatting.

* Remove PosixError utility module

* Remove NariMethodsFeature and related references

Deleted the NariMethodsFeature module and removed its usage from AdvancedBase and PuterJSFileSystemModule. This simplifies the codebase by eliminating unused or deprecated NARI method support.
2025-12-13 17:59:16 -08:00
Daniel Salazar 6652a1d332 fix: make cache calls async on boot (#2173) 2025-12-13 17:00:02 -08:00
Daniel Salazar 25221e539d fix: bad caching query crashing our db (#2172)
* logs: add errors to cache log

* logs: add errors to cache log

* fix: bad caching query crashing our db
2025-12-13 16:48:36 -08:00
Daniel Salazar 5c9a98a7a1 Ds/main (#2171)
* logs: add errors to cache log

* logs: add errors to cache log
2025-12-13 15:48:37 -08:00
Daniel Salazar d7b3ba3bb0 cd: make our deploy reliably wait for server to be ready (#2170)
* chore: continue removing extra logs

* cd: make our deploy reliably wait for server to be ready
2025-12-13 14:34:44 -08:00
Daniel Salazar e79f8a46f0 chore: add better logging to broadcast connections (#2169)
* fix: await fetching app cache on init

* chore: add better logging to broadcast connections
2025-12-13 14:07:25 -08:00
Daniel Salazar bbd5f52320 chore: continue removing extra logs (#2159)
* fix: await fetching app cache on init

* await for methods on boot now
2025-12-13 13:34:25 -08:00
Nariman Jelveh 87ac67a340 Remove DevConsoleService and related dev console widgets (#2167)
* Remove DevConsoleService and related dev console widgets

Eliminates `DevConsoleService` and `NullDevConsoleService`, along with all code that registers or manages dev console widgets across the backend. Developer messages and notifications are now logged directly to the console. Removes related commands and test mocks, simplifying the developer experience and reducing code complexity.

* Remove MinLogService and related registration code

Deleted MinLogService.js and removed its registration from SelfHostedModule.js. This cleans up unused or deprecated logging functionality.

* Remove `DevSocketService` and related registration

* Increase test job timeouts in CI workflow

* Remove dev environment widget ops counter

Eliminated increment and decrement of the dev_batch-widget ops counter in BatchExecutor. This simplifies the code and removes dev-only UI tracking logic from the batch operation flow.

* Remove console Puter logo feature and related code

Deleted the src/fun/logos.js file and removed all references to the Puter logo display in WebServerService and documentation. This streamlines the server startup output and eliminates unused or unnecessary code.

* Update WebServerService.js

* Standardize console banner formatting in services
2025-12-13 13:31:16 -08:00
jelveh d07d5fd5cb Remove DevTODService and its registration 2025-12-13 11:33:06 -08:00
Nariman Jelveh 794ff1e255 Remove tag cache refresh logic from AppInformationService (#2166)
* Remove tag cache refresh logic from AppInformationService

Eliminated the _refresh_tags method and its scheduled interval from AppInformationService. This change removes the tag cache refresh functionality, likely due to refactoring or deprecation of tag-based app discovery.

* Remove AI usage testing contributor docs
2025-12-13 09:45:13 -08:00
jelveh 888fab42e1 Remove AI response normalization files 2025-12-13 00:23:35 -08:00
jelveh 9c5938e2fd Remove comment-writer and AI METADATA comments from backend source files 2025-12-13 00:16:31 -08:00
jelveh f838fe4ecc Remove Threads module from puter-js 2025-12-13 00:06:43 -08:00
Nariman Jelveh 8f7a735cc0 Remove dev-console-ui-utils and update related services (#2163)
* Remove dev-console-ui-utils and update related services

* Remove debug console.log statements from backend code

Eliminated various leftover console.log and debug print statements across multiple backend modules and services to clean up the codebase and reduce unnecessary logging in production.

* Remove unnecessary console.log statements
2025-12-12 23:46:39 -08:00
Nariman Jelveh b8ed8caa3a Remove CommentService and related tests (#2160)
Deleted the CommentService implementation and its test file, and unregistered the service from CoreModule. This removes all comment-related backend functionality.
2025-12-12 21:49:54 -08:00
Nariman Jelveh 6bb4e9dfae Remove Bootstrap 5.1.3 assets from public directory (#2161)
* Remove Bootstrap 5.1.3 assets from public directory

* Create bootstrap.min.css
2025-12-12 21:41:16 -08:00
Nariman Jelveh ae92233b95 Remove fat from puterjs (#2156)
* Refactor puter-js to remove putility and service layer

* Add fallback for IPC listener registration

* Remove TeePromise in favor of `createDeferred` pattern

* Update utils.js

* Bump version to 2.2.0 in package.json

* Remove model name normalization and driver mapping logic

Eliminated the code responsible for normalizing model names and mapping models to specific AI drivers. The default driver is now set to 'ai-chat', simplifying the model selection and driver assignment process.

* Simplify AIService selection logic in image generation

* Remove unused Together image model constants
2025-12-12 19:44:15 -08:00
Daniel Salazar ef69865dd1 chore: decrease uninmportant logs (#2158) 2025-12-12 18:50:01 -08:00
Daniel Salazar f3e143e74a fix: bad usageType (#2157) 2025-12-12 17:31:40 -08:00
Daniel Salazar 797b87b004 cleanup: remove dead cloudwatch call (#2155) 2025-12-12 17:08:26 -08:00
KernelDeimos 6c0daf58c4 perf: is()/is_above() determine when to fetch 2025-12-12 17:38:43 -05:00
KernelDeimos af9a2b8300 perf: don't await on modifying 'accessed' 2025-12-12 17:38:43 -05:00
KernelDeimos 3fe6b8d23a fix: fsNode.is() requiring unnecessary fetch
When you have two path selectors, .is() should compare path strings
instead of fetching any entries.
2025-12-12 17:38:43 -05:00
KernelDeimos 4b31204224 perf: condition for re-fetch in fsNode.exists() 2025-12-12 17:38:43 -05:00
jelveh 54c2d9768e Update package.json 2025-12-12 13:47:27 -08:00
jelveh 348e000863 Bump puter.js version to 2.1.15 and update metadata
Added a homepage field and specified the repository directory in package.json for improved project metadata.
2025-12-12 13:43:25 -08:00
jelveh bb697616c0 Refine signup form spacing and title styling 2025-12-12 13:28:18 -08:00
Reynaldi Chernando ce2a509221 Fix hosting types (#2153) 2025-12-12 12:55:59 -08:00
Reynaldi Chernando 17ca4c7c93 Fix speech2txt options (#2150) 2025-12-12 12:55:51 -08:00
Reynaldi Chernando e431ac265c Fix FS types (#2134) 2025-12-12 12:55:39 -08:00
Reynaldi Chernando 697b3424c7 Add missing AI types (#2151) 2025-12-12 12:55:20 -08:00
Reynaldi Chernando c950be13f2 Fix KV types (#2152) 2025-12-12 12:54:13 -08:00
jelveh 7dcf590cf1 Add hide-scrollbar class to sidebar and user options 2025-12-12 11:58:59 -08:00
Reynaldi Chernando 7b15ee0bd0 Add alias for gpt-5.2-chat (#2148) 2025-12-11 19:59:21 -08:00
jelveh bb7b71236f Add new GPT-5.2 chat models to OpenAI provider 2025-12-11 19:43:22 -08:00
jelveh e75259dfd0 Add GPT-5.2 model to OpenAI provider models 2025-12-11 19:07:30 -08:00
Daniel Salazar aa225e3049 fix: batch app info referral (#2146) 2025-12-11 18:31:22 -08:00
jelveh 77c7214a1d Optimize app stats cache update with aggregate queries 2025-12-11 18:08:38 -08:00
Daniel Salazar 9e2ae1c004 fix: bad ai calls (#2144) 2025-12-11 17:13:25 -08:00
Daniel Salazar 83eab0d6ac Revert "Revert: single ai image entry point (#2131)" (#2143)
This reverts commit 907d0db328.
2025-12-11 17:03:20 -08:00
jelveh 89fbcffc7a Remove backend documentation section from CONTRIBUTING.md 2025-12-11 17:03:12 -08:00
jelveh 83eff9da87 Remove style guide and first contribution sections 2025-12-11 17:00:46 -08:00
jelveh f961dd4acd Update CONTRIBUTING.md 2025-12-11 16:58:21 -08:00
Daniel Salazar a103ca9bcb cleanup: remove Library + bloated utils where possible (#2142) 2025-12-11 16:55:29 -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
jelveh f07092164f Delete app.js 2025-12-11 15:29:55 -08:00
jelveh a423820e4b Remove unused backend HTML and module files
Deleted ThirdPartyDriversModule.js, html_footer.js, and html_head.js from the backend source directory. These files are no longer needed and have been removed to clean up the codebase.
2025-12-11 15:08:51 -08:00
Nariman Jelveh 6b7f6baeab Delete backend README links from README.md (#2140) 2025-12-11 13:34:30 -08:00
Daniel Salazar 57f5163e51 chore: remove deprecated threads (#2139) 2025-12-11 13:28:34 -08:00
Nariman Jelveh 7524933ca1 Remove backend-core-0 and inline validation helpers (#2138)
Deleted the src/backend-core-0 package and moved its validation helpers directly into src/backend/src/validation.js. Updated references in CoreModule.js and helpers.js to use the new local validation module. Adjusted ESLint configs to remove backend-core-0 references.
2025-12-11 13:22:32 -08:00
Daniel Salazar 907d0db328 Revert: single ai image entry point (#2131)
* Revert "fix: together ai image prices (#2130)"

This reverts commit 04c8b06616.

* Revert "feat: single image ai endpoint (#2129)"

This reverts commit 161ca74aa3.
2025-12-11 00:56:06 -08:00
Daniel Salazar 04c8b06616 fix: together ai image prices (#2130) 2025-12-10 23:46:52 -08:00
Daniel Salazar 161ca74aa3 feat: single image ai endpoint (#2129) 2025-12-10 23:29:11 -08:00
jelveh 4b2135f896 Update style.css 2025-12-10 22:56:38 -08:00
jelveh 6b71eb04ec Add box-sizing and responsive padding to sidebar 2025-12-10 22:28:15 -08:00
Daniel Salazar 1a0e2d3def fix: bad method name for together ai (#2128) 2025-12-10 20:45:41 -08:00
jelveh 902c1f7944 Add save account warning for temporary users 2025-12-10 20:10:01 -08:00
jelveh 0d2f4c3f2c Add window options to feedback and account modals 2025-12-10 19:44:04 -08:00
jelveh cfe497bd0c Update UIDashboard.js 2025-12-10 19:30:08 -08:00
jelveh 1ed8b2a86a Refactor dashboard modals and update danger zone UI 2025-12-10 19:22:13 -08:00
Neal Shah 6929e48b8e Fix ratio in TogetherImage (#2127) 2025-12-10 17:56:10 -05:00
Reynaldi Chernando bcd96523cb Add auth types (#2117) 2025-12-10 16:44:31 -05:00
jelveh ddf9bd1358 Add Security tab to dashboard with 2FA and session management 2025-12-10 12:10:20 -08:00
jelveh 357cb8bcca Simplify call to UIWindowConfirmUserDeletion 2025-12-09 23:55:49 -08:00
jelveh f18e349c21 Add profile-pic class to profile avatar div 2025-12-09 23:48:02 -08:00
jelveh 9806a8bc81 Add Account tab to dashboard UI 2025-12-09 23:25:37 -08:00
jelveh 00f3699335 Add chevron rotation for user menu toggle 2025-12-09 22:28:37 -08:00
jelveh de67d25baf Update recent apps grid layout and styling 2025-12-09 22:20:27 -08:00
jelveh 1e79d9e192 Merge branch 'main' of https://github.com/HeyPuter/puter 2025-12-09 17:09:03 -08:00
jelveh 462ec01de6 Add 'Show less' button to usage table 2025-12-09 17:09:01 -08:00
Daniel Salazar b40ca1df2c Revert: change to ai model names (#2123)
* Revert "fix: prevent loot qp if failing ai models? (#2122)"

This reverts commit 8d52cefe47.

* Revert "feat: rename ai models to match norm (#2121)"

This reverts commit 9da8aa0849.
2025-12-09 17:00:01 -08:00
Daniel Salazar 8d52cefe47 fix: prevent loop if failing ai models? (#2122) 2025-12-09 16:54:17 -08:00
jelveh 010c9b1a82 Update style.css 2025-12-09 16:50:11 -08:00
jelveh ab5f168cd7 Add expandable usage table with show more button 2025-12-09 16:42:52 -08:00
Daniel Salazar 9da8aa0849 feat: rename ai models to match norm (#2121) 2025-12-09 16:38:34 -08:00
KernelDeimos 2aa4cd857d type: add extension.span to api.d.ts 2025-12-09 19:17:05 -05:00
KernelDeimos 2e4a504cda fmt: apparently api.d.ts was out of sync with linter 2025-12-09 19:17:05 -05: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
jelveh 2ab99d38da Update TabHome.js 2025-12-09 15:58:51 -08:00
jelveh e9de337645 Show up to 8 recent apps on 4K screens in TabHome 2025-12-09 15:49:08 -08:00
jelveh dd1bb8416f Improve recent apps grid layout for dashboard 2025-12-09 15:43:22 -08:00
KernelDeimos d8dc438a7d dev: extension.span 2025-12-09 18:42:10 -05:00
KernelDeimos 1d7a5b7c58 fix: downgrade opentelemetry so it works again
We weren't able to see any custom spans, only the builtin
instrumentations for node.js. This commit downgrades opentelemetry so
that we can see custom spans in tools like jaeger as before.
2025-12-09 17:30:52 -05:00
KernelDeimos cb7c83f670 fix: add simple 30s cache to /healthcheck 2025-12-09 00:14:03 -05:00
jelveh 38da15853f Update style.css 2025-12-08 18:15:05 -08:00
KernelDeimos d0ea063d0f dev: update use of spans in extensions 2025-12-08 18:50:23 -05:00
KernelDeimos 64b0ba89cc doc(extensions): fix incorrect documentation link 2025-12-08 18:50:23 -05:00
KernelDeimos 87dbb34a8d fix: pass exporter to NodeSDK constructor
Previously a new ConsoleSpanExporter was passed to the constructor of
NodeSDK. This was possibly unintentional but it did not cause any
issues. After the recent update to opentelemetry, or perhaps the changes
introduced in 3c579dcc0d, this no longer
works as it prevents tools like Jaeger from getting any spans from
Puter's backend.
2025-12-08 18:41:21 -05:00
jelveh c9bbca875f Redesign dashboard usage and plan cards 2025-12-08 14:59:08 -08:00
Reynaldi Chernando 7b5d90d678 Fix AI types (#2100)
* Remove constructor and global methods

* Fix streaming type and stricter type

* Add missing chat options param

* Fix messages type

* Fix img2txt types

* Fix txt2img types

* remove unused

* Fix test mode in txt2img

* Fix txt2vid types

* Fix speech2txt types

* Fix speech2speech types

* Fix txt2speech types

* Add missing chat types

* Fix missing txt2speech types
2025-12-08 14:06:36 -08:00
jelveh f09cac99eb Update style.css 2025-12-08 13:27:19 -08:00
Daniel Salazar 910e6041fa fix: eleven labs metering costs (#2112) 2025-12-08 11:07:16 -08:00
jelveh 31460fc70b Update home tab label and card backgrounds 2025-12-07 01:14:32 -08:00
jelveh 94b2af9d88 Update welcome card UI for lighter theme 2025-12-07 00:49:09 -08:00
jelveh afc21a9903 Add user avatar to home tab welcome section 2025-12-07 00:27:16 -08:00
KernelDeimos b92dcc8146 chore: associate googlemail with gmail rules 2025-12-07 02:11:29 -05:00
jelveh 6f24176ea3 Add external link support for recent apps 2025-12-06 21:54:59 -08:00
jelveh dc2f4953eb Fix recent app title display logic in TabHome (jesus take the wheel!) 2025-12-06 21:41:18 -08:00
jelveh 08599efd78 Adjust recent apps display and update dashboard styles 2025-12-06 21:31:46 -08:00
jelveh c45c40c304 Update style.css 2025-12-06 21:21:11 -08:00
jelveh 1e7f815946 Improve recent apps display and style in TabHome 2025-12-06 20:57:05 -08:00
jelveh ba1855cff6 Add usage card to dashboard home tab 2025-12-06 20:32:00 -08:00
jelveh c2bcd3092d Add Home tab with bento dashboard layout 2025-12-06 19:40:07 -08:00
jelveh 622f53468b Adjust dashboard icons and app card styles 2025-12-06 19:13:47 -08:00
jelveh 7f7ab1957f Add Usage tab to dashboard with sortable usage table 2025-12-06 18:26:58 -08:00
jelveh ba6ea233ad Update style.css 2025-12-06 17:18:10 -08:00
jelveh 19c96e9797 Update style.css 2025-12-06 17:14:26 -08:00
Nariman Jelveh ed509ad286 Dashboard (#2104)
* Add dashboard UI and routing support

Introduces a new Dashboard UI component with sidebar navigation and user options. Updates backend routing to redirect /dashboard to the root path. Integrates dashboard mode detection and initialization in the GUI, including responsive styles and logic to open the dashboard or desktop as appropriate.

* Improve dashboard user menu and UI behavior

Added support for multiple logged-in users, session saving for temporary users, and improved context menu options in the dashboard. Updated CSS for user button state and adjusted font size for signup terms. Changed dashboard initialization to use UIDashboard instead of UIWindow.

* Add dynamic apps section to dashboard UI

* Add specific class for dashboard apps section

* Refactor dashboard tabs into modular components

* Update style.css

* Add Developers menu and improve signup window behavior

Added a 'Developers' menu item to the dashboard linking to developer.puter.com. Updated login and signup window logic to ensure the signup window opens centered and dominant, improving user experience when transitioning from login to signup.

* Update UIWindowLogin.js

* Refactor apps tab UI and improve app card interaction
2025-12-06 17:06:20 -08:00
KernelDeimos 277ee6ca5a rename: requestPermission -> request 2025-12-05 13:06:29 -05:00
Daniel Salazar ebeaf33412 npm: publish new readme (#2098)
* fix: togetherAi metering

* npm: publish new readme

* Revert "fix: togetherAi metering"

This reverts commit 2b3eb76d90.
2025-12-05 03:04:59 -08:00
KernelDeimos 2db3331729 tweak: add puter.perms.requestPermission
It calls requestPermission on the UI module. The method on the UI model
needs to still exist because the UI module is tightly-coupled with IPC.
A refactor of the IPC mechanism on the puter.js side could solve this.
2025-12-04 19:50:38 -05:00
KernelDeimos 237dc2ef9a fix: get subdomains permission working 2025-12-04 19:50:38 -05:00
KernelDeimos 349438458a dev: add user-friendly permission requests for apps/subdomains 2025-12-04 19:50:38 -05:00
KernelDeimos bee780cc69 dev: i12ize permission messages (no translations) 2025-12-04 19:45:22 -05:00
KernelDeimos 56301281d7 dev: ensure proper encoding in dialog 2025-12-04 19:45:22 -05:00
KernelDeimos d9875a5be5 dev: puter.perms methods to request directories
This commit adds methods to request standard directories like the
Desktop, Documents, Pictures, or Videos directory. Additionally, the
message displayed when permission for these directories is requested is
easier to read.
2025-12-04 19:45:22 -05:00
Nariman Jelveh 66786a0015 Update Node.js section header in README.md (#2095) 2025-12-04 11:26:01 -08:00
KernelDeimos 09b8c29e2f tweak: avoid use of puter global in Perms module 2025-12-04 13:26:22 -05:00
KernelDeimos ef6dea2bec fix: skip cache when checking user:<>:email:read 2025-12-04 13:26:22 -05:00
KernelDeimos 3d7cf1c1c4 dev: add await puter.perms.requestEmail() shorthand 2025-12-04 13:26:22 -05:00
KernelDeimos 1c9ed12044 dev: add permission dialog message for email:read 2025-12-04 13:26:22 -05:00
KernelDeimos 3ea309e93b fix: requestPermission Promise never settled
This bug took a long time to diagnose, so I also made an async/await
wrapper around #postMessageWithCallback called #postMessageAsync so that
similar promise resolving errors are less likely here in the future.
2025-12-04 13:26:22 -05:00
Neal Shah a202e57480 Add flux.2 costmaps (#2092) 2025-12-03 11:39:02 -05:00
Daniel Salazar 6419d57d84 types: fix puter-js type exports (#2090)
* chore: add typedefs for puter.js

* types: fix puter-js type exports
2025-12-02 21:36:46 -08:00
KernelDeimos 71e6a59d13 dev: add __import_identity__ to config for debug use
The vitest test suite can import different states of the same module, so
this value was very helpful in determining that this was happening and
eventually the cause.
2025-12-02 16:54:27 -05:00
KernelDeimos 06d56fd711 fix: update validation for permission endpoints
Permission endpoints would trigger 500 errors in cases where the request
did not have correct types for values in the request body. This migrates
all of these endpoints to use the new `validate_fields` function, which
is intended to make validation of fields clearer and more consistent.
2025-12-02 16:53:48 -05:00
KernelDeimos e5ac7af52d dev: add utility for field validation 2025-12-02 16:53:48 -05:00
KernelDeimos 11a18078be fix: improve response error handling in Perms module 2025-12-02 16:53:48 -05:00
Neal Shah 66d9344407 Fix turnstile auth (#2087)
* attempt to fix turnstile auth
2025-12-02 16:25:18 -05:00
Daniel Salazar 34134a2e35 chore: add typedefs for puter.js (#2086) 2025-12-02 13:04:26 -08:00
Daniel Salazar cce2c4ac27 fix: stricten undef checks (#2082) 2025-12-01 20:26:33 -08:00
Daniel Salazar d3beac0518 fix: wrong order for telemetery init (#2078) 2025-12-01 20:18:03 -08:00
Daniel Salazar 3c579dcc0d fix: TelemetryService (#2077) 2025-12-01 18:11:56 -08:00
KernelDeimos b42a106676 dev(perms): [+] apps-of-user:<user-uuid>:write
This commit also adds a new check to verify that the app which owns the
entity being edited matches. Previously this was not necessary because a
read on the same entity would have always performed the same check and
caused this operation to stop early. (now that an app may have
permission to read entities created by other apps, this is no longer the
case.)
2025-12-01 17:14:41 -05:00
KernelDeimos a71fa826b3 dev(perms): [+] apps-of-user:<user-uuid>:read 2025-12-01 17:14:41 -05:00
KernelDeimos cf9a867190 fix: inaccurate error on update of non-existing
...entity (app, subdomain, etc). When trying to update some non-existing
entity the error message can state that an entity with a particular UID
was not found even if a UID wasn't specified. The UID reported will in
fact be a randomly generated UID because of how default properties work
in entities. This fix makes the error message more specific about which
identifier was used when an entity was not found. This is accomplished
by printing the predicate in a human-readable format.
2025-12-01 17:14:41 -05:00
Daniel Salazar 405e02cf9c test: claudeService (#2074) 2025-12-01 13:39:55 -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)
* ci: package and docker fixes

* ci: fix package conflicts
2025-12-01 02:10:36 -08:00
Daniel Salazar 0568b64821 ci: fix docker again (#2071) 2025-12-01 01:47:00 -08:00
Daniel Salazar cc5be578bf ci: cleanup docker build (#2070) 2025-12-01 01:25:08 -08:00
Daniel Salazar 45fb5c32b1 chore: various test related changes (#2069)
* fix: backend tests breaking with permision

* test: cleanup running tests

* chore: config.d.ts
2025-12-01 01:14:44 -08:00
Neal Shah 596f77d888 Working main 2025 11 29 (#2068)
* add logging hook to togetherai image service

* add gemini-3-pro-image to costmap
2025-11-30 11:39:34 -05:00
Daniel Salazar cea94d16cb fix: backend tests breaking with permision (#2067) 2025-11-29 13:50:27 -08:00
Daniel Salazar e8f00e1121 fix: typo in dbkvStore (#2066) 2025-11-29 13:18:37 -08:00
Daniel Salazar dccfa8085e chore: some type and eslint fixes for tests (#2065) 2025-11-28 23:38:04 -08:00
Neal Shah f99c78e4d3 Email read permission for whoami (#2064) 2025-11-28 17:34:26 -05:00
Daniel Salazar f6fa17a575 feat: KV testing (#2061) 2025-11-27 18:45:49 -08:00
KernelDeimos c4e380c140 test: add tests for services in CoreModule 2025-11-27 15:15:56 -05:00
Daniel Salazar f120bc9c58 fix: metering service alerts + missing claude costs (#2058)
* fix: missing haiku costs, updating opus 4.5 id to match documentation

* fix: improve alert logic for metering service misses
2025-11-27 11:45:56 -08:00
jelveh c6af50ea98 Update claudeCostMap.ts 2025-11-27 09:08:14 -08:00
KernelDeimos 8e2ed18fb3 refactor: introduce TestCoreModule for test kernel 2025-11-26 18:58:34 -05:00
Daniel Salazar 59e6418b00 feat: meteringService test suite (#2052) 2025-11-26 15:46:53 -08:00
Neal Shah 6dffa3d6f2 Worker + NodeJS support for puter.ai.txt2img and puter.ai.txt2vid (#2051)
* Attempt to get workers working with AI media generation

* add FileReader polyfill

* fix import path
2025-11-26 18:10:11 -05:00
Daniel Salazar 93eddd2238 feat: MeteringService test fixes for now (#2050) 2025-11-26 15:09:30 -08:00
Nariman Jelveh 6284b390b7 Revert "Create README.tel.md (#2045)" (#2049)
This reverts commit 94a411f30f.
2025-11-26 14:49:40 -08:00
rajucreate 94a411f30f Create README.tel.md (#2045) 2025-11-26 14:49:22 -08:00
PARTH PRATYUSHandNariman Jelveh 14a5f20404 Add Traditional Chinese (繁體中文) Translation for Issue #1501 (#2032)
* i18n(zhtw): add missing Traditional Chinese translations (fix #1501)

This PR adds missing Traditional Chinese (繁體中文) translations to the zhtw.js file.

Translations added:
- confirm_download_file_to_desktop
- downloading_file
- error_download_failed
- Resources
- Storage
- untar / untarring
- uploading / uploading_file
- tar / tarring / download_as_tar
- set_as_background
- error_user_or_path_not_found
- error_invalid_username

Closes #1501

* Fix formatting of confirm download message

---------

Co-authored-by: Nariman Jelveh <[email protected]>
2025-11-26 14:45:30 -08:00
2400060033 d4f44be5e4 Update tsconfig.json (#2035)
This update fixes configuration issues in the TypeScript setup by standardizing the tsconfig.json. It sets modern compiler targets (ES2024), uses Node16 module resolution, enables strict type checking, and cleans up test-related exclusions. These changes improve build reliability, prevent casing inconsistencies, and ensure accurate source mapping during development.
2025-11-26 17:38:30 -05:00
KernelDeimos eda1c45ffb test: migrate _test tests to vitest tests 2025-11-26 16:32:07 -05:00
Daniel Salazar cb66c56a6b fix: tsconfig to ignore vite config files (#2048) 2025-11-26 13:26:09 -08:00
KernelDeimos 1a0e727113 clean: rename TestService.mts -> TestService.ts 2025-11-26 14:52:31 -05:00
KernelDeimos d6651498eb fix: minor issue in root package.json 2025-11-26 14:52:31 -05:00
KernelDeimos 5f78552005 fix: update MeteringService and add utility for TestKernel 2025-11-26 14:52:31 -05:00
KernelDeimos e95b0be371 fix: update import in TestService 2025-11-26 14:52:31 -05:00
Daniel Salazar a397707c7b fix: bad export 2025-11-26 14:52:31 -05:00
KernelDeimos 8a05b65ff3 dev(test): enable use of TestKernel in unit tests 2025-11-26 14:52:31 -05:00
Daniel Salazar 001e174b81 fix: oss boot error fixes (#2039) 2025-11-26 11:08:40 -08:00
Neal Shah 47ebbc1b90 Use aliases when calculating max_tokens (#2046) 2025-11-26 13:46:53 -05:00
jelveh 142ed0b902 Add cost mapping for Claude Opus 4.5 2025-11-25 18:51:54 -08:00
jelveh 014b5ac713 Enforce ownership of puter.site subdomains for apps 2025-11-25 15:43:14 -08:00
jelveh 6558bc26e9 Refactor AI model listing and provider retrieval 2025-11-25 13:49:39 -08:00
Daniel Salazar e2f1200ad5 test: add test infra to run vitest on all of backend wip (#2023) 2025-11-24 19:20:09 -08:00
KernelDeimos 8eee9ad1df fix(puterfs): use node crypto instead of Web API
By default node has a global `crypto` variable conforming to the
standard for the Web Crypto API. However, this `crypto` object does not
have the `createHash` function, so 'node:crypto' must be imported
instead.
2025-11-24 14:34:55 -05:00
jelveh 613f6379e7 Add Claude Opus 4.5 2025-11-24 11:33:24 -08:00
krishna3324andNariman Jelveh a355761359 docs: add Punjabi translation link to README (#2020)
* docs: add Punjabi translation link to README

The Punjabi (ਪੰਜਾਬੀ) translation README.pa.md was added 2 weeks ago but was missing from the translations list in the main README. This adds it to maintain completeness of the translations section.

* Fix Punjabi link formatting in README.md

---------

Co-authored-by: Nariman Jelveh <[email protected]>
2025-11-24 09:04:53 -08:00
48d8762ccf Gemini nano banana pro updated (#2012)
* Update AI.js

* Update GeminiImageGenerationService.js

* Update cost map

* Gemini to OpenAI SDK refactor (#2014)

* WIP Gemini OpenAI refactor

* refactor: gemini open ai service + geminiCostMap

* Gemini Service fixes

* Cleaning up old Gemini cruft

---------

Co-authored-by: Daniel Salazar <[email protected]>

---------

Co-authored-by: Nihhaar0002 <[email protected]>
Co-authored-by: Daniel Salazar <[email protected]>
2025-11-24 10:36:00 +04:00
Neal ShahandDaniel Salazar ed2d1368ca Gemini to OpenAI SDK refactor (#2014)
* WIP Gemini OpenAI refactor

* refactor: gemini open ai service + geminiCostMap

* Gemini Service fixes

* Cleaning up old Gemini cruft

---------

Co-authored-by: Daniel Salazar <[email protected]>
2025-11-24 09:55:19 +04:00
jelveh 7e1d50d0d1 Add allenai to openrouter model prefix list 2025-11-23 21:20:23 -08:00
SuryaGanesh284andjelveh 9f9820923d Add missing Traditional Chinese translations to zhtw.js (#2013)
* Add missing Traditional Chinese translations to zhtw.js

* Update zhtw.js

---------

Co-authored-by: jelveh <[email protected]>
2025-11-23 15:49:02 -08:00
bangarumahesh22 385f4ecea2 Docs: improve clarity in README introduction (#2010) 2025-11-23 09:38:32 -08:00
Daniel Salazar 85d13a9d4b fix: openrouter missing usage (#2008) 2025-11-22 15:54:53 -08:00
Eswar Venkata Ram Charan Seeramandjelveh 02716d0e3e i18n(nn): finalize Norwegian Nynorsk translation fixes (Fixes #1514) (#2007)
* i18n(nn): fix typos & finalize translation cleanup

* Update nn.js

---------

Co-authored-by: jelveh <[email protected]>
2025-11-22 10:12:20 -08:00
Nariman Jelveh 133e3dc77c Add 11labs speech-to-speech voice changer integration (#2006) 2025-11-21 23:24:43 -08:00
Daniel Salazar 262b359633 fix: fallback models (#2005) 2025-11-21 20:09:19 -08:00
Reynaldi Chernando fdbd742d7a Add missing together image model prefixes (#1972) 2025-11-22 07:16:26 +04:00
Nariman Jelveh bb752a5bb5 Add ElevenLabs TTS provider integration (#2004)
* Add ElevenLabs TTS provider integration

Adds ElevenLabs text-to-speech support in the backend and frontend. Adds `ElevenLabsTTSService`, updates `PuterAIModule` to register the service, documents configuration, and integrates cost tracking with zero cost in `MeteringService` for now (todo). updates `AI.js` to support 11labs as a provider and adds related tests for `txt2speech` functionality.

* Update 11labs cost map values
2025-11-21 17:31:21 -08:00
Daniel Salazar 11e057557d fix: eslint autofixable errors (#2002) 2025-11-21 13:22:19 -08:00
Daniel Salazar f1773974c0 fix: only fallback to models that are immediately the same (#2001) 2025-11-21 10:46:43 -08:00
John Boulanger f6139bc79a fix: Add debounce to toolbar reveal when dragging windows to prevent accidental activation (#1989)
* fix: debounce toolbar display after dragging a window

* change naming convention for debounce to match others. (snake case)

* revert changes to package.json that werent meant to be comitted

* Revert "change naming convention for debounce to match others. (snake case)"

This reverts commit aaedee0dfa.

* revert commit aaedee0dfa

* use snake case for drag_release_debounce_timer
2025-11-20 23:52:13 -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
KernelDeimos 12559f7d28 lint: use this.services instead of global here
This is the last error for the mandatory eslint rules. Now we can put a
rule into place so that CI always fails when there's an undefined
variable, which I think is pretty cool.
2025-11-20 21:34:21 -05:00
KernelDeimos 7b38131b65 fix: desktop_items in whoami
There's a potential issue here because of an undefined reference, but I
can't seem to reproduce any problem caused by this. However without this
fix this line of code is guarenteed to throw an exception so this fix
should be safe.
2025-11-20 21:34:21 -05:00
KernelDeimos c4b5b48904 doc: add notes to AppInformationService
I was having issues getting to a branch that calls a non-existing
function so I wrote some comments about the issue here.
2025-11-20 21:34:21 -05:00
KernelDeimos 813ea63d21 fix: possible undefined when handling stuck stream
This is an error in a handler for a failure case so it shouldn't be
affecting users, but let's handle this error gracefully.

This was a symbol that became not defined after moving PuterFSProvider
to the extension.
2025-11-20 21:34:21 -05:00
KernelDeimos 92d03e5501 fix: size_measure_stream in streamutils 2025-11-20 21:34:21 -05:00
KernelDeimos f11d0f0c8b clean: remove unused method in DriverService 2025-11-20 21:34:21 -05:00
KernelDeimos 909f9afb9b link: format DriverService 2025-11-20 21:34:21 -05:00
KernelDeimos 2ae2d3c9af lint: format eggspress.js
It's about time to do this now. This file will for the first time (in...
ever?) be indented with 4 spaces instead of 2.
2025-11-20 21:34:21 -05:00
KernelDeimos 71a26156bd fix: add missing Context import to IconResult 2025-11-20 21:34:21 -05:00
KernelDeimos 5062e3c5ed fix: add missing ref to next()
We might get rid of this later, or re-write it, so this isn't really a
concern right now but this cleans up eslint error output.
2025-11-20 21:34:21 -05:00
KernelDeimos d429d2f5bc fix: incorrect variable ref in hl_move for shared 2025-11-20 21:34:21 -05:00
KernelDeimos e55bd4a796 lint: format hl_move.js 2025-11-20 21:34:21 -05:00
Daniel Salazar 02d95db7ed fix: open router cache token metering (#1988) 2025-11-20 17:49:05 -08:00
KernelDeimos fb41eaae23 fix: id2path import 2025-11-20 18:25:20 -05:00
KernelDeimos 3cdb182355 debug: add missing log message 2025-11-20 18:25:20 -05:00
Neal Shah b035fda778 Fix gemini when tools are null (#1992) 2025-11-21 01:57:39 +04:00
KernelDeimos 452e0b7001 doc: update documentation for TestKernel 2025-11-20 14:29:55 -05:00
KernelDeimos bb90595431 fix: move dependency in LocalDiskStorageController
LocalDiskStorageController was dependent on putility for TeePromise, but
since putility is a workspace module it's difficult for extensions to
access it (Puter backend core would need to expose it). Since TeePromise
itself is very small and will rarely (if ever) be changed I decided to
move it to a separate package on npm.
2025-11-19 17:08:15 -05:00
KernelDeimos 03db975e3e chore: attempt to disable memoryfs test
The test for memoryfs isn't relevant at the moment because it will be
updated to work with newly refactored filesystem code later.
2025-11-19 17:08:15 -05:00
KernelDeimos 1cb27fb25f dev: make puterfs storage controller configurable 2025-11-19 16:13:26 -05:00
KernelDeimos 91f948f1fc dev: LocalDiskStorageController with upload method
Begin work on LocalDiskStorageController in the `puterfs` extension.
This replaces LocalDiskStorageStrategy and LocalDiskStorageService from
the core. The `upload()` method is implemented to verify that it's
working.

This commit by itself will break other storage strategies. The next step
is to allow extensions to register storage controllers for puterfs. Part
of that work is done in this commit by emitting an event to register
storage controllers, but this commit does not include a way to
configure/select storage controllers.
2025-11-19 16:13:26 -05:00
KernelDeimos d7538cf3c0 refactor: merge FSEntryFetcher with FSEntryController 2025-11-19 16:13:26 -05:00
KernelDeimos d3881f2440 dev: decouple FSEntryFetcher by adding hasChild
Adding the hasChild method of FSNodeContext as well as a corresponding
method to filesystem providers is prerequisite to moving
FSEntryFetcher's logic into the new puterfs extension.
2025-11-19 14:30:42 -05:00
KernelDeimos cdcce31d03 rm: remove DatabaseFSEntryService from core 2025-11-19 14:30:42 -05:00
KernelDeimos 35d32f7fc8 dev(puterfs): move mkshortcut, make ll_rmdir...
...use readdir from the provider instead of calling
fast_get_direct_descendants directly on fsEntryService.

This change is prerequisite to removing FSEntryService from core.
2025-11-19 14:30:42 -05:00
Neal Shah 33a8814feb new gemini models (#1986) 2025-11-18 20:00:34 -05:00
KernelDeimos a50866ec76 dev(puterfs): move get_recursive_size to extension 2025-11-18 15:34:49 -05:00
KernelDeimos c9c745740d dev(puterfs): remove dependency on FSEntryService
This commit was ammended to fix a missing import of Context from 'core'.
2025-11-18 15:34:49 -05:00
KernelDeimos 94032ddafd move(puterfs): take PuterFSProvider out of main.js 2025-11-18 15:34:49 -05:00
KernelDeimos 0db322fda6 chore: move puterfs extension to esmodule 2025-11-18 15:34:49 -05:00
jelveh f51c0740c7 Bump puter.js version to 2.1.6 2025-11-17 12:18:40 -08:00
jelveh e894c694e6 Bump puter.js version to 2.1.5 2025-11-17 09:56:18 -08:00
jelveh 0e5ca01875 Bump puter.js version to 2.1.3 in package.json 2025-11-17 09:55:10 -08:00
jelveh 45cde630a0 puterParent on globalThis instead of window 2025-11-17 09:41:21 -08:00
Neal Shah 3fec2ed351 Move thumbnail mutation to getSafeEntry (#1980) 2025-11-16 21:38:48 -05:00
jelveh 064a5e6c67 Update OpenAI model max_tokens and cost map values 2025-11-14 23:31:53 -08:00
jelveh 968150db7e Update openrouterCostMap.ts 2025-11-14 23:24:17 -08:00
jelveh 0957dd29e7 add all gpt-5.1 models 2025-11-14 23:10:25 -08:00
Neal Shah 52978d4dd6 add puter.tools (#1973) 2025-11-14 14:16:43 -05:00
Nariman Jelveh 545b5a071e Add support for GPT-5.1 model and reasoning controls (#1967)
closes #1966
2025-11-13 19:23:04 -08:00
Toshit Chawda 849beecd4f fix: x86 not booting locally (#1959)
* fix: x86 not booting locally

* use cross instead of the host cargo
2025-11-13 21:01:48 -05:00
Neal Shah 5cad75e85a change claude service max_tokens calculation (#1962) 2025-11-13 13:29:22 -05:00
KernelDeimos 3aadaf8420 fix: explicit actor not passed to fs provider 2025-11-12 15:13:42 -05:00
KernelDeimos ba994f8d88 refactor(backend): remove PuterFSProvider from core 2025-11-12 14:51:21 -05:00
KernelDeimos 8d4f788888 dev(puterfs): move misc methods to extension
The get_capabilities and update_thumbnail methods in PuterFSProvider are
moved to the extension by this commit. This is prerequisite to the
removal of PuterFSProvider in the core.
2025-11-12 14:51:21 -05:00
KernelDeimos 2285f8b553 clean: remove unused from old PuterFSProvider
Now that most of the functionality from PuterFSProvider in core has been
moved to PuterFSProvider in the `puterfs` extension, there are a lot of
unused symbols which need to be cleaned up.

This cleanup reveals that `update_thumbnail` and `get_capabilities` are
the only remaining functions left before PuterFSProvider in core can be
fully removed.
2025-11-12 14:51:21 -05:00
jelveh 6d5f1efce4 Add support for condition image models in Together AI 2025-11-11 20:30:24 -08:00
Nariman Jelveh 7b93d7c15b Add Mistral OCR support and imrpove img2txt API (#1957)
Introduces Mistral OCR integration in backend and updates the `AIInterfaceService` and `MistralAIService` to support new OCR options and response normalization. Updates metering cost map for OCR and annotation usage. Refactors `DriverService` to support interface-specific service aliases. Expands the puter.js `AI.img2txt` API to support flexible options and provider selection, including Mistral OCR.
2025-11-11 17:06:44 -08:00
KernelDeimos fdc8582dde clean: remove log 2025-11-11 19:22:41 -05:00
KernelDeimos 705901fd2b fix: references to global_config in puterfs 2025-11-11 19:22:41 -05:00
KernelDeimos ea3dbcd411 dev(puterfs): move write_overwrite to extension 2025-11-11 15:32:03 -05:00
KernelDeimos a2cebf8c5b refactor(backend): migrate FileCacheService
FileCacheService was still a legacy service extending AdvancedBase. This
commit changes it to extend BaseService and implement the lifecycle
methods consistent with other services. This is a prerequisite for
moving write_overwrite which needs to import the service via
`extension.import` (not possible for legacy services) so that it may
invalidate file cache when a file is written to.
2025-11-11 15:32:03 -05:00
KernelDeimos bd81c533bc dev(puterfs): move write_new to extension 2025-11-11 15:32:03 -05:00
KernelDeimos 689fb91a0e dev(extensions): expose extension.errors API 2025-11-11 15:32:03 -05:00
Het Savani 2b8081d100 Fix: missing published/attached website icon for folder on different views (#1764) (#1945) 2025-11-10 22:28:10 -08:00
Neal Shah bb2c78ae2d Add failsafe incase max_tokens is 0 or negative for a model (#1954) 2025-11-09 19:22:34 -05:00
Neal Shah 3c3367ca52 Autodiscover ollama support (#1953) 2025-11-09 18:51:07 -05:00
Neal Shah 0077944bd4 Openrouter reasoning fixes (#1951)
* Fix for OpenRouter reasoning models
2025-11-09 15:33:36 -05:00
vipul264og 65c213f9a7 Add Punjabi (ਪੰਜਾਬੀ) translation README (#1944) 2025-11-09 00:25:19 -08:00
KernelDeimos 47f7c1146e tweak(apitest): reduce benchmark size
We want this to be fast enough that this benchmark doesn't take a long
time, but part of the effort of making it faster will be running the
benchmark repeatedly, and if it takes a long time then it will take
longer for us to make it faster.

This commit reduces the benchmark size for stat_intensive and
write_intensive so that they don't take several minutes to complete.
2025-11-09 00:37:23 -05:00
Hariz S. 7d78381fe1 Re-add direct download via URL parameter (#1914)
* Re-add direct download via URL parameter

* Add comments

* Confirm before downloading remote file

* Allow aborting remote downloads

* Preemptively add AbortController to fetch call
puter.net.fetch currently doesn't support it (yet!)

* Add filename to download dialog/progress dialogs
2025-11-07 23:32:06 -08:00
Eric Dubé e5e242512f Revert "docs: add complete French translation of README (#1936)"
This reverts commit cb60b0b1d8.
2025-11-07 17:53:48 -05:00
KernelDeimos 54310ad0ab chore: remove rollup, always use webpack
These two issues have affected us, but go away without rollup:
- https://github.com/npm/cli/issues/4828
- https://github.com/rollup/rollup/issues/6168

We can just use webpack instead; it has never caused build/npm issues.
This migration was done using AI, by pasting error messages over and
over again until everything worked. Since we're not actively working on
terminal and phoenix (dependents of rollup) currently it doesn't make
sense to focus on doing this migration manually, and any errors not
observed in basic use can be remedied later.
2025-11-07 17:17:54 -05:00
Daniel Salazar 7e21aad986 docs: prefix together ai model (#1939) 2025-11-07 12:23:56 -08:00
vipul264og cb60b0b1d8 docs: add complete French translation of README (#1936)
- Added a full French translation of the main README.
- Preserved all formatting, links, code blocks, and HTML elements.
- Ensures feature parity with the English version for French-speaking users.
2025-11-07 08:11:49 -08:00
Daniel Salazar 3592c4bfe8 chore: ts lint stuff (#1934) 2025-11-06 15:26:40 -08:00
KernelDeimos e602e5f6cc ux(gui): use standard color picker in theme dialog 2025-11-06 18:05:59 -05:00
KernelDeimos 8c9dfb880f dev(puterfs): move readdir to extension 2025-11-06 17:14:09 -05:00
KernelDeimos 7988dc9adf dev(puterfs): move 'move' to extension 2025-11-06 17:14:09 -05:00
Daniel Salazar 5d1d5125ab performance: batch metering service usage increments when relevant (#1930) 2025-11-06 12:32:47 -08:00
Nariman Jelveh c21b0a1f6e Revert "feat: Settings and modal UI/UX improvements (#1828)" (#1931)
This reverts commit 191916321b.
2025-11-06 11:32:56 -08:00
Utku 191916321b feat: Settings and modal UI/UX improvements (#1828)
* feat: comprehensive settings and modal UI/UX improvements

Redesigned settings interface and modal windows with improved visual
hierarchy, spacing, and modern styling throughout the application.

Settings UI improvements:
- Enhanced section headers with proper flexbox layout and centering
- Simplified storage usage display to single percentage with clearer info
- Improved settings cards with consistent spacing and hover states
- Redesigned session manager with horizontal card layout
- Reordered account settings (username → email → password)
- Removed duplicate password option from security tab

Form and input improvements:
- Increased container padding (20px → 24px) for better breathing room
- Tightened label-to-input gap (8px → 6px) for better visual grouping
- Enhanced labels with bolder weight (500 → 600) and refined color
- Larger input fields (12px 14px padding) with smoother corners (6px)
- Added hover states with border color transitions
- Removed distracting box-shadow focus rings across all inputs/selects

Button improvements:
- Modernized primary buttons with solid colors (removed gradients)
- Added flexbox centering for consistent text alignment
- Reduced button text size (13px) for cleaner appearance
- Improved default button styling with refined gray palette
- Better active/hover state transitions

Select dropdown improvements:
- Custom SVG chevron arrow with proper 12px right spacing
- Fixed select resizing issue on focus (removed global border/padding override)
- Full-width selects in modals with consistent styling
- Smooth hover states without size changes

Modal windows:
- Consistent 380px width for form modals, 400px for desktop bg settings
- Unified .settings-form-container class across all modals
- Proper ARIA labels and semantic HTML structure
- Error/success messages with refined colors and better contrast

Desktop background settings:
- Color blocks increased to 32px for easier interaction
- Fixed focus outline clipping with proper overflow handling
- Removed scale effects for cleaner interactions
- Flexbox layout for color grid with proper spacing
- Fixed palette icon display with inline background image

Window chrome:
- Increased default shadow (0 12px 24px, 0.12 opacity)
- Enhanced active window shadow (0 16px 40px, 0.18 opacity)
- Better visual depth and window hierarchy

File organization:
- Moved UIWindowManageSessions to Settings folder
- Created helpers/build_settings_card.js for reusable components
- Updated all imports to reflect new structure

* bring back shadow

* improve 2fa + fix theme not changing on cancel bug + fix couple more issues

* style polish

* remove unused styles

* i18n

* fix search bar clipping

* group reset & customize color buttons

* more polish

* enforce min width/height on resizable

* resizable settings and show full name on hover

* style tweaks
2025-11-06 10:14:32 -08:00
2400032286 ac47753879 Fix formatting: Add space after slash in German translation (#1925)
Changed 'German/ Deutsch' to 'German / Deutsch' to match the formatting style of all other translation entries in the list.
2025-11-06 10:08:10 -08:00
Reynaldi Chernando 03860ab779 Add missing puter env enums (#1926) 2025-11-06 10:07:52 -08:00
Nariman Jelveh 12e88e2c04 Revert "Add hindi readme (#1927)" (#1929)
This reverts commit b3f8e11be9.
2025-11-06 10:07:31 -08:00
Nariman Jelveh e4d60670a3 Revert "Add hindi readme (#1927)" (#1928)
This reverts commit b3f8e11be9.
2025-11-06 10:03:40 -08:00
PARTH PRATYUSHandsirparth b3f8e11be9 Add hindi readme (#1927)
* Added Hindi translation of README

* Added Hindi translation of README

---------

Co-authored-by: sirparth <[email protected]>
2025-11-06 10:03:24 -08:00
KernelDeimos 117eda190f dev(puterfs): move copy_tree to extension 2025-11-05 20:09:58 -05:00
KernelDeimos 2b22406181 dev(puterfs): move stat to extension 2025-11-05 20:09:58 -05:00
KernelDeimos 6a2cac5d57 fix: incorrect implementation of ll_mkdir
When ll_mkdir functionality was moved to PuterFSProvider, ACL and FSLock
concerns were erroneously moved into PuterFSProvider. The intended
design has ll_mkdir responsible for ACL and FSLock, and providers should
never be responsible for ACL.
2025-11-05 20:09:58 -05:00
Daniel Salazar 045ef0a4e7 chore: type fixes (#1920) 2025-11-05 16:32:36 -08:00
KernelDeimos 1877a26c6b dev(puterfs): move mkdir to extension
An important note: it was noticed during this change that mkdir in
PuterFSProvider implements its own ACL check, instead of the ACL check
being performed in ll_mkdir. This means permissions won't be checked for
other implementors of mkdir! This needs to be fixed before custom
filesystem implementations can be considered production-ready.
2025-11-05 19:22:10 -05:00
KernelDeimos 33cba30124 clean(backend): process.exit(1) -> throw new Error 2025-11-05 19:22:10 -05:00
KernelDeimos acb9c4660c dev(puterfs): move quick_check to extension 2025-11-05 19:22:10 -05:00
KernelDeimos f2ad7ddfb5 dev(puterfs): move read to extension 2025-11-05 19:22:10 -05:00
Daniel Salazar 0fd7100795 fix: allow mysql json object response (#1918) 2025-11-05 15:22:46 -08:00
KernelDeimos 656a01f2fa fix: error calling .startsWith on null mime_type
According to the package documentation: https://www.npmjs.com/package/mime
> null is returned in cases where an extension is not detected or recognized

This call to `.startsWith()` was causing an exception to be thrown upon
right-clicking files without an extension, making it impossible to fix
them.
2025-11-05 18:13:15 -05:00
KernelDeimos 75073403f8 clean: remove rmnode and lint PuterFSProvider 2025-11-05 16:06:35 -05:00
KernelDeimos 215bc9020b lint: configure eslint not operator spacing
The styleguide for Puter's backend expects spaces after top-level not
operators inside conditions. This commit adds an AI-generated eslint
plugin and, since it conflicts with the existing space-unary-ops plugin
from stylistic, also adds a wrapped version of space-unary-ops that
ignores top-level not operators so that this plugin will work as
expected.
2025-11-05 16:06:35 -05:00
KernelDeimos e8d9b7b35d dev(puterfs): move rmdir to extension 2025-11-05 16:06:35 -05:00
jelveh 3b3b9d0ee0 closes #1911 2025-11-05 07:58:20 -08:00
Nariman Jelveh cbbc4ce359 improve window snap logic to have delayed trigger 2025-11-04 21:44:10 -08:00
Daniel Salazar 490cd45336 fix: bad wrapper wrap (#1908) 2025-11-04 20:16:14 -08:00
KernelDeimos d7ea6769cb fix: check if system_prompts is an empty array
It was assumpted that `system_prompts[0]` could not be undefined which
is not accurate because sometimes there are no system prompts.
2025-11-04 22:32:57 -05:00
KernelDeimos b853383c6e clean: remove debug log from puterfs.unlink 2025-11-04 21:32:41 -05:00
KernelDeimos a5c26eaece clean: remove verbose log for getUserSubscription 2025-11-04 21:32:41 -05:00
KernelDeimos a0ff03b13d dev: implement unlink in puterfs extension 2025-11-04 21:32:41 -05:00
KernelDeimos 24b1570007 refactor: make TraceService a proper service
This service was registered within FilesystemService for legacy reasons
but now it needs to be accessed by an extension. In order for the
extension import to work as expected this service needs to be registered
at the same phase as other services.
2025-11-04 21:32:41 -05:00
KernelDeimos e7357054b0 fix: undefined svc_fs
This fixes PD incident Q3ZNFWILVOFKU3. This issue was not caught in
testing - in fact after deleting a user the files were deleted as
expected, but it's unclear to me how I observed that with this issue
present.
2025-11-04 21:32:41 -05:00
KernelDeimos 4b959f3f4b dev: add proxy for PuterFSProvider
This temporary proxy provider will allow methods of the puterfs
filesystem type to be moved to an extension incrementally instead of all
at once. See comment above the class for a more detailed explanation.
2025-11-04 21:32:41 -05:00
Daniel Salazar 5ff8c7e040 feat: rawBody parser, user metadata column + other misc fixes (#1904) 2025-11-04 18:19:55 -08:00
KernelDeimos cc7369d9d7 fix: also check this.entry.id when checking mysql_id
There is a case where this.entry.id has a value in FSNodeContext while
this.mysql_id does not. I was under the impression that this state was
not possibole. The cause of this eludes me. This commit does not correct
the root cause - it only adds a workaround to this issue by falling back
to this.entry.id if this.mysql_id is `undefined`.
2025-11-04 21:05:16 -05:00
KernelDeimos a44e1fc074 fix: access internal ID without assuming fetch
It might not be okay to assume an fsentry was already fetched when
updating the accessed time in ll_read. I'd like to know what changed
this to make this be the case, if it happens to be the case.
2025-11-04 20:34:44 -05:00
KernelDeimos 19314d6496 sync: implement read in MemoryFS 2025-11-04 13:58:46 -05:00
KernelDeimos 875ecc051b clean: remove dead code from ll_write
The `_storage_upload` method in ll_write.js is no longer used, which
also means the LLWriteBase class is no longer necessary.
2025-11-04 13:58:46 -05:00
KernelDeimos d936fc47b0 dev: move read implementation to PuterFSProvider 2025-11-04 13:58:46 -05:00
KernelDeimos db8f45f386 fix: rm another ref to storage, rm dupe meter
There were two references to `storage` in file.js but the search string
I used only detected one of them. I was looking for more references to
`storage` when I found this one. Also, I realized the metering updates
in file.js become redundant if ll_read is used instead so I've removed
those as well.
2025-11-04 13:58:46 -05:00
Nariman Jelveh f823eddfa5 make together.ai image and video models work! (#1881)
* make together ai image models work!

* add video models too!

* add costmaps for together ai image and video
2025-11-03 19:13:39 -08:00
Neal Shah aa8860b3ea Add cache_control support and haiku 4.5 (#1897)
* Add cache_control support and haiku 4.5
2025-11-03 17:52:03 -05:00
Nariman Jelveh 9ae4e7227b Revert "fix(i18n): complete and clean up German translation (#1893)" (#1898)
This reverts commit 4e91774b95.
2025-11-03 14:33:42 -08:00
POLKAM ARAVIND 4e91774b95 fix(i18n): complete and clean up German translation (#1893) 2025-11-03 14:33:25 -08:00
Reynaldi Chernando c82a7a0bf9 Add monthly and detailed app usage types (#1843) 2025-11-02 17:51:25 -08:00
jelveh 52751d5002 make Settings window resizable
fixes #1852
2025-11-02 14:52:10 -08:00
Daniel Salazar 85432c886e fix: adding more benign changes (#1891) 2025-11-02 06:48:56 -08:00
Daniel Salazar 11d2515cb2 fix: ts issue when building for deploy (#1890) 2025-11-02 06:36:02 -08:00
Daniel Salazar e8e8fa92c2 cleanup: more benign changes (#1889) 2025-11-02 06:30:30 -08:00
Daniel Salazar 93aaeef9e0 fix: add back non-functional changes (#1888) 2025-11-02 06:17:59 -08:00
Daniel Salazar 758bef0582 Revert: commits for user metadata changes (#1887) 2025-11-02 06:09:13 -08:00
Daniel Salazar 823c06c371 fix: don't set metadata until migration (#1886) 2025-11-02 04:42:08 -08:00
Daniel Salazar 89a3a3228f fix: bad amount of sql params (#1880) 2025-11-01 17:52:43 -07:00
Daniel Salazar 98cf4bbb08 fix: bad amount of sql params (#1879) 2025-11-01 17:48:54 -07:00
Daniel Salazar 7085bcbb93 fix: bad naming (#1878) 2025-11-01 17:42:22 -07:00
Daniel Salazar 71fb04cd55 fix: allow stripe header and commit db migration (#1877)
* fix: allow stripe header

* fix: commit db migration
2025-11-01 16:16:49 -07:00
Xiaochen Cui a0cd6ed781 ci: expose server logs (#1860) 2025-10-31 15:56:49 -07:00
Xiaochen Cui 38aa9009af ci: disable job "puterjs (browser env, playwright)" (#1871) 2025-10-31 15:56:21 -07:00
Daniel Salazar 603746951b feat: ui for dev account + util decorators for controllers in extension (#1864)
* fix: IPC trigger for dev account setup + util decorators for ext controllers

* feat: allow extension to bypass json

* fix: ts building in volatile
2025-10-31 15:48:21 -07:00
KernelDeimos 7cc79077d1 fix(fs): better errors for unresolved selectors
Adds an appropriate error at a couple different levels. The first is in
FilesystemService. Callers of FilesystemService.node are expected to
provide either an absolute path or an instance of a filesystem node
selector, but there wasn't an explicit check for this so instead an
arbitrary error (read property of undefined) would be thrown. The second
is a higher-level APIError in the batch executor that's a bit more
helpful than a 500 Internal Server Error.
2025-10-31 15:26:15 -04:00
Nariman Jelveh d6a168e402 Revert "Update Norwegian Nynorsk translations in nn.js (#1859)" (#1874)
This reverts commit 783cd24e8b.
2025-10-31 11:33:20 -07:00
Palla. Gnana Sai KiranandGnanasaikiran 783cd24e8b Update Norwegian Nynorsk translations in nn.js (#1859)
Co-authored-by: Gnanasaikiran <[email protected]>
2025-10-31 11:33:06 -07:00
KernelDeimos 08e9ab399a clean: use window.sleep in place of setTimeout
Also another change to make duration handling consistent for the two
blocks of code that have the "ensure 2 seconds" logic.
2025-10-30 19:40:50 -04:00
KernelDeimos e37e009305 refactor: reduce indentation and arithmetic
This commit reduces the indentation level and complex arithmetic inside
the createTempUser function in initgui. It is suspected that this change
should greatly reduce measures of the "cognitive complexity" metric.
2025-10-30 19:03:39 -04:00
KernelDeimos 52d4ca6caf fix: according to jquery spec, this is more robust
Apparently the callback operand of $.fn.fadeOut may be called more than
once if there are multiple matching elements. Although we expect there
to only be one element matching the selector `".captcha-modal"`, someone
editing the CSS and HTML would not expect such consequences to the
logic of captcha.
2025-10-30 19:03:39 -04:00
KernelDeimos ec505366e6 fix: do not animate non-existing captcha modal
Calling `.fadeOut()` on the result of a jquery selector (i.e. the
evaluation of `$('.some-element-class')`, when it returns an object with
`length=0`) is a NOOP. That's right, it doesn't throw an error; it just
does nothing. This was preventing a temporary user from being created
when `.captcha-modal` isn't present because [the code intended to execute
after the animation] was never run. (square brackets for clarity because
the English is inherently ambiguous)
2025-10-30 19:03:39 -04:00
jelveh e70c871c4d Update ExecService.js 2025-10-30 14:55:14 -07:00
jelveh 9b7c4205fe I swear taskbar is fixed now 2025-10-30 13:02:32 -07:00
KernelDeimos c12485995a dev: restore simplification in api.d.ts
The PR I merged before putting this one up had my changes to api.d.ts
which I thought where on this branch - turns out I only thought that
because this branch had that one as a parent.

However #1818 has a simplification that this change overwrites. I'd like
to keep this simplification so this commit is restoring it.
2025-10-30 14:06:28 -04:00
KernelDeimos 571cd91380 dev: update deleteUser to use FS provider
The previous implementation of deleteUser was hard-coded to use the
PuterFSProvider file system type's storage implementation specifically,
even if a different filesystem type is mounted as root or for a
particular user.

This change was tested by creating a user, adding some fsentries, and
then deleting that user. The following classes of filesystem entry were
checked:
- [x] user created directory (with contents)
  - [x] directory fsentry was deleted
- [x] user created directory (empty)
  - [x] directory fsentry was deleted
- [x] immutable directory
  - [x] directory fsentry was deleted
- [x] user created file
  - [x] file fsentry was deleted
  - [x] file storage was deleted
- [x] user created file in trash
  - [x] file fsentry was deleted
  - [x] file storage was deleted
2025-10-30 14:06:28 -04:00
KernelDeimos 896082ba62 refactor: use ll_read in file.js
Accessing the storage object directly duplicates effort of locating the
correct filesystem provider based on the mountpoint of the file with the
contents being requested; an effort that file.js did not perform which
made it incompatible with filesystem mountpoints.

This change has been made to make it easier to move filesystem type
implementations to extensions, because accessing storage directly will
not be supported after puterfs is an extension.
2025-10-30 14:06:28 -04:00
Xiaochen Cui 831d9017de ai: return reasoning tokens in the streaming mode (#1356) 2025-10-30 10:47:30 -04:00
jelveh 5d22ad1edb Update UIWindow.js 2025-10-29 18:30:36 -07:00
Nariman Jelveh 64f86daddb feat: add speech2text (#1855)
- A new stt driver in `AIInterfaceService` and `PuterAIModule`.
- added methods for audio transcription and translation in the speech-to-text interface.
- updated cost mapping for stt models in `openAiCostMap.ts`.
- Updated permissions and interfaces to support new speech-to-text features.
2025-10-29 12:04:09 -07:00
Nariman Jelveh b6af2df257 Revert "Complete Traditional Chinese translations (#1501) (#1822)" (#1856)
This reverts commit ff7f6d7f94.
2025-10-28 23:04:29 -07:00
Arun kumarandArun24-8 ff7f6d7f94 Complete Traditional Chinese translations (#1501) (#1822)
Co-authored-by: Arun24-8 <[email protected]>
2025-10-28 23:04:10 -07:00
Nariman Jelveh 861aeddf3e feat: add OpenAI support to text-to-speech (#1853)
- added support for OpenAI as a tts provider in `AIInterfaceService` and `PuterAIModule`.
- Updated cost mapping for OpenAI tts models in `openAiCostMap.ts`.
- improved `Txt2SpeechOptions` interface to include new parameters for provider, model, and response format.
- added tests for OpenAI provider in `txt2speech.test.js` to ensure functionality.
2025-10-28 18:51:04 -07:00
Daniel Salazar 62b6582d85 feat: meter ll_read for the person reading (#1854) 2025-10-28 18:35:27 -07:00
Nariman Jelveh 0507f1782d Merge branch 'main' of https://github.com/HeyPuter/puter 2025-10-28 17:09:40 -07:00
Nariman Jelveh 507b6d343e Fix multiple issues with taskbar and windows being affected by the side panel 2025-10-28 17:09:28 -07:00
Xiaochen Cui c93a53ead2 ci: init e2e test for browser env, tidy other tests (#1796)
* ci: init e2e test for browser env

stash changes

* test: update fsentry definition, add tests

stash changes

* test: pass puter-js mkdir test

* test: add test for puter-js move

* tidy code

* tidy code

* doc: add docs for playwright test

* recover memoryfs

* test: puter-js readdir/stat

* test: puter-js write

* test: puter-js read

* test: puter-js move_cart

* test: fix failed tests on move

* tests: rename files

* test: puter-js copy_cart

* tests: puter-js batch/delete, read config from file

* ci: add vitest

* ci: update names and timeout

* ci: simplify playwright-test

* ci: simplify api-test

* move "api-tester" from tools to tests

* test: update example config

* test: remove folder tests/api-tester/ci

* test: unify config location

* test: remove unused files

* ci: fix wrong config

* ci: fix wrong path

* test: add docs

* ci: update timeout, print artifact url
2025-10-28 16:35:37 -07:00
Eric Dubé c3d66503ab dev: add /update-fsentry-thumbnail (#1794) 2025-10-28 17:31:17 -04:00
Daniel Salazar 0bb14261c2 feat: devCenter open ui message (#1850) 2025-10-28 13:41:00 -07:00
Nariman Jelveh d7f10b2205 Update call.js (#1849) 2025-10-28 13:25:07 -07:00
Daniel Salazar ff9932b2f3 fix: dbkv raw import (#1848) 2025-10-28 13:04:54 -07:00
Nariman Jelveh b1e3430a9d Set correct URL for test video in txt2vid 2025-10-27 19:00:40 -07:00
Reynaldi Chernando 117f8e393d Add UploadOptions for Puter.js types (#1832)
* Add UploadOptions

* Add name option
2025-10-27 18:15:27 -07:00
Daniel Salazar d1ae2bfe80 chore: update typedefs and fix dbkv issue (#1840)
* chore: update typedefs

* fix:dbkv decr
2025-10-27 18:13:49 -07:00
KernelDeimos cd5d0ca5dc dev(extensions): [+] puterfs (copies memoryfs)
This extension has a copy of memoryfs which is exposed as `testfs`. The
purpose of this is to register a new filesystem type from an extension
to ensure it works as expected and to get feedback on a working example.
2025-10-27 19:54:36 -04:00
KernelDeimos dda1c00614 dev(extensions): exports and types for FS 2025-10-27 19:54:36 -04:00
KernelDeimos a36b76e030 dev(extensions): event to register FS providers 2025-10-27 19:54:36 -04:00
Hariz S. 2487251bb9 Improved public folder file links (#1687)
* Don't update URL when opening public files via direct URL

* Alert user when attempting to open a nonexistent file

* Fix toolbar autohide in public file urls

* Remove extraneous debug logs

* Properly define stat var in public folder URL handling

* Update window URL when focusing an app opened through file URL

* Localize error messages
2025-10-27 15:35:11 -07:00
Daniel Salazar fd8a88b8f4 fix: lessen alert triggering for metering (#1837) 2025-10-27 12:41:48 -07:00
Nariman Jelveh 2c7343115a Add sora 2 support (#1834)
* Update OpenAI package to version 6.7.0 and add video generation capabilities

- Updated `openai` dependency in `package-lock.json` and `package.json`.
- Introduced new permissions for video generation in `hardcoded-permissions.js`.
- Added video generation service in `AIInterfaceService.js` and registered it in `PuterAIModule.js`.
- Implemented coercion for video streams in `CoercionService.js`.
- Updated driver service to include video generation.
- Added `txt2video` method and options in `AI.js` and corresponding TypeScript definitions in `index.d.ts`.

* Update openaiVideoCostMap.ts

* Revert "Update openaiVideoCostMap.ts"

This reverts commit 9e66f93605.

* change `txt2video` to `txt2vid`
2025-10-27 12:27:52 -07:00
Nariman Jelveh 5ae8ed98eb Fix issues with Settings accessibility 2025-10-26 17:42:56 -07:00
Nariman Jelveh bce244b867 Remove taskbar item animation 2025-10-26 17:12:21 -07:00
Nariman Jelveh 3720369d87 default txt2img model set to gpt-image-1-mini 2025-10-26 11:52:28 -07:00
Nariman Jelveh 5476389795 add support for gpt-image-1-mini 2025-10-26 11:33:44 -07:00
Eric DubéandNariman Jelveh b73764d210 more reliable suspended (#1696)
* fix: remove verbose parameters log

* fix: more reliable check for suspended user

---------

Co-authored-by: Nariman Jelveh <[email protected]>
2025-10-25 16:27:36 -07:00
NUDURUMATI H R N PRASANNA SAVITHRUandNariman Jelveh 6edb2a30e7 chore: update phrasing based on review (#1821)
* chore: update phrasing based on review

* Update nb.js

---------

Co-authored-by: Nariman Jelveh <[email protected]>
2025-10-25 16:11:40 -07:00
Nariman Jelveh 46cb188877 Update ig.js 2025-10-25 15:11:08 -07:00
Reynaldi Chernando e11182f817 Add dedupeName to CreateAppOptions (#1783) 2025-10-25 15:09:25 -07:00
Tamalampudi Siva Harsha Vardhan ReddyandNariman Jelveh 1bfdab8825 i18n(ig): translate missing entries in src/gui/src/i18n/translations/… (#1820)
* i18n(ig): translate missing entries in src/gui/src/i18n/translations/ig.js

* add missing double quotes

---------

Co-authored-by: Nariman Jelveh <[email protected]>
2025-10-25 15:07:48 -07:00
Neal Shah 20601ce5e4 fix: Switch to new OpenAI Moderation model (#1826) 2025-10-24 19:13:18 -04:00
Neal Shah d0c5f12682 optimization: change for (msg.. messages) in moderation to pass in everything in one call (#1825) 2025-10-24 17:44:15 -04:00
Daniel Salazar 3fb3cf0e60 fix: simplify export import typedef (#1818)
* fix: simplify export import typedef

* feat: expose kvstore methods in the service too

* chore: update versioning
2025-10-24 12:52:58 -07:00
Eric Dubé 1a1e9e8bb2 dev: add event to mutate app origin (#1823)
* dev: add event to mutate app origin

* fix: location of app origin event
2025-10-24 14:09:13 -04:00
Daniel Salazar 219fd2274c feat: allow for unlimitedAllowList + typedefs snuck in by accident (#1813)
* feat: allow for unlimitedAllowList

* feat: add clearer types to extensions
2025-10-23 13:57:32 -07:00
XiaochenCui ce38983e73 memoryfs: fix wrong args for fs.node 2025-10-23 15:05:47 -04:00
XiaochenCui 4fdca1e47b ci: capture the error during setup 2025-10-23 15:05:47 -04:00
Nariman Jelveh c4d4bc9758 remove progwin for desktop mkdir (#1814) 2025-10-22 18:52:35 -07:00
Daniel Salazar 256189a7de feat: route for global usage aggregate (#1810)
* feat: route for global usage aggregate

* feat: add globalUsageEndpoint to puter-js

* fix: globalUsage endpoint
2025-10-22 16:46:13 -07:00
Daniel Salazar c9ab01cf1e fix: usage limited issue whens treaming (#1806) 2025-10-22 11:22:59 -07:00
KernelDeimos 5b16774a9a fix: throw error not lorem when moderation fails
Instead of switching to test mode, which responds with "Lorem Ipsum"
sample output to test the API, throw an appropriate error message for
content moderation failures. This is especially useful when OpenAI's
moderation is way way way way too aggressive as this confuses users.
2025-10-22 13:59:53 -04:00
KernelDeimos 16e7fe9851 fix: openai configuration regression
I was not able to locate a change causing a configuration regression,
however I do know AI was working in my OSS clone and that I had no
reason to change my AI configuration in my `local.json` file. In any
case, it is clear that configuration was not working as intended.

This commit fixes PuterAIModule which was not enabling OpenAI services
when `openai` was configured within the `services` block, even though
the `services` block configuration is supposed to be the recommended
configuration and the global `openai` config object is supposed to be
deprecated.

This commit also fixes OpenAIImageGenerationService which was not
accepting the current parameter name for the API key (`apiKey`) and
instead only accepted the legacy key (`secret_key`) which created this
interesting problem where using the recommended parameter name would
prevent Puter from booting successfully.
2025-10-22 13:59:53 -04:00
KernelDeimos 06d6eb83e7 doc: dependencies when moving PuterFS to extension
This commit begins the plan towards moving PuterFS to an extension. It
is first necessary to analyze the dependencies and determine which
services and modules are part of PuterFS and which ones are not.
2025-10-22 13:59:40 -04:00
KernelDeimos b80c0ba79e chore: puter.js version 2.1.1 2025-10-22 13:59:19 -04:00
KernelDeimos 547acf6988 Revert "patch version bump for puter-js and putility in it"
This reverts commit 55d07acdee.
2025-10-22 13:59:19 -04:00
jelveh 55d07acdee patch version bump for puter-js and putility in it 2025-10-22 10:44:50 -07:00
KernelDeimos d398dc90fd chore: putility patch version 1.1.1 2025-10-22 13:32:56 -04:00
KernelDeimos 4a69cd26c2 chore: putility minor version 1.1.0 2025-10-22 13:18:34 -04:00
KernelDeimos ecad29a30e sync: update license headers in putility
The `putility` package had AGPL-3.0 license headers but it should be
under the MIT license because puter.js (the SDK) depends on it.
2025-10-22 13:18:34 -04:00
Eric Dubé c375b30810 Update putility to MIT
Huh, I thought it was already...
2025-10-22 12:18:55 -04:00
Daniel Salazar 9394b5e204 docs: metering and examples (#1803)
* chore: expose meteringService methods in wrapper while not in an extension

* docs: metering and examples
2025-10-21 17:25:46 -07:00
Daniel Salazar 16fd614b84 feat: rename meteringAndBilling to metering (#1800) 2025-10-21 14:59:24 -07:00
Daniel Salazar 435d26608a feat: shard apps as well to avoid hot partitions (#1799) 2025-10-21 13:30:34 -07:00
Daniel Salazar 6bbd9bdc9f feat: limit alerting (#1798) 2025-10-21 12:50:38 -07:00
Daniel Salazar 3229fe0b61 Revert "Revert: fs metering (#1790)" (#1795)
This reverts commit 4b14ef863c.
2025-10-21 11:07:05 -07:00
Daniel Salazar 4b14ef863c Revert: fs metering (#1790) 2025-10-20 21:58:44 -07:00
Daniel Salazar 760bc22743 fix: bad acl check returning early (#1789) 2025-10-20 20:13:43 -07:00
Daniel Salazar 0260a9cbce Revert "Revert "Revert "Revert "feat: alert when going over usage limits sign…"
This reverts commit f2265cca59.
2025-10-20 18:45:08 -07:00
Daniel Salazar f2265cca59 Revert "Revert "Revert "feat: alert when going over usage limits significantl…" (#1787)
This reverts commit 0d0cdce1cf.
2025-10-20 16:51:31 -07:00
Daniel Salazar 0d0cdce1cf Revert "Revert "feat: alert when going over usage limits significantly + egre…" (#1786)
This reverts commit 54d73b1998.
2025-10-20 15:56:34 -07:00
Daniel Salazar 54d73b1998 Revert "feat: alert when going over usage limits significantly + egress meter…" (#1785)
This reverts commit 27f24118f3.
2025-10-20 15:25:52 -07:00
Daniel Salazar 27f24118f3 feat: alert when going over usage limits significantly + egress metering (#1782)
* feat: alert when going over usage limits significantly + meter egress/ingress

* fix: metering roundings
2025-10-20 13:54:21 -07:00
Nariman Jelveh eb123d873f feat: introduce PANEL_WIDTH constant and refactor UIWindow for panel handling (#1780)
Added a constant for PANEL_WIDTH to standardize panel width across the application. Refactored UIWindow logic to utilize this constant for positioning and resizing, ensuring consistent behavior when panels are open. Restored the getSnapDimensions function to adjust available dimensions based on the taskbar position and open panels.
2025-10-17 18:43:59 -07:00
Neal Shah 3184e01307 add puter.workers.getLoggingHandle (#1779) 2025-10-17 17:03:57 -04:00
Xiaochen Cui d7a0a81991 ci: avoid potential hanging via hard limit (#1778)
* ci: avoid potential hanging via hard limit

* ci: remove build phase

* ci: print tmp_password for test
2025-10-17 12:29:56 -07:00
jelveh 76dcdd4927 Refresh the stat cache regularly 2025-10-16 20:57:23 -07:00
Nariman Jelveh 0713599281 Update stat.js (#1753) 2025-10-16 20:41:40 -07:00
Reynaldi Chernando 5a8f06db9e Remove fixed width in publish website input (#1747) 2025-10-16 20:40:40 -07:00
Xiaochen Cui 103bac32d8 ci: add timeout for api-test (#1768) 2025-10-16 20:15:22 -07:00
KernelDeimos 31fa030a38 devex: use 'stars' style for webserver notice
This change is made to make notices more consistent as well as presented
in a way that works well with dark and light terminal color schemes.
2025-10-16 20:09:37 -04:00
Nariman Jelveh 8fc533338a implement an extension event for IPC messages coming in (#1776) 2025-10-16 16:52:01 -07:00
Daniel Salazar 686c2bc966 fix: permission writeback to flat kv perissions (#1774) 2025-10-16 16:30:17 -07:00
KernelDeimos 1404f10333 devex: remove verbose logging on copy and paste 2025-10-16 19:17:53 -04:00
Nariman Jelveh d2346ff1c7 cleanup usage reporting (#1772) 2025-10-16 15:25:33 -07:00
KernelDeimos 9529d87e31 devex: add log tracing feature
simply set `trace_logs` to `true` in your config and you can easily
figure out where logs are coming from.
2025-10-16 18:00:04 -04:00
KernelDeimos dc6a931a23 fix: error logs are too verbose
There were some extra logs when an error triggers an alarm that don't
need to be there.
2025-10-16 18:00:04 -04:00
KernelDeimos 294fda2433 devex: cosmetic log fixes 2025-10-16 18:00:04 -04:00
KernelDeimos 68d3ccc774 devex: misc. log changes
- removes extra log from dev socket service
- changes SYSTEM logs so they don't look like warnings
- adds optional hiding of INFO label
2025-10-16 18:00:04 -04:00
KernelDeimos da0228b19f devex: hide system actor from extension log fields 2025-10-16 18:00:04 -04:00
KernelDeimos 6cdf91fbc9 devex: add log level support for extensions 2025-10-16 18:00:04 -04:00
KernelDeimos fd602aabac devex: get extensions on the service logger 2025-10-16 18:00:04 -04:00
KernelDeimos abcb2e9580 dev: handle 'console.log' through log service 2025-10-16 18:00:04 -04:00
KernelDeimos 13a70f5394 devex: update notices and better ANSI handling 2025-10-16 18:00:04 -04:00
KernelDeimos 5e6b628491 devex: more log reduction (2) 2025-10-16 18:00:04 -04:00
KernelDeimos 77b167eb0a doc: document the dev socket 2025-10-16 18:00:04 -04:00
KernelDeimos cd279f7355 devex: more log reduction 2025-10-16 18:00:04 -04:00
KernelDeimos 3a8bab920d devex: remove logs that print when uploading 2025-10-16 18:00:04 -04:00
KernelDeimos c6dc55d362 devex: add support for 'stars' to notice() 2025-10-16 18:00:04 -04:00
KernelDeimos 0373f20de6 devex: misc. log cleanups 2025-10-16 18:00:04 -04:00
Nariman Jelveh b1f70fa63e Put some stars around the credentials box 2025-10-16 18:00:04 -04:00
KernelDeimos 8efecdec18 devex: update default admin password output 2025-10-16 18:00:04 -04:00
KernelDeimos 482d88639c doc: document log configuration 2025-10-16 18:00:04 -04:00
KernelDeimos 8f05a13918 devex: re-enable Puter logo by default 2025-10-16 18:00:04 -04:00
KernelDeimos b53dc01b45 devex: show full time in dev log output 2025-10-16 18:00:04 -04:00
KernelDeimos 0892e476bd devex: disable dev console by default, add socket 2025-10-16 18:00:04 -04:00
KernelDeimos c68457c91c devex: no more tip of the day unless you ask for it 2025-10-16 18:00:04 -04:00
KernelDeimos afea8fe80d dev: introduce NullDevConsoleService
In the prod environment there is no instance of DevConsoleService. If
methods are called on the service without a check to see if it exists,
this results in "read on undefined" errors that can only be produced in
a prod environment. This was the cause of the issue caused by the
previous log cleanup PR where it looked like "websockets were broken".
The missing undefined check is fixed by #1734, but the change in this
commit will catch future cases.

Additionally, this change will help with moving away from the dev
console.
2025-10-16 18:00:04 -04:00
KernelDeimos 75a759015c devex: introduce service-level log configuration 2025-10-16 18:00:04 -04:00
KernelDeimos 0b6b871144 devex: disable logs for missing fsentries and cache
Often fsentry stats are used to see if an fsentry exists, so fsentry not
found logs are common and expected. This commit disables those by
default. Additionally, logging for cache events is disabled as well,
since those are only helpful when debugging cache specifically.
2025-10-16 18:00:04 -04:00
KernelDeimos 441622d526 devex: make http logs configurable 2025-10-16 18:00:04 -04:00
KernelDeimos 354da08f64 clean: non-functional changes to WebServerService 2025-10-16 18:00:04 -04:00
KernelDeimos 20c9ac7539 sync: package-lock.json 2025-10-16 18:00:04 -04:00
Nariman Jelveh 00e122d3d1 cleanup usage reporting (#1771) 2025-10-16 14:29:57 -07:00
Daniel Salazar 9bdb139f7a fix: bad null check (#1770) 2025-10-16 14:00:20 -07:00
Daniel Salazar c38da86293 fix: bad math check for max consumed credits (#1769) 2025-10-16 13:56:52 -07:00
Daniel Salazar fc7a51bd2f fix: NaN value for consumedPurchaseCredits accounting (#1767) 2025-10-16 13:21:11 -07:00
Nariman Jelveh 74f583024d Improve usage report UI (#1766)
* Update style.css

* take into account credits added to monthly allowances
2025-10-16 13:03:35 -07:00
Daniel Salazar b7cee87370 feat: purchase addons logic in metering (#1765) 2025-10-16 13:02:19 -07:00
Daniel Salazar 08e26af85d feat: enforce new metering + get rid of old methods (#1762)
* feat: enforce new metering + get rid of old methods

* fix: make openrouter metering more robust
2025-10-16 10:33:17 -07:00
Daniel Salazar 15b65dab7d fix: app monthly usage details error (#1761) 2025-10-16 00:50:05 -07:00
Nariman Jelveh 61fbc45e3c Add refresh button for updating usage data in Settings (#1760) 2025-10-15 23:42:18 -07:00
Nariman Jelveh aca1292886 adjust usage table styling (#1759) 2025-10-15 18:49:12 -07:00
jelveh 206633293c Update UITabUsage.js 2025-10-15 12:35:39 -07:00
jelveh 33f9036abc usage unit format hot fix 2025-10-15 12:26:55 -07:00
jelveh 9cdcb2f108 Update UITabUsage.js 2025-10-15 12:21:24 -07:00
Nariman Jelveh ed5d629e02 Detailed usage report (#1752)
* Implement detailed usage report table

- Added `number_format` function for flexible number formatting with options for decimals, separators, and negative formatting.
- Updated `UITabUsage.js` to include a toggle for viewing driver usage details, fetching and displaying usage data dynamically.
- Improved CSS styles for driver usage details to improve layout and interactivity.

* Update style.css

* Refactor driver usage display in UITabUsage.js

- Updated UITabUsage.js to improve the layout of driver usage information, including a new header structure for better organization.
- Added CSS styles for the new header layout and adjusted existing styles for improved visual consistency and interactivity.

* fix progress bar logic
2025-10-15 12:12:45 -07:00
Daniel Salazar b4cafaa5bb fix: alowance typo (#1756) 2025-10-15 12:09:57 -07:00
Daniel Salazar 7e8842e35d feat: add alarms to meteringService if cost for service is unexpectedly 0 (#1755)
* feat: add alarms to meteringService if cost for service is unexpectedly 0

* fix: better sub checks
2025-10-15 12:05:15 -07:00
Daniel Salazar 24a51c59ae fix: metering typos (#1754) 2025-10-15 10:39:18 -07:00
Daniel Salazar e51d0c4600 feat: metering service allowence checks and subscription integration 🚀 (#1749)
* feat: metering allowence checks

* fix: bad math
2025-10-15 02:28:25 -07:00
Daniel Salazar 96a58ced29 metering: new usage endpoint + puter-js changes for it (#1738)
* metering: new usage endpoint

* metering: new usage endpoint + puter-js changes for it
2025-10-14 12:44:40 -07:00
jelveh 2819ec7b06 Update index.js 2025-10-13 00:36:15 -07:00
Nariman Jelveh 661f13fc92 improve caching mechanism by deleting specific caches on item addition in FileSystem module (#1745) 2025-10-12 19:50:48 -07:00
Neal Shah 8bf13b1b82 add guard around sending thumbnail event if thumbnail url is blank or falsey (#1744) 2025-10-12 20:18:41 -04:00
Neal Shah 9e0ba954ff fix npm pacjage not importing init.cjs (#1743) 2025-10-12 19:46:04 -04:00
jelveh 6a72c261e2 closes #1722 2025-10-12 16:28:12 -07:00
Nariman Jelveh f083e6b060 Improve puterjs caching (#1739)
* add regular cache checking for popular directories

* Update index.js

* implement `readdir` request deduplication to improve performance

* Update index.js
2025-10-11 21:03:38 -07:00
Nariman Jelveh 35507b33b7 taskbar positioning hotfix 2025-10-10 18:22:56 -07:00
Nariman Jelveh 62341aa030 Update UITaskbar.js (#1737) 2025-10-10 18:00:51 -07:00
Daniel Salazar ef6c7b17f1 metering: rest of ai (#1736)
* metering: rest of ai

* fix: wrong cost name
2025-10-10 17:58:35 -07:00
Nariman Jelveh 5a4a1f16a4 Taskbar pos (#1735)
* Update UIWindow.js

* wip

* Update UITaskbar.js
2025-10-10 17:08:57 -07:00
KernelDeimos b6e12762ce fix: missing check for dev console service 2025-10-10 15:01:07 -04:00
KernelDeimos 70c7aa41ac Reapply "Logs Update" (#1730)
This reverts commit 8f7a68ace6.
2025-10-10 15:01:07 -04:00
Nariman Jelveh 9607706d11 fix: adjust toolbar positioning for sidepanel based on taskbar location (#1731)
* fix: adjust toolbar positioning for sidepanel based on taskbar location

* fix: update window width calculation for left position based on open panels
2025-10-09 21:16:26 -07:00
Neal Shah 8f7a68ace6 Revert "Logs Update" (#1730)
* Revert "fix: quick fix for config context issue"

This reverts commit 0c06040e6c.

* Revert "sync: package-lock.json"

This reverts commit 1e1bd0f2ba.

* Revert "devex: misc log cleanup"

This reverts commit a64a786528.

* Revert "devex: minimal first page load logs"

This reverts commit 196e463c59.

* Revert "devex: minimal initialization logs"

This reverts commit ea9c222c09.

* Revert "fix: add missing await in kv example extension"

This reverts commit 9b34e67d0d.

* Revert "devex: reduce logs at init"

This reverts commit fa221149c2.

* Revert "sync: package.json changes"

This reverts commit 4db73d75a5.

* Revert "fix: remove unused AWS SDK v2 import"

This reverts commit 4d8692fd31.

* Revert "devex: hide `npm install` output unless it fails"

This reverts commit fe03a4b598.

* Revert "devex: rollup via module instead of subprocess"

This reverts commit 360082d8bd.

* Revert "devex: webpack via module instead of subprocess"

This reverts commit 1449d12b0e.

* Optional chain logger
2025-10-09 23:08:01 -04:00
Daniel Salazar 2c614b2b99 cleanup: remove auxilary return for now (#1727) 2025-10-09 19:20:52 -07:00
Daniel Salazar a3c6c0b914 Revert "revert: revert devex changes (#1728)" (#1729)
This reverts commit fc725d0130.
2025-10-09 19:16:20 -07:00
Daniel Salazar fc725d0130 revert: revert devex changes (#1728)
* Revert "fix: quick fix for config context issue"

This reverts commit 0c06040e6c.

* Revert "sync: package-lock.json"

This reverts commit 1e1bd0f2ba.

* Revert "devex: misc log cleanup"

This reverts commit a64a786528.

* Revert "devex: minimal first page load logs"

This reverts commit 196e463c59.

* Revert "devex: minimal initialization logs"

This reverts commit ea9c222c09.

* Revert "fix: add missing await in kv example extension"

This reverts commit 9b34e67d0d.

* Revert "devex: reduce logs at init"

This reverts commit fa221149c2.

* Revert "sync: package.json changes"

This reverts commit 4db73d75a5.

* Revert "fix: remove unused AWS SDK v2 import"

This reverts commit 4d8692fd31.

* Revert "devex: hide `npm install` output unless it fails"

This reverts commit fe03a4b598.

* Revert "devex: rollup via module instead of subprocess"

This reverts commit 360082d8bd.

* Revert "devex: webpack via module instead of subprocess"

This reverts commit 1449d12b0e.
2025-10-09 18:43:03 -07:00
Daniel Salazar c0d96c7e97 fix: openrouter usage calculator (#1725) 2025-10-09 17:12:48 -07:00
KernelDeimos 0c06040e6c fix: quick fix for config context issue
I don't know what causes this
2025-10-09 19:39:02 -04:00
KernelDeimos 1e1bd0f2ba sync: package-lock.json 2025-10-09 19:39:02 -04:00
KernelDeimos a64a786528 devex: misc log cleanup 2025-10-09 19:39:02 -04:00
KernelDeimos 196e463c59 devex: minimal first page load logs 2025-10-09 19:39:02 -04:00
KernelDeimos ea9c222c09 devex: minimal initialization logs 2025-10-09 19:39:02 -04:00
KernelDeimos 9b34e67d0d fix: add missing await in kv example extension 2025-10-09 19:39:02 -04:00
KernelDeimos fa221149c2 devex: reduce logs at init
Moves more logs to debug level, removing a few that were unnecessary.
2025-10-09 19:39:02 -04:00
KernelDeimos 4db73d75a5 sync: package.json changes 2025-10-09 19:39:02 -04:00
KernelDeimos 4d8692fd31 fix: remove unused AWS SDK v2 import
This was done to reduce init logs by removing the AWS SDK v2 deprecation
notice from the output.
2025-10-09 19:39:02 -04:00
KernelDeimos fe03a4b598 devex: hide npm install output unless it fails
Since extensions are loaded as packages, the `npm install` outputs can
get very verbose. This change reduces log noise when Puter initializes.
2025-10-09 19:39:02 -04:00
KernelDeimos 360082d8bd devex: rollup via module instead of subprocess 2025-10-09 19:39:02 -04:00
KernelDeimos 1449d12b0e devex: webpack via module instead of subprocess
This was really really really (100 more "really"s) tedious compared to
what I had expected.
2025-10-09 19:39:02 -04:00
Daniel Salazar 248b199fa3 feat: add openrouter metering (#1724)
* feat: add openrouter metering

* fix: models promise await parenthesis

* fix: openRouter name for metering
2025-10-09 16:36:21 -07:00
Neal Shah 3703f7e14f Add in events for thumbnails (#1700) 2025-10-09 17:07:22 -04:00
Daniel Salazar 5450c85b3a fix: bad boolean check (#1721) 2025-10-09 11:15:47 -07:00
Nariman Jelveh 5a9284a2cb Update UIWindow.js (#1720) 2025-10-09 09:49:57 -07:00
Nariman Jelveh abc8d7fcce Npm run test puterjs (#1719)
* chore: add http-server as a dev dependency and update package scripts

* refactor: move maximized window positioning logic to UIWindow and remove from UITaskbar
2025-10-08 22:14:42 -07:00
Nariman Jelveh 6fdea68eec chore: add http-server as a dev dependency and update package scripts (#1718) 2025-10-08 19:13:05 -07:00
Daniel Salazar eea27be8eb fix: metering service global write and open ai default model (#1717) 2025-10-08 18:41:15 -07:00
Daniel Salazar 73a24af951 feat: meter claude ai (#1716)
* feat: meter claude ai

* fix: claude meteringService dep
2025-10-08 17:49:12 -07:00
Xiaochen Cui 89ad06afae ci: fix failure by upgrading library (#1713) 2025-10-08 17:17:37 -07:00
Daniel Salazar 3df1d31a37 fix: broken open ai moderation (#1714) 2025-10-08 16:41:32 -07:00
KernelDeimos e59f4e6c16 devex: reduce webpack verbosity 2025-10-08 19:25:53 -04:00
KernelDeimos 74ceb2fa1b devex: move more init logs to debug
Removes init/construct logs, moves many boot logs to debug level,
introduces debug level in BootLogger, moves "CONFIGURATION MUTATED AT
RUNTIME" message to debug level and allows config.js to output logs to
the standard logger in context.
2025-10-08 19:25:53 -04:00
KernelDeimos cae50b8859 dev: add experimental parallel init emit
This is put behind a flag for now because potential bugs that may arise
from this change are difficult to locate or predict.
2025-10-08 19:25:53 -04:00
Nariman Jelveh 64cfa8158d feat: immprove UIPopover and UIWindow behavior for sidepanel visibility (#1711)
- Adjust `UIPopover` positioning when a sidepanel is visible.
- Update `UIWindow` to manage visibility states and adjust toolbar positions accordingly.
- Modify CSS for AI Button to change z-index for better layering.
2025-10-08 15:40:14 -07:00
askmanu[bot] 0270b64bc4 Added reference documentation for: src/backend/src/modules/puterai/lib/Messages.js 2025-10-08 16:52:11 -04:00
askmanu[bot] 4fb06d3b3e Added reference documentation for: src/backend/src/modules/puterai/lib/GeminiSquareHole.js 2025-10-08 16:52:11 -04:00
askmanu[bot] aed3ce7ed7 Added reference documentation for: src/backend/src/modules/broadcast/connection/CLink.js 2025-10-08 16:52:11 -04:00
Daniel Salazar 248b38e732 fix: undefined alias array (#1709) 2025-10-08 13:12:58 -07:00
Daniel Salazar 0acb884ed0 feat: meter open ai (#1703)
* feat: meter open ai

* fix: dep injections & moderation

* feat: add paging
2025-10-08 12:58:05 -07:00
jelveh a70a621dd5 Update style.css 2025-10-08 12:33:56 -07:00
Nariman Jelveh 508ed920f6 Update globals.js (#1702) 2025-10-07 15:23:56 -07:00
Nariman Jelveh b02e6c86b0 Update helpers.js (#1701) 2025-10-07 14:36:02 -07:00
Daniel SalazarandNariman Jelveh d9c64a9378 feat: manage permission for user to user and dev to app file sharing (#1567)
* perf: move user-user perm checks to flat kv entries

* feat: manage permission for user to user and dev to app file sharing

* fix typings cuz macos sucks

* fix: mac os typecase

* fix: chore macOs typecase

* fix: bad join of permissions

* feat: add check-permissions endpoint for checking an users perms

* Add 'manage' to permission lists in the Sharing dialog

* fix: manage being allowed through our ACL

---------

Co-authored-by: Nariman Jelveh <[email protected]>
2025-10-07 13:46:00 -07:00
Daniel Salazar 6d35496252 chore: publish npm (#1698)
* chore: bump puter-js version and publish

* chore: package-lock
2025-10-07 11:56:18 -07:00
Daniel Salazar 2a2a1f6a99 fix: backward compatibility for puter kv incr/decr (#1697) 2025-10-07 11:39:23 -07:00
KernelDeimos 44522f0a22 fix: remove verbose parameters log 2025-10-07 02:31:35 -04:00
Nariman Jelveh 70cde54f80 Update LogService.js 2025-10-06 22:16:53 -07:00
Nariman Jelveh dfccbdccce Update LogService.js 2025-10-06 21:58:14 -07:00
Nariman Jelveh 84a28b9637 Sidepanel (#1694)
* add AI side panel to UIDesktop

* integrated `UIAIChat` component into `UIDesktop` for AI interactions.
* added styles for AI side panel, including buttons and chat message formatting in style.css, enhancing user experience with AI features.

* add support for window-based side panels

* remove window resizing logic that is simply broken

* whitelisting added

* Add `showWindow` and `hideWindow` methods to Puter.js
2025-10-06 18:40:44 -07:00
Daniel Salazar e3f9455cae test: vitest tests for puter js (#1693) 2025-10-06 15:00:40 -07:00
Daniel Salazar f06bec4cd4 feat: extract and centralize cost maps (#1691) 2025-10-06 14:52:09 -07:00
ProgrammerIn-wonderland 44fcb5800b fix: options.no_options_auth should be optional chained 2025-10-06 13:46:57 -04:00
KernelDeimos a5fa16b7bb fix: preflight issue with protected endpoints
When /user-protected/change-password (and presumably other endpoints
under /user-protected) receive a preflight request they respond with
HTTP status 401. This is because `.use()` calls on the router apply to
all request methods erroneously.

This commit fixes the issue. Further investigation is required to
determine when preflight requests started happening on this endpoint.
2025-10-06 11:31:21 -04:00
Rajeshwar Singhandjelveh 3120d6a057 feat(Translation): added support for Armenian and also added Bulgarian (Closes #1523) (#1676)
* feat(Translation): added support for Armenian and also added Bulgarian

* fixed

* add license header to bg.js

* Update package-lock.json

---------

Co-authored-by: jelveh <[email protected]>
2025-10-05 22:59:58 -07:00
ProgrammerIn-wonderland 82732b9e96 Safari fix for TLS connections in puter 2025-10-05 02:06:36 -04:00
Nariman Jelveh 5b09dbb1f5 Update UIDesktop.js (#1682) 2025-10-04 18:14:54 -07:00
Nariman Jelveh 4dae0d6370 I18n for sys dirs (#1679)
* improve UIItem and UIWindow to support internationalization for system directory names. Updated UIItem to display localized names for trash, desktop, home, documents, pictures, videos, and public directories. Modified UIWindow to set the window title using localized names for the desktop and home paths.

* refactor UIWindow to use i18n for system directory titles. Updated window title settings for desktop, documents, pictures, videos, public, and trash paths to use localized names, improving user experience across different languages.
2025-10-04 13:04:31 -07:00
Nariman Jelveh 2cedb05a8a add option to automatically set window title to opened file's name (#1678)
* add option to automatically set window title to opened file's name

A new checkbox in the app edit section to allow users to automatically set the window title to the name of the opened file. Updated related functions to handle this new setting, ensuring it is saved and reset correctly.

* Update launch_app.js
2025-10-04 12:13:57 -07:00
gulizar ElhalilandNariman Jelveh 3d44609d80 Update ku.js (#1677)
* Update ku.js

translation has been added.

* Update ku.js

---------

Co-authored-by: Nariman Jelveh <[email protected]>
2025-10-04 11:24:04 -07:00
KernelDeimos 74430da673 style: small change to test deploy
Arbitrary whitespace change just to test something.
2025-10-03 21:36:44 -04:00
Eric DubéandDaniel Salazar 4eaba05136 chore: update package-lock.json with npm v11.6.1
* try: update package-lock.json from Linux/x86 on 11.6.1

* darwin

* darwing

* dev: try updating rollup

* try: npm 11.6.1 delete package-lock.json and run `npm i`

* push darwin pacakge lock

* sync: package-lock.json with npm 11.6.1

---------

Co-authored-by: Daniel Salazar <[email protected]>
2025-10-03 20:18:13 -04:00
Nariman Jelveh db66fecadf Update style.css (#1671) 2025-10-03 16:24:44 -07:00
Nariman Jelveh 44bc7b7437 Replace "Save As..." with i18n('Save As…') (#1670) 2025-10-03 15:54:43 -07:00
Nariman Jelveh cc8a658122 Update UI.js (#1668) 2025-10-03 14:59:23 -07:00
KernelDeimos 39fdcec9bf fix: add missing utilities.js 2025-10-03 17:12:41 -04:00
KernelDeimos 9c5b96305a example(extensions): [+] example-kv 2025-10-03 16:53:23 -04:00
KernelDeimos 9ff59d9290 fix: system actor for extension lifecycle events
Using services such as `kv` which expect an actor in context would not
work in a handler for a lifecycle event such as `'init`' in an
extension. In core backend modules is it generally expected that if a
user actor is not in context a backend service will explicitly specify
that the system actor should be used with the `su` service's `sudo`
method. We cannot require extension developers to add this wrapping code
whenever they want to use kv.

In the future it might be better to have a specific "ExtensionActorType"
for this purpose.
2025-10-03 16:53:23 -04:00
ProgrammerIn-wonderland f60e02565f add conditional type overload for streaming 2025-10-03 16:38:44 -04:00
Kishan_Singh 1affbb4cc8 fix: support async iterator for AI chat streaming mode in types 2025-10-03 16:38:44 -04:00
Hariz 4eab7167e6 Disable browser context menu on launcher popover (#1648)
* Disable browser context menu on launcher popover

* Allow system context menu on launch search bar

* Remove extraneous debug log
2025-10-02 20:40:42 -07:00
Daniel Salazar 4a1aee0713 fix: increment for non-existent keys (#1649) 2025-10-02 15:51:56 -07:00
KernelDeimos 36b30ebf57 dev(extensions): [+] extension-examples:ii:hello-world 2025-10-02 18:35:20 -04:00
KernelDeimos aef8227454 doc(extensions): data import 2025-10-02 17:00:51 -04:00
KernelDeimos 54b8990c70 devex(extensions): simplify kv get and set methods
The basic `.get()` and `.set()` calls should be the same between
persistent key-value store (puter-kvstore) and in-memory cache (kv.js).
This commit wraps these methods to support the "shorthand" usage.
2025-10-02 16:53:59 -04:00
KernelDeimos b9f42f6daa fix: PayloadTooLargeError for JSON + base64 images
The `/drivers/call` endpoint hangs when the JSON middleware produces
(or, is going to produce?) a PayloadTooLargeError. Increasing the limit
avoids this issue for typical use.
2025-10-02 15:41:09 -04:00
Dan Tran a17ab22ab7 feat: Add missing Vietnamese translations (#1641) 2025-10-02 10:18:43 -07:00
Daniel Salazar cc3b0db6b1 feat: initial metering service supporting monthly tracking of service consumption (#1630) 2025-10-01 14:04:36 -07:00
KernelDeimos 36ddad0ecc lint: add config global to extensions 2025-10-01 16:58:46 -04:00
KernelDeimos 7137d1a178 doc: permission grant in extension drivers 2025-10-01 16:57:44 -04:00
KernelDeimos bfffdfdc36 doc(extensions): exports not front-and-center
The extension documentation mentions imports and exports together very
early on, but extension exports should be used sparingly. I suspect most
extensions with exports will be among Puter's builtin extensions.
2025-10-01 16:47:56 -04:00
KernelDeimos 9946d2ffc5 dev(extensions): event for extensions to grant permst 2025-10-01 16:46:59 -04:00
KernelDeimos 574088ea55 doc: improve extension documentation
- describe extension events
- link drivers documentation
2025-10-01 16:03:24 -04:00
KernelDeimos ec8111cc2f dev(extensions): improved configuration support
Extensions now read configuration objects under the "extensions" block
in the backend configuration. Additionally, a `config.json` for default
values directly in the extension's directory is now supported.
2025-10-01 15:29:13 -04:00
Yukirin 94c0490f34 Update id.js (#1638)
Added missing translations and re-translated some of existing translations
2025-10-01 10:46:43 -07:00
KernelDeimos 887536b811 fix: cleanup EngPortalService commands
- removes commands from EngPortalService that were previously moved to
  ParameterService
- renames `eng:test` to `eng:list-operations`

Closes #1624
2025-10-01 13:17:04 -04:00
Daniel Salazar 5b3bc9ddf4 fix: permission batch get (#1637) 2025-09-30 20:17:01 -07:00
biranzegelman97andNariman Jelveh 916f419e0f added missing hebrew translations + fixed some existing translation + changed he.js export variable from en to he (#1634)
* added missing hebrew translations + fixed some existing translation + changed he.js export variable from en to he

* remove "Missing translations" comment?

---------

Co-authored-by: Nariman Jelveh <[email protected]>
2025-09-30 19:16:35 -07:00
Hariz 62f5cc54cf Fix bug with context menu positioning on page load (#1636)
* Fix bug with context menu positioning on page load

* Fix double context menu bug on mobile
2025-09-30 18:58:54 -07:00
Nariman Jelveh 6ee60f9c13 Closes #629 2025-09-30 18:27:33 -07:00
HarizandNariman Jelveh 6429dcf15e Add 'Set as Desktop Background' context menu item to images (#1635)
* Add 'Set as Desktop Background' context menu item

* Use the `mime` library to detect images in the `UIItem` context menu

---------

Co-authored-by: Nariman Jelveh <[email protected]>
2025-09-30 18:06:09 -07:00
KernelDeimos c11a4008ee doc: improve comments in hellodriver.js 2025-09-30 17:12:09 -04:00
KernelDeimos 5cc182653e doc: document creating extensions through drivers 2025-09-30 16:33:34 -04:00
KernelDeimos 057eaa46ca dev(extensions): [+] hellodriver
The hellodriver extension provides a useful interface for generating
greetings at the same time as a simple example of how to implement
drivers.
2025-09-30 16:33:34 -04:00
KernelDeimos 87f2fbf36b clean: DriverService
Removes dead code and reduces branching. In the get_service_or_throw_
method, the changes in this commit show how the branching got more
redundnat in the previous change.
2025-09-30 16:33:34 -04:00
KernelDeimos 41820baba6 dev: add extension support in DriverService
Adds new events that DriverService emits: `create.interfaces` and
`create.drivers`. Returns the functionality of the "drivers" registry,
which now expects objects provided by extensions.
2025-09-30 16:33:30 -04:00
Nariman Jelveh eaa31ba18f Update copyright headers that were translated to non-english 2025-09-30 12:54:00 -07:00
Nariman Jelveh 343f042f39 feat: add tar and untar functionality for file management
- Implemented `tarItems` function to create tar archives from selected files or directories.
- Added `untarItem` function to extract tar archives.
- Updated UI to include options for downloading and tarring files.
- Enhanced item icon handling to display tar file icons.
- Added translations for tar and untar operations.

- Fixes #1629
2025-09-30 10:35:55 -07:00
Daniel Salazar 9c47a7f8ca perf: move user-user perm checks to flat kv entries (#1562) 2025-09-29 19:41:39 -07:00
Nariman Jelveh d085568674 Delete .github/ISSUE_TEMPLATE directory 2025-09-29 18:48:35 -07:00
KernelDeimos 1c64cb274b fix(ai): try overriding timeout to disable error
The Anthropic SDK preemptively throws an error if it thinks a response
is going to take longer than 10 minutes:
https://github.com/anthropics/anthropic-sdk-typescript#long-requests

According to this documentation, overriding the `timeout` option
disables this error. In this commit the option is changed to the default
value of 10 minutes plus an additional 1 second; it is assumed based on
the documentation's phrasing that it is not necessary to make the
timeout higher but simply to specify a value.
2025-09-29 15:08:23 -04:00
KernelDeimos df6fc8a432 test: fix test kernel after adding runtimle modules
RuntimeModules (a feature for extensions) can be accessed by core
modules through a registry exposed in Context by Kernel. However,
TestKernel was not exposing this same registry which caused an error
when module installation occurred during tests.
2025-09-29 14:27:07 -04:00
jelveh 208d25f371 Update ClaudeService.js 2025-09-29 11:20:34 -07:00
Andrei Onelandaskmanu[bot] d216887fa0 doc: add comments under filesystem, modules, entitystorage
* Added reference documentation for: src/backend/src/modules/puterfs/DatabaseFSEntryFetcher.js

* Added reference documentation for: src/backend/src/modules/dns/DNSService.js

* Added reference documentation for: src/backend/src/filesystem/ll_operations/ll_write.js

* Added reference documentation for: src/backend/src/filesystem/strategies/storage_a/LocalDiskStorageStrategy.js

* Added reference documentation for: src/backend/src/om/entitystorage/WriteByOwnerOnlyES.js

---------

Co-authored-by: askmanu[bot] <192355599+askmanu[bot]@users.noreply.github.com>
2025-09-29 14:16:50 -04:00
jelveh 5caf148ae9 Update ClaudeService.js 2025-09-29 11:16:13 -07:00
jelveh 847b3a07a4 Improve item.add cache invalidation logic so that it doesn't purge the entire cache 2025-09-29 00:02:03 -07:00
jelveh a69072b31b More precise cache invalidation in case of item rename 2025-09-28 23:43:36 -07:00
jelveh fe022cff1d Back to native purge to build from first principles?! 2025-09-28 22:50:55 -07:00
jelveh 1195e319a8 update kv.js version in package.json 2025-09-28 22:05:30 -07:00
Nariman Jelveh ebb0162d79 Increase cache efficiency 2025-09-28 21:30:31 -07:00
Nariman Jelveh 7382264648 more nuanced cache invalidation strategy with logging enabled by default 2025-09-28 20:35:51 -07:00
Nariman Jelveh a965df0cc0 Remove cache expiry in puter.js 2025-09-28 19:16:29 -07:00
Nariman Jelveh 72341c78dc Update index.js 2025-09-28 18:59:44 -07:00
jelveh ef74a1a660 fix: prevent unnecessary updates on socket events
Updated the `bindSocketEvents` method to check the `original_client_socket_id` before posting updates for 'cache.updated' and 'item.renamed' events. This prevents unnecessary updates when the event originates from the same client socket.
2025-09-28 14:35:45 -07:00
jelveh f1fd372933 refactor: improve metadata handling in WSPushService
Updated the `WSPushService` to pass additional metadata during user timestamp updates and event emissions for file system operations. This includes modifications to the `_on_fs_create`, `_on_fs_update`, `_on_fs_move`, and `_on_fs_pending` methods to ensure metadata is consistently included, improving the context for GUI updates.
2025-09-28 13:43:08 -07:00
jelveh 740089aff1 fixes #1622 2025-09-27 00:03:49 -07:00
Xiaochen Cui 891093fd2b fix a typo (#1627) 2025-09-26 21:45:00 -07:00
Haitamandjelveh 733c7b638d feat: Complete missing Ukrainian, Turkish and Thai translations (#1616)
* feat: Complete missing Ukrainian, Turkish and Thai translations

* add the trailing comma

---------

Co-authored-by: jelveh <[email protected]>
2025-09-26 21:40:20 -07:00
KernelDeimos baf261c0c4 fix: check if shraed files exist in ll_readshares
This may have been breaking the ability to see directories shared by
other users sometimes.
2025-09-26 18:59:23 -04:00
KernelDeimos 088ff4d696 fix: update path when renaming during save_account
We do update the path of all child directories by calling
filesystem.update_child_paths(), but this was never done for the user's
actual home directory itself (only everything under it).

The most ideal solution would be to delegate this behavior to the move
operation instead of updating the fsentries table directly, but making
this change right now has a high risk of breaking changes since this the
behavior in this file is very old.
2025-09-26 18:44:32 -04:00
Nariman Jelveh fae33301a8 fix the issue with last_valid_ts always being 0 2025-09-26 15:05:44 -07:00
mrtbgauandNariman Jelveh b8263fd8e0 feat: add missing Persian and Finnish translations (#1614)
* feat: add missing Persian translations

* feat: add missing Finnish translations

* Remove "Missing translations" comment

---------

Co-authored-by: Nariman Jelveh <[email protected]>
2025-09-26 15:05:04 -07:00
KernelDeimos d85f5fad5e dev: expose 'kv' as 'cache' from data extension 2025-09-26 17:31:00 -04:00
KernelDeimos d5a2a34f53 dev(extensions): add extension.use
The extension.use method allows registering routers and generic handlers
(not wrapped by eggspress) to express.
2025-09-26 17:30:09 -04:00
KernelDeimos 601eb019a2 dev(extensions): [+] data
The data extension adds convenient access to the database and kvstore
via it's 'db' and 'kv' exports.

Example usage:
  const { db, kv } = extensions.import('data');
  await kv.set('some-key', 'some-value');
  await db.write('INSERT INTO something (a, b) VALUES (1, 2)');
2025-09-26 15:28:00 -04:00
KernelDeimos 63bf4eccbe dev: make services importable by extensions
For example you can access WebServerService with
extension.import('service:web')
2025-09-26 15:28:00 -04:00
KernelDeimos 0c30a9e157 fixup! dev(extensions): [+] whoami 2025-09-26 15:28:00 -04:00
KernelDeimos dabf8cac56 fix: add missing dep to whoami extension 2025-09-26 15:28:00 -04:00
KernelDeimos 570409ef15 doc: add more extension internals documentation 2025-09-26 15:28:00 -04:00
KernelDeimos 27d7668a72 dev: '@extension name' and priority in puter.json
Adds the '@extension name <name>' directive for single-file Puter
extensions, and adds support for defining priority in 'puter.json'.
2025-09-26 15:27:59 -04:00
KernelDeimos cb31c1d44e dev: add command to list extensions
This commit adds the `extension:list` command for listing extensions.
This command is itself defined in an extension. To make this possible,
an event called 'create.commands' is emitted form CommandService with
the event object holding a function that can be used to add commands.
2025-09-26 15:27:59 -04:00
KernelDeimos 7b4c62d1c3 lint: minor formatting issue with catch(e)
The custom eslint pluggin for the formatting rule I have for the
expressions in control structures isn't a good fit when the condition is
a single variable named by a single character. This happens a lot with
`catch`. `catch ( e ) {` has too much spacing, but `catch (e) {` looks
relatively normal.
2025-09-26 15:27:59 -04:00
KernelDeimos 62e77a15a2 conf: add block in eslint.config.js for extensions 2025-09-26 15:27:59 -04:00
KernelDeimos 353cf397cb dev: remove legacy whoami and use extension 2025-09-26 15:27:59 -04:00
KernelDeimos db5aef51b0 fix: missing await in extension loader 2025-09-26 15:27:59 -04:00
KernelDeimos ebbe18f72d dev(extensions): [+] whoami 2025-09-26 15:27:59 -04:00
KernelDeimos 943a3c7bab type(extensions): config and add core.util.helpers 2025-09-26 15:27:58 -04:00
KernelDeimos 1358e98c5b devex: add some types for extension intellisense 2025-09-26 15:27:58 -04:00
KernelDeimos dde652fb27 dev: expose 'core' from useapi as runtime module 2025-09-26 15:27:58 -04:00
KernelDeimos 15cb98107c doc: add extension documentation for core devs
Extensions need to be documented at different layers of concern:
1. How to use/run extensions
2. How to create extensions as a contributor
3. How extensions work under the hood

This documentation addresses the third layer, describing how Kernel
and core modules interact with extensions.
2025-09-26 15:27:58 -04:00
KernelDeimos 4353c2dc46 dev: expose 'web' from useapi as runtime module
This will allow extensions to import from the 'web' module:
const { Endpoint } = extension.import('web');
2025-09-26 15:27:58 -04:00
KernelDeimos f6be6952dc dev: export runtime module registry to context 2025-09-26 15:27:58 -04:00
KernelDeimos b328355a90 fix: apparently setters shadow getting
I thought you could:
  method() {}
  set method (v) { /* ... /* }

but you can't. You have to:
  get method() { return (function () {}).bind(this) }
  set method (v) { /* ... /* }

I don't know why a setter can't just only shadow setting, but that's
how they designed the language. ¯\_(ツ)_/¯
2025-09-26 15:27:57 -04:00
KernelDeimos 6ff3d154fa devex: .git is not an extension
This change makes sure Kernel skips `.git` directories when scanning
for extensions. This allows me to make a git repository containing
example extensions for Puter.
2025-09-26 15:27:57 -04:00
KernelDeimos bdd60c63d8 devex: add '{repo}' variable for extension paths
Previously '{source}' was added but this is a bit difficult to work
with since it's the path from the source file, which is usually the
'src/' directory under the repository. This won't be obvious anyone
who doesn't already know this. '{repo}' just points to the path of
the repository itself.
2025-09-26 15:27:57 -04:00
KernelDeimos 06cd14353a doc: document import/export mechanism for extensions 2025-09-26 15:27:57 -04:00
KernelDeimos e271476e0b tweak: alias 'runtime' to 'extension'
Extension developers should not have to remember what comes form
where between two different globals. This change makes Extension
effectively a facade (Facade Pattern) containing the behaviors
of both extensions and runtime modules.
2025-09-26 15:27:57 -04:00
KernelDeimos 9aef281ad2 dev: add runtime modules for imports and exports
RuntimeModule is a new construct which represents the import/export
mechanism for Puter extensions. This can be thought of as analogous
to node's Module class. These are called "runtime modules" because
extensions have less control of what they're consuming than a typical
npm module; i.e. `runtime.import('database')` will provide a version
of 'database' that's compatible with the importing extension, but the
version used can't be locked or otherwise determined by the extension.
2025-09-26 15:27:57 -04:00
Xiaochen CuiandNariman Jelveh 860388c3cb update client-cache logic (#1626)
* client-cache: remove pulling

* client-cache: fix wrong ts field

* client-cache: purge cache on any local update

* client-cache: last_updated_time -> last_valid_time

* client-cache: update cache on remote update

* client-cache: update last_valid_ts every sec

* client-cache: switch to localstorage

* do the cache and purge test when `setAuthToken` is called

---------

Co-authored-by: Nariman Jelveh <[email protected]>
2025-09-26 11:44:12 -07:00
Nariman Jelveh a0b567da52 chore: update @heyputer/kv.js dependency to version 0.2.0 and initialize cache with dbName in puter-js (#1623) 2025-09-26 10:58:16 -07:00
Daniel Salazar 3fc183297f revert: eslint config rules (#1625) 2025-09-26 10:52:00 -07:00
Daniel SalazarandNeal Shah d70d412115 feat: DAV Locks support + refactor of DAV method handler (#1486)
* feat: DAV Locks support + refactor of DAV method handler

* format: Restore old whitespace for CoreModule.js

* fix: options route registering after likecycle hooks

---------

Co-authored-by: Neal Shah <[email protected]>
2025-09-26 11:00:29 -04:00
Xiaochen Cui 7bfa85d4fe client-cache: remove pulling (#1620)
* client-cache: remove pulling

* client-cache: fix wrong ts field

* client-cache: purge cache on any local update
2025-09-25 16:56:01 -07:00
Daniel Salazar 8d36e52ae7 Merge pull request #1621 from HeyPuter/DS/main
dep: updating node dep version to one that supports modules
2025-09-25 12:17:15 -07:00
Daniel Salazar 9705c58160 dep: updating node dep version to one that supports modules 2025-09-25 12:08:36 -07:00
OnitsagandNariman Jelveh 1cff4fd46a feat: Add missing Portuguese translations (#1615)
* feat: Add missing Portuguese translations

* feat: Add missing Swedish translations

* remove missing translations comment

---------

Co-authored-by: Nariman Jelveh <[email protected]>
2025-09-25 11:47:04 -07:00
velzie 8b9fefa4a2 fix puterjs throwing errors after consuming message events not meant for it (#1612) 2025-09-25 11:11:34 -07:00
Thomas NGUYEN 72ee05fefb feat: Add missing Urdu translations (#1618) 2025-09-25 10:58:46 -07:00
Xiaochen Cui 681c084180 client-cache: update cache-invalidation policy to ts-based comparison (#1611) 2025-09-24 18:08:09 -07:00
Nariman Jelveh 8b7e764af9 add instancesOpen to puter.js UI 2025-09-24 17:03:36 -07:00
KernelDeimos fa436a7775 devex: make it impossible to commit eslint errors 2025-09-24 17:41:48 -04:00
KernelDeimos fe1d78d5bf conf(eslint): fix backend rule, -@stylistic/quotes
This commit fixes the block that's meant to match backend files. There
was an error in the arguments for '@stylistic/indent' which was
effectively disabling the entire block. In vscode, it is very unclear
that this is happening, so I had to manually run this command:

npx eslint "src/backend/**/*.js" --debug

This commit also disables @stylistic/quotes; I disagree with this
rule for several reasons:
1. Sometimes the appropriate quote depends on the contents:
   i.e. '""""' + "''''" is cleaner than '""""\'\'\'\''.
2. If you argue that mixing quotes between concatenated strings
   (like the previous example) is a bad idea, then I can further
   state that this rule forces me to mix quotes:
   `we use a ${templateString}` + "but can't do it here"
2025-09-24 16:58:28 -04:00
Khilfi KA 99ebbfa00d Add Bahasa Malaysia (Malay) i18n Support (#1609)
* Complete Bahasa Malaysia (Malay) translation of Puter

* Fix code styling

* Add Malay README.md

* Removed dash from `sub-projek`

* Make `Library` italic

* Add Malay language to `Translations` section
2025-09-24 12:44:41 -07:00
ProgrammerIn-wonderland cf05413b83 ux: Whitelist onlyoffice applications from copy dialog in IPC 2025-09-23 18:10:54 -04:00
Daniel Salazar 25de96c8c9 Merge pull request #1607 from HeyPuter/DS/main
chore: add jsdoc typings for KV interface
2025-09-23 14:26:48 -07:00
Daniel Salazar 8cc14fece3 chore: add jsdoc typings for KV interface 2025-09-23 14:26:35 -07:00
Daniel Salazar 06f89a8a80 Merge pull request #1606 from HeyPuter/DS/main
feat: allow setting puter origin via globalThis variables
2025-09-23 14:26:17 -07:00
Daniel Salazar bf76a1edea feat: allow setting puter origin via globalThis variables 2025-09-23 13:26:12 -07:00
KernelDeimos aae3da39f8 sync: package-lock.json 2025-09-23 15:03:09 -04:00
Hariz 67be35b6a0 Don't raise window if close/minimize btn clicked (#1589) 2025-09-22 18:52:57 -07:00
Nariman Jelveh e0316b9cbe remove unnecessary console.log() 2025-09-22 16:36:48 -07:00
KernelDeimos 1ea8f9ddf1 devex: performance monitor environment variable
Instead of requiring developers to keep changes in their git index to
use the performance monitor, make it configurable through the .env
file.
2025-09-22 19:31:03 -04:00
KernelDeimos f729eaa31f fix: use dynamic import for dotenv 2025-09-22 19:30:37 -04:00
KernelDeimos 15eb44d62d feat: add optional dotenv support
This adds an optional import for 'dotenv'. If dotenv is installed
via npm then the .env file will be loaded.
2025-09-22 19:13:05 -04:00
KernelDeimos 49341321f1 dev: add option to make the database slow
Adds a configuration parameter called "slow" to database config which
adds a hardcoded delay 70ms to database operations. This is useful
when testing for performance issues.
2025-09-22 19:10:48 -04:00
jelveh b93890b008 Update package.json 2025-09-21 22:36:40 -07:00
jelveh 502ef3c32b Update README.md for Puter.js: Enhance formatting, add installation instructions, and include community links 2025-09-21 22:33:13 -07:00
dependabot[bot] 4dfdd2839f build(deps): bump webpack from 5.89.0 to 5.101.3 in /src/puter-js (#1601)
Bumps [webpack](https://github.com/webpack/webpack) from 5.89.0 to 5.101.3.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v5.89.0...v5.101.3)

---
updated-dependencies:
- dependency-name: webpack
  dependency-version: 5.101.3
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-21 14:50:30 -07:00
Nariman Jelveh 32962211b4 Revert "Enhance login GUI: improve layout and add show/hide password (#1599)" (#1600)
This reverts commit 9e07fa74b7.
2025-09-21 09:53:12 -07:00
SaifAttar003 9e07fa74b7 Enhance login GUI: improve layout and add show/hide password (#1599) 2025-09-21 09:52:55 -07:00
dependabot[bot] 8e3cc68701 build(deps): bump requests from 2.32.3 to 2.32.4 in /tools/api-tester/ci (#1598)
Bumps [requests](https://github.com/psf/requests) from 2.32.3 to 2.32.4.
- [Release notes](https://github.com/psf/requests/releases)
- [Changelog](https://github.com/psf/requests/blob/main/HISTORY.md)
- [Commits](https://github.com/psf/requests/compare/v2.32.3...v2.32.4)

---
updated-dependencies:
- dependency-name: requests
  dependency-version: 2.32.4
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-21 00:49:21 -07:00
Hariz 3de3c21f66 Add context menu to apps in the start menu (#1487)
* Add context menu to apps in the start menu

* Start menu context menus: Close other menus

* More bugfixes for start menu context menus

* Start menu context menus: Add/remove from taskbar

* Bugfixes for adding to taskbar through start menu

* Highlight start menu icons when ctxmenu is opened

* Close context menus on start menu kbd navigation

* Reset start menu icon state when ctx menu closed

* Fix multiple start item context menus opening simultaneously

* Remove parent argument from start icon context menus
2025-09-20 18:52:14 -07:00
Daniel Salazar 6910b41a22 Merge pull request #1595 from HeyPuter/DS/main
npm: fix publish
2025-09-19 17:22:24 -07:00
Daniel Salazar 44284eb788 fix: typedefs 2025-09-19 17:12:01 -07:00
Daniel Salazar d6fbe94364 npm: fixed publish 2025-09-19 16:52:18 -07:00
dependabot[bot] a3cbee1b58 build(deps): bump serialize-javascript in /src/puter-js (#1594)
Bumps [serialize-javascript](https://github.com/yahoo/serialize-javascript) from 6.0.1 to 6.0.2.
- [Release notes](https://github.com/yahoo/serialize-javascript/releases)
- [Commits](https://github.com/yahoo/serialize-javascript/compare/v6.0.1...v6.0.2)

---
updated-dependencies:
- dependency-name: serialize-javascript
  dependency-version: 6.0.2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-19 14:28:36 -07:00
Daniel Salazar 0ef2b1c05e Merge pull request #1593 from HeyPuter/DS/main
fix: package name
2025-09-19 14:02:36 -07:00
Daniel Salazar 9d5a09f0bc fix: package name 2025-09-19 14:01:03 -07:00
Daniel Salazar 3cb9040a94 Merge pull request #1592 from HeyPuter/DS/main
npm: release to npm
2025-09-19 13:58:50 -07:00
Daniel Salazar a936333006 npm: release to npm 2025-09-19 13:58:25 -07:00
jelveh a023c24c35 Update package.json 2025-09-19 13:55:19 -07:00
jelveh 41191c65d7 Update puter.js README.md 2025-09-19 13:52:54 -07:00
Xiaochen Cui c8500ba1ab test: add puterjs test to apiteste (#1590) 2025-09-19 13:27:47 -07:00
Xiaochen Cui 9d0199f858 add apitest to github actions (#1591) 2025-09-19 13:27:32 -07:00
coluccifrancesco 0c60ebd1d0 Update it.js (#1588)
I translated the last part of the document for the italian language.
All the updates are typo-checked for errors , and there's none.
The translation has been made keeping in mind the italian use of various terms, some of the english words haven't been translated due to the extended use of the orignal term in everyday vocabulary.
2025-09-19 11:07:02 -07:00
Daniel Salazar 770e5e071e Merge pull request #1587 from HeyPuter/DS/main
ci: drop support and testing for node 18
2025-09-19 10:29:39 -07:00
Daniel Salazar 493334b030 chore: update README for puter.js to publish on npm 2025-09-19 02:34:33 -07:00
jelveh 654dfa9124 Update style.css 2025-09-18 23:03:16 -07:00
jelveh c0b03e147b add redundant readdir to cache the home dir 2025-09-18 21:03:28 -07:00
Nariman Jelveh 7000831138 make whoami return last_activity_ts 2025-09-18 19:07:53 -07:00
Nariman Jelveh 31fffb087d Refactor file system operations in GUI and puter.js to use eventual consistency (#1579)
* Refactor file system operations in GUI and puter.js to use eventual consistency for stat and readdir calls

This update modifies multiple instances of file system operations to include a consistency option set to 'eventual'. This change aims to improve performance and responsiveness by allowing for eventual consistency in file system interactions across various components, including helpers, UI elements, and IPC handling.

* Update cache expiration time for file system operations in readdir and stat to 1 hour

* feat: add network connectivity monitoring and cache purging

This update introduces a new feature that monitors network connectivity and purges the cache when the connection is lost. The implementation includes event listeners for online/offline changes and visibility changes to ensure cache consistency during network disruptions.

* clean up logs
2025-09-18 17:13:39 -07:00
Daniel Salazar 466cc113c6 ci: drop support and testing for node 18 2025-09-18 16:10:44 -07:00
software developer, self taughtandNariman Jelveh 89d5030ae3 Add missing polish translation (#1584)
* add missing polish translation

* Clean up comments in pl.js translations

Removed comments about missing translations from the Polish translations file.

---------

Co-authored-by: Nariman Jelveh <[email protected]>
2025-09-18 13:58:35 -07:00
dependabot[bot] 5fe28ee8e2 build(deps): bump serialize-javascript and mocha in /src/terminal (#1585)
Bumps [serialize-javascript](https://github.com/yahoo/serialize-javascript) to 6.0.2 and updates ancestor dependency [mocha](https://github.com/mochajs/mocha). These dependencies need to be updated together.


Updates `serialize-javascript` from 6.0.0 to 6.0.2
- [Release notes](https://github.com/yahoo/serialize-javascript/releases)
- [Commits](https://github.com/yahoo/serialize-javascript/compare/v6.0.0...v6.0.2)

Updates `mocha` from 10.2.0 to 10.8.2
- [Release notes](https://github.com/mochajs/mocha/releases)
- [Changelog](https://github.com/mochajs/mocha/blob/main/CHANGELOG.md)
- [Commits](https://github.com/mochajs/mocha/compare/v10.2.0...v10.8.2)

---
updated-dependencies:
- dependency-name: serialize-javascript
  dependency-version: 6.0.2
  dependency-type: indirect
- dependency-name: mocha
  dependency-version: 10.8.2
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-18 12:04:44 -07:00
dependabot[bot] c9c92e806a build(deps-dev): bump rollup from 3.21.4 to 3.29.5 in /src/phoenix (#1583)
Bumps [rollup](https://github.com/rollup/rollup) from 3.21.4 to 3.29.5.
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG-3.md)
- [Commits](https://github.com/rollup/rollup/compare/v3.21.4...v3.29.5)

---
updated-dependencies:
- dependency-name: rollup
  dependency-version: 3.29.5
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-18 10:38:52 -07:00
dependabot[bot] 1475183b06 build(deps): bump multer from 1.4.5-lts.2 to 2.0.2 (#1582)
Bumps [multer](https://github.com/expressjs/multer) from 1.4.5-lts.2 to 2.0.2.
- [Release notes](https://github.com/expressjs/multer/releases)
- [Changelog](https://github.com/expressjs/multer/blob/main/CHANGELOG.md)
- [Commits](https://github.com/expressjs/multer/compare/v1.4.5-lts.2...v2.0.2)

---
updated-dependencies:
- dependency-name: multer
  dependency-version: 2.0.2
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-18 10:36:39 -07:00
dependabot[bot] a9699a9f77 build(deps): bump braces from 3.0.2 to 3.0.3 in /src/terminal (#1581)
Bumps [braces](https://github.com/micromatch/braces) from 3.0.2 to 3.0.3.
- [Changelog](https://github.com/micromatch/braces/blob/master/CHANGELOG.md)
- [Commits](https://github.com/micromatch/braces/compare/3.0.2...3.0.3)

---
updated-dependencies:
- dependency-name: braces
  dependency-version: 3.0.3
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-18 10:28:44 -07:00
dependabot[bot] ce237b5c4a build(deps): bump form-data from 4.0.2 to 4.0.4 in /test/integration (#1580)
Bumps [form-data](https://github.com/form-data/form-data) from 4.0.2 to 4.0.4.
- [Release notes](https://github.com/form-data/form-data/releases)
- [Changelog](https://github.com/form-data/form-data/blob/master/CHANGELOG.md)
- [Commits](https://github.com/form-data/form-data/compare/v4.0.2...v4.0.4)

---
updated-dependencies:
- dependency-name: form-data
  dependency-version: 4.0.4
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-18 10:26:20 -07:00
jelveh abc0d7b16c Update refresh_item_container.js 2025-09-17 16:12:35 -07:00
jelveh e4ada292f1 Update index.js 2025-09-17 15:59:24 -07:00
ProgrammerIn-wonderland 8884c7f472 fix: get rid of preflight for non-apifs readdir/stat 2025-09-17 18:57:57 -04:00
Nariman Jelveh e37166dae0 Cache is king baby! Let's go 🚀 (#1574)
* Implement the first naive version of `readdir` cache

* Purge the entire cache on every single mutation

Right now we're going to use the very naive, but safe, approach to purge the entire cache whenever there is change in the user's fs. We're going to incrementally improve this; but for now, better safe than sorry!

* Add socket event listeners to flush cache on file system item changes

This update introduces event listeners for 'item.added', 'item.renamed', and 'item.moved' events, triggering a cache flush on each event to ensure data consistency in the file system module.

* increase exp time for the cache

* Update readdir.js

* Update index.js
2025-09-17 15:36:42 -07:00
Amritpandey5andjelveh 214fd3010e added missing values (#1577)
* added missing values

* Update de.js

---------

Co-authored-by: jelveh <[email protected]>
2025-09-17 14:09:35 -07:00
aaryanandjelveh f4af6874b0 doc: added missing Dutch translations (#1575)
* doc: added missing Dutch translations
- fixes #1515

* Update nl.js

---------

Co-authored-by: jelveh <[email protected]>
2025-09-17 08:56:06 -07:00
Neal Shah b1facfbabd fix: get rid of a console log 2025-09-16 19:46:53 -04:00
ProgrammerIn-wonderland a48f3e0274 get rid of noReallyItsJson 2025-09-16 19:46:53 -04:00
ProgrammerIn-wonderland 1e620c73bc make drivers and KV also preflightless 2025-09-16 19:46:53 -04:00
ProgrammerIn-wonderland 135d7b81a4 preflightless stat/readdir 2025-09-16 19:46:53 -04:00
Nariman Jelveh 079d060747 Make templates non blocking (#1573)
* refactor: update available_templates function for non-blocking template loading

- Changed the available_templates function to initiate loading templates asynchronously without blocking the UI.
- Initialized window.file_templates with an empty array and updated it once the templates are loaded.
- Added a console log in UIDesktop to track transaction duration upon completion.

* Update UIDesktop.js
2025-09-16 14:57:01 -07:00
Nariman Jelveh 6d17385f09 add getDuration() to the Transaction class 2025-09-16 14:31:55 -07:00
Jatin SharmaandNariman Jelveh b6da8ba9ce Complete Missing Hungarian Translations in hu.js (#1572)
* Update Hungarian translations in hu.js

* Update hu.js

---------

Co-authored-by: Nariman Jelveh <[email protected]>
2025-09-16 13:39:32 -07:00
dtakahashi333 42302b12ac fix: add Japanese translations (#1519) (#1570) 2025-09-16 12:30:09 -07:00
Thiago (Teet) b2d38e2058 Fixes to PT-BR translation (br.js) (#1568)
Fixed spelling and missing accentuations

Adjusted capitalization for consistency with other strings

Made wording more natural in PT-BR (e.g. “site” instead of “website”, “Login” instead of “Início de Sessão”)
2025-09-15 23:39:36 -07:00
KernelDeimos c588ff20d0 clean: remove logs (obvious cases)
This commit removes debug logs that meet these criteria:
- used console.log instead of the log service
- were left in the source tree accidentally
- show up at boot or during stat/readdir operations

This is not a comprehensrve removal; this is a first pass to get a
few of the trivial cases.
2025-09-16 01:12:57 -04:00
Nariman Jelveh e4c2581623 Make readdir workd with uid in addition to path 2025-09-15 20:12:45 -07:00
KernelDeimos d482d7cdf5 dev: add immutable default directories to whoami 2025-09-15 22:11:02 -04:00
Nariman Jelveh eb53b86c8a feat: add optional input image fields to AIInterfaceService
- Introduced `input_image` and `input_image_mime_type` as optional parameters in the AIInterfaceService schema to enhance image processing capabilities.
2025-09-15 16:57:38 -07:00
Nariman Jelveh 4e8aad675d feat: improve image generation and coercion for data URLs
- Updated `GeminiImageGenerationService` to differentiate between data URLs and web URLs for image handling.
- Added coercion support in CoercionService for converting data URLs to streams, including extraction of content type.
- Documented the txt2img method in AI.js to clarify usage for text and image-to-image generation.
2025-09-15 15:45:54 -07:00
KernelDeimos 6480d37ec0 fix: make optimization for is_empty conditional
Usually Puter has a UID by this point, but if it ever doesn't we can
fall back on using the path with a `LIKE ? + '%'` query. However,
users before a particular date might have fsentries without a path,
so we need to perform a check on the user's timestamp to avoid issues.
2025-09-15 18:29:10 -04:00
KernelDeimos 3af84c0647 fix: is_empty sometimes being wrong
is_empty wasn't working correctly while running concurrently with
fetchEntry because because the check in fetchIsEmpty was too
specific. This commit fixes this issue while also adding support for
a 'path' parameter to is_empty.
2025-09-15 18:29:10 -04:00
Nariman Jelveh f4fc24bce3 feat: add support for image-to-image generation in GeminiImageGenerationService
- Enhanced the `generate` method to accept base64 encoded input images and their MIME types.
- Implemented validation for input image and MIME type to ensure proper usage.
- Updated the content construction logic to handle both text-to-image and image-to-image generation scenarios.
2025-09-15 15:08:06 -07:00
BarnakandNariman Jelveh 47acb141da Updating ru.js (#1566)
* Update ru.js

Added missing translations from english to russian

* Update ru.js

* Update ru.js

---------

Co-authored-by: Nariman Jelveh <[email protected]>
2025-09-15 12:06:03 -07:00
KernelDeimos ef76d33cc2 fix: string coercion for email verify code
Some databases will automatically do this string coercion, but others
will not. This commit ensures the value is always a string.
2025-09-15 14:56:42 -04:00
Nariman Jelveh 5121dbd300 Update PuterHomepageService.js 2025-09-15 11:28:42 -07:00
Nariman Jelveh 5e16259209 Update UIWindowDesktopBGSettings.js 2025-09-15 11:13:49 -07:00
Nariman Jelveh 2db29a01ba Default wallpeper url for prod should be the CDNed one 2025-09-15 10:58:01 -07:00
Daniel Salazar 4e563b4238 Merge pull request #1560 from HeyPuter/DS/main
fix: expiry time for dbkv
2025-09-15 10:44:21 -07:00
Leo f89f429849 Romanian Translation Done (#1565)
* romanian translation

* romanian translation
2025-09-15 09:57:18 -07:00
KernelDeimos b92a4edb83 fix: missing return for app icons on init 2025-09-15 04:31:36 -04:00
KernelDeimos 4d92f4a3ce fix: missing span name ("fn is not defined" error) 2025-09-15 04:28:51 -04:00
KernelDeimos ed5464f0c0 tmp: disable refresh_app_cache
Earlier I actually thought this wasn't running in prod because when I
run Puter locally the "refresh app cache" message doesn't appear.
I ensured that minlog was off but I forgot that around the same time
I also disabled the "tick" log level by default. If it weren't for
that I would've realized this an hour ago. That said, it's kind of
odd that this seems to be the source of the leak, because this isn't
new behavior.
2025-09-15 04:15:19 -04:00
KernelDeimos 3a0733f557 debug: add annotation class for app objects 2025-09-15 04:00:27 -04:00
KernelDeimos 7d7291cde4 fix: add unlink() methods to clear ECMAP 2025-09-15 03:19:46 -04:00
KernelDeimos 509f1add4e tmp: for now, make refresh_apps_cache a noop 2025-09-15 02:47:11 -04:00
KernelDeimos f98c78504b fix: try disabling this 30 second app cache for now
OOM conditions happening... maybe this will fix it
2025-09-15 00:12:46 -04:00
Nariman Jelveh 735f16725d refactor: make theme service non-blocking and fix captcha issues (#1564)
Replaced inline styles with CSS classes for the captcha modal to improve maintainability and readability. Adjusted JavaScript to accommodate the new structure and ensure proper functionality. Enhanced error handling and loading state management during the captcha verification process.
2025-09-14 20:20:19 -07:00
KernelDeimos 42abfcc5e7 perf: huh, right... not sure how I missed that
These two async operations depend on fetchEntry, but they do not
depend on each other; they can be run in parallel.
2025-09-14 20:40:18 -04:00
KernelDeimos 27ab23e7b1 fix: read 'push' of undefined 2025-09-14 19:01:59 -04:00
KernelDeimos f3fdfea65b perf: add 30 second app cache
There used to be an app cache here that would be invalidated but I
think this may have been removed because the invalidation logic
was causing issues. A 30 second cache seems reasonable though, so
let's do that for now.
2025-09-14 19:01:59 -04:00
KernelDeimos 733b6a653e perf: further readdir improvements 2025-09-14 19:01:59 -04:00
Daniel Salazar 860f68a9a5 fix: expiry time for dbkv 2025-09-14 12:48:25 -07:00
Aryan Arlikar 9820794470 Translate and improve emojis (#1557)
* chore(i18n/emoji): improve clarity of confirmation and name validation emojis

* chore(i18n/emoji): improve clarity of confirmation and name validation emojis
2025-09-14 12:45:54 -07:00
Watson 4c5032ff47 Update ko.js with full Korean translations (#1558)
* Update ko.js with full Korean translations

* fix: update 'public' translation from '공개' (open) to '공용' (shared) for clarity
2025-09-14 11:22:24 -07:00
Webb321andNariman Jelveh cab3d130c7 fix: add Chinese transaltions (#1559)
* fix: add Chinese transaltions

* fix: formatting

---------

Co-authored-by: Nariman Jelveh <[email protected]>
2025-09-14 10:55:41 -07:00
KernelDeimos 094dd183b2 fix: event multiplication introduced in ebf4d7 2025-09-13 22:41:09 -04:00
KernelDeimos 7872fd58ed perf: optimize extension loader
Parallelize as much as possible, and avoid reading data from the
package.json when the file was generated by the extension loader
in the first place.
2025-09-13 22:41:09 -04:00
KernelDeimos 7730877c91 dev: add extension initialization priority 2025-09-13 22:41:09 -04:00
KernelDeimos 55c53d9eee dev: extension registry and lifecycle
Adds `register`, `registry`, `preinit`, and related symbols to the
available extension globals.
2025-09-13 22:41:09 -04:00
KernelDeimos 9135632129 dev: add support for ES6 Module extensions
Previously ES6 Module extensions would only work on versions of node
with --experimental-require-module enabled by default, and provided the
entry file had no top-level await. This commit uses "await import"
conditionally if the "type" in package.json is set to "module".
2025-09-13 22:41:09 -04:00
Daniel Salazar 0608958117 Merge pull request #1555 from HeyPuter/DS/main
fix: br.js transaltions
2025-09-13 18:14:25 -07:00
Daniel Salazar 6b05c90a21 fix: br.js transaltions 2025-09-13 18:12:57 -07:00
Daniel Salazar 740fef2306 Merge pull request #1484 from HeyPuter/DS/main
feat: logging for queries in puter js
2025-09-13 18:12:31 -07:00
Daniel Salazar 5569af8961 Merge branch 'main' into DS/main 2025-09-13 18:10:08 -07:00
AlfreThiagoandNariman Jelveh 07f97deab5 Adding missing translations for Brazilian Portuguese. (#1554)
* Feat: Adding missing translations for Brazilian Portuguese. Fixes #1500

* Corrections in brazilian translation

* Clean up translation file by removing comments

Removed comments indicating missing translations in br.js.

---------

Co-authored-by: Nariman Jelveh <[email protected]>
2025-09-13 17:30:41 -07:00
KernelDeimos a5882889dd perf: make stat really fast 2025-09-13 20:27:44 -04:00
KernelDeimos c70434d947 perf: avoid reduntant fetches due to concurrency
Sometimes the same fs entry is fetched multiple times concurrently
because of parallel methods with separation of concerns.

After this commit, only one parallel fetch will go through and the
others will wait for it. Subsequent fetches will not occur is the
data that was needed is already there.
2025-09-13 20:27:44 -04:00
KernelDeimos 6a129ba8cc perf: skip quick_check for only one provider
The 'quick_check' increases the amount of time it takes to perform a
stat operation significantly proportional to the time it takes to do
a stat because an fsentry fetch occurs before a transient
memoization map is available for an operation.
2025-09-13 20:27:44 -04:00
dependabot[bot] 915358cec4 build(deps-dev): bump rollup from 3.23.0 to 3.29.5 in /src/terminal (#1553)
Bumps [rollup](https://github.com/rollup/rollup) from 3.23.0 to 3.29.5.
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG-3.md)
- [Commits](https://github.com/rollup/rollup/compare/v3.23.0...v3.29.5)

---
updated-dependencies:
- dependency-name: rollup
  dependency-version: 3.29.5
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-13 16:01:23 -07:00
dependabot[bot] 1f3e83a9a0 build(deps): bump path-to-regexp from 6.2.1 to 6.3.0 in /src/phoenix (#1552)
Bumps [path-to-regexp](https://github.com/pillarjs/path-to-regexp) from 6.2.1 to 6.3.0.
- [Release notes](https://github.com/pillarjs/path-to-regexp/releases)
- [Changelog](https://github.com/pillarjs/path-to-regexp/blob/master/History.md)
- [Commits](https://github.com/pillarjs/path-to-regexp/compare/v6.2.1...v6.3.0)

---
updated-dependencies:
- dependency-name: path-to-regexp
  dependency-version: 6.3.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-13 13:48:24 -07:00
Nariman Jelveh 1c64aee87e Update package-lock.json 2025-09-13 13:45:49 -07:00
dependabot[bot] 298cb83c48 build(deps): bump braces from 3.0.2 to 3.0.3 in /src/phoenix (#1551)
Bumps [braces](https://github.com/micromatch/braces) from 3.0.2 to 3.0.3.
- [Changelog](https://github.com/micromatch/braces/blob/master/CHANGELOG.md)
- [Commits](https://github.com/micromatch/braces/compare/3.0.2...3.0.3)

---
updated-dependencies:
- dependency-name: braces
  dependency-version: 3.0.3
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-13 13:43:31 -07:00
dependabot[bot] d746d3ef55 build(deps): bump serialize-javascript and mocha in /src/phoenix (#1550)
Bumps [serialize-javascript](https://github.com/yahoo/serialize-javascript) to 6.0.2 and updates ancestor dependency [mocha](https://github.com/mochajs/mocha). These dependencies need to be updated together.


Updates `serialize-javascript` from 6.0.0 to 6.0.2
- [Release notes](https://github.com/yahoo/serialize-javascript/releases)
- [Commits](https://github.com/yahoo/serialize-javascript/compare/v6.0.0...v6.0.2)

Updates `mocha` from 10.2.0 to 10.8.2
- [Release notes](https://github.com/mochajs/mocha/releases)
- [Changelog](https://github.com/mochajs/mocha/blob/main/CHANGELOG.md)
- [Commits](https://github.com/mochajs/mocha/compare/v10.2.0...v10.8.2)

---
updated-dependencies:
- dependency-name: serialize-javascript
  dependency-version: 6.0.2
  dependency-type: indirect
- dependency-name: mocha
  dependency-version: 10.8.2
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-13 13:38:43 -07:00
dependabot[bot] 7e1a3c9ac7 build(deps): bump get-func-name from 2.0.0 to 2.0.2 in /tools/api-tester (#1549)
Bumps [get-func-name](https://github.com/chaijs/get-func-name) from 2.0.0 to 2.0.2.
- [Release notes](https://github.com/chaijs/get-func-name/releases)
- [Commits](https://github.com/chaijs/get-func-name/commits/v2.0.2)

---
updated-dependencies:
- dependency-name: get-func-name
  dependency-version: 2.0.2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-13 13:30:47 -07:00
dependabot[bot] a38d8db965 build(deps): bump axios from 1.4.0 to 1.12.0 in /tools/api-tester (#1548)
Bumps [axios](https://github.com/axios/axios) from 1.4.0 to 1.12.0.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.4.0...v1.12.0)

---
updated-dependencies:
- dependency-name: axios
  dependency-version: 1.12.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-13 13:28:13 -07:00
dependabot[bot] 3c2639403c build(deps): bump form-data from 4.0.0 to 4.0.4 in /tools/api-tester (#1547)
Bumps [form-data](https://github.com/form-data/form-data) from 4.0.0 to 4.0.4.
- [Release notes](https://github.com/form-data/form-data/releases)
- [Changelog](https://github.com/form-data/form-data/blob/master/CHANGELOG.md)
- [Commits](https://github.com/form-data/form-data/compare/v4.0.0...v4.0.4)

---
updated-dependencies:
- dependency-name: form-data
  dependency-version: 4.0.4
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-13 13:26:11 -07:00
Nariman Jelveh a582c0ee38 Update package-lock.json 2025-09-13 13:19:58 -07:00
Nariman Jelveh 8392396b1b Update Axios 2025-09-13 13:18:01 -07:00
Nariman Jelveh 338ae161d7 closes #1545 2025-09-13 13:16:37 -07:00
shadow-tawandjelveh ac9a42b8e2 Updating the Arabic (العربية) translation (#1543)
* the Arabic (العربية) translation of Puter is Completed

* Update ar.js

* updating the Arabic (العربية) translation of Puter

---------

Co-authored-by: jelveh <[email protected]>
2025-09-12 18:26:30 -07:00
KernelDeimos e926738d64 perf: add some new keys to initial fetch 2025-09-12 19:40:26 -04:00
KernelDeimos 7bc03fe17c perf: fix sequential kv gets for default apps 2025-09-12 19:33:43 -04:00
KernelDeimos 5d3863d473 style: user_preferences.default_apps
This snippet of code doesn't need to iterate over keys, it can iterate over
values instead. Also, this "let" can be a "const".
2025-09-12 19:23:24 -04:00
KernelDeimos 5119efaf79 Reapply "feat: support Gemini imagegen service"
This reverts commit 05071b4338.
2025-09-12 19:16:58 -04:00
KernelDeimos c40c138aa2 fix: I have no idea how I didn't catch this
Apparently this just never happens when I use Puter locally.
2025-09-12 19:09:41 -04:00
KernelDeimos 05071b4338 Revert "feat: support Gemini imagegen service"
This reverts commit e13b008c79.

This is being done temporarily to debug something else without
confounding variables.
2025-09-12 18:43:20 -04:00
ProgrammerIn-wonderland e13b008c79 feat: support Gemini imagegen service 2025-09-12 18:17:31 -04:00
KernelDeimos b3e2b69c4d perf: execution context memoization map for filesystem
This commit adds an object called ECMAP. This object is a transient
memoization store for use by FSNodeContext.
2025-09-12 18:13:41 -04:00
KernelDeimos 43a0be33ca fix: selector handling from 8cfa0ece
For instances where svc_fs.node was called and explicitly passed a
NodePathSelector (instead of being passed a legacy-style object
with a path attribute) this code was failing. This commit moves the
affected code snippet after input coercion and updates references
to use the coerced input.

style: formatting changes were applied to the code. Instead of using
nested conditional blocks we use labelled breaks
2025-09-12 16:59:47 -04:00
KernelDeimos c508189455 fix: missing condition in ownership check
Not sure when this went away, but we were always getting the
permission though the file path instead of ID/UUID from what it
looks like, which was hiding this problem.
2025-09-12 16:45:39 -04:00
KernelDeimos b8354cc4a6 perf: always shortcut is-owner implicator 2025-09-12 15:26:09 -04:00
Nariman Jelveh 8cfa0ece15 Hit the cache under the user object when trying to resolve paths to system directories 2025-09-12 11:43:49 -07:00
Nariman Jelveh a1eb954221 Short-circuit for apps accessing their own AppData directory. 2025-09-11 22:03:27 -07:00
Nariman Jelveh 7511a1518c Short-circuit the permission check for users accessing their own files 2025-09-11 21:41:42 -07:00
KernelDeimos 9582297547 perf: naive permission cache
Add a simple 20 second cache with kv.js to the scan_ method of
PermissionService. This will not improve the performance for
the permission system, but it will invoke it less often.
2025-09-11 22:37:09 -04:00
KernelDeimos 7dfb05f589 fix: try skipping any directory in extensions named gui
Putting the constants at the top of these files breaks things, but
skipping any directory named "gui" is probably safe.
2025-09-11 20:15:19 -04:00
Neal Shah acda7b73ef New image models (#1542)
* Refactor OpenAIImageGenerationService to more easily support new models, add GPT-image-1

* set default image model to gpt-image-1
2025-09-11 20:00:22 -04:00
KernelDeimos 709f5444b2 fix: skip files with //!noprepend at the top
This is a quick solution for javascript files that should not have Puter
extension code prepended to the top of them. We may want to do something
different in the future like skipping directories named "gui" or
following imports (we can only do that with ESM though) or actually
having a way to run ES modules in their own global context (which is
avaialble in node.js as vm.Module under an experimental flag, but there
is no way to use the default linker for imports in the module);
basically there's no good way to do this and it is very unfortunate.
2025-09-11 18:08:15 -04:00
Siddharthan P S 76eb76c277 i18n(ta): complete missing Tamil translations in ta.js (#1541) 2025-09-11 12:12:42 -07:00
Md. Sabbir Ahmed ef16f904ce dev: add missing bengali translations (#1537) 2025-09-10 22:18:19 -07:00
shadow-tawandjelveh 8f928b1442 the Arabic (العربية) translation of Puter is Completed (#1538)
* the Arabic (العربية) translation of Puter is Completed

* Update ar.js

---------

Co-authored-by: jelveh <[email protected]>
2025-09-10 22:15:50 -07:00
f8edb1d31e Adding missing Spanish translations (#1536)
* feat: adding missing Spanish translations. This fixes #1530

* fix: fixing typos

* remove the `Missing translations` comment

---------

Co-authored-by: RicMonster1 <[email protected]>
Co-authored-by: jelveh <[email protected]>
2025-09-10 22:11:13 -07:00
Daniel Salazar 63433880ec Merge pull request #1497 from HeyPuter/DS/expireAt
feat: add expiry support to DBKV, and eslint config
2025-09-10 17:18:13 -07:00
ProgrammerIn-wonderland b3191e3b5d fix: Remove polluting logging in __all__.js 2025-09-10 14:44:16 -04:00
Daniel Salazar f8ea790824 feat: add expiry support to DBKV, and eslint config 2025-09-10 11:33:21 -07:00
Deepam Goyal 3f746b94de feat(i18n): add missing Hindi translations (#1525) (#1534) 2025-09-10 09:33:03 -07:00
jelveh 7ff5786038 add missing keys and placeholders to i18n 2025-09-09 20:27:58 -07:00
KernelDeimos eb6c23dd83 sync: package-lock.json
Previous commit to do this contained accidental other changes that I
staged and forgot about. This commit really only contains the sync for
package-json. This was broken for a while - since when we did work on
AWS secrets manager.
2025-09-09 22:37:36 -04:00
KernelDeimos 5a66bdeb20 Revert "sync: package-lock.json"
This reverts commit 281d9ebaae.
2025-09-09 22:37:12 -04:00
KernelDeimos 281d9ebaae sync: package-lock.json
This got out of sync after the AWSSecretsPopulator commit, I think.
2025-09-09 22:31:01 -04:00
Nariman Jelveh bb6bcd05c2 Remove unnecessary comment from some i18n files 2025-09-09 19:01:53 -07:00
Tarun sainiandNariman Jelveh fb04c55216 feat(UI): Differentiate tablet UI based on pointer capabilities (#1482)
* feat: Differentiate tablets by pointer type

Reclassifies tablets with a mouse/trackpad to use the desktop UI.

This is detected by checking for `(hover: hover)` media query capabilities. This ensures that touch-only tablets retain their original, touch-friendly mobile UI while fixing the bug for users with pointer devices.

* Make sure `matchMedia` exists before using it

---------

Co-authored-by: Nariman Jelveh <[email protected]>
2025-09-09 18:58:04 -07:00
Nariman Jelveh c59dbcfaa2 Revert "Refactor GeminiService for modularity, error handling, and readabilit…" (#1496)
This reverts commit 318ecb9f49.
2025-09-09 18:00:43 -07:00
Imroz 318ecb9f49 Refactor GeminiService for modularity, error handling, and readability (#1438) 2025-09-09 18:00:29 -07:00
Xiaochen Cui 046e905857 captcha: complete the docs (#1494) 2025-09-09 17:49:38 -07:00
KernelDeimos d198e26629 fix: oops, it's not puter.config here
abuse.js is not an extension, but I was treating it like an extension.
2025-09-09 19:09:39 -04:00
KernelDeimos 2ba6152c70 dev: add stack trace for database in jaegar
When using opentelemetry to analyze the system with jaegar, I found this
additional information helpful.
2025-09-09 19:05:33 -04:00
KernelDeimos 7d4c7bae20 dev: improve error message in UIDesktop
This error message in UIDesktop caused me confusion earlier because it
didn't provide any indication of where the error came from. This commit
adds a string behind the error to specify that it happened while trying
to launch an app.
2025-09-09 19:04:44 -04:00
KernelDeimos 6120515300 dev: allow passing JWT options to create_access_token 2025-09-09 19:04:12 -04:00
KernelDeimos 2954b6225b fix: add undefined check for gui metadata
This commit adds an undefined check for metadata from Puter's desktop
GUI inside a filesystem operation frame; this information won't always
be available.
2025-09-09 19:03:01 -04:00
KernelDeimos 8e6fba9e66 dev: options to disable undesirable checks in dev
Allows disabling abuse checks undefined origin checks with config
parameters to make development more convenient. The approach before this
change has been to manually comment out these lines of code.
2025-09-09 19:01:27 -04:00
KernelDeimos a4d1855b70 fix: add missing file
File missing from previous commit
2025-09-09 15:42:00 -04:00
KernelDeimos 34501e34b7 dev(kernel): make extension variable more global-like
The extension pseudo-global was only available at the root synchronous
execution context of a module loaded as an extension, which meant it
wasn't available for such things as handler functions for listeners even
though it looks like it should be lexically scoped.

This commit writes a `const` to the top of javascript files in the
runtime copy of an extension so that it works as nearly to a real global
as possible.

A real global isn't possible here for two reasons. First, running in the
same v8 VM as Puter means we can't have distinct global objects with the
same name across different extensions. Second, we can't use node:vm
because we would then be unable to support ES modules, which are
experimental in node:vm and also there's no equivalent to createRequire
for the linker even if we wanted to require the
--experimental-vm-modules flag in our package.json. This seems to be the
best we can do given the state of affairs of the runtime.
2025-09-09 15:37:22 -04:00
Daniel Salazar caa383d5cd feat: logging for queries in puter js 2025-09-09 12:08:21 -07:00
KernelDeimos 8c2e459f3c fix: third times the charm 2025-09-09 13:44:53 -04:00
KernelDeimos b44278197e dry: query parameter makes more sense for /healthcheck 2025-09-09 13:32:08 -04:00
KernelDeimos 8242ade01b mon: add alternative to /healthcheck
Some monitoring services want a system to look like it's failing hard
instead of a system being able to report that it's failing successfully.
This commit adds an alternative to healthcheck that throws 500 when any
service is failing, as though reporting such depended on the services
working, to appease these monitoring services and their semantically
incorrect nature of operation.

This commit message sets the precedent for "mon:" as a conventional
commit style prefix for changes related to system health and monitoring.
2025-09-09 13:14:11 -04:00
KernelDeimos 48982cac84 perf(kernel): parallelize extension installation
This optimization speends up load time for Puter significantly when many
extensions are present. This is also necessary for subsequent changes
which may require prepending code to all the source files inside an
extension, which would be too slow without this optimization.
2025-09-09 03:25:04 -04:00
KernelDeimos 6919974d66 dev: minlog is off by default for Archlinux
We can assume Arch users are comfortable with making configuration
changes and observing high volume log output (maybe not true for
alternative distributions of arch, but for base Arch absolutely) so it
probably makes sense to have the log minimizer off for these cases.
2025-09-08 21:37:46 -04:00
Nariman Jelveh c2bd222532 Create BUG-BOUNTY.md (#1483)
* Create BUG-BOUNTY.md

* Update BUG-BOUNTY.md
2025-09-08 18:38:40 -07:00
Zac0511 6904017183 Update fr.js (#1493)
Added missing translations from latest updates
2025-09-08 14:43:20 -07:00
ProgrammerIn-wonderland 72e66da8a1 fix: webdav MOVE/COPY escaping bug 2025-09-08 11:45:51 -04:00
Nariman Jelveh bd818d86be Revert "Fix mac setup bug (#1449)" (#1492)
This reverts commit dfcf234d47.
2025-09-07 16:08:40 -07:00
Pranav AgoneandPranav Agone dfcf234d47 Fix mac setup bug (#1449)
* fix(desktop): prevent horizontal scrolling by constraining window drag #710

* docs: Force add config.example.json for Mac Docker setup (#1427)

---------

Co-authored-by: Pranav Agone <[email protected]>
2025-09-07 16:08:21 -07:00
Vara Rahul RajanaandNariman Jelveh cddfa0ca11 fix(gui): prevent background apps from stealing focus (#1491)
* fix(gui): prevent background apps from stealing focus

* remove the `background` option as it's not really needed or used in other parts

---------

Co-authored-by: Nariman Jelveh <[email protected]>
2025-09-07 15:44:32 -07:00
Nariman Jelveh d324814e06 Update AI.js 2025-09-07 13:15:00 -07:00
Nariman Jelveh 47012a67ab Update UIWindowPublishWebsite.js 2025-09-05 17:33:38 -07:00
ProgrammerIn-wonderland ecff560480 fix: Use APIErrror.create in place of newAPIError 2025-09-05 20:26:39 -04:00
Hariz 4a0de7b2fc Reduce bottom bound on dragging UIItems (#1485) 2025-09-05 17:17:22 -07:00
ProgrammerIn-wonderland ba2609be28 fix: APIErrors in entri service 2025-09-05 20:14:25 -04:00
ProgrammerIn-wonderland 7e0b8c66c4 fix: use correct API error in entri-service 2025-09-05 19:10:40 -04:00
ProgrammerIn-wonderland 7082059fa4 dev: Add deleteMapping to entri service, add extra validation for getConfig 2025-09-05 19:03:04 -04:00
ProgrammerIn-wonderland 35c66f7d42 webdav range support and URI encode fixes 2025-09-05 18:18:03 -04:00
KernelDeimos e6eff9940d dev(backend): emit rename through EventService
While previously the /rename endpoint sent only a websocket message to
the client, move didn't fire a rename event if the name of the file had
changed. This commit adds a more generalized rename event that can be
reliably used to update a UI whenever the name of a file changes.
2025-09-05 12:57:38 -04:00
KernelDeimos 994233aa0a clean: remove a couple of verbose logs 2025-09-05 12:57:38 -04:00
Hariz 85451447c4 Fix buggy arrow key navigation in start menu (#1477)
* Fix buggy arrow key navigation in start menu

* More fixes for start menu keyboard navigation

* Fix issue with start menu searchbar focus

* Rewritten start menu keyboard navigation
2025-09-05 00:19:23 -07:00
Nariman Jelveh bf9be900cc Update UIItem.js 2025-09-04 19:38:02 -07:00
Nariman Jelveh a68f0edc41 Don't allow items to be dragged out of the viewport 2025-09-04 19:36:03 -07:00
Nariman Jelveh 55c173c0b7 surgically accurate item name editor sizing 2025-09-04 12:36:30 -07:00
Neal ShahandDaniel Salazar 628459209c fix: puter workers url 🐛 (#1480)
* fix: puter workers url 🐛

---------

Co-authored-by: Daniel Salazar <[email protected]>
2025-09-03 12:41:01 -04:00
Nariman Jelveh 222117c39a Revert "docs: Add documentation for Entity Storage internals (#1478)" (#1479)
This reverts commit 6ef404aa54.
2025-09-03 08:13:01 -07:00
Tarun saini 6ef404aa54 docs: Add documentation for Entity Storage internals (#1478) 2025-09-03 08:12:37 -07:00
jelveh ea056aa9f3 Update OpenAICompletionService.js 2025-08-31 09:06:38 -07:00
jelveh 3f3895b0b4 Update AI.js 2025-08-30 00:07:09 -07:00
Nariman Jelveh 99ee3279c3 Update AI.js 2025-08-29 18:31:13 -07:00
ProgrammerIn-wonderland 23b65eee49 Disable AWSSecretsPopulator 2025-08-29 20:38:42 -04:00
ProgrammerIn-wonderland c61b736ac8 AWS Secrets populator support 2025-08-29 20:30:06 -04:00
KernelDeimos 43232ccc32 fix: less copying of service configs 2025-08-29 19:30:48 -04:00
KernelDeimos aebc758cbf fix: objutil 2025-08-29 19:06:36 -04:00
KernelDeimos e4262201d8 dev: update objutil 2025-08-29 18:41:28 -04:00
KernelDeimos d05696f1a7 dev: object value transform iterator utility
When you need to transform strings or other primitives inside an object
and preserve the object's structure in an optimally memory-efficient
way, this does that.
2025-08-29 17:33:45 -04:00
KernelDeimos d1b4458c74 fix: possible missing path properties in /sign
When /sign is called with UIDs instead of paths, it is possible to get a
response without 'path' properties present in "signed fs item" objects.
This commit addresses the issue by fetching paths from FS node objects
as a last resort.
2025-08-29 16:08:17 -04:00
Nariman Jelveh d4674d7ddd Use the correct blue background for the logo in the loading CAPTCHA 2025-08-28 15:58:33 -07:00
KernelDeimos 6d8889e434 dev: add config.__set_config_object__() 2025-08-28 18:28:29 -04:00
Nariman Jelveh 4c8d170202 Merge branch 'main' of https://github.com/HeyPuter/puter 2025-08-28 15:27:40 -07:00
Nariman Jelveh 23be92e64c keep the signup button enabled by default 2025-08-28 15:27:13 -07:00
Xiaochen Cui 0c39f83078 captcha: imporve condition checks for cloudflare turnstile (#1469)
* captcha: imporve condition checks for cloudflare turnstile

* captcha: fix undefined "resetTurnstile" func

* captcha: set appearance

* captcha: add the missing prefix
2025-08-28 15:23:26 -07:00
Xiaochen Cui a98cc45f22 feat: memory filesystem provider
* Reapply "dev: memory filesystem"

This reverts commit 6f3bace4c4.

* fs: improve the robustess of set/get_storage api
2025-08-28 16:08:21 -04:00
KernelDeimos 481b18b228 fix: hoist resetTurnstile 2025-08-28 14:12:25 -04:00
jelveh 245a04047e Update initgui.js 2025-08-27 17:29:34 -07:00
ProgrammerIn-wonderland 42d561416e Merge branch 'XiaochenCui-captcha' 2025-08-27 20:02:08 -04:00
ProgrammerIn-wonderland 4027ad951f Merge branch 'captcha' of https://github.com/XiaochenCui/puter into XiaochenCui-captcha 2025-08-27 20:01:57 -04:00
ProgrammerIn-wonderland f0d1a424a6 dev: Range header support in puter hosting (puter.site) 2025-08-27 19:19:36 -04:00
XiaochenCui bb2c51b840 captcha: add captcha widget to the signup window 2025-08-27 16:19:06 -07:00
ProgrammerIn-wonderland 45c8bfa335 expose offset && byte_count in fs.read 2025-08-27 18:55:17 -04:00
ProgrammerIn-wonderland e48179a1f9 fix: improve support for unbounded range headers 2025-08-27 18:01:19 -04:00
ProgrammerIn-wonderland 9863f92aaa better range header support 2025-08-27 17:33:11 -04:00
KernelDeimos 6f3bace4c4 Revert "dev: memory filesystem"
This reverts commit 1f6bbe1672.
2025-08-27 14:26:03 -04:00
Xiaochen Cui 1f6bbe1672 dev: memory filesystem
* fs/memory-provider: passed all apitests

* test: write benchmark

* fs: add benchmark for stat-intensive scenario

* apitest: update duration

* fs: remove "NodeSelector", add checks to memoryfs, passed simple test

* test: update apitest

* debug: remove a debug stmt
2025-08-27 14:12:31 -04:00
XiaochenCui c34bd8177c test: fix apitest, add new unit tests and benchmarks, normalize output 2025-08-27 13:48:00 -04:00
ProgrammerIn-wonderland c0c601ac8f return partial content header 2025-08-26 18:43:29 -04:00
KernelDeimos 4a996c556a fix: issue cancelling replace during save by move 2025-08-26 18:36:44 -04:00
ProgrammerIn-wonderland 1b25dc6e50 change capitalization of getReadURL.js 2025-08-26 18:27:10 -04:00
ProgrammerIn-wonderland 542cda38b7 create getReadUrl 2025-08-26 18:17:03 -04:00
jelveh d2ea480dc6 clean: log 2025-08-26 14:53:42 -07:00
KernelDeimos 2a9310edf2 clean: log 2025-08-26 17:49:48 -04:00
KernelDeimos 64f7f928d6 dev: add expiresIn 2025-08-26 17:26:54 -04:00
DHANUSH RAJAandNariman Jelveh 607b555961 fix: remove unnecessary scrollbar from Account page (#1307)fix: remove unnecessary scrollbar from Account page (#1307)Fix account scrollbar issue by changing overflow:hidden to overflow:v… (#1465)
* Fix account scrollbar issue by changing overflow:hidden to overflow:visibleFix scrollbar issue by changing overflow:hidden to overflow:visibleUpdate UITabAccount.js

* Update license URL in UITabAccount.js and improve code formatting

---------

Co-authored-by: Nariman Jelveh <[email protected]>
2025-08-26 14:24:24 -07:00
KernelDeimos 915bcf5f07 fix: sometimes WebServer log doesn't have context 2025-08-26 16:46:17 -04:00
KernelDeimos b2d43a0783 dev: add access token permission scanner 2025-08-26 16:17:28 -04:00
ProgrammerIn-wonderland 3dc4bb0d7d dev: add range header to /token_read 2025-08-26 14:55:36 -04:00
ProgrammerIn-wonderland c610fc98e9 update ll_read cache logic to be more respectful of Range header 2025-08-26 14:41:26 -04:00
ProgrammerIn-wonderland 122a93af18 dev: direct range header support in /read 2025-08-26 14:15:43 -04:00
ProgrammerIn-wonderland a08948f905 fix: Diswhitelist credential sharing for CORS 2025-08-26 13:35:40 -04:00
Nariman Jelveh 4c3a68ee51 feat: improve 404 error handling in Puter sites with custom page support (#1466)
- Implement a new method to serve a custom 404.html file if it exists in the subdomain root path.
- Update existing error responses to utilize the new custom 404 handling.
- Ensure fallback to default error handling if the custom file is not found or an error occurs during reading.
2025-08-25 16:08:49 -07:00
Nikhil 090d1afa9c feat: update Norwegian Nynorsk (nn.js) translations (#1463)
- Add translations for all previously missing keys in nn.js
- Add translations for UI elements including window titles, alerts, and desktop UI
- Maintain consistent formatting with proper indentation
- Add contextual English comments to aid future translators
- Ensure all keys follow correct naming conventions

Fixes #366
2025-08-24 11:28:23 -07:00
ProgrammerIn-wonderland 1907e2db6a fix error in macOS's metadata rejection 2025-08-22 17:05:59 -04:00
Neal Shah c1f83bd85f macOS webdav pollution fix (#1462) 2025-08-22 16:59:17 -04:00
Karthikayan 6b11ee1b3a bug: fix tamil language selection text (#1460) 2025-08-22 11:13:39 -07:00
Neal Shah 64126179cc Fix: Microsoft office Bearer issue (#1461) 2025-08-22 14:01:28 -04:00
Nariman Jelveh 76584b9f87 Update UIWindowPublishWebsite.js 2025-08-21 18:24:00 -07:00
Nariman Jelveh 9e648e3e97 Revert prev update 2025-08-21 18:08:29 -07:00
Nariman Jelveh 5d50f838c3 Update UIWindowPublishWebsite.js 2025-08-21 17:45:34 -07:00
Nariman Jelveh 992b10b566 Add UI for custom domains 2025-08-21 16:12:15 -07:00
ProgrammerIn-wonderland a770c5ade6 Merge branch 'main' of https://github.com/HeyPuter/puter 2025-08-21 17:12:26 -04:00
ProgrammerIn-wonderland 439f5fa850 fix: dav: Allow macOS x-epected-entity-length 2025-08-21 17:12:24 -04:00
jelveh 0eb47ac1d3 Update DeepSeekService.js 2025-08-21 10:01:53 -07:00
Nariman Jelveh 91a45c25de Update apps.js 2025-08-20 14:53:01 -07:00
XiaochenCui 04ef8fbc0f fs: fix wrong file content on read 2025-08-20 13:45:30 -04:00
KernelDeimos 018059258b fix: allow paths like %appdata%/subdir
This commit expands on the previously implemented '%appdata%' value for
the 'path' option for "Open File" dialogs and allows it to be a prefix
for arbitrary subdirectories under an app's AppData directory.
2025-08-20 12:42:41 -04:00
KernelDeimos 47e2e8ee78 feat: add 'path' option to showOpenFileDialog
This commit adds a 'path' option to showOpenFileDialog by supporting it
in the relevant conditional block in IPC.js. A special path "%appdata%",
which would otherwise produce an error in the file explorer (so no
conflict is possible), will resolve to the appdata directory of the
current app.
2025-08-20 12:42:41 -04:00
Andrei OnelandEric Dubé 986b0f66e8 doc: putility
* Added reference documentation for: src/putility/src/bases/BasicBase.js

* Added reference documentation for: src/putility/src/libs/context.js

* Added reference documentation for: src/putility/src/libs/log.js

* Added reference documentation for: src/putility/src/concepts/Service.js

* Update src/putility/src/bases/BasicBase.js

Co-authored-by: Eric Dubé <[email protected]>

* Update src/putility/src/concepts/Service.js

Co-authored-by: Eric Dubé <[email protected]>

---------

Co-authored-by: Eric Dubé <[email protected]>
2025-08-18 19:04:44 -04:00
Andrei Onel 7849776605 doc: various jsdoc additions
* Added reference documentation for: src/backend/src/services/auth/Actor.js

* Added reference documentation for: src/backend/src/om/proptypes/__all__.js

* Added reference documentation for: src/backend/src/middleware/anticsrf.js

* Added reference documentation for: src/backend/src/services/auth/AntiCSRFService.js

* Revert "Added reference documentation for: src/backend/src/om/proptypes/__all__.js"

This reverts commit a9bb0fb48b.
2025-08-18 19:01:27 -04:00
ProgrammerIn-wonderland a27f4b60e4 fix: webdav service name for undefined origin 2025-08-18 18:03:57 -04:00
ProgrammerIn-wonderland a046f186d8 fix: webdavfs class init method name init to _init 2025-08-18 17:50:13 -04:00
Neal Shah fcb5aa4078 Dav (#1450)
* Windows WebDav support

* feat: 2fa support for dav

* fix auth cookie when Basic auth present

* dev: dav: refactor handler, support root level navigation

* dev: dav: JSDOCing important things

* fix: possible edge case of password containing colon character

* feat: direct token login for webdav

* set cookie to not be session cookie

* fx: webdav undefined origin support
2025-08-18 17:32:29 -04:00
jelveh b1e3fb136a Merge branch 'main' of https://github.com/HeyPuter/puter 2025-08-18 00:35:55 -07:00
jelveh caa77e61e6 Update apps.js 2025-08-18 00:35:47 -07:00
Shahidpathan22 4f983ff400 Added Norwegian Bokmål translations for missing keys (#1447)
* Added Norwegian Bokmål translations for missing keys

* Added Norwegian Bokmål translations for missing keys
2025-08-17 12:06:29 -07:00
Nariman Jelveh 7202060903 Revert "fix(desktop): prevent horizontal scrolling by constraining window dra…" (#1446)
This reverts commit c93c2965d2.
2025-08-17 00:51:16 -07:00
Pranav AgoneandPranav Agone c93c2965d2 fix(desktop): prevent horizontal scrolling by constraining window drag #710 (#1443)
Co-authored-by: Pranav Agone <[email protected]>
2025-08-17 00:50:47 -07:00
jelveh 81e3428177 Update refresh_item_container.js 2025-08-16 14:20:06 -07:00
jelveh b7860ee099 Update launch_app.js 2025-08-16 13:46:10 -07:00
jelveh bc4cb61331 add transaction for opening apps 2025-08-16 13:43:25 -07:00
jelveh 2ed16b8b43 add support for transactions 2025-08-16 13:15:04 -07:00
Andrew Poženel - SloDevTeamandjelveh 58fa69a2aa Update sl.js (#1445)
* Update sl.js

Added Slovene/Slovenian translation

* Update sl.js

---------

Co-authored-by: jelveh <[email protected]>
2025-08-16 09:46:15 -07:00
jelveh 470dbc8d6b Update UI.js 2025-08-15 23:42:17 -07:00
jelveh d807672af7 close #1103 2025-08-15 23:33:53 -07:00
jelveh 89dd335208 close #1134 2025-08-15 23:01:34 -07:00
Nariman Jelveh 91e6749645 Create template file for the Slovenian i18n 2025-08-15 16:21:07 -07:00
KernelDeimos 7375cb7382 dev: add .undefinedOnCancel to open dialog too 2025-08-15 09:48:37 -07:00
KernelDeimos 5522cfbd52 feat: make it possible to pass signed files to launchApp
Allow apps to launch new instances or other apps with specific files.
The files must be passed as file signature objects, ensuring it was a
file the app was granted access to through a user action.
2025-08-15 09:48:37 -07:00
KernelDeimos e8d63819a8 fix: add .undefinedOnCancel to showSaveFilePicker 2025-08-15 09:48:37 -07:00
KernelDeimos 6b0865e284 feat: add copy mode save
Adds a 'copy' mode to showSaveFilePicker. In this mode, a source file is
copied to the target file. The file may not exist in another apps
AppData directory. Unlike the 'move' mode, the file can be outside of
the app's AppData directory (a "user" file); in this situation the user
will be prompted to grant permission for the copy action. The app will
have access to the newly-created copy.
2025-08-15 09:48:37 -07:00
jelveh 483ba14af8 Update ExecService.js 2025-08-14 23:40:52 -07:00
Nariman Jelveh 8b97657205 Merge pull request #1441 from HeyPuter/launchapp-imrpvements
send source app data to opened app
2025-08-14 23:30:13 -07:00
jelveh 7277be75a8 Update ExecService.js 2025-08-14 23:25:24 -07:00
jelveh bcfb9accb1 Update ExecService.js 2025-08-14 23:22:48 -07:00
jelveh 3747365f9a send source app data to opened app 2025-08-14 23:17:50 -07:00
ProgrammerIn-wonderland aa4bd72b92 take DomainModule to be not DNSModule 2025-08-14 19:00:57 -04:00
ProgrammerIn-wonderland 1a9ff9e954 fix: (for node 18) import parse-domain as esmodule 2025-08-14 18:47:23 -04:00
ProgrammerIn-wonderland 686053a0fe dev: add verification for entri webhooks 2025-08-14 18:32:22 -04:00
ProgrammerIn-wonderland aac6ff14ac custom domains webhook 2025-08-14 18:32:22 -04:00
ProgrammerIn-wonderland d105b341d5 Entri token service 2025-08-14 18:32:22 -04:00
ProgrammerIn-wonderland 58800e5d19 rebase fixes 2025-08-14 18:32:22 -04:00
KernelDeimos 65b288d58d dev: enable DNSModule for local instances 2025-08-14 18:32:22 -04:00
KernelDeimos 4fadd26459 dev: add TXT record verification for domain names 2025-08-14 18:32:22 -04:00
KernelDeimos df602d5edb dev: continue work on custom domains
Adds service for querying controlling user for a domain. If no user is
verified as allowed to control the domain then we give control to the
'admin' user (to support local configurations of Puter).

After this point, I find myself a bit stuck because DNS queries are
incredibly difficult to test locally when you use tailscale.
2025-08-14 18:32:22 -04:00
KernelDeimos 49b0805014 dev: custom domain routing (the easy part)
With this commit alone, any user can specify "domain" on their
subdomains. This means they could affect the route for domains they
don't control, so this is not production-ready without further changes.
2025-08-14 18:32:22 -04:00
Nariman Jelveh 436f2d679f Update WebServerService.js 2025-08-14 12:04:47 -07:00
Nariman Jelveh 8e43fff19d Update WebServerService.js 2025-08-14 11:50:05 -07:00
Nariman Jelveh e225cb92f6 Update WebServerService.js 2025-08-14 11:41:41 -07:00
jelveh 2ddce7166f Add sentry-trace and baggage to allowed headers 2025-08-13 12:38:56 -07:00
KernelDeimos 4ba2f97da0 fix: move temp users to 'user' group when email is confirmed
Temporary users can go through email confirmation which effectively
makes these users registered/permanent users. When email is confirmed
they should be moved to the default group for registered users.
2025-08-13 15:15:36 -04:00
Xiaochen Cui ffc9246070 dev: consolidate fs.written to fs.write (#1392) 2025-08-13 13:21:07 -04:00
jelveh 1e720a7aca Add a subtle gap between maximized window and vertical taskbars 2025-08-08 23:46:59 -07:00
ProgrammerIn-wonderland 282acfb048 filter workers from hosting list 2025-08-08 15:00:40 -04:00
jelveh 478591b676 Update IPC.js 2025-08-08 00:58:22 -07:00
KernelDeimos 5b8c13c147 todo: does this break in different languages? 2025-08-07 18:16:57 -04:00
ProgrammerIn-wonderland 0deaaf4736 accept appName in place of appId 2025-08-07 16:15:20 -04:00
ProgrammerIn-wonderland 82c1f64b37 remove todo comment 2025-08-07 16:15:20 -04:00
ProgrammerIn-wonderland c8c7e22007 add check so workers can only be associated with the context's app 2025-08-07 16:15:20 -04:00
ProgrammerIn-wonderland 66288f798e add ability to specify app for worker 2025-08-07 16:15:20 -04:00
jelveh acc29a35c4 add gpt-5-chat-latest 2025-08-07 11:52:11 -07:00
jelveh c10e6ccd8f Update index.html 2025-08-07 11:48:04 -07:00
jelveh 3ba2c9d052 add gpt 5! 2025-08-07 11:28:26 -07:00
jelveh 312efb947d add Claude Opus 4.1 2025-08-06 23:56:04 -07:00
jelveh 9b1cba407e Update style.css 2025-08-06 22:35:27 -07:00
jelveh d647c7686d Create icon.png 2025-08-06 22:27:14 -07:00
jelveh 41a62326bf Improve Apps class to enforce required fields and improve title handling. Added validation for name and index URL, as they are mandatory for app creation. Updated title assignment to default to name if not provided. 2025-08-06 19:41:14 -07:00
Nariman Jelveh e8f6b06723 Add spinner visibility for worker creation process in dev center 2025-08-06 18:56:17 -07:00
Nariman Jelveh ac35dc55f0 Hide dev-center spinner at the correct time when refreshing lists 2025-08-06 15:41:37 -07:00
ProgrammerIn-wonderland 49d4cbc486 remove driver lsmod check 2025-08-06 15:43:32 -04:00
KernelDeimos 7b1fb5d9a6 fix: confirm email with code flow
It wasn't working:
- erroneously expected `email` parameter in request
- sqlite compatibility issue
- incorrect branching, fixed with guard clause
2025-08-06 14:58:33 -04:00
jelveh f06abf96b3 Update apps.js 2025-08-06 09:34:21 -07:00
Nariman Jelveh a73d10826c adjust website and worker counters in dev center after a deletion 2025-08-05 19:32:31 -07:00
Nariman Jelveh 5968da1202 Merge pull request #1417 from HeyPuter/workers-in-dev-center
Workers and websites in dev center
2025-08-05 19:06:44 -07:00
jelveh 23d2d504f0 Improve table heading visuals 2025-08-05 09:48:50 -07:00
jelveh 64a5de3cc4 fix dev docs link 2025-08-05 09:09:41 -07:00
jelveh 6bccf7dc7d Update style.css 2025-08-05 09:03:35 -07:00
jelveh 5ccdd627ee Add functionality to remove app, website, and worker cards with dedicated functions; streamline deletion process and improve UI updates for empty states. 2025-08-05 08:49:30 -07:00
jelveh 636bf6b8b3 Implement shift-click functionality for checkbox selection in apps, websites, and workers; improve UI responsiveness by updating row activation based on checkbox state. 2025-08-04 23:18:01 -07:00
jelveh 90f1232b87 Refactor dropped items handling in dev-center.js to use window scope and improve UI updates; minor UI adjustment in websites.js and handle empty file paths in workers.js 2025-08-04 22:47:17 -07:00
jelveh 162aa485d0 Add directory change functionality for websites and update UI alert handling 2025-08-04 22:27:07 -07:00
jelveh 59dade2736 fix the bug with directory picker selecting the current directory 2025-08-04 22:18:22 -07:00
jelveh b6fcb78f6e wip 2025-08-04 22:08:32 -07:00
jelveh 9f8c0d3227 Update index.html 2025-08-04 15:25:14 -07:00
jelveh a6db0f1092 Update style.css 2025-08-04 15:20:37 -07:00
jelveh 0d6423a8b1 Enforce email confirmation via GUI for deploying workers 2025-08-04 14:35:28 -07:00
jelveh ab8cdb2d57 Add requestEmailConfirmation to puter.ui 2025-08-04 14:11:55 -07:00
jelveh 39bd825866 fix search functionality by managing 'has-value' class for input fields in websites and workers search 2025-08-04 13:24:36 -07:00
jelveh dc8b7ecb34 update app count when a new app is created 2025-08-04 13:09:50 -07:00
jelveh 1d1b484bca Update workers.js 2025-08-04 00:04:11 -07:00
Nariman Jelveh a340c9a0b7 fix sorting in websites tab 2025-08-03 19:47:45 -07:00
Nariman Jelveh b59b19f8b3 Creating workers or websites start with selecting a file/folder 2025-08-03 19:25:18 -07:00
Nariman Jelveh 59c297db49 search is now isolated to the active tab 2025-08-03 19:06:45 -07:00
Nariman Jelveh 3df0bac9dc count websites and workers at start 2025-08-03 18:39:14 -07:00
Nariman Jelveh 2691818f6e Update index.html 2025-08-03 18:24:02 -07:00
Nariman Jelveh 1bc8de8112 make workers sortable by file path 2025-08-03 18:24:02 -07:00
Nariman Jelveh 12f574ed70 move libs back to original location 2025-08-03 18:24:02 -07:00
Nariman Jelveh 8f18a841b3 Add file column to worker table and enable file path launching 2025-08-03 18:24:02 -07:00
Nariman Jelveh 80ccb2d48b Update workers.js 2025-08-03 18:24:02 -07:00
Nariman Jelveh 4550e4f4fd remove unnecessary console.logs in Login 2025-08-03 18:24:02 -07:00
jelveh 2d0d253f96 Update apps.js 2025-08-03 18:24:02 -07:00
jelveh 30db54f062 Remove context menu from entries 2025-08-03 18:24:02 -07:00
jelveh 3b707c31a7 Search websites supports conenct directory matching 2025-08-03 18:24:02 -07:00
jelveh 99739173d6 Show connected directory on websites list 2025-08-03 18:24:02 -07:00
jelveh f0dba7ca60 Show connected directory for websites 2025-08-03 18:24:02 -07:00
jelveh 36a2f2f7b8 fix issue with deplot area not showing up 2025-08-03 18:24:02 -07:00
jelveh 615de5ec11 wip 2025-08-03 18:24:02 -07:00
jelveh bb7bb532ab wip 2025-08-03 18:24:01 -07:00
jelveh 7fceb804a7 better interaction when deleting websites etc 2025-08-03 18:24:01 -07:00
jelveh 82339b69a3 Add "No websites notice" 2025-08-03 18:24:01 -07:00
jelveh 7c30472bdf add websites tab 2025-08-03 18:24:01 -07:00
Nariman Jelveh e0d7a4aa17 Refactor app and worker management UI with context menus and improved delete functionality 2025-08-03 18:24:01 -07:00
Nariman Jelveh 2f30ce3d4d layout fix 2025-08-03 18:24:01 -07:00
Nariman Jelveh 4b43b24e50 multiple style improvements 2025-08-03 18:24:01 -07:00
Nariman Jelveh c5159a6da2 Update style.css 2025-08-03 18:24:01 -07:00
Nariman Jelveh 32bdd70ed0 improve worker counting 2025-08-03 18:24:01 -07:00
Nariman Jelveh 2d4b5984ed Implement 'Delete' and 'Delete Selected' for workers 2025-08-03 18:24:01 -07:00
Nariman Jelveh 970ba0bd77 enable checkboxes for workers table 2025-08-03 18:24:01 -07:00
Nariman Jelveh fab062b0fe Add the workers and websites tabs 2025-08-03 18:24:01 -07:00
Nariman Jelveh b2cf01e57c Add 'My Workers' tab 2025-08-03 18:24:01 -07:00
ProgrammerIn-wonderland 33629a7acd dev: migrate away from puter.drivers.call() 2025-08-03 17:21:35 -07:00
ProgrammerIn-wonderland 7d4ee75619 fix: return "null" for file_path and file_uid if backing file is nonexistent 2025-08-03 16:19:10 -07:00
ProgrammerIn-wonderland 94b6538851 dev: workers, return iso timestamp instead 2025-08-02 16:44:38 -07:00
ProgrammerIn-wonderland 15eefb1122 dev: expose file_uid in worker calls 2025-08-02 16:29:01 -07:00
ProgrammerIn-wonderland f8e95c4002 dev: query backend for workers.list() and workers.get() now to get path too 2025-08-02 16:24:07 -07:00
Neal Shah a586083b02 change worker API (#1411) 2025-08-02 15:30:45 -07:00
Nariman JelvehandProgrammerIn-wonderland 54aaed3459 Gui deploy workers (#1409)
* add deploy as worker context menu item

* Update UIWindowPublishWorker.js

* quick fix

* Update new_context_menu_item.js

* Show spinner when publishing workers

* Improve worker default file

* fix

---------

Co-authored-by: ProgrammerIn-wonderland <[email protected]>
2025-08-01 14:52:58 -07:00
Neal Shah 6578d4d91c remove sessionStorage params (#1408) 2025-07-31 16:06:37 -07:00
Nariman Jelveh b78e5c4444 Update initgui.js 2025-07-31 13:32:41 -07:00
Nariman Jelveh 26e9d9e0e3 Add the attempt_temp_user_creation option to puter.auth.signIn() 2025-07-31 13:05:40 -07:00
Prathamesh Wankhede d7b731a413 Update nb.js (#1404)
feat(i18n): completed missing Norwegian Bokmål translations in nb.js
2025-07-31 12:35:24 -07:00
Neal Shah 3d227e0798 Update worker limit (#1405)
* Update worker limit

* Handle error for when a mapping has no routes
2025-07-31 12:34:19 -07:00
Rohan Rawat 0f91503eb5 docs: added utils.js build script documentation (#1402) 2025-07-31 12:22:52 -07:00
Neal Shah 81ecb13370 Support a few more incoming and global objects in workers (#1401)
* no more global puter object in workers

* also support my as a global in workers

* support incoming user object in workers

* also support myself in puter workers
2025-07-30 19:39:34 -07:00
ProgrammerIn-wonderland 8e58fabb71 improve error handling, user specific worker limit 2025-07-30 15:43:16 -07:00
ProgrammerIn-wonderland 299e7b6e10 Make puter.workers.get() return more info 2025-07-30 12:21:24 -07:00
ProgrammerIn-wonderland 3e2e42fa53 Add coersion to JSON response in workers 2025-07-30 12:21:24 -07:00
ProgrammerIn-wonderland 616ddf8467 Supoport multiple domains to one worker 2025-07-30 11:53:03 -07:00
ProgrammerIn-wonderland d5f0137c0a Make worker names global && return improve error handling for APIError 2025-07-30 11:53:03 -07:00
XiaochenCui 85a0f71bfd hotfix: emit the missing event, fix check condition 2025-07-30 10:25:13 -07:00
Neal Shah 3016eb6363 ask user for auth if no token (#1389) 2025-07-29 20:45:40 -07:00
Neal Shah 402c407f81 Allow - in worker name
Sent from my iPhone
2025-07-29 20:03:13 -07:00
ProgrammerIn-wonderland a2126d5dd6 worker global s2w -> router 2025-07-29 22:03:58 -04:00
Karan Singhandjelveh a15fdd0b6d dev: Replaced human-readable text with i18n keys (#1382)
* dev: Replaced human-readable text with i18n keys

* Add two missing keys in UIDesktop.js

* more i18n keys!

* add more keys

* Update UIWindow.js

---------

Co-authored-by: jelveh <[email protected]>
2025-07-29 17:57:18 -07:00
Nariman Jelveh 9a7d34aec9 do not await kv when setting taskbar position 2025-07-29 17:43:07 -07:00
Emmanuel Ferdman 1d27fffb10 Fix issue in invalid social media url
Signed-off-by: Emmanuel Ferdman <[email protected]>
2025-07-29 20:26:09 -04:00
Emmanuel Ferdman 2c4da6f558 Fix issue in invalid social media url
Signed-off-by: Emmanuel Ferdman <[email protected]>
2025-07-29 20:26:09 -04:00
ProgrammerIn-wonderland 5b49e877d9 add protocol to URL returned by puter worker 2025-07-29 20:13:15 -04:00
XiaochenCui 27c1e62687 fs: ll_write -> provider.write 2025-07-29 19:29:35 -04:00
XiaochenCui 026a908a23 fs: ll_mkdir -> provider.mkdir 2025-07-29 19:29:35 -04:00
ProgrammerIn-wonderland 1b1d22e166 puter.workers.exec() 2025-07-29 18:42:33 -04:00
ProgrammerIn-wonderland f962a6a838 Allow relative paths for creating puter s2w workers 2025-07-29 16:18:14 -04:00
ProgrammerIn-wonderland 050ad0f785 add worker file limit 2025-07-29 16:18:14 -04:00
ProgrammerIn-wonderland ba0f4e3f86 remove unneeded logs 2025-07-29 16:18:14 -04:00
ProgrammerIn-wonderland 2fe52cb972 Filesystem backed web workers 2025-07-29 16:18:14 -04:00
ProgrammerIn-wonderland 173340e887 Move s2w workers to be backed by files and commit that information to subdomains database 2025-07-29 16:18:14 -04:00
ProgrammerIn-wonderland 27b9cb0b4c Add "coerce to response" if compatible type is returned by an s2w route 2025-07-29 16:18:14 -04:00
ProgrammerIn-wonderland 02e49a44be Making streaming drivers ReadableStreamable 2025-07-29 16:18:14 -04:00
KernelDeimos cbb833f3de Revert "sync: update OpenAI moderation to use new model"
This reverts commit 1b56bdc526.

OpenAI told us to switch to this model for moderation, but this model
clearly isn't ready for production use yet.
2025-07-29 16:08:05 -04:00
Nariman Jelveh 88011cfb1f Update README.md 2025-07-29 12:23:41 -07:00
KernelDeimos d4250d65aa fix: don't encrypt session UUID if there isn't one 2025-07-29 13:35:03 -04:00
Glenn Dmello ec586e834a modified nb.js (#1381) 2025-07-29 10:22:39 -07:00
XiaochenCui dea6069398 fs/stat: return_permissions -> return_shares, update tests as well 2025-07-29 13:17:55 -04:00
XiaochenCui 97eeadb3e4 fs: fix failed tests in move and stat 2025-07-29 13:17:55 -04:00
Nariman Jelveh f3b09cf170 Update index.js 2025-07-28 22:03:25 -07:00
Nariman Jelveh b5a1be6823 Update style.css 2025-07-28 21:02:29 -07:00
Nariman Jelveh 12f4c2c3d2 Fix the issue with Properties window not working in Explore 2025-07-28 20:08:11 -07:00
KernelDeimos 1b56bdc526 sync: update OpenAI moderation to use new model 2025-07-28 20:47:56 -04:00
Nariman Jelveh 1df1afca37 Update index.js 2025-07-28 16:17:35 -07:00
Nariman Jelveh 75fc436b54 add dividers in the taskbar 2025-07-28 16:17:23 -07:00
KernelDeimos 0257c1475e dev: add async getter for 'owner' on FSNodeContext 2025-07-28 18:30:02 -04:00
KernelDeimos 925b1ff4b4 dev: add fs.written event
Unlike fs.write, fs.written is only emitted after the contents of the
fily have been fully streamed and comitted to the delegate storage.
2025-07-28 18:23:00 -04:00
KernelDeimos f2a29d5228 fix: prevent entity mutation during upsert
In EntityStoreService, update and upsert both make use of the
detect_identifier utility function to get an identifier to pass through
to (eventually) SQLES.

For `update`, the `id` object is passed as the argument. Properties are
removed from this object when "redundant identifiers" are extracted to
create the update predicate.

For `upsert`, the `entity` object is passed and `id` is ignored. It is
suspected that this was done for reasons of improved developer
experience for developers using the API. The mutation behavior of
detect_identifier caused issues when trying to modify a property that
can also be used as an identifier, without having another identifier
available. (i.e. need to get UID of a subdomain to change the
`subdomain` property instead of just using `subdomain` to identify it).

This commit modifies the default behavior of detect_identifier to not
remove properties, then adds a flag to preserve the previous behavior
which is set TRUE by `update` since it's widelely used by puter.js and
has higher impact for potential regressions.
2025-07-28 17:41:46 -04:00
KernelDeimos 9f8cd18fd8 dev: add bypass for Entity Storage validation 2025-07-28 15:10:44 -04:00
jelveh 89ea1ae699 Update security.txt 2025-07-28 09:16:24 -07:00
Nariman Jelveh cfa7e23e84 Fix the selectable positioning and sizing issues in Explore. All set! 2025-07-27 20:20:19 -07:00
Nariman Jelveh e1f52ebd88 Update UIWindow.js 2025-07-27 20:09:34 -07:00
Nariman Jelveh 2e30f292f4 Improve selection visualization logic for Explore widnows.
This doesn't completely fix the misalignment of selection area but improves a lot of issues with it. A temporary, middle-ground solution until I implement the full-on selection area rendering
2025-07-27 18:52:37 -07:00
Nariman Jelveh 2cd3245b49 Update package-lock.json 2025-07-27 15:35:50 -07:00
jelveh bc842ad371 Update viselect.min.js 2025-07-27 11:32:37 -07:00
jelveh 783a0385d3 Remove Slider component 2025-07-27 11:04:45 -07:00
jelveh 8a697652d9 Use regular UIWindow component in UIWindowTaskManager 2025-07-25 23:59:29 -07:00
jelveh cadaff441c Remove unnecessary onAppend callbacks 2025-07-25 23:39:21 -07:00
jelveh dd76ac27ae Update UITaskbar.js 2025-07-25 20:22:38 -07:00
KernelDeimos d17b466e37 fix: properly update owner object in FSNodeContext 2025-07-25 22:12:19 -04:00
jelveh 01e4faa762 Update UITaskbar.js 2025-07-24 12:54:45 -07:00
jelveh 261bfd1c03 Adjust taskbar items' height and width based on number of items in the taskbar 2025-07-24 12:06:38 -07:00
Yasir Rafique e9184902ea chore: add Prettier config 2025-07-24 13:09:46 -04:00
Nariman Jelveh bfd1f8faab Configurable taskbar position (#1372)
* feat(gui): Enhance taskbar functionality and positioning

- Implement dynamic taskbar position management with options for left, bottom, and right placements.
- Update desktop dimensions and window positioning based on taskbar position.
- Add context menu options for changing taskbar position on desktop devices.
- Ensure mobile devices always display the taskbar at the bottom.
- Introduce CSS styles for taskbar positioning and adjust desktop padding accordingly.

* feat(gui): Reinitialize tooltips based on taskbar position

- Implement dynamic tooltip positioning for taskbar items based on the current taskbar location (left, right, bottom).
- Ensure tooltips are destroyed and recreated when the taskbar position is updated, enhancing user experience and consistency.

* feat(gui): Improve taskbar and tooltip positioning

- Add support for dynamic tooltip positioning for the 'top' taskbar location.
- Adjust CSS styles for arrow tooltips to enhance visual alignment and positioning.
- Refine taskbar item positioning for left and right placements to ensure consistent appearance.

* Improve popover positioning based on taskbar location

- Improve `UIPopover` positioning logic to account for left and right taskbar placements.
- Adjust Y position of popovers to ensure they appear correctly below toolbars for left/right taskbars.
- Update CSS styles for arrow tooltips to enforce consistent positioning with !important declarations.

* Refactor context menu positioning logic in UITaskbarItem

- Introduce a helper function to dynamically calculate context menu position based on the taskbar's location (top, bottom, left, right).
- Ensure context menus are positioned correctly relative to the taskbar item, improving usability across different taskbar placements.

* Fix UITaskbar window height calculation for consistent positioning

- Adjust the height calculation for windows in the UITaskbar to remove an unnecessary offset, ensuring accurate window sizing relative to the toolbar height.
- This change improves the visual consistency of maximized windows across different taskbar placements.

* Enhance window snapping and positioning based on taskbar location

- Introduce a new function to calculate snap dimensions and positions dynamically based on the taskbar's location (left, right, bottom).
- Update window snapping logic to ensure windows are positioned correctly relative to the taskbar, improving usability and visual consistency.
- Adjust boundary checks for window placement to account for taskbar height and position, enhancing the overall user experience.

* Update default taskbar position to 'left' and adjust CSS padding for desktop layout

- Change the default taskbar position from 'bottom' to 'left' in UITaskbar.
- Modify CSS to increase left padding for desktop taskbar positioning, enhancing layout consistency.

* Improve CSS for desktop layout with height adjustments

- Update CSS styles for input fields and desktop taskbar to set height to 100vh, ensuring consistent full-page layout across different screen sizes.
- This change improves the visual consistency and usability of the interface.

* Improve desktop selectable interactivity and taskbar tooltip behavior

- Add functionality to mark the desktop as selectable active, improving user interaction with desktop elements.
- Update tooltip display logic to only show when the desktop is not in a selectable state, enhancing usability.
- Adjust CSS styles for desktop layout, ensuring consistent behavior and appearance when the desktop is active or inactive.

* Update default taskbar position logic for first-time and existing users

- Set the taskbar position to 'left' for first-time visitors and default to 'bottom' for returning users without a saved preference.
- This change improves the user experience by providing a more intuitive initial layout for new users while maintaining consistency for existing users.
2025-07-23 15:48:23 -07:00
jelveh 5b46f0bcb1 use openrouter for qwen models 2025-07-22 16:21:56 -07:00
XiaochenCui fee100dddd fs/mkdir: add docs spec, update tests, update apitest 2025-07-22 12:46:03 -04:00
XiaochenCui 7e20039ef4 fs/mkdir: update check logic, update test cases 2025-07-22 12:46:03 -04:00
XiaochenCui f906c1ebad fs: adapt to different mkdir api, block write to root dir, add tests 2025-07-22 12:46:03 -04:00
Neal Shah 6d09566ba7 Allow multipage apps in puterjs (#1368)
* Allow multipage apps in puterjs

* Don't error on browsers which dont support sessionStorage
2025-07-21 14:02:46 -07:00
Nariman Jelveh e14e1acd95 Revert "feat(gui): Add animation effects to the taskbar (#1365)" (#1366)
This reverts commit 212bc88c8f.
2025-07-19 11:12:28 -07:00
GitHubliuzhijie 212bc88c8f feat(gui): Add animation effects to the taskbar (#1365)
- Add new animation functionality to the taskbar; icons will enlarge when the mouse hovers over them
- Introduce new CSS properties and styles to support the animation effects
- Implement mouse move and leave event handling in UITaskbar
- Add UITaskBarCreateCurve and UITask components
2025-07-19 11:11:57 -07:00
jelveh 1b1517d570 add subdomain middleware for extensions 2025-07-18 20:54:26 -07:00
jelveh b8ffc1ada0 Allow CORS on /extensions/ 2025-07-18 20:27:50 -07:00
Neal Shah 0858f9932b Support streaming drivers in XMLHTTPRequest-less platforms (nodejs, serviceworker) (#1364)
* xmlhttpreq partial support pt1

* XMLHTTPRequest shim cleanup

* fix check for x-ndjson

* change credit header at top of xhr shim
2025-07-18 14:35:08 -07:00
Josh Josephandjelveh f9995a219d Fixed issue: #1033 (Added app category display in Dev Center in main app list) (#1350)
* Update README.md

* Fixed issue:  #1033 (Added app category display in Dev Center in main app list)

* Fixed issue:  #1033  (Added app category display in Dev Center in main app list)

* test 1033

* Fixed issue: #1033 (Added app category display in Dev Center in main app list)

* Fixed issue: #1033 (Added app category display in Dev Center in main app list)

* Center the app checkbox

---------

Co-authored-by: jelveh <[email protected]>
2025-07-17 21:03:17 -07:00
Igor Moraes 17a11a3a8b Update Portuguese and Spanish translation README (#1363)
* Update Portuguese translation of README

* Update Portuguese and Spanish translation readme
2025-07-17 20:35:37 -07:00
Neal Shah 481210b6a6 event.puter//user puter and automatic cors exemption handling in puter workers (#1342)
* event.puter

* automatic opt out cors handling

* remove "starting puterjs initialization" log

* Set compatibility date

* remove body log
2025-07-17 15:37:34 -07:00
jelveh cc2670444c Reject promise in signIn is user closes auth window 2025-07-16 18:45:20 -07:00
jelveh 5a7ba5d4ad Do not show file operations in the context menu of root dir 2025-07-15 18:04:04 -07:00
Eric Dubé d5749691b3 doc: link related future work 2025-07-15 16:13:39 -04:00
XiaochenCui 0a8e4f985e mkdir: return 403 error for mkdir action in the root dir 2025-07-15 16:13:39 -04:00
jelveh c75d9b9544 use openrouter for grok 2025-07-13 13:08:18 -07:00
jelveh 05a74b3152 do not preselect tests 2025-07-11 17:03:33 -07:00
jelveh e387abe2f6 Make 'Signup' window draggable 2025-07-11 16:28:37 -07:00
jelveh ef95cd493c MORE TESTS!! 2025-07-11 16:27:14 -07:00
KernelDeimos 963b248582 fix: get sharp far away from bundlers as possible 2025-07-10 16:20:12 -04:00
KernelDeimos 4575b24c51 chore: update sharp because GH issue template 2025-07-10 14:30:00 -04:00
KernelDeimos e85a2703f4 sync: update XAi models 2025-07-09 23:27:24 -04:00
jelveh 3def1d4d7c feat: implement authentication UI in Puter.js's test UI
- Added login and logout functionality with corresponding UI elements.
- Enhanced layout for user information display and login button.
- Integrated authentication state checks to update UI based on user sign-in status.
- Improved button styles and interactions for better user experience.
2025-07-09 16:42:54 -07:00
jelveh 9c74e295bd style: enhance run.html layout and user interaction
- Added user-select: none to disable text selection for better UX.
- Adjusted margins for buttons and elements to improve spacing and alignment.
- Modified the layout of the navigation bar for a cleaner appearance.
2025-07-09 16:20:58 -07:00
jelveh 9ca1f0639a feat: implement settings management and modal in puter.js test framework
- Added a settings button to open a modal for configuring Puter.js URL and API Origin.
- Implemented functions to load and save settings to localStorage.
- Dynamically load the Puter.js script based on user-defined settings.
- Styled the modal and its components for better user experience.
2025-07-09 16:10:06 -07:00
Xiaochen Cui 0b6dbe587a feat(aws/polly): add new apis to puter-js, add new args to txt2speech (#1337) 2025-07-09 15:38:17 -04:00
KernelDeimos 50d520f099 fix: file cleanup for Claude when streaming 2025-07-09 15:12:15 -04:00
KernelDeimos 2c8da38db0 dev: add puter_path support for OpenAI 2025-07-09 15:12:15 -04:00
KernelDeimos ba3ff03569 dev: add finally_fn for cleanup tasks in AI impls 2025-07-09 15:12:15 -04:00
KernelDeimos 389967b659 clean: code does not need to announce it was updated
This broke the jsdoc comment for _init in OpenAICompletionService
2025-07-09 15:12:15 -04:00
jelveh 1573f1dd81 Add tests for puter.ai.txt2speech 2025-07-09 11:54:15 -07:00
KernelDeimos 71f298ea43 debug: make sure this stack trace gets logged 2025-07-08 19:39:53 -04:00
KernelDeimos 2158e8e8c6 dev: add puter file upload via ai.chat for Claude
This commit implements uploading Puter files through ai.chat using
Claude's beta "file inputs" feature. To use this, simply specify
`puter_path` in a content part, and that content part will be
transformed into the correct type of content part for the specified file
and the file will be uploaded.
2025-07-08 19:38:13 -04:00
Neal Shah d8a4180b4f Puter.js workers api (#1339) 2025-07-08 13:29:02 -07:00
Zac0511 858929a3b9 Add a basic Firebase Studio config file (#1338) 2025-07-08 08:32:19 -07:00
jelveh 1952549f5a Add new Mistral model coercions to puter.js 2025-07-07 23:07:32 -07:00
jelveh f50ac9e8f9 Update Mistral models 2025-07-07 22:50:47 -07:00
KernelDeimos cbfb9283d1 fix: add safeguard in case server response is wrong 2025-07-07 17:25:01 -04:00
KernelDeimos 405564f55f fix: update refresh_actor cache invalidation 2025-07-07 15:20:43 -04:00
jelveh 74a01a8752 Add reset results functionality to test UI
- Introduced a "Reset results" button to clear test container backgrounds and remove error messages.
- Implemented hover styles for the reset button to enhance user interaction.
- Ensured the reset functionality hides the progress panel and resets progress tracking.
2025-07-06 18:54:31 -07:00
jelveh 190f8352f0 Add performance tests for get and set methods in kv module
- Introduced two new tests: testGetPerformance and testSetPerformance.
- Each test measures the execution time of the respective method and asserts that it completes in under 100ms.
- Ensured correct value retrieval and performance metrics are logged for both tests.
2025-07-06 17:52:32 -07:00
jelveh 41cb7a06b7 Implement progress panel for test execution tracking
- Added a progress panel to display real-time test execution status, including current test, progress percentage, and elapsed time.
- Introduced styles for the progress panel and its components to enhance visibility and user experience.
- Implemented JavaScript functions to manage progress tracking, including starting and stopping timers, and updating the panel with test results.
- Ensured the progress panel is responsive to test selections and updates dynamically during test execution.
2025-07-06 15:42:02 -07:00
jelveh f23216b122 partially selected checkboxes should are reflected in the heading master checkbox 2025-07-06 15:20:12 -07:00
jelveh f06c13a427 Update test counter styles for improved visibility
- Adjusted the styles for the test counter to enhance its appearance.
- Removed inline styles from the test counter span for cleaner HTML structure.
- Ensured consistent font size and color for better readability.
2025-07-06 15:16:11 -07:00
jelveh a605ef42a1 Enhance test UI with navigation and counter display
- Added a fixed navigation bar for improved accessibility and layout.
- Introduced a test counter to display the number of selected tests.
- Updated styles for better alignment and spacing in the test UI.
- Ensured the counter updates dynamically based on checkbox selections.
2025-07-06 15:11:47 -07:00
jelveh b4143a6f39 Enhance test UI with master checkbox functionality
- Updated the test UI to include a master checkbox that controls the selection of individual test checkboxes.
- Implemented logic to update the master checkbox state based on the selection of individual checkboxes and group checkboxes.
- Adjusted the margin for h2 checkboxes for improved layout.
2025-07-06 14:59:51 -07:00
jelveh afa6333224 Merge branch 'main' of https://github.com/heyputer/puter 2025-07-06 14:55:03 -07:00
jelveh e58d6f0770 Enhance test UI with sticky headers and checkbox groups
- Added sticky positioning for h2 headers in the test section.
- Updated h2 elements to include checkboxes for grouping tests (File System, Key Value Store, AI).
- Implemented event listeners to synchronize individual test checkboxes with their respective group checkboxes.
- Simplified select/unselect all functionality to update group checkboxes accordingly.
2025-07-06 14:54:55 -07:00
KernelDeimos f6e6e8dff8 fix: shortcut KV permissions
All users have access to KV, however the permission system is used
because:
1. KV is a driver, and all drivers have access checks
2. The rate limit policy comes from the permission system

This change uses support for implicit permission shortcuts to prevent
any of the permission association tables from being read. It also
hard-codes the policy so that KV's rate-limit policy is not read from
the policy.json file.
2025-07-06 15:59:07 -04:00
KernelDeimos 3f0e7659f3 dev: add support to imply shortcut permissions
Permission implicators with the "shortcut" option will be checked prior
to concurrent permission scanning. If any of these permissions are
granted, then the concurrent phase of permission scanning will not be
invoked; instead, the user will only see the shortcut permission.

It may be useful to add an option in the future for a full permission
scan, which could be useful in such things as a user interface to help
with permission management.
2025-07-06 15:59:07 -04:00
KernelDeimos 3f483c5bf5 dev: add otel spans for permission scans and db 2025-07-06 15:59:07 -04:00
KernelDeimos fd956cb1cd fix: improvements to jaeger trace service
- migrate config location (legacy location still supported)
- allow passing additional otel options when creating spans
2025-07-06 15:59:07 -04:00
Neal Shah bddc872e00 feat: puter workers
* experimental Cloudflare Workers for Platforms support

* add support for the puter driver

* stop hardcoding api.puter.localhost

* support destroy from express route as well

* initial worker support

* xhrshim + fixes (incomplete)

* change order of readyState + load event

* remove some debug logs

* change worker/puterUtils into a cjs module

* Cloudflare workers eventtarget workaround

* worker preamble webpack

* edit worker readme to reflect reality

* allow a way to code in api endpoint instead of hardcoding it to api.puter.com

* move cloudflare eventtarget fix to puter-portable template

This is so it gets run before the rest of puter-js initializes

* remove express route for worker
2025-07-05 17:01:44 -04:00
jelveh 8fa8dd0987 Add tests for App Directory isolation 2025-07-05 12:24:45 -07:00
jelveh af9bf0980c Add puter.ai streaming test 2025-07-05 11:36:29 -07:00
jelveh a2d05af556 Add support for Uint8Array in puter.fs.write 2025-07-05 11:18:13 -07:00
jelveh b0a2590426 Remove redundant tests in puter.js 2025-07-05 10:53:14 -07:00
jelveh 779ee8d5d2 Add human-readable descriptions to Puter.js tests 2025-07-05 10:50:06 -07:00
jelveh 1fb1edd621 remove unused tests from GUI 2025-07-05 10:26:56 -07:00
jelveh 4ca7e852d8 fix toolbar showing scroll on disabling autohide 2025-07-05 09:41:00 -07:00
jelveh 7ccc704694 Use better font for the test UI 2025-07-04 19:14:18 -07:00
jelveh a02a228bf6 Add a 'test' button to each test in Puter.js's test suite 2025-07-04 19:12:06 -07:00
jelveh 6da8ebfe96 Fix the copy assertion rule in puter.js test suites 2025-07-04 19:05:04 -07:00
jelveh 9698761b2b AND MOOOAREEE AI tests 2025-07-04 19:01:16 -07:00
jelveh 3fdee779c7 MOAAAAREEE AI tests! 2025-07-04 18:43:10 -07:00
jelveh 478aed7bda Add basic tests for puter.ai 2025-07-04 18:20:31 -07:00
Nariman Jelveh 3eef18c578 Remove captcha from frotnend (#1335) 2025-07-04 16:31:42 -07:00
KernelDeimos f3c658c011 chore: sync package-lock.json 2025-07-04 18:30:00 -04:00
KernelDeimos 354b116b42 fix: make sharp optional 2025-07-04 18:29:29 -04:00
KernelDeimos 502204a7b7 test: update tests, migrate backend to vitest
Backend had tests written in mocha as well as a test written for jest
(created by an AI utility, wasn't compatible with mocha tests). The AI
generated test had merit so it was migrated to vitest along with all the
mocha tests, which supports conventions from both frameworks.

Vitest also has an excellent watcher cli.

The root repo package.json now runs unit tests in backend. Before it was
only running tests defined in the _test method of backend services.
2025-07-04 18:21:45 -04:00
Nariman Jelveh 87e15cac2d Update SECURITY.md to use the warning tag in the markdown 2025-07-04 06:51:48 -07:00
Xiaochen CuiandEric Dubé ade213b88b fix: return proper error message when the model is not found (#1331)
* fix: return proper error message when the model is not found

* use global source for the domain

Co-authored-by: Eric Dubé <[email protected]>

---------

Co-authored-by: Eric Dubé <[email protected]>

Closes #1326
2025-07-03 17:58:04 -04:00
KernelDeimos c7970fd1a8 fix: include base reserved words by default 2025-07-03 17:41:10 -04:00
jelveh b0b131f214 add expire mthod to puter.kv 2025-07-02 22:54:55 -07:00
jelveh 6df1d4d5f2 Fix puter.js test for incr and decr in KV 2025-07-02 22:31:25 -07:00
jelveh 2bad220602 Update KVStoreInterfaceService.js 2025-07-02 20:10:00 -07:00
jelveh 0947b90c87 Make puter.js tests print out error results 2025-07-02 20:06:25 -07:00
jelveh 37d09a63d4 Only support language and voice (ordered) in puter.js txt2speech 2025-07-02 18:08:54 -07:00
Nariman Jelveh aa3032da8e Add preliminary support for different voices (#1325) 2025-07-02 17:09:48 -07:00
jelveh 62e786faa6 Do not activate toolbar when desktop selectable is active 2025-07-02 16:14:18 -07:00
jelveh 7285a27be4 Fix toolbar autohide/hide timing 2025-07-01 22:42:50 -07:00
Nariman Jelveh 2103374854 Dynamic toolbar: allow users to customize toolbar sticky (#1330)
* close #1329
2025-07-01 18:37:36 -07:00
Nariman Jelveh 485f9a6f14 Don't hide the toolbar on mobile and tablet (#1328) 2025-06-30 17:18:56 -07:00
Nariman Jelveh 9700488aff Merge pull request #1324 from HeyPuter/dynamic-toolbar
Dynamic toolbar
2025-06-30 16:53:35 -07:00
jelveh edf00a5fd4 Update style.css 2025-06-30 10:24:24 -07:00
jelveh 278bb29ee5 better coloring and delay 2025-06-30 07:01:16 -07:00
jelveh 0864be054c When a window is being dragged don't activate toolbar (duh!) 2025-06-29 19:36:03 -07:00
jelveh 40260a9fb2 full support for fullpage mode 2025-06-29 19:17:58 -07:00
jelveh ad68ddeacc make window snap animation appear faster 2025-06-29 17:36:58 -07:00
jelveh 54ae9c1ca9 the first time toolbar is shown, keep it open until user hovers over it at least once 2025-06-29 16:57:24 -07:00
jelveh b1de89e1ec Update tr.js 2025-06-29 16:03:41 -07:00
jelveh 3db99aa67b Puter will now support only one type of menubar, and that's the in-window type 2025-06-29 15:58:53 -07:00
jelveh 0895418f0c Improve the logic behind hiding the toolbar after clicks and other interactions 2025-06-29 15:18:20 -07:00
jelveh b0fdf1f63d Implement the basics of a dynamic toolbar
Dynamic toolbar will hide and show automatically depending on user actions and state of the app. This is to save screen real estate.
2025-06-29 14:21:40 -07:00
jelveh 657a615d9e Update AI.js 2025-06-28 23:28:31 -07:00
Nariman Jelveh 2ddd26b13d Merge pull request #1319 from Krisss46/fixing-arrow-key-behaviour
fix: arrow key navigation in Explorer (#1089)
2025-06-28 20:44:56 -07:00
Krisss46 5fd5017080 fix: arrow keys unresponsive when selecting items with offset center points 2025-06-29 03:05:17 +01:00
jelveh 9a847760bc Fix #1231 2025-06-28 12:38:39 -07:00
Nariman Jelveh a135c354fb Merge pull request #1318 from XiaochenCui/xiaochen/dev
dev: extension prefix update, doc helper & docs update
2025-06-28 11:29:24 -07:00
Krisss46 ae07a5e316 fix: arrow key navigation 2025-06-28 16:12:12 +01:00
Nariman Jelveh 9b9733c9c2 Merge pull request #1219 from rodrick-mpofu/feature/desktop-shortcut-link
feat: add desktop link shortcuts (refs #682)
2025-06-27 23:27:51 -07:00
jelveh 06f5601a2e Update package.json 2025-06-27 23:10:53 -07:00
jelveh 75d22b010c Update package-lock.json 2025-06-27 23:09:25 -07:00
jelveh c4e32474b2 Remove some redundant checks and favicon handling logic 2025-06-27 23:05:53 -07:00
jelveh ad62182566 Update new_context_menu_item.js 2025-06-27 22:53:49 -07:00
jelveh 1df874c581 remove refresh_item_container since it's not used 2025-06-27 22:49:58 -07:00
jelveh aeac392a7c Remove mods and favicons 2025-06-27 22:46:34 -07:00
Nariman Jelveh 196f996435 Merge branch 'main' into feature/desktop-shortcut-link 2025-06-27 22:45:38 -07:00
XiaochenCui 0b7474340f dev: extension prefix update, doc helper & docs update 2025-06-27 16:29:16 -07:00
KernelDeimos 7f6b302636 fix: remaining issues with fake-chat/costly 2025-06-27 14:31:26 -04:00
KernelDeimos f46d47d2a8 fix: cost testing model 2025-06-27 14:19:03 -04:00
jelveh 1ad113bbbf Update package-lock.json 2025-06-26 22:59:02 -07:00
Nariman Jelveh c7f4df63da Merge pull request #1314 from bilalkhantanoli/nn-translation-completion
fix(i18n): Complete Norwegian Nynorsk translation
2025-06-26 22:45:56 -07:00
KernelDeimos ae4dc23c37 fix: incorrect pricing 2025-06-26 22:06:32 -04:00
KernelDeimos 60a9be12ba fix: update package-lock.json 2025-06-25 15:00:07 -04:00
Bilal 807d7bd698 fix: complete Norwegian Nynorsk translation 2025-06-22 12:25:22 +05:00
jelveh 7896c59ef8 Remove terminal and draw from Launch menu 2025-06-21 22:42:48 -07:00
KernelDeimos 2d9526ba40 fix: install 2025-06-21 22:00:26 -04:00
KernelDeimos 43122801bf fix: various AI fixes
- fix mis-handling of aliased models and DRY so it doesn't happen again
- fix where we try to get model details for a pseudo model
  (usage-limited)
- fix metering with non-streaming mistral requests
2025-06-21 21:39:52 -04:00
KernelDeimos ddfd11713e tweak: change default model to gpt-4.1-nano 2025-06-21 20:28:53 -04:00
KernelDeimos 52f79061ce dev: add cost-calculated event for AI chat 2025-06-21 20:21:49 -04:00
KernelDeimos d9a6a03740 tweak: update pricing for 4o-mini 2025-06-21 20:21:32 -04:00
jelveh c3d2ce5d0e Add max_tokens to all models' metadata 2025-06-21 16:13:50 -07:00
KernelDeimos ebefca2c24 dev: add some max_tokens values 2025-06-21 18:02:00 -04:00
jelveh 6f6bb5a484 Remove Convert, IPGeo, NewsData, Firebase, Mail, Analytics, and Weather 2025-06-21 14:57:58 -07:00
KernelDeimos 4b5955b459 fix: add missing unit conversion step 2025-06-21 17:12:55 -04:00
KernelDeimos 62d72676af dev: enable custom text and fix max_tokens for fake-chat 2025-06-21 05:13:59 -04:00
KernelDeimos 2e90e8dc96 fix: streaming in FakeChatService 2025-06-21 03:21:54 -04:00
KernelDeimos 9235ddd6f3 dev: change message in ai service 2025-06-21 02:19:04 -04:00
KernelDeimos 1a85eeca5c dev: add value to prompt validation event 2025-06-21 02:03:11 -04:00
KernelDeimos 3f5de6d493 fix: use correct path for openrouter max tokens 2025-06-21 01:43:54 -04:00
KernelDeimos 26fb2e704f dev: apparently LLM APIs can't do Math.min 2025-06-21 00:28:38 -04:00
KernelDeimos 52b778a2e7 dev: improve use metering 2025-06-20 23:04:46 -04:00
KernelDeimos a7d1bf0e99 fix: remove dormant condition operand from signup.js 2025-06-20 19:41:06 -04:00
Nariman Jelveh 0accd41e13 Merge pull request #1311 from Rohanpawar9921/docs/rohan-readme-hindi
docs(i18n): update Hindi translation of README
2025-06-19 21:05:56 -07:00
jelveh d3d7e38c3e Remove the Email, Exec, and Convert modules in Puter.js 2025-06-19 20:50:45 -07:00
KernelDeimos db960d585a fix: add support for new Endpoint usage 2025-06-19 23:46:23 -04:00
KernelDeimos 5903f1fb31 fix: incorrect call to APIError from configurable_auth 2025-06-19 23:44:45 -04:00
KernelDeimos 5b7b524080 fix: add one I missed previous commit 2025-06-19 23:37:03 -04:00
KernelDeimos e5e88073c1 dev: add some useapi exports to CoreModule 2025-06-19 23:27:57 -04:00
Rohanpawer9921 f97a23a181 docs(i18n): update Hindi translation of README 2025-06-18 10:29:24 +05:30
KernelDeimos 3918917f31 dev: add appdata_app property to stat response 2025-06-18 00:22:15 -04:00
KernelDeimos 659879812d fix: necessary updates happen for move save too 2025-06-18 00:21:23 -04:00
KernelDeimos 8b56d1131c clean: move handle_url_save for readability 2025-06-17 22:16:00 -04:00
KernelDeimos 771eb37c7f dev: add save file by moving from appdata 2025-06-17 22:14:40 -04:00
KernelDeimos 0eb436678b move: handle_same_name_exists to helpers.js 2025-06-17 21:11:44 -04:00
KernelDeimos a4b412dc46 refactor: IPC/showSaveFilePicker 2025-06-17 21:03:32 -04:00
KernelDeimos a8164c1108 doc: document event buses and http (unfinished) 2025-06-17 13:13:02 -04:00
KernelDeimos 352ec6d883 dev: allow apps to sign files in their AppData 2025-06-17 13:12:25 -04:00
KernelDeimos 6315020cc0 dev: regex rules for undefined origin allowed
This commit allows using a regex to specify a route that's allowed to
not have an "Origin" header specified. This is necessary for parametized
URLs.
2025-06-16 18:16:18 -04:00
KernelDeimos 24cae79291 dev: expose LLOWrite to Puter extensions 2025-06-16 17:26:03 -04:00
KernelDeimos 152a5578fc fix: issue using ll_write outside of hl_write
Using LLOWrite outside of HLWrite, which is useful inside a Puter
extension when a simple write operation is being invoked by the backend,
required passing a thumbnail. However, sometimes this is not necessary.
This commit makes it possible run an LLOWrite operation without passing
a thumbnail stream.
2025-06-16 17:23:40 -04:00
KernelDeimos 914b077e1a doc: document config and logging in services 2025-06-11 18:03:51 -04:00
Nariman Jelveh 1652fb496c Delete experiments directory 2025-06-10 15:13:12 -07:00
Nariman Jelveh 2bebc4ba9f Delete badges directory 2025-06-10 15:11:16 -07:00
Nariman Jelveh d34fc897fa Update README.md 2025-06-10 15:10:47 -07:00
Nariman Jelveh 8d6ed96fc7 Delete src/git directory 2025-06-10 15:08:44 -07:00
Nariman Jelveh af84f60f7b Delete awesome directory 2025-06-10 15:07:17 -07:00
Nariman Jelveh 5ed4a28495 Delete addlicense.yml 2025-06-10 15:06:08 -07:00
Nariman Jelveh 4ade2e3fb3 Delete index.html 2025-06-10 14:58:39 -07:00
KernelDeimos 5c2155491d dev: updates for extension-hosted apps
The following changes make it easier to host web apps from inside a
Puter extension:
- expose express module to prevent mixing versoins
- allow registration of URLs exempt from origin requirement
2025-06-06 15:52:21 -04:00
KernelDeimos ca84ed34bf dev: meta driver with usages method 2025-06-05 19:14:04 -04:00
KernelDeimos 20ba064181 dev: log actor uid with created wisp tokens 2025-06-03 16:28:13 -04:00
ATAG bdbe773ff2 doc: add freebsd-specific instructions to first-run-issues.md
Fix the missing 'sharp' dependency on FreeBSD, since it doesn't have prebuilt binaries for this OS.
2025-06-03 15:19:56 -04:00
Krishna d885ea5772 fix: enable and fix date command tests
Closes #796
2025-06-03 15:04:01 -04:00
KernelDeimos a402528018 dev: add explicit error for undefined auth token 2025-06-03 14:52:01 -04:00
jelveh 5bfd10f845 Enable fullpage_on_loading by default for new apps 2025-06-01 22:10:21 -07:00
KernelDeimos e9b249c74f doc: clarify formatting changes in PRs 2025-05-30 17:28:05 -04:00
Tanmay Patwary feb45d192f doc: clarify CostService usage and improve metered services discoverability 2025-05-28 02:52:49 -04:00
Nariman Jelveh a39af1884e Merge pull request #1286 from ProgrammerIn-wonderland/main 2025-05-27 13:37:39 -07:00
ProgrammerIn-wonderland 99cf2cad67 remove log 2025-05-27 16:36:23 -04:00
ProgrammerIn-wonderland 54ec707f7f support for request bodies 2025-05-27 16:34:58 -04:00
jelveh 345c628262 add the code option to puter.print 2025-05-26 15:38:38 -07:00
Nariman Jelveh e227b92f36 Merge pull request #1284 from ProgrammerIn-wonderland/main
Networking: dont sent authentication header if puter.authToken is undefined
2025-05-26 15:06:52 -07:00
ProgrammerIn-wonderland d1a9bed107 Networking: dont sent authentication header if puter.authToken is undefined 2025-05-26 18:05:59 -04:00
Neal Shah bcbf852f5c tweak: make auth UI not required for now (#1283) 2025-05-26 17:36:28 -04:00
KernelDeimos 1024fe28c3 dev: update wisp service for guest tokens 2025-05-26 17:28:50 -04:00
Tanmay Patwary 7831d12d42 chore: sync extension events documentation with backend changes 2025-05-26 17:03:38 -04:00
KernelDeimos ccdb678937 fix: save_account lock timeout
There was a setTimeout here that was supposed to be replaced with the
timeout feature on LockService, but it looks like that never happened.
2025-05-26 13:31:03 -04:00
KernelDeimos 1a0718028b dev: migrate toolbar labels to i18n 2025-05-26 13:04:10 -04:00
KernelDeimos 9c78c0d3f7 dev: rename 'puter.log' to 'puter.logger' 2025-05-26 11:31:16 -04:00
jelveh 951bc0ea7a Only show Puter Dialog when needed 2025-05-23 19:50:47 -07:00
KernelDeimos dbdebec635 dev: disable preauth for now 2025-05-23 17:50:14 -04:00
KernelDeimos 340871295e dev: pre-auth 2025-05-23 17:33:24 -04:00
KernelDeimos 6363f6307c dev: make it possible to handle requests from extension 2025-05-23 17:00:15 -04:00
KernelDeimos fde1a11515 dev: add request.will-be-handled event 2025-05-23 16:23:46 -04:00
KernelDeimos ca3acf13c1 fix: wrong symbol in previous commit 2025-05-22 15:42:43 -04:00
KernelDeimos 2cd5b3cb49 fix: prevent health check from surpressing traces
Stack traces aren't logged when a health check failure occurs. This was
caused by interfacing with AlarmService directly instead of using the
error service.
2025-05-22 15:20:05 -04:00
jelveh 5a6b299e78 Update AI.js 2025-05-22 11:13:01 -07:00
jelveh d2cc550c96 add claude sonnet 4 and claude opus 4 2025-05-22 10:45:26 -07:00
jelveh 491cf506de Update index.js 2025-05-21 19:51:30 -07:00
jelveh b703b60977 omg this is getting out of hand 2025-05-21 19:40:50 -07:00
jelveh f765180c1b well, puter.log is taken so going to change puter.print instead 2025-05-21 19:21:52 -07:00
jelveh f6786b8895 introduce the puter.log() method 2025-05-21 18:50:15 -07:00
jelveh 7f699302a4 Trying out the XSS-safe approach for puter.print 2025-05-21 18:11:51 -07:00
Nariman Jelveh bd8d141879 Merge pull request #1273 from ProgrammerIn-wonderland/main
Housekeeping: Get rid of puter.http/puter.https
2025-05-20 18:56:03 -07:00
ProgrammerIn-wonderland 6af0cddfc6 Housekeeping: Get rid of puter.http/puter.https 2025-05-20 21:38:34 -04:00
Nariman Jelveh cfdf2b304e Merge pull request #1272 from ProgrammerIn-wonderland/main
fix TLS stream premature close issue
2025-05-20 18:29:35 -07:00
ProgrammerIn-wonderland 75f0e043ea fix TLS stream premature close issue 2025-05-20 21:26:44 -04:00
Nariman Jelveh aeac68750b Merge pull request #1271 from ProgrammerIn-wonderland/main
Add support for chunked encoding in puter.net.fetch
2025-05-20 18:23:56 -07:00
ProgrammerIn-wonderland 0d48389c40 code formatting 2025-05-20 21:04:34 -04:00
ProgrammerIn-wonderland 7a6df9a63f change todo 2025-05-20 21:03:28 -04:00
ProgrammerIn-wonderland af2df13619 add support for chunked encoding 2025-05-20 21:01:09 -04:00
Nariman Jelveh 17e50243f9 Merge pull request #1270 from ProgrammerIn-wonderland/main
fix accidental checking of requestHead when responseHead should be checked
2025-05-20 15:03:36 -07:00
ProgrammerIn-wonderland 2a16a2502b fix accidental checking of requestHead when responseHead should be checked 2025-05-20 18:01:57 -04:00
Nariman Jelveh 9b3aa2508d Merge pull request #1269 from ProgrammerIn-wonderland/main
Puter.net.fetch -- cors exempt wisp based fetch
2025-05-20 14:29:29 -07:00
ProgrammerIn-wonderland 95f1656780 initial puter.net.fetch implementation 2025-05-20 17:27:10 -04:00
ProgrammerIn-wonderland 9fdca11070 fix auth flow on subsequent loads 2025-05-20 16:40:38 -04:00
KernelDeimos 8d371b9e7b dev: remove default token limit from Openrouter 2025-05-19 18:52:05 -04:00
KernelDeimos 76b973cd41 dev: add additional debugging for stream AI errors 2025-05-19 17:24:47 -04:00
KernelDeimos 8a0619af26 dev: reduce visible log output by default
- introduce concern-based log categories
- ensure debug-level logs aren't shown without DEBUG env variable
- remove some unnecessary/outdated logs
- add concern fields to services and log instantiations
2025-05-19 16:41:42 -04:00
KernelDeimos cecc9f23dc fix: pass dedupe_name to mkshortcut via batch 2025-05-18 21:00:58 -04:00
jelveh 93645cd0ae remove redundant console.logs 2025-05-18 17:37:40 -07:00
KernelDeimos 1c19086592 fix: add necessary supporting code for funding update 2025-05-17 22:15:21 -04:00
jelveh ea405e5cb6 Update style.css 2025-05-17 15:47:50 -07:00
jelveh 84e190cb59 Revert broken code for deleting profile picture 2025-05-17 15:20:59 -07:00
jelveh d7b9f1e866 Remove the Flexer component from the Security tab in settings 2025-05-17 14:30:57 -07:00
jelveh b23d8b504d Remove Spinner.js 2025-05-17 14:17:56 -07:00
jelveh 4862bac495 Remove StringView.js 2025-05-17 14:10:34 -07:00
jelveh 7d88a8b959 Update UIWindowTaskManager.js 2025-05-17 14:02:24 -07:00
jelveh ab1cbb257c Remove the Table component 2025-05-17 13:50:14 -07:00
jelveh dc399d8774 Update style.css 2025-05-17 13:18:05 -07:00
jelveh a28cb11c34 Make the sidebar in settings fixed 2025-05-17 13:16:52 -07:00
jelveh 17a77f97a1 add correct i18n keys for the professional subscription tier 2025-05-17 13:00:54 -07:00
jelveh a1b96b7130 Allow users to open Settings and specific tabs from a URL 2025-05-17 12:30:27 -07:00
KernelDeimos 7823fdfab0 dev: add lazy render option for UIElement 2025-05-17 15:23:14 -04:00
Nariman Jelveh da66b03163 Merge pull request #1268 from ProgrammerIn-wonderland/main
change initialization order to make wisp socket on first use of network
2025-05-16 14:19:51 -07:00
ProgrammerIn-wonderland f944d76261 change initialization order to make wisp socket on first use of networking 2025-05-16 17:18:28 -04:00
Nariman Jelveh 7f1f98ae70 Merge pull request #1267 from ProgrammerIn-wonderland/main
Add reauthentication for unauthenticated web clients when Socket api is called
2025-05-16 11:18:28 -07:00
ProgrammerIn-wonderland 73e6830b1f Add reauthentication for unauthenticated web clients 2025-05-16 13:45:55 -04:00
jelveh 39a59970bb remove startup chime 2025-05-15 23:26:10 -07:00
jelveh f942c13be0 Revert UIItem refactor and fix the position of Create Shortcut in the context menu 2025-05-15 23:21:11 -07:00
jelveh 0012fd3970 Remove unused imports all over the codebase 2025-05-15 22:34:14 -07:00
jelveh 8dcf75ba54 Update ui_item.js 2025-05-15 17:47:05 -07:00
KernelDeimos 5f14dc720b fix: build error 2025-05-15 20:44:54 -04:00
jelveh 9c14a21fdd Use i18n for "Share With..." 2025-05-15 17:12:13 -07:00
KernelDeimos 880760c602 ux: use financial units instead of SI for credits
Instead of K, M, G, T, P it's K, M, B, T, Q.
2025-05-15 14:05:35 -04:00
KernelDeimos 3290440f4b dev: document auth and permissions 2025-05-15 14:05:35 -04:00
jelveh 0e0bfd6d7c Update PuterDialog.js 2025-05-13 17:34:11 -07:00
KernelDeimos 3dbe89f3dc dev: migrate "Create Shortcut" to DRY multi/single 2025-05-12 17:34:04 -04:00
KernelDeimos aa049b2c5a dev: factor out menu items functions in UIItem
The large if...else block for single-item vs multi-item selection
context menu items makes it difficult to extract common behaviors
between the two. For example, the "create shortcut" menu item could be
added by the same code snippet in both cases, and that snippet might
have conditional logic for the number of items (with 1 as a special
case).

The reason to move branching logic to the code snippets that handle
individual menu items is because the previous change to fix shortcuts in
shared directories revealed cross-cutting concerns in branching logic.
Since both single-item and multi-item "create shortcut" options both
have branching to handle the shared directory case, they are now more
similar than different.
2025-05-12 16:39:21 -04:00
KernelDeimos 73ab4baa60 dev: SI suffix for usage meter 2025-05-12 15:18:02 -04:00
KernelDeimos 72a45500d5 fix: cannot create shortcut for shared file
Closes #1263
2025-05-12 13:25:38 -04:00
KernelDeimos 518449cfdd fix: share issue 2025-05-09 17:04:00 -04:00
KernelDeimos 9bf48e7289 fix: fallback behavior related to fake-chat service
Fallbacks from or to the fake-chat service should not be allowed.
Fallbacks to the "costly" model from fake-chat could result in
unintended charges and fallbacks to real models from fake-chat could
result in service abuse.
2025-05-05 16:10:52 -04:00
KernelDeimos 34787bbb0c fix: gone 2025-05-03 21:27:21 -04:00
KernelDeimos 77f3bf2177 fix: ui bug in settings window 2025-05-02 16:01:26 -04:00
KernelDeimos 75aebd6d35 fix: sqlite syntax inconsistency
The SQL statement for creating a group uses syntax that only works under
sqlite. This was caused by introducing anomaly detection when a user
creates a large number of groups in quick succession.
2025-05-02 14:34:46 -04:00
KernelDeimos 4647e2d9c0 dev: add experimental firebase authentication
This adds an experimental custom token authentication endpoint to Puter.
This is disabled unless the firebase-auth service is explicitly
configured, and is not yet ready for production use.
2025-05-01 17:14:25 -04:00
Nivedita Rani 284b89a5fd fix: iframe overlap issue (PR 1250)
* Removed css property overflow: hidden at the parent container which was interfering with the layout calculations and was forcefully clipping child elements

* Replace css property overflow: hidden  with contain: paint to fix stacking without masking border-radius

Fixes #1233
2025-05-01 13:55:17 -04:00
KernelDeimos ea241540b9 dev: add WeatherService
- adds weather service
- updates IdentificationService to add ip_user property
2025-04-29 13:43:53 -04:00
KernelDeimos 29dbf3a517 dev: URLs to files in public directories
Already existing was the functionality to go to puter.local/@username to
access the Public folder belonging to "username". This commit adds the
ability for relative paths such as puter.local/@username/document.md to
access /username/Public/document.md in the suggested app for handling
".md" files.
2025-04-28 17:40:02 -04:00
KernelDeimos 3856ddcc8f dev: add default parameters for driver interfaces 2025-04-25 16:03:22 -04:00
KernelDeimos c5c17bae3a dev: add cost calculation for NewsDataService 2025-04-25 14:14:58 -04:00
KernelDeimos 78ae6f6bf2 dev: begin implementing driver for newsdata.io 2025-04-24 17:04:30 -04:00
KernelDeimos 89b8c8de1d fix: add missing null check 2025-04-24 16:09:32 -04:00
KernelDeimos b7efa6f894 fix: handle problematic null or undefined case
This is the product of a couple hours of debugging. We can now remove
the uuid entry from the cache for a deleted user without the strange
lockup behavior that was being observed previously. However, it is still
explained exactly how this happened; while this commit addresses the
cause it does not represent an actual understanding of the issue.

What is known is the following:
- /delete-own-user can trigger a complete lockup
- this happens when invalidate_cached_user is called
- kv.del('users:uuid:<uuid of user>') triggers the issue
- ... because get_user returns null and
- configurable_auth middleware accepts the null value
- configurable_auth middleware DOES call next()
- it is unknown why a lockup occurs after this
2025-04-24 14:41:05 -04:00
KernelDeimos 210ecaba8f tmp: comment out user uuid del 2025-04-23 22:33:25 -04:00
KernelDeimos 2b0c8fcaf0 dev: expose Context and ready event to extensions 2025-04-23 15:51:28 -04:00
KernelDeimos abf5852b93 dev: better log support for extensions 2025-04-23 15:28:15 -04:00
KernelDeimos a3ae60861c dev: add injected logger support
This allows a logger to be specified in the execution context. If
LogService sees this, it will perform its usual logging but also call
the injected logger.
2025-04-23 14:49:18 -04:00
KernelDeimos 017328420d dev: add support for an "any" interface
Driver interfaces don't require specifying the structure of the return
value when it's a JSON object, but parameters require specifying what
parameters can be provided. This commit adds a special wildcard
parameter for interface definitions. When the wildcard parameter is set,
the entire input object is considered as if it were the value of one
parameter.
2025-04-22 16:29:55 -04:00
KernelDeimos 790e3bdffc dev: puter.call
Instead of puter.drivers.call, make it puter.call. This is accomplished
by allowing puter.js modules to mutate the `puter` object on
initialization. Support for an optional `_init` method, similar to
backend services, is added to Puter modules to help with this.
2025-04-22 15:21:36 -04:00
KernelDeimos 9935f5a0be dev: simplify calling drivers with matching names
This commit modifies puter.js to allow calling an
interface+service+method with matching names without redundantly
specifying. The 'ip-geo' service is also renamed to ipgeo to match its
method name and allow a simple:

puter.drivers.call('ipgeo', { ip: '1.2.3.4' })
2025-04-22 14:01:01 -04:00
KernelDeimos 1764b99c22 dev: add log messages for cost records 2025-04-22 13:14:41 -04:00
KernelDeimos 7e7e2897b2 dev: improve actor logs
This commit adds the concept of a toLogFields method on objects which
will determine how they're turned into log fields in LogService. This
method is now implemented on actor to prevent errors when the object is
passed to log functions without being stringified first.
2025-04-22 12:52:09 -04:00
KernelDeimos b80052f177 dev: add cost service integration to IPGeoService 2025-04-22 12:07:13 -04:00
KernelDeimos 7945586050 dev: ip geolocation driver (initial development) 2025-04-21 17:53:39 -04:00
KernelDeimos 8ff2e93e66 tweak: add limit to deleteUser file select
I wasn't able to reprod any memory leak from a user having a large
number of files locally, but it's showing up in logs and maybe could add
up with lots of temp users getting auto-removed. It's worth a shot.
2025-04-19 15:45:33 -04:00
KernelDeimos f7b302b024 fix: potential log error 2025-04-19 14:27:14 -04:00
KernelDeimos c254b39afe fix: consistent email check in confirm-email 2025-04-19 11:07:13 -04:00
KernelDeimos c959ef3b83 dev: add actor to log context when available 2025-04-18 16:55:11 -04:00
KernelDeimos fdfa4cbc7c dev: log memory info periodically 2025-04-18 16:26:52 -04:00
KernelDeimos cc72508b75 dev: remove default system prompt 2025-04-17 15:35:35 -04:00
jelveh 2cdcc5ffcd Add o3 and o4-mini models 2025-04-16 11:06:57 -07:00
jelveh b17dc58ca6 remove unused imported modules 2025-04-15 23:44:11 -07:00
jelveh 19574e5bb1 Update OpenAICompletionService.js 2025-04-15 23:33:03 -07:00
jelveh c732263958 Update AI.js 2025-04-15 23:24:53 -07:00
jelveh cab933f1c2 Update AI.js 2025-04-14 12:56:32 -07:00
jelveh 68860d8876 Update AI.js 2025-04-14 12:52:54 -07:00
jelveh 42f0ac5785 Use OpenAI for `o1-mini1 2025-04-14 12:44:58 -07:00
jelveh 90d16c35e2 Add missing openai models 2025-04-14 12:36:07 -07:00
jelveh 16b8adc4ed add new GPT models 2025-04-14 12:26:04 -07:00
jelveh 2d7ca7f2e1 better error message for invalid emails 2025-04-13 18:24:06 -07:00
jelveh 398b1578a5 Update signup.js 2025-04-13 17:56:56 -07:00
jelveh 2949e16be2 Update signup.js 2025-04-13 17:38:53 -07:00
jelveh c9c441210b Update signup.js 2025-04-13 17:08:58 -07:00
jelveh 4ea7754133 Update initgui.js 2025-04-13 16:52:23 -07:00
jelveh f14b0d1ac9 this didn't work, reverting 2025-04-13 16:39:31 -07:00
jelveh 1b83966c26 Update signup.js 2025-04-13 16:24:19 -07:00
KernelDeimos 107adce68b dev: disallow "auto" model
This model seems to cause us problems
2025-04-12 16:53:53 -04:00
jelveh daa95d8c39 Update AI.js 2025-04-10 20:17:35 -07:00
KernelDeimos dc2e406cc6 fix: use event service 2025-04-10 15:45:46 -04:00
KernelDeimos c7c7f78255 Revert "tmp: temporary timeout to test a theory"
This reverts commit d1e4ed7f63.
2025-04-10 01:40:21 -04:00
KernelDeimos d1e4ed7f63 tmp: temporary timeout to test a theory 2025-04-10 01:32:53 -04:00
KernelDeimos 3f0e990398 dev: polling in usage tab 2025-04-09 14:34:32 -04:00
KernelDeimos f0c06931bd fix: check funding with no args 2025-04-09 14:34:32 -04:00
KernelDeimos 2c9bc8f9e0 dev: instant update for usage in settings 2025-04-09 14:34:32 -04:00
KernelDeimos 0176a1f629 dev: update usages tab 2025-04-09 14:34:32 -04:00
KernelDeimos b5848012a9 delete: monthly usage limiting 2025-04-09 14:34:32 -04:00
KernelDeimos fc677ef61f dev: migrate judge0 and convertapi to cost service 2025-04-09 14:34:32 -04:00
KernelDeimos b57b907ba6 dev: migrate textract to use cost service 2025-04-09 14:34:32 -04:00
KernelDeimos 8d175bd3fa doc: test values for PermissiveCreditService 2025-04-09 14:34:32 -04:00
KernelDeimos c9d4eec018 dev: migrate polly to use cost service 2025-04-09 14:34:32 -04:00
KernelDeimos 82a4ab0884 dev: migrate image gen service to use cost service 2025-04-09 14:34:32 -04:00
KernelDeimos 14304143af dev: migrate image generation to use cost service 2025-04-09 14:34:32 -04:00
KernelDeimos b9b9c95f84 dev: minimum cost option 2025-04-09 14:34:32 -04:00
KernelDeimos 0201b93013 fix: redundant report-usage call in FakeChatService 2025-04-09 14:34:32 -04:00
KernelDeimos d0edb2c1f3 fix: async handling for events
There were issues with async handling in events which can make it
difficult to use event handlers to mutate values provided by an emitter.

This is not an optimal solution: this will await event listeners in
sequence. Ideally, event listeners should be awaited concurrently.
2025-04-09 14:34:32 -04:00
KernelDeimos 1f7073ef76 dev: add services property to extensions
A small change that adds ".services" to the "extension" global in an
extension, so extensions can more easily talk to other services.
2025-04-09 14:34:32 -04:00
KernelDeimos 21bd427cef refactor: generalize handling of costly services
Usage/cost tracking per user was over-fitted to LLM/AI services. This
commit adds CostService and updates AIChatService to use that instead of
updating the `ai_usage` table. The `ai_usage` table is now considered
deprecated.

A service called PermissiveCreditService is enabled by default in
SelfHostedModule. This is so users who host their own Puter instances
don't have to worry about usage limits, since they're providing their
own keys anyway.
2025-04-09 14:34:32 -04:00
KernelDeimos 0347a38136 fix: handle all temp user errors by reloading 2025-04-09 13:27:30 -04:00
KernelDeimos c8d52b3203 style: captcha refresh button 2025-04-08 16:54:36 -04:00
KernelDeimos d0e06e83c0 dev: add ip to captcha middleware event 2025-04-08 16:54:36 -04:00
jelveh 592acbcae6 remove "anthropic/" from model name 2025-04-08 12:34:23 -07:00
KernelDeimos 27fd7b3670 fix: broken model parameter 2025-04-08 13:27:56 -04:00
Nariman Jelveh fd910f36cf Merge pull request #1169 from shushannap/FAtranslation
tweak: reorder and fix Farsi translation of i18n keys
2025-04-08 08:41:16 -07:00
KernelDeimos 95ddfe3909 fix: error handling in ThreadService 2025-04-07 19:02:52 -04:00
KernelDeimos fc11eba070 fix: puter.js threads error handling 2025-04-07 18:43:21 -04:00
KernelDeimos 3e98d13f6b doc: document driver endpoint 2025-04-07 14:37:45 -04:00
KernelDeimos 9a12db2066 fix: .startsWith on undefined 2025-04-04 17:58:06 -04:00
jelveh 4fb772796f Update AI.js 2025-04-04 14:43:53 -07:00
EvaNtziou dad72c5bd7 feat: button to remove profile image #1245 (#1246)
* Restored and updated UITabAccount.js, style.css
* Update UITabAccount.js

Closes: 1245
2025-04-04 16:00:53 -04:00
jelveh 80060e863d Use openrouter for llama models 2025-04-03 17:23:26 -07:00
Nariman Jelveh ddb04431cc Update README.md 2025-04-02 18:48:22 -07:00
jelveh 590973f50d Update AI.js 2025-04-02 12:04:38 -07:00
KernelDeimos fb01bb474a fix: edge case during email change
Previous logic was:
- on email change, update temporary value
- send email to confirm new email
- temporary value is moved to real email

This doesn't work when an account has not yet confirmed their email
after signup (i.e. user's email_confirmed is still 0). Well, it actually
does work, but the user is only able to confirm the change to their
email and not set their account as having a confirmed email.

New logic has a branch for this case; IFF email_confirmed=0:
- change account confirm code
- send new account confirm email
2025-04-01 12:41:49 -04:00
KernelDeimos 7a3365a25c refactor: begin migrating utility code
I'm calling this approach a "re-core"; see src/backend-core-0/README.md
for more information about this.
2025-03-31 22:09:29 -04:00
KernelDeimos f2305ff289 fix: how did this get here 2025-03-31 20:22:13 -04:00
KernelDeimos e5f23e815d dev: disable textex by default
it's too verbose now
2025-03-31 20:07:19 -04:00
KernelDeimos f80105af6d fix: sure, but how 'bout a logo that isn't broken
A logo addition from another PR snuck in. This definitely makes it
consistent with signup, but this logo broken! This commit makes it be
not broken anymore.
2025-03-31 19:33:55 -04:00
Eric Dubé b7defab2d2 refactor: Migrate interfaces.js to new registration mechanism (#1239)
* refactor: migrate interfaces.js to new registration mechanism

- Created EntityStoreInterfaceService for crud-q interface\n- Created AnalyticsInterfaceService for puter-analytics interface\n- Added InterfacesModule to load these services\n- Removed interfaces.js\n\nCloses #1131

ai: true

* chore: remove interfaces.js file

ai: true

* fix: DRY CRUD interfaces

This comment is flagged as AI-generated, but Claude rate-limited before
it could actually make the commit so this commit was made by hand. Well,
while I'm writing this commit message I may as well mention that Claud's
rate limits are relentless and it has become impossible to use Claude
for some purposes as a result.

ai: true

* refactor: replace interfaces module with separate Module.js files for entitystore and analytics

- Removed interfaces module\n- Added EntityStoreModule.js to entitystore module\n- Added AnalyticsModule.js to analytics module\n- Updated main index.js to use the new modules directly\n\nai: true

ai: true

* fix: modules exported and registered incorrectly

* feat: add KVStoreModule for puter-kvstore interface

- Created KVStoreModule.js\n- Created KVStoreInterfaceService.js to register the puter-kvstore interface\n- Updated exports.js to include the new module\n\nai: true

* fix: remove index.js from kvstore module

- Removed unnecessary index.js file from kvstore module\n\nai: true

* fix: remove index.js files from analytics and entitystore modules

- Removed unnecessary index.js files from analytics and entitystore modules\n\nai: true

* fix: cleanup mycoder mistakes again

...because it actually threw out my previous commit where I already did
this.
2025-03-31 19:32:38 -04:00
Krista Vlastou 647ae35c84 Added a confirm password field and a show password option 2025-03-31 16:30:55 -04:00
KernelDeimos 6451f1b4e9 fix: error handling error in UIWindowSignup
Caused-By: ad4b3e7aeb
2025-03-31 13:22:31 -04:00
jelveh da2a8de307 Update UITabUsage.js 2025-03-29 16:51:24 -07:00
jelveh 1d1b4f81b5 clean up html and css 2025-03-29 12:31:23 -07:00
KernelDeimos a276a82e44 fix: put guard around startup chime 2025-03-29 14:57:45 -04:00
KernelDeimos 7c1fb4c3bf dev: improve puter.js convert interface 2025-03-28 22:39:28 -04:00
Jonathan Mahrt GuyouandEric Dubé ad4b3e7aeb feat: captcha
* Added Revis distributed cash to enhance our Captcha Verification system so that we prevent our system from replay attacks

* Fix: There was an error with the implementation of Redis, so I reverted to our previous version that uses in memory storage

* Integrated the captcha verification system into our sign in Form. The captcha verification system now works on both login and sign int

* Remove test files from captcha module

* Update src/backend/src/modules/captcha/middleware/captcha-middleware.js

Co-authored-by: Eric Dubé <[email protected]>

* Update src/backend/src/modules/captcha/middleware/captcha-middleware.js

Co-authored-by: Eric Dubé <[email protected]>

* Now the captcha can be requested on condition, this llaows extenstions to control wether a captcha should be required,
I fixed the code in CaptchaModule to use config
and got rid of the lines that made captcha middleware available since it wasn't used anywhre

* I split the middleware into two distinct parts, so that the frontend can now determine captach requirements. PuterHomePageService can set GUI parameters for captcha requirements. The /whoarewe endpoint provides captcha requirement information and the extensuo system integration is maintained

* Fix security issues with password handling in URL query parameters

* Made sure that the enter key, submits the login request instead of refreshing the captcha

* In development we can now disable the Captcha verification system by running it with CAPTCHA_ENABLED=false npm start

* Went back and modified checkCaptcha so that it checks at the start to check what CAPTCHA_ENABLED is equal to

* Refactor captcha system to use configuration values instead of environment variables

* Fix captcha verification and align with project standards

* Update src/backend/src/modules/captcha/README.md

Co-authored-by: Eric Dubé <[email protected]>

* fix: incorrect service name

* dev: use Endpoint for captcha endpoints

Use Endpoint class, which uses eggspress behind the scenes, which handles
async errors in handlers automatically.

* dev: add extension support and simplify captcha

- removed extra error handling
- removed dormant code
- no distinction between login and signup (for now)

* clean: remove local files

* fix: undefined edge case

---------

Co-authored-by: Eric Dubé <[email protected]>
2025-03-28 19:46:56 -04:00
rodrick-mpofu bf16e20447 fix: remove duplicate icons and hide .weblink extension 2025-03-28 05:17:02 -04:00
KernelDeimos f73958ee8c chore: update package-lock.json 2025-03-28 05:01:49 -04:00
Eric Dubé 45c072ff93 feat: add public endpoint for models list (#1228)
* feat: add public endpoint for models list

- Created ChatAPIService for public endpoints\n- Added /chat/models and /chat/models/details endpoints\n- Registered service in CoreModule\n- Added tests for the new service\n\nCloses #1227

ai: true

* Update src/backend/src/services/ChatAPIService.js
2025-03-27 17:12:09 -04:00
Ntwari Bruce 39048a9e2e dev: ai command tool use / function calling (#1194)
* Enhanced ai command to perfom other commands

* Enhance AI Command in Puter's shell

* Enahanced ai command to use tooling/function calling

* Fixed circular dependency and added list function to Builtincommand

* Fixed circular dependency and system prompt
2025-03-27 14:31:24 -04:00
KernelDeimos 9180261472 doc: add style doc for backend 2025-03-26 18:07:12 -04:00
Krista Vlastou 4b7e09e157 fix: npm install error on Windows (spawn EINVAL) (#1214) 2025-03-26 14:58:46 -04:00
rodrick-mpofu 94853d33bf Implement link shortcut feature (refs #682) 2025-03-25 02:24:20 -04:00
KernelDeimos 3d3af13979 feat: add startup chime feature
Added ability to play Puter chime sound at startup after login
with a toggle in personalization settings to enable/disable it.

ai: true
2025-03-24 23:19:36 -04:00
KernelDeimos bcd8d0cc82 tweak: clarify Nodemailer section in email testing documentation
- Clarified that the Nodemailer example is for testing MailHog setup\n- Added information about how Puter uses Nodemailer\n- Added references to the EmailService class

ai: true
2025-03-24 21:55:34 -04:00
KernelDeimos 71fd94131e tweak: improve email testing documentation formatting and flow
- Reorganized sections for better readability\n- Added clearer headings and instructions\n- Improved troubleshooting section\n- Enhanced overall document structure

ai: true
2025-03-24 21:50:36 -04:00
gautamthegozi 94d148430a doc: Documentation for Email Testing (#1204)
* Documentation for Email Testing

* Documentation fix

* Fix
2025-03-24 21:48:36 -04:00
KernelDeimos 7bd0c8e3f2 doc: add documentation for robots 2025-03-24 17:58:47 -04:00
Eric Dubé c683b812bc doc: Improve PuterAI module documentation structure (#1216)
* docs: improve PuterAI module documentation structure

- Update docmeta.md to describe top-level doc structure\n- Create README.md for PuterAI module documentation\n- Move requests.md content to api_examples.md\n- Add ai_usage_testing.md in contributors directory\n\nCloses #1215\n\nai: true

* docs: remove original requests.md after content migration

Content has been migrated to api_examples.md with improved organization and structure.\n\nai: true
2025-03-24 17:52:00 -04:00
KernelDeimos 6a3b20f0a8 fix: clarify variable names in puter.ai.chat method
- Renamed 'options' to 'requestParams' to clearly indicate parameters sent to the backend driver\n- Renamed 'settings' to 'userParams' to clearly indicate parameters provided by the user\n- Updated comments to be more descriptive about the purpose of each variable\n\nFixes #1212\n\nai: true
2025-03-24 16:17:58 -04:00
KernelDeimos 64d1b6e663 dev: allow specifying chat driver in puter.js 2025-03-24 15:58:32 -04:00
KernelDeimos 617fb49178 fix: allow fake-chat to report usage for costly model
Modified the event handler in AIChatService to only skip usage reporting for fake-chat when it's not using the costly model, allowing the costly model to properly report its usage and costs.

ai: true
2025-03-24 15:54:40 -04:00
KernelDeimos 7a2851d2cc fix: add _init method to register FakeChatService as a provider
Added _init method to FakeChatService to register itself as a provider with AIChatService, ensuring that the service and its models are properly recognized by the system.

ai: true
2025-03-24 15:54:40 -04:00
KernelDeimos 42c6f92048 feat: add costly model to FakeChatService
Added a new 'costly' model to FakeChatService that simulates incurring costs similar to real AI services. This model can be used for testing cost tracking without incurring actual external API costs.

ai: true
2025-03-24 15:54:40 -04:00
Eric Dubé 67a898ea33 fix: update check_usage_ to only consider past month usage (#1209)
This change modifies the SQL query in check_usage_ to only consider AI usage from the past month when checking against limits, rather than all historical usage.

ai: true
2025-03-24 13:40:01 -04:00
Eric Dubé 1266ef2179 fix(ux): Make it easier to add file extensions to an app in bulk (#1205)
* Add support for pasting multiple file extensions at once in Dev Center

* Fix bulk file extension paste functionality in Dev Center

* fix: add try-catch around tippy

* Fix issues with bulk file extension pasting and add comma key support

* Fix issue with duplicate red tags appearing temporarily

* Implement robust bulk file extension paste functionality in Dev Center

* Fix security issue with JSON.stringify to properly escape < characters
2025-03-23 23:00:17 -04:00
hisham-maarraoui b0efff7a4f feat: show/hide desktop icons option in context menu
* feat: hide icons/show icons feature added to the right-click/secondary click menu on the desktop

* Fix: Changes made to the hide/show desktop icons feature after receiving feedback in the first pull request

* CSS rule added to static CSS file instead of being implemented dynamically
2025-03-21 16:23:17 -04:00
kira-offgrid 868ef4e5a4 fix: cleanup example so bots don't flag it 2025-03-21 13:23:21 -04:00
Anuja Mishra 50817f601e dev: Standardized OpenAI config format and updated documentation issue #1180 (#1195)
* Standardized OpenAI config format and updated documentation issue #1180

* Addressed review comments
2025-03-20 12:50:51 -04:00
KernelDeimos 33a7811e8f fix: alerts being completely broken
PR 1175 introduced a bug that wasn't caught where alert messages are not
properly assigned. Additionally, the default alert type was "warning"
which is a regression. This commit makes "info" the default alert type
and ensures options.message is the first candidate for the alert message
contents.
2025-03-19 12:37:18 -04:00
KernelDeimos 5c3f447b4c dev: expose config path to root context 2025-03-18 15:23:50 -04:00
Franciszek 9cb6b13bb6 i18n: Polish Translation fix (#1193)
* Update README.pl.md

Things I would change:

Line 1: System Operacyjny Internetu -> System Operacyjny Internet
Line 25: system operacyjny internetu -> internetowy system operacyjny
(Original Translation is more like Internet's OS, not Internet OS)

Line 36: Rozwój Lokalny ->  Instalacja Lokalna
(Original does not mean programming, but more like growth or evolution)

Line 97: Połącz się z opiekunami -> Skontaktuj się z opiekunami 
(Original has meaning, like connecting by cable, not contacting)

* Update README.pl.md

Changed:
Instalacja Lokalna -> Lokalne Środowisko Programistyczne.
2025-03-18 12:13:34 -04:00
Het Savani dab5e0a281 fix: file manager sidebar headings contrast (#1191) 2025-03-17 14:05:25 -04:00
KernelDeimos be59f57d68 dev: update puter.js imports to work in cli
This is a step towards getting puter.js to run in node instead of just
in the browser. In node, all the relative imports need to end with the
file extension, and the "type" option in package.json needs to match the
import mechanism used. It was also necessary to migrate
webpack.config.js to ESM syntax, which I would not have done if the
tooling didn't force me to.
2025-03-17 13:21:15 -04:00
ajaykrishnaswamyandEric Dubé 782e858b3c Update (and automate) events docs (#1164)
* documentation: new documentation for emit features

* Update events documentation and doc_helper.js script

* Update package.json

Co-authored-by: Eric Dubé <[email protected]>

* added manual_overrides.json.js file

* Update doc_helper.js to resolve paths relative to project root and update events documentation

* created a new events.md generated file, differences can be seen.

* added and populated events.md file. Can now compare new and old versions

---------

Co-authored-by: Eric Dubé <[email protected]>
2025-03-16 12:41:14 -04:00
KernelDeimos 947dca96a2 chore: remove eslint.config.js
ESLint cannot support our preferred code style for backend without
writing custom plugins. On frontend, we already decided ESLint wasn't a
good fit several months ago. This commit removes the eslint config to
avoid other developer's editors making unwanted whitespace changes.

In backend, we use spaces within control structure parens. This really
does make the code easier to read. In the future, maybe we'll write our
own linter.
2025-03-16 00:52:56 -04:00
Arunabh Sharmaandavijh 004e47a4a9 feat: add API to get a list of all available models (#1160)
* add API to get a list of all available models

* modified listModels() and listModelProviders() for readability.

* remove dead code

---------

Co-authored-by: avijh <[email protected]>
2025-03-16 00:31:33 -04:00
Andrew ShiromaandRishabh Shinde bf3d63a083 feat: create and export UsageLimitedChatService (#1182)
* feat: create and export UsageLimitedChatService for when user exceeds usage limit

* tweak: change comment on usage-limited-chat to better explain action

* fixed whitespace

* tweak: remove test-app from gitignore

* tweak: remove extra spacing in AIChatService usage-limited-chat comment

* tweak: fixed whitespace

* tweak: remove tabbed whitespace in AIChatService

* tweak: remove .qodo from gitignore

* tweak: remove extra enter in AIChatService

* Revert "tweak: remove .qodo from gitignore"

tweak: correct mistake on removing extra enter

This reverts commit e066e294fa.

* tweak: add space at fallback and remove whitespace tabs

* tweak: remove whitespace on brackets

* tweak: remove .qodo and test-app from gitignore

* tweak: add accidentally deleted enter back in

---------

Co-authored-by: Rishabh Shinde <[email protected]>
2025-03-15 19:48:09 -04:00
Arunabh Sharma 9626175d3a chore: upgrade supported node version to 23.9 (#1184)
* upgrade node version to 23.9

* update package-lock.json
2025-03-15 16:03:46 -04:00
Tanveer Brar 3cdbcd83b3 feat: GUI Permission Dialog (#1177)
* Added requestPermission endpoint in SDK, updated IPC handler HeyPuter/puter#1150

* - Updated UIWindowRequestPermission.js to accept multiple permission types
- Updated dialog message for permission window in UIWindowRequestPermission.js
- Updated parameters for call to UIWindowRequestPermission in IPC.js
- Added search_uid.js endpoint to allow GUI searches for fsentry by file UUID HeyPuter#1150

* Updated body and header for Permission Request Dialog HeyPuter#1150
- Replace app uid with app name for header in UIWindowRequestPermission.js
- Added path for file permission request body in UIWindowRequestPermission.js
- Removed previously added search_uid.js api implementation previously as it is replaced by simpler call in gui

* Updated permission description generation in UIWindowRequestPermission.js HeyPuter#1150

* Removed incorrect web handling in IPC.js HeyPuter#1150

* Formatting fixes
2025-03-14 19:37:28 -04:00
Aman PurohitandEric Dubé a278a6140b feat: UIAlert with dynamic icon types and default button configurations (#1175)
* UIAlert with dynamic icon types and default button configurations

* Update src/gui/src/UI/UIAlert.js

Co-authored-by: Eric Dubé <[email protected]>

* Update src/gui/src/UI/UIAlert.js

Co-authored-by: Eric Dubé <[email protected]>

* fix: improve error handling in UIAlert component and reseting package-lock

* fix: update UIAlert to use 'type' for alert type selection

* fix: update UIAlert to use 'type' for button configuration

---------

Co-authored-by: Eric Dubé <[email protected]>
2025-03-14 19:18:38 -04:00
Saish Pawar 505e7abda2 fix: reposition clock to right (#1181) 2025-03-14 18:38:57 -04:00
KernelDeimos 5c50eb1f8b fix(gui): logo placement with no clock using margin
Flex isn't being used in the top bar correctly, which is causing
unpredictable issues when people implement new elements on the top bar.
The best solution for this is to use proper flex values but right now
it's important to get the layout back to normal for production so I'm
implementing this sub-par fix where we always include a spacer element.
2025-03-14 03:09:08 -04:00
KernelDeimos 8edcf7575d fix(gui): clock padding moving other elements 2025-03-13 14:54:46 -04:00
Saish Pawar 672e2e70ad dev: moved current datetime to toolbar as a widget (#1172)
* move current datetime to toolbar as a widget

* revert interval to 1000ms
2025-03-13 13:28:57 -04:00
Gautam Kumar 11043e9ba1 doc: make default URL easier to notice
* Update README.md

Without clear instructions it wasted a few hours just for setting up.
Atleast no one will face issues with domain name in localhost now

* Making LocalHost website visible

* Making LocalHost website visible v2
2025-03-13 12:09:15 -04:00
Saish Pawar 6236d00ea2 fix: made protocol dynamic in the publishURL displayed on 'Publish As Website' dialogbox (#1170)
* change https to http on UIWindowPublishWebsite

* fix: made protocol string dynamic in the publish as website dialogbox
2025-03-12 15:58:11 -04:00
KernelDeimos 3e74f42c4d fix: thread delete events 2025-03-12 14:57:53 -04:00
KernelDeimos 41d5dbc0da fix: incorrect addition of https prefix for peers 2025-03-12 14:57:42 -04:00
KernelDeimos ad7b7b9513 fix: don't show register when user signup is disabled
closes #1087
2025-03-12 14:52:23 -04:00
Shushanna 433f15bacd tweak: reorder and fix Farsi translation of i18n keys 2025-03-11 21:20:05 -07:00
KernelDeimos 76bedf5f8f fix: thread subscription updates across regions 2025-03-10 16:29:00 -04:00
KernelDeimos 252647cea6 fix: issues with thread subscriptions
I really screwed that up on my first attempt. Puter apps don't trigger
the user-connected websocket event, which rendered thread subscriptions
in apps useless. Furthermore, the uuid of the thread that was subscribed
too wasn't present in the event, which is also pretty useless.
2025-03-09 20:28:22 -04:00
KernelDeimos 26591e4171 fix: wrong parameter count 2025-03-09 16:48:35 -04:00
KernelDeimos 249d883592 dev: add missing constructors to new puter.js methods
- Also add subscribe() to threads module so I don't lose it in a git
  stash
2025-03-09 16:48:35 -04:00
KernelDeimos daa3449f29 dev: begin adding developer app permissions 2025-03-09 16:48:35 -04:00
Andy Cordero 33c304879a fix(gui): color of the UI on dark mode (e.g. windows control, active sidebar) (#1161)
* update theme service to improve color handling and SVG icon styling

* enhance sidebar item colors for better visibility

* Fix the whitespace
2025-03-09 16:30:16 -04:00
Ntwari Bruce 7ed779bbf3 feat: enhanced ai command to perfom other commands (#1156)
* Enhanced ai command to perfom other commands

* Enhance AI Command in Puter's shell
2025-03-08 17:47:53 -05:00
KernelDeimos 8c497935cf dev: thread subscriptions 2025-03-07 17:27:29 -05:00
KernelDeimos 60cecedc87 dev: add user information to threads 2025-03-07 15:31:40 -05:00
KernelDeimos 03045e2737 fix: temperature and max_tokens (interface + OpenAI) 2025-03-07 15:24:22 -05:00
Braulio Fernandes 2a288e6cf0 add temp and max_tokens to Gemini Service 2025-03-07 13:57:25 -05:00
Braulio Fernandes 1e6e70b553 add temperature and max_tokens parameters to complete method 2025-03-07 13:57:25 -05:00
Braulio Fernandes 2e90919424 add max_tokens and temperature for completion with Claude 2025-03-07 13:57:25 -05:00
Braulio Fernandes 986dc9ea1f add temp and max_tokens to options request obj 2025-03-07 13:57:25 -05:00
KernelDeimos 59da18f2a3 dev: expose shell to ANSIShell coreutil commands 2025-03-07 11:41:49 -05:00
jelveh f897eee3e7 Update RecommendedAppsService.js 2025-03-07 08:25:33 -08:00
KernelDeimos 96199cbb54 fix: small fixes for threads 2025-03-05 16:55:09 -05:00
KernelDeimos 53c865c973 dev: add group management SDK 2025-03-05 15:24:52 -05:00
KernelDeimos 7aa3cb7312 dev: puter.js support for group management 2025-03-04 16:43:23 -05:00
KernelDeimos f0a6e493a1 dev: register puter.perms module 2025-03-04 14:39:32 -05:00
KernelDeimos 1f05df68eb dev: add threads module for puter.js 2025-03-04 14:38:30 -05:00
KernelDeimos 01ba6168d9 dev: make thread endpoints more conventional 2025-03-04 14:38:30 -05:00
KernelDeimos 9f3ce50994 dev: add read and list endpoints 2025-03-04 14:38:30 -05:00
KernelDeimos fdf10ef549 dev: add threads delete endpoint 2025-03-04 14:38:30 -05:00
KernelDeimos 90d9b41ec3 dev: add threads API with create and edit 2025-03-04 14:38:30 -05:00
KernelDeimos 02ddfcc567 dev: add puter.perms module to puter.js 2025-03-04 14:37:41 -05:00
KernelDeimos 3276faa5f0 fix: permission request 500 errors
As far as I remember, PermissionService was not using APIError because
it was considered to be only for errors from API endpoints and not
internal calls. However, this never made very much sense: APIError is
really more like "error that Puter's backend actually knows how to
handle" at this point; everything should be APIError and APIError should
probably eventually be renamed.
2025-03-04 13:56:51 -05:00
KernelDeimos 1e86039cf5 dev: add PUT, DELETE to eggspress 2025-03-04 12:58:55 -05:00
Eric Dubé eca5da9c1f Update issue templates 2025-03-03 14:50:06 -05:00
KernelDeimos cfa5c7e715 fix: puter subdomain error response
We were sending a JSON error in what should have been an HTML response.
Additionally, the error message wasn't very clear about the nature of
the problem.
2025-03-03 13:06:14 -05:00
jelveh ae9f5efed0 send event after toolbar is ready and after account is saved 2025-02-28 10:28:40 -08:00
jelveh b56f5c5998 Revert "Remove the Button component from some UI components"
This reverts commit 1eb4c6034e.
2025-02-28 09:23:32 -08:00
jelveh 5c62742fa3 remove unnecessary console.log 2025-02-28 00:14:56 -08:00
jelveh 1eb4c6034e Remove the Button component from some UI components 2025-02-27 23:53:52 -08:00
jelveh c55a13dcd8 Update en.js 2025-02-27 23:19:00 -08:00
KernelDeimos ec0a721143 fix: message coercion bug affecting vision 2025-02-27 14:49:55 -05:00
KernelDeimos 18170f77e2 doc: link videos 2025-02-26 15:42:09 -05:00
KernelDeimos 4486490039 doc: document configuration 2025-02-26 14:59:13 -05:00
KernelDeimos 3666b9f3a2 feat: essential configuration options for deployers
This commit makes everything a ton easier for deployers, adding
configuration options to allow nip.io domains or all origins to access
Puter for ideal LAN or VPN configurations.
2025-02-26 14:18:28 -05:00
KernelDeimos d3da9da9c5 meta: update index.html 2025-02-26 11:35:07 -05:00
KernelDeimos 12a29275c0 meta: add index.html to test something
I'm going to see if a static GitHub Pages page can fetch our GitHub
issues, so I need to commit this file to the repo.
2025-02-26 11:28:45 -05:00
KernelDeimos 3bd12fb5f2 doc: document event core.fs.create.directory
issue: https://github.com/HeyPuter/puter/issues/1122
2025-02-25 18:18:55 -05:00
KernelDeimos e6b3cb3666 fix: get event docs back in sync
I used 'fix' for this instead of 'doc' because I am also adding a
package for code that generates markdown, so this doesn't have the
zero-risk nature typically associated with a "doc: " commit.
2025-02-25 17:52:54 -05:00
KernelDeimos 04f9225af3 chore: update package-lock.json 2025-02-25 17:48:03 -05:00
KernelDeimos 794778d665 fix: dev-center undefined error
I uploaded a video for this one but just realized I never made a commit
for it - it was hiding in my git stash.

So here will be a rare situation that the video link is able to be
placed inside the commit message: https://youtu.be/8XiFR1o5Vuk
2025-02-25 17:21:08 -05:00
KernelDeimos eda376b6cc doc: make first sidebar items make sense 2025-02-25 15:31:40 -05:00
KernelDeimos 2a7bd2ad8d doc: update doc/README.md and genwiki 2025-02-25 15:23:58 -05:00
KernelDeimos efe6f4cb80 doc: update doc/README.md 2025-02-25 15:20:11 -05:00
KernelDeimos 23e5d22439 doc: move el() documentation to gui/doc 2025-02-25 14:57:35 -05:00
KernelDeimos 99684d80e4 doc: generate wiki from repository docs 2025-02-25 14:56:12 -05:00
KernelDeimos 7f372fd1be doc: improve backend intro doc 2025-02-24 16:28:08 -05:00
KernelDeimos 7fd1f9aa5f doc: document backend key locations 2025-02-24 16:28:08 -05:00
KernelDeimos 34fdf3abd9 doc: improve docs organization
- Move extension docs back into this repo
- Add index README.md under `doc/`
- Improve documentation of project structure
2025-02-24 16:28:08 -05:00
KernelDeimos 8ed1f801b8 dev: attempt adding Claude 3.7
At this commit support is not tested. I was unable to get the AI module
in puter.js to call 3.7 instead of the old 3.5 model.
2025-02-24 14:13:43 -05:00
KernelDeimos 759c32ac72 fix: errors after stream starts 2025-02-24 11:42:30 -05:00
Nariman Jelveh ad5be196cc Update README.md 2025-02-24 01:28:37 -08:00
KernelDeimos d081c4f2fe fix(security): patch express via path-to-regexp
As far as I can tell from the block post:
https://blakeembrey.com/posts/2024-09-web-redos/
this vulnerability should not affect releases of Puter before this
update because we do not have any routes with multiple parameters where
the second parameter does not start with '.' or '/'.

However, for the sake of good security hygiene and so `npm audit` looks
nice, we're upgrading the package. (better late than never)
2025-02-21 23:42:47 -05:00
Nariman Jelveh 1cae7fc7d4 Update #DoesItRunPuter.md 2025-02-21 13:26:31 -08:00
KernelDeimos 2ee380ec16 fix: o3 tools with array parameters
Apparently the o3 model things items is a required property for array
types in JSON schema. This is not the case, but we fixed it anyway.
2025-02-20 15:57:50 -05:00
KernelDeimos 7e82c947b1 fix: path update in legacy rename behavior
Change username doesn't go through ll_move, and does not adhere to DRY
alongside the /rename operation. This led to an inconsistency where the
rename behavior in the change username operation didn't update the
cached fsentry path.
2025-02-20 14:10:22 -05:00
KernelDeimos 145d836b9f test: unit test tool calls 2025-02-20 09:41:59 -05:00
KernelDeimos d66e38cc66 fix: message coercion for tool call message
Some services can't tolerate a message with tool calls and an empty
array set on the content property, despite the fact that OpenAI does
seem to support this.
2025-02-19 15:32:07 -05:00
KernelDeimos 9d181741de dev: gemini function calling 2025-02-19 13:16:27 -05:00
Nariman Jelveh d8c49d8b2d Merge pull request #1121 from HeyPuter/revert-1072-fix/success-msg-deploy
Revert "Fix : the issue with the success message not displaying after deployment"
2025-02-17 19:29:54 -08:00
Nariman Jelveh e2d120d81f Revert "Fix : the issue with the success message not displaying after deployment" 2025-02-17 19:29:45 -08:00
Nariman Jelveh 96c4030541 Merge pull request #1072 from mariatouil/fix/success-msg-deploy
Fix : the issue with the success message not displaying after deployment
2025-02-17 19:29:40 -08:00
KernelDeimos 1b5a64043a dev: add openrouter implementation 2025-02-17 18:46:48 -05:00
KernelDeimos 7e76b657bb fix: recursive delete error 2025-02-17 15:31:54 -05:00
Nariman Jelveh d0f32ee2b8 Merge pull request #1119 from Zac0511/patch-4 2025-02-17 09:40:04 -08:00
KernelDeimos feb2ca126f dev: validate attachments 2025-02-17 10:46:02 -05:00
Zac0511 6d8b733cba Update fr.js
Modified 2 translations
2025-02-17 12:49:10 +01:00
Nariman Jelveh 4bc6bf242f Update README.md 2025-02-16 19:46:09 -08:00
jelveh fe5f7cb878 Fix window height when maximized in full page mode 2025-02-15 13:02:57 -08:00
KernelDeimos 870e4aa938 fix: move AppCommandProvider to the end 2025-02-14 16:05:36 -05:00
KernelDeimos 8828d03f86 dev: add gemini to puter.js 2025-02-14 12:15:13 -05:00
KernelDeimos 5513e1c93b dev: add godmode toggle command for apps 2025-02-14 11:16:41 -05:00
KernelDeimos fbd5ffd85d dev: fix cache refresh for invalid origins 2025-02-14 10:29:30 -05:00
ProgrammerIn-wonderland cfa1447df6 fix Uncaught TypeError: Cannot read properties of undefined (reading 'closeCallBack') 2025-02-13 23:22:58 -05:00
KernelDeimos 29834f02c0 release: 2.5.1 2025-02-13 21:50:39 -05:00
KernelDeimos 0bcbc8f784 fix: phoenix changelog 2025-02-13 17:48:21 -05:00
KernelDeimos abd66309c8 dev: update phoenix changelog 2025-02-13 16:57:00 -05:00
KernelDeimos a2413b12b0 dev: de-couple requiring a read from fallback read
IMPORTANT: requires update to database access implementations
2025-02-13 15:11:02 -05:00
Nariman Jelveh 7fca9b79ea Merge pull request #1113 from ProgrammerIn-wonderland/main
Added tab completion to PDEs
2025-02-12 13:43:44 -08:00
ProgrammerIn-wonderland ffaa91f849 Added tab compleition to PDEs 2025-02-12 16:42:24 -05:00
Nariman Jelveh b32011f10f Merge pull request #1111 from HeyPuter/revert-1109-add/browser-ides
Revert "Added Browser IDEs"
2025-02-11 19:37:49 -08:00
Nariman Jelveh 50d5713e8f Revert "Added Browser IDEs" 2025-02-11 19:37:36 -08:00
Nariman Jelveh 1133c4656a Merge pull request #1109 from mojafa/add/browser-ides
Added Browser IDEs
2025-02-11 19:37:18 -08:00
ProgrammerIn-wonderland fd387597bb PDE command provider 2025-02-11 17:49:31 -05:00
KernelDeimos 5169d4bb40 dev: add stream support to Gemini 2025-02-11 16:24:57 -05:00
KernelDeimos b74ec1f69c dev: add Gemini support (non-streaming) 2025-02-11 14:57:17 -05:00
KernelDeimos 74319b44af dev: add more information to lock logs 2025-02-11 14:40:38 -05:00
KernelDeimos c2c5d88336 fix: update package.json 2025-02-11 12:29:01 -05:00
KernelDeimos fa4b38cd02 fix: oops, no export (putility.libs.event) 2025-02-11 11:23:55 -05:00
KernelDeimos e49af481ba dev: make it easier to use putility emitter 2025-02-11 11:10:02 -05:00
KernelDeimos a803d55cfb fix: broken test in putility 2025-02-11 10:54:03 -05:00
mojafa ab704ce4d7 added browser IDE support
Signed-off-by: mojafa <[email protected]>
2025-02-11 03:23:34 +03:00
KernelDeimos 70fde95255 fix: parse body before auth for /down 2025-02-10 17:54:23 -05:00
KernelDeimos e5c3769bd8 fix: fix previous fix 2025-02-10 17:42:12 -05:00
KernelDeimos 390230c5a0 fix: potential fix for /down auth
This is a temporary  workaround for a bug de-syncing http session
cookies.
2025-02-10 17:35:19 -05:00
KernelDeimos 2000b8909f fix: allow command provider to not implement complete method 2025-02-10 17:22:10 -05:00
KernelDeimos ad2ed295b1 dev: fix app close messages from ExecService 2025-02-10 13:59:47 -05:00
jelveh a3513c22a2 do not repeat session picking in popup for file pickers 2025-02-07 18:07:02 -08:00
jelveh 4d380ffa8a remove unnecessary confirmation dialog for file/directory pickers in popups 2025-02-07 17:47:58 -08:00
KernelDeimos 6dcb3777ca dev: fix index_url issue 2025-02-07 15:57:29 -05:00
KernelDeimos ca17f38929 dev: normalize Mistral, get tool calls working
Mistral has a lot of unnecessary quirks because the SDK coerces to
snake_case. We should see if the OpenAI client works with Mistral, and
it it does we'll use that instead so we don't have to maintain all these
exceptional cases.
2025-02-07 15:27:28 -05:00
KernelDeimos 735f275e7c dev: normalize Groq (tool use works) 2025-02-07 14:01:34 -05:00
KernelDeimos 29cd14a01d dev: XAI streaming function calls 2025-02-07 12:55:34 -05:00
jelveh 84b2400650 it fixes it surely! 2025-02-06 19:52:54 -08:00
jelveh d4b4df06fd Use the fetch API in Puter.js's Convert module 2025-02-06 19:45:10 -08:00
jelveh 1e5deabcdb Update package-lock.json 2025-02-06 18:20:12 -08:00
jelveh 949d3ab17c add Convert modules to Puter.js 2025-02-06 18:19:12 -08:00
KernelDeimos 62cf10072a dev: include cost information in usage reports
This adds an incremental migration from models reporting input and
output tokens, to models reporting full token information. This means
AIChatService doesn't need to lookup the model details or know about the
different types of tokens supported by every model.
2025-02-06 17:34:57 -05:00
KernelDeimos f7147ab312 dev: generalize how OpenAIUtil handles usage
The current implementation would break for XAIService because it gets
cumulative usage reports as the stream goes on (whereas OpenAI and
DeepSeek only provide this at the end of the stream).
2025-02-06 17:34:57 -05:00
KernelDeimos 16e2729b1d dev: migrate XAIService to normalized messages 2025-02-06 17:34:57 -05:00
KernelDeimos ce0ab02f39 dev: add file output mode for convert 2025-02-06 17:34:57 -05:00
KernelDeimos 5e30958a14 tweak: enable convert module on selfhosted run 2025-02-06 17:34:57 -05:00
KernelDeimos 2b0e173975 dev: add convert module (and ConvertAPI) 2025-02-06 17:34:57 -05:00
ProgrammerIn-wonderland 12806a2395 only close TLS socket once 2025-02-06 17:13:04 -05:00
ProgrammerIn-wonderland 26666fe666 new API puter.net.generateWispV1URL() 2025-02-05 16:56:57 -05:00
KernelDeimos c8bed6eaee dev: add deepseek tool calls 2025-02-05 15:32:35 -05:00
KernelDeimos d4eff82d3c dev: add email attachments 2025-02-05 14:12:05 -05:00
KernelDeimos da4a1a182b dev: de-couple OpenAI SDK utilities from service
This change will be helpful for making behavior across OpenAI-compatible
APIs consistent.
2025-02-05 11:36:07 -05:00
KernelDeimos 50383aab59 dev: try this for now 2025-02-04 16:45:42 -05:00
KernelDeimos e6fc773706 fix: unfixed fix from earlier 2025-02-04 16:36:06 -05:00
KernelDeimos 9dbba292c4 dev: coerce semantics of tool calls/use in messages
If these APIs were standardized this would have been so much less
painful, but alas, tool calls are implemented completely differently
between Claude and OpenAI. Good job guys.
2025-02-04 16:15:47 -05:00
KernelDeimos 484bb5c201 fix: parser error for empty json buffer 2025-02-04 15:42:03 -05:00
KernelDeimos d2358d234b fix: fix name and id for openai tool calls 2025-02-04 14:36:30 -05:00
KernelDeimos 29c0241119 fix: let messages with tool_calls have content=null 2025-02-04 14:21:14 -05:00
KernelDeimos 8f27742038 fix: repair stream end 2025-02-04 14:09:28 -05:00
KernelDeimos e2797c38d0 fix: add type=text 2025-02-04 14:02:01 -05:00
KernelDeimos 747614c28b dev: integrate stream normalization for OpenAI 2025-02-04 13:57:10 -05:00
KernelDeimos 437467e0ce dev: integrate stream normalization for Claude 2025-02-04 13:10:14 -05:00
Nariman Jelveh 0ce8fdc9f6 Merge pull request #1037 from HeyPuter/Add-TRADEMARK.md
Create TRADEMARK.md
2025-02-03 14:23:24 -08:00
jelveh 4e17908664 Update TRADEMARK.md 2025-02-03 14:22:01 -08:00
KernelDeimos f54b7b7b3d dev: PoC for stream normalization 2025-02-03 16:57:13 -05:00
KernelDeimos f0434435c4 dev: option to normalize AI response (non-streaming) 2025-02-03 14:03:27 -05:00
KernelDeimos 57231d31e4 dev: add email module to run-selfhosted 2025-02-03 13:14:52 -05:00
KernelDeimos cfa3fde436 dev: error handling and text encoding 2025-02-03 13:11:29 -05:00
KernelDeimos 55d052cfc2 fix: various issues with Mail module 2025-02-03 12:25:22 -05:00
KernelDeimos e281dc92e3 dev: add mail module 2025-02-03 10:08:39 -05:00
KernelDeimos dc90999fee dev: enable gpt-o3-mini 2025-01-31 14:48:49 -05:00
KernelDeimos d88dedb66c dev: normalize Claude input
- add merging of same-role messages for all normalized inputs
- generalize Claude-specific system message extraction
- remove redundant behavior from Claude
2025-01-31 11:22:06 -05:00
KernelDeimos 40aa52225f dev: make ai fallback configurable 2025-01-31 10:32:36 -05:00
Nariman Jelveh e257dceb93 Merge pull request #1100 from Zac0511/patch-4
Update fr.js
2025-01-31 05:04:24 -08:00
Zac0511 6c2fa4d398 Update fr.js
Fixed some translations and deleted a copy of billing translations
2025-01-31 09:50:49 +01:00
KernelDeimos 2d12949a08 dev: improve user request error detection 2025-01-30 15:40:10 -05:00
KernelDeimos 60eef2fc67 fix: buffer incomplete JSON objects from AI stream
- simplify ndjson stream to get complete lines instead of chunks
- add buffering for incomplete lines
2025-01-30 15:21:05 -05:00
KernelDeimos af3d732fc4 dev: async await for puter-exec 2025-01-30 13:37:15 -05:00
KernelDeimos d0eca6dafb Revert "dev: remove redundant message adaption from claude"
This reverts commit 0c42613ff0.
2025-01-30 12:23:27 -05:00
KernelDeimos 760eb55b69 Revert "fix: mistake in 0c42613"
This reverts commit 8ffd0004b3.
2025-01-30 12:23:06 -05:00
KernelDeimos 8ffd0004b3 fix: mistake in 0c42613 2025-01-30 12:19:07 -05:00
KernelDeimos 05ced4e625 Revert "dev: remove max_tokens from Claude"
This reverts commit 3bce60893e.
2025-01-30 12:18:26 -05:00
KernelDeimos 3bce60893e dev: remove max_tokens from Claude 2025-01-30 12:09:35 -05:00
KernelDeimos 0c42613ff0 dev: remove redundant message adaption from claude 2025-01-30 10:11:52 -05:00
KernelDeimos babe9f8ede dev: remove now-redundant token count logic from openai service 2025-01-29 16:58:30 -05:00
KernelDeimos 7151723894 dev: use message normalization and clean up openai service 2025-01-29 16:45:15 -05:00
KernelDeimos 0009ededfa dev: implement generic extract_text for ai messages 2025-01-29 16:08:30 -05:00
KernelDeimos e9279ffb36 dev: implement message normalization 2025-01-29 15:28:14 -05:00
KernelDeimos e6ad54be19 dev: puterjs exec module (2) 2025-01-29 13:58:21 -05:00
KernelDeimos cbe02a4489 dev: puterjs exec module 2025-01-29 13:57:50 -05:00
KernelDeimos 77d6bb2d8c dev: always select highest version of the specified language 2025-01-29 10:31:58 -05:00
KernelDeimos dcd47bc4cf fix: fix microcents to USD conversion in AIChatService
This only affects a value sent to TrackSpendingService. Cost
calculations related to user's quotas / billing remain unaffected.
2025-01-28 16:45:48 -05:00
KernelDeimos 913c1b7836 test: add unit test for TimeWindow
TimeWindow is used by TrackSpendingService for two purposes:
- tracking cost within a time window
- preventing duplicate alarms within a cooldown period

It is important to test this to ensure alarms related to AI costs are
accurate.
2025-01-28 16:16:00 -05:00
KernelDeimos 1dad2e8716 dev: allow specifying runtime version 2025-01-28 14:25:45 -05:00
KernelDeimos c852a287e8 dev: push exec submission updates to client 2025-01-28 13:41:26 -05:00
KernelDeimos 4005e9667c dev: implement custom backoff strategy for judge0 2025-01-28 13:27:26 -05:00
KernelDeimos 5718071c08 dev: add judge0 exec and polling 2025-01-28 12:55:54 -05:00
KernelDeimos 0fac03a05a fix: claude duplicate messages in stream 2025-01-28 11:27:47 -05:00
KernelDeimos c96d3b546c dev: update selfhosted default modules 2025-01-28 10:37:39 -05:00
KernelDeimos 3451308e48 dev: tweak supported languages list 2025-01-28 10:20:31 -05:00
KernelDeimos 5b04d1afe1 dev: increase alarm threshold for ai use 2025-01-28 00:35:40 -05:00
KernelDeimos 97f86e564f dev: oh my Claude
Sometimes tool use requests are streamed as JSON, but sometimes they're
streamed as an empty string (causing the JSON parser to error). Had they
not streamed anything we actually would've responded correctly, but
what they stream implies "this empty string is the JSON input" which is
incorrect. Oh well.
2025-01-27 21:32:50 -05:00
KernelDeimos 3f99d975c0 dev: initial work on judge0 implementation 2025-01-27 16:19:16 -05:00
KernelDeimos 81ee52b00f dev: add puterexec module 2025-01-27 15:38:29 -05:00
KernelDeimos 4d826c0602 dev: process language information from judge0 2025-01-27 14:50:40 -05:00
KernelDeimos ecc89678d1 doc: add examples of streaming tool use 2025-01-27 14:13:01 -05:00
KernelDeimos 5ad53e061a dev: get streaming tool use to work in Claude 2025-01-27 13:53:56 -05:00
KernelDeimos d00061ae2f dev: improve accuracy of TrackSpendingService 2025-01-27 11:36:54 -05:00
jelveh 52c1adb7eb Update globals.js 2025-01-26 17:05:43 -08:00
jelveh bb348e4bd5 Update UIWindowMyWebsites.js 2025-01-26 11:20:07 -08:00
KernelDeimos 6083e3ac52 fix: skip request-count usage check via AIChatService 2025-01-24 17:58:04 -05:00
KernelDeimos db9597a7b5 doc: add example function calling requests 2025-01-24 16:35:46 -05:00
KernelDeimos aae18e6878 dev: support POST requests in puter.http 2025-01-24 15:38:19 -05:00
KernelDeimos c7f3e0b937 fix: remove log from InternetModule 2025-01-23 21:27:14 -05:00
KernelDeimos 1fde01aa04 dev: enable tool use for Claude 2025-01-23 20:21:14 -05:00
KernelDeimos e9f6266062 dev: add deepseek AI to backend 2025-01-23 20:07:41 -05:00
KernelDeimos 40030ebc94 dev: enable tool-use in Claude 2025-01-23 16:46:13 -05:00
KernelDeimos 54a104276b dev: add tools normalization/converting 2025-01-23 16:15:32 -05:00
KernelDeimos bcdec32ba2 doc: log some AI responses 2025-01-23 15:20:31 -05:00
KernelDeimos 06452f5283 fix: small workaround for duplicate close 2025-01-23 14:58:23 -05:00
KernelDeimos 36dc9664ad fix: race condition and buffer issue in puter.http
The call to sock.write() wasn't waiting for the 'open' event, which
worked fine over non-TLS sockets by chance. Also, responses with only
a single WISP packet were resulting in buffered response data not
being sent to the caller.
2025-01-23 14:14:13 -05:00
KernelDeimos 3f5b34cd34 fix: missing some buffer contents in no-keepalive 2025-01-23 13:43:21 -05:00
KernelDeimos ee136f4168 dev: add extra safeguards for system user 2025-01-23 11:46:36 -05:00
KernelDeimos 7909cae76e dev: check 'invalid_request_error' hint from openai 2025-01-23 11:46:36 -05:00
jelveh 6f7ab2ab17 Update RecommendedAppsService.js 2025-01-22 21:38:07 -08:00
jelveh bfdf815f61 Update RecommendedAppsService.js 2025-01-22 21:34:27 -08:00
jelveh 925077916e Update RecommendedAppsService.js 2025-01-22 21:29:30 -08:00
KernelDeimos 9cbb741a8a fix: new edge cases with function calls / tools 2025-01-22 19:55:33 -05:00
KernelDeimos 1256614ec2 dev: add support for tools 2025-01-22 19:28:05 -05:00
KernelDeimos cf7aa27543 fix: oops, we're passing negative values; let's just remove this 2025-01-22 18:13:41 -05:00
KernelDeimos 61824ea04b fix: oops we still need that 2025-01-22 18:04:56 -05:00
KernelDeimos 7f50da5082 dev: use Connection: close for http requests by default 2025-01-22 17:46:51 -05:00
KernelDeimos 8143e5700f fix: remove hard-coded token limit for OpenAI 2025-01-22 17:28:18 -05:00
KernelDeimos 2b505caf98 dev: implement puter.http 2025-01-22 16:16:36 -05:00
KernelDeimos 6f39365b24 fix: wisp relay authentication 2025-01-22 14:20:53 -05:00
KernelDeimos 591c6c0fd3 dev: add wisp relay service 2025-01-22 11:45:58 -05:00
KernelDeimos 4c72e9d285 dev: separate process management from DevWatcherService 2025-01-22 10:08:06 -05:00
KernelDeimos 44c6f57c7a dev: add system kv access for extensions 2025-01-20 13:33:02 -05:00
KernelDeimos e8f5450cb0 fix: reduce code paths for querystrings 2025-01-20 10:34:25 -05:00
jelveh 4e578e9b28 update copyright date 2025-01-19 22:27:31 -08:00
jelveh 55f3f07ee5 Implement puter.ui.wasLaunchedWithItems() 2025-01-19 22:20:19 -08:00
Nariman Jelveh f13fa2553c Merge pull request #1093 from AryanTavish/main
Complete the Norwegian Bokmål (Norsk Bokmål) translation of Puter
2025-01-19 16:34:45 -08:00
jelveh ed2eea7c6b Update nb.js 2025-01-19 16:34:28 -08:00
Aryan Tavish 967da6ba24 Update nb.js (removed object billing to make indivisual string keys )
For example, instead of:

billing = {
    change_payment_method: "Endre",
    // ...
}
changed to:

'billing.change_payment_method': "Endre",
// ...
2025-01-18 10:19:30 +05:30
KernelDeimos d03952b237 fix: icons 2025-01-17 18:28:19 -05:00
Nariman Jelveh f27ef665ee Merge pull request #1094 from ProgrammerIn-wonderland/main
more socket fixes
2025-01-17 14:08:14 -08:00
ProgrammerIn-wonderland 01fc301f1e replace hardcoded api.puter.com with puter.APIOrigin 2025-01-17 17:05:51 -05:00
ProgrammerIn-wonderland 5798fcd042 automatic reconnection on disconnect 2025-01-17 17:05:42 -05:00
KernelDeimos 17d0738d62 dev: no_temp_user event setting 2025-01-17 13:09:00 -05:00
Nariman Jelveh 7d24fa2b32 Update nb.js 2025-01-16 19:07:44 -08:00
aryantavish 3883af2e96 Complete the Norwegian Bokmål (Norsk Bokmål) translation of Puter 2025-01-17 07:40:08 +05:30
KernelDeimos 56ae760bea dev: extension support for request measurements 2025-01-15 11:59:30 -05:00
KernelDeimos 38ccc82c8e fix: subdomains to deleted files tried to deref fs node 2025-01-15 11:11:57 -05:00
KernelDeimos 37ca89228c fix: app icon empty string should be skipped 2025-01-15 11:11:57 -05:00
Nariman Jelveh 8cff90bdc3 Merge pull request #1092 from ProgrammerIn-wonderland/main
move try-catch outside of loop in TLS readstream
2025-01-15 08:00:31 -08:00
ProgrammerIn-wonderland f177732a0e move try-catch outside of loop in TLS readstream 2025-01-15 10:11:58 -05:00
Nariman Jelveh d638f371d0 Merge pull request #1091 from ProgrammerIn-wonderland/main
add 0x01 and 0x03 wisp messages
2025-01-14 21:03:21 -08:00
ProgrammerIn-wonderland b35cf776aa add 0x01 and 0x03 wisp messages 2025-01-15 00:01:43 -05:00
Nariman Jelveh 4fd6da9903 Merge pull request #1090 from ProgrammerIn-wonderland/main
TLS Support through rustls-wasm
2025-01-14 21:01:29 -08:00
ProgrammerIn-wonderland 98be5c1323 error handling on TLS handshake and reporting wisp errors to client 2025-01-14 23:54:47 -05:00
ProgrammerIn-wonderland 6261d7c90c WIP TLS support 2025-01-14 21:20:00 -05:00
Nariman Jelveh 365fac907c Merge pull request #1088 from ProgrammerIn-wonderland/main
add close to psocket
2025-01-14 14:52:46 -08:00
ProgrammerIn-wonderland a5e4840920 add close() 2025-01-14 17:51:24 -05:00
KernelDeimos 766c235cc7 fix: save_account case for disable_user_signup 2025-01-14 17:23:39 -05:00
Raiu 8d5860d733 feature: disable creation of temp_users and user signup through config 2025-01-14 17:06:14 -05:00
Raiu 78ac033a1c fix: use .get() for Map lookup. fix: correctly set url and url_paths. fix: null check to throw error. 2025-01-14 17:06:14 -05:00
KernelDeimos 7fa0822584 dev: measure response data amount 2025-01-14 16:17:55 -05:00
KernelDeimos 113ed31336 fix: ensure puter.signup emit resolves 2025-01-14 14:41:27 -05:00
KernelDeimos ca9e74ece4 dev: measure request transfer amount 2025-01-14 13:43:50 -05:00
KernelDeimos 4f3a6f7bbc dev: ll_rmdir,ll_rmnode -> provider.(rmdir,unlink) 2025-01-14 13:06:41 -05:00
KernelDeimos 5bf11adff3 dev: add utility to measure bytes in a stream 2025-01-14 10:45:23 -05:00
KernelDeimos 202e7f06e2 test: cleanup and tweak batch test
One of the test cases has been rendered redundant so it has been
removed. Another test was changed to overwrite a file as it's expected
to already exist.
2025-01-14 09:42:20 -05:00
KernelDeimos d9822a4f09 fix: --onlycase param broke cartesian tests 2025-01-14 09:18:33 -05:00
KernelDeimos f359ae193e fix: empty response when mkdir is a no-op 2025-01-13 15:27:02 -05:00
KernelDeimos 807c3ba5ec fix: mkdir with create_missing when some parents exist
There was an issue affecting mkdir requests with create_missing_parents
set to true which prevented the correct behavior if some of the listed
parents were already present. This commit ensures mkdir selects the
deepest existing node as the parent before proceeding.
2025-01-13 15:16:52 -05:00
KernelDeimos fb7025164e fix: possible out-or-order response objects from batch 2025-01-13 14:39:43 -05:00
KernelDeimos 5ef75e5df3 fix: app data check error in write 2025-01-13 14:11:26 -05:00
KernelDeimos 9215937064 test: remove tests for unsupported behavior in mkdir 2025-01-13 13:54:59 -05:00
KernelDeimos c9215d9e86 test: update outdated test cases 2025-01-13 11:38:00 -05:00
KernelDeimos 9d9d97fd00 fix: missing parent dirs created in move 2025-01-13 10:07:49 -05:00
KernelDeimos 6f4b1bf94a fix: missing changes to run-selfhosted.js 2025-01-13 09:11:39 -05:00
jelveh 706a2403e1 When navigating context menu using keyboard skip over item dividers 2025-01-11 14:59:03 -08:00
KernelDeimos d6bbba7bf0 fix: appease mocha's import requirements 2025-01-10 17:40:02 -05:00
KernelDeimos 6a6bfa034f fix: error msg for invalid puter-ocr urls 2025-01-10 17:37:44 -05:00
KernelDeimos 14cc8f7bc0 doc: notes about mountpoint hurdles 2025-01-10 16:44:46 -05:00
KernelDeimos e1bdee1abe dev: ability to run api tests from puter terminal 2025-01-10 16:24:08 -05:00
KernelDeimos 2993b887bd dev: experimental local-terminal service 2025-01-10 14:12:30 -05:00
KernelDeimos 7293fdbbfa dev: ll_move -> provider.move 2025-01-10 13:10:43 -05:00
KernelDeimos 28c5800d06 sync: package-lock.json 2025-01-10 10:27:40 -05:00
KernelDeimos 75aaaa66a8 fix: improper 500 in wisp token verify 2025-01-10 10:27:40 -05:00
KernelDeimos 7aa886d573 fix: actor param in legacy /write 2025-01-10 10:27:40 -05:00
jelveh a295420f58 fix: new desktop height calculation when resizing browser window 2025-01-09 16:15:32 -08:00
KernelDeimos 8fabf014a9 fix: circular imports 2025-01-09 19:07:31 -05:00
KernelDeimos eac2ddf8da sync: backend ver with puter ver 2025-01-09 19:07:31 -05:00
jelveh eb59c1a102 Don't console.log auth token 2025-01-09 15:32:33 -08:00
Nariman Jelveh d65ee6cfb1 Merge pull request #1085 from ProgrammerIn-wonderland/main
networking API beginnings
2025-01-09 15:25:40 -08:00
ProgrammerIn-wonderland 1ed3bccaa5 networking API beginnings 2025-01-09 18:11:28 -05:00
KernelDeimos d9a8ea095c dev: try removing npm registry from Dockerfile 2025-01-09 17:38:53 -05:00
KernelDeimos dd86724941 dev: add cartesian case selector 2025-01-09 16:36:37 -05:00
KernelDeimos 405d9b35aa move: api-tester to monorepo 2025-01-09 15:51:50 -05:00
KernelDeimos 44ad3c5781 fix: test and improve boolify 2025-01-09 15:45:15 -05:00
KernelDeimos f60c008158 fix: skip test files in mod lib loading 2025-01-09 15:41:40 -05:00
KernelDeimos 6d196d59f0 fix: shortcut issue 2025-01-09 11:51:26 -05:00
KernelDeimos 740fdb592e fix: test for get-launch-apps 2025-01-09 11:10:41 -05:00
KernelDeimos 3097b86597 fix: add package-lock.json 2025-01-09 10:24:12 -05:00
KernelDeimos 8963eb0c4f fix: try redundant npm install after build stage 2025-01-08 15:23:03 -05:00
KernelDeimos 686d3de518 fix: I'ma buy GitHub a coffee and spill it on their servers if this works 2025-01-08 14:47:49 -05:00
KernelDeimos a13af7e31a fix: oh, right; there's two of them 2025-01-08 12:20:05 -05:00
KernelDeimos 63b3376b48 dev: try upgrading docker node version 2025-01-08 12:11:43 -05:00
KernelDeimos 0cb1ca7989 chore: date and update version 2025-01-07 15:51:44 -05:00
KernelDeimos 691be3802b doc: update CHANGELOG.md 2025-01-07 15:50:26 -05:00
KernelDeimos 4085d508b0 dev: update release notes generator 2025-01-07 15:33:53 -05:00
KernelDeimos 803f440d55 fix: terminal not loading in self-hosted 2025-01-07 15:13:35 -05:00
KernelDeimos f5a7b06d40 doc: fix generated comment errors (batch 2) 2025-01-07 14:35:54 -05:00
KernelDeimos 7deb0c5692 fix: don't call /rao in gui 2025-01-06 21:20:13 -05:00
jelveh 6a184d52b4 Update copyright notice dates in license headers 2025-01-06 15:18:22 -08:00
KernelDeimos 540821c759 doc: fix generated comment errors (batch 1) 2025-01-06 16:47:30 -05:00
KernelDeimos 15898fe5b7 chore: update license headers 2025-01-06 11:55:17 -05:00
KernelDeimos 0fb05309c2 doc: miscellaneous comment fixes 2025-01-06 11:24:18 -05:00
KernelDeimos 57befd310d doc: fix comments for list(), models(), complete() 2025-01-06 10:04:54 -05:00
jelveh 9c181516fc lol there was an empty file in there! 2025-01-05 23:20:17 -08:00
jelveh 5f81299bf0 cleaned up as much as i could 2025-01-05 23:14:47 -08:00
jelveh f3f1a1f188 Copyright notice fix 2025-01-05 22:39:20 -08:00
Nariman Jelveh 737a3a0ebc Merge pull request #1082 from ahmadkani/main
English README translated to Persian language
2025-01-04 14:54:22 -08:00
Ahmad e633d11dbb English document translated to Persian language 2025-01-04 10:47:36 +03:30
jelveh a03314f8b8 Update dev-center.js 2025-01-03 21:05:55 -08:00
KernelDeimos 9b0f220556 dev: request /rao from sites 2025-01-03 14:32:24 -05:00
KernelDeimos 71f221dd07 dev: ll_copy -> provider.copy_tree 2025-01-03 14:32:24 -05:00
KernelDeimos 8a9164d7c5 fix: missing ll_copy import 2025-01-03 13:28:03 -05:00
jelveh 34fcae9c56 Update UIWindow.js 2025-01-03 09:48:00 -08:00
jelveh 3e3db2327e Update UIWindow.js 2025-01-03 09:42:15 -08:00
KernelDeimos 63401f2c83 dev: DRY base64 app icons from streams 2025-01-03 11:46:01 -05:00
KernelDeimos 06a67a3b22 dev: migrate /rao to actor-capable auth 2025-01-03 10:24:46 -05:00
jelveh cd5866dd6b Update UITaskbarItem.js 2025-01-02 18:48:24 -08:00
jelveh 6fbd00f2ec Update style.css 2025-01-02 18:14:49 -08:00
jelveh 1ef8c36135 quick fix 2025-01-02 18:05:38 -08:00
jelveh ddd1c254f0 Update style.css 2025-01-02 17:20:47 -08:00
jelveh 3a47bc69d9 Add tooltips to vague icons in Dev Center 2025-01-02 17:14:08 -08:00
KernelDeimos a8fc4669e8 dev: fix default origins in puter.js 2025-01-02 16:23:02 -05:00
jelveh f1d0f9cd1f Update style.css 2025-01-02 11:04:00 -08:00
KernelDeimos 3e4c8ab56b dev: add wisp auth endpoints 2025-01-02 12:45:52 -05:00
KernelDeimos 13003c486f fix: bad uuid reference to resourceService 2025-01-02 10:53:37 -05:00
jelveh 626c453f19 Add more sub-sections to ACCEPTABLE USES 2025-01-01 10:46:25 -08:00
jelveh 3856ec476d Update TRADEMARK.md 2025-01-01 10:16:06 -08:00
jelveh 0c5f780f59 Merge branch 'main' of https://github.com/heyputer/puter 2025-01-01 10:01:41 -08:00
Nariman Jelveh 314d373527 Merge pull request #1079 from HeyPuter/revert-1050-issue-1000-drag-drop-fix
Revert "Fix: drag-and-drop issue: files not appearing on desktop automatically"
2025-01-01 09:49:44 -08:00
Nariman Jelveh 774a75401a Revert "Fix: drag-and-drop issue: files not appearing on desktop automatically" 2025-01-01 09:49:33 -08:00
Nariman Jelveh 55687bb412 Merge pull request #1050 from mariatouil/issue-1000-drag-drop-fix
Fix: drag-and-drop issue: files not appearing on desktop automatically
2025-01-01 09:49:23 -08:00
jelveh 4691af3a6f Update AppInformationService.js 2024-12-31 21:27:42 -08:00
jelveh a0da1e06e3 Use puter.ui's spinner for all spinners in Dev Center 2024-12-31 20:46:05 -08:00
KernelDeimos ad8a3978c0 fix: allow localhost for development 2024-12-31 17:16:09 -05:00
KernelDeimos 29471a752f dev: ll_readdir -> provider.readdir 2024-12-31 15:43:04 -05:00
KernelDeimos 0ef1849013 dev: make puterfs a mountpoint 2024-12-31 15:43:04 -05:00
jelveh 5d8ccf8c9e Use the correct date formatting in get_stats depending on DB engine 2024-12-31 11:21:08 -08:00
jelveh 13e5f7f69f Replace non-existent timestamp column with ts in get_stats 2024-12-31 10:53:46 -08:00
KernelDeimos 9d578b8d1f dev: begin de-coupling FSNodeContext/PuterFS 2024-12-31 13:15:01 -05:00
KernelDeimos f7196991fc refactor: rm legacy FSAccessContext and systemfs 2024-12-31 10:33:39 -05:00
jelveh 539b31cc5b Don't allow dropping of Launcher icons after trash in taskbar. 2024-12-30 22:02:42 -08:00
jelveh 4da9f525da delete components that aren't used 2024-12-30 20:39:51 -08:00
KernelDeimos 2728761d3c dev: remove unnecessary filesystem methods
These used to serve a purpose but now they only cause a dependency loop
between LL*/HL* operations and FilesystemService itself, making it
difficult to strategize filesystem behavior.
2024-12-30 15:52:10 -05:00
KernelDeimos dacbbf033d fix: rewrite confusing log message 2024-12-30 15:34:12 -05:00
KernelDeimos 233260233c fix: AppInformationService initialization 2024-12-30 15:23:37 -05:00
KernelDeimos 47a4313d92 fix: dev center app icon SVG issue 2024-12-30 13:39:12 -05:00
KernelDeimos 23eab63776 fix: app icon double-encode bug
When getting a stream for an SVG icon from AppIconService with a
previously-fetched stored icon provided, a double-encoding bug was
preventing a valid image from being obtained.
2024-12-30 13:38:41 -05:00
KernelDeimos a6b9d33d27 fix: first read of recommended apps 2024-12-30 12:55:44 -05:00
KernelDeimos 055ba7d9df dev: move recommended apps to service with cache invalidation
Adds an event for app invalidation.

Moves iconify_apps to AppIconService and adds RecommenededAppsService,
which holds some logic that used to be in get-launch-apps. The event for
app invalidation is then used by RecommenededAppsService to determine
when to clear the recommended apps cache.
2024-12-30 12:38:51 -05:00
KernelDeimos c1961dd54e dev: move app services to apps module
Moves AppIconService, OldAppNameService, and ProtectedAppService to the
new apps module to keep things organized, and updates imports. There
were no interesting init errors. Services creating a database at init
were tested for failures but this wasn't an issue. It turns out
initializing with a database accessor before the db service inits is
okay, but using that database accessor at init is not.
2024-12-30 11:03:27 -05:00
KernelDeimos 2de442be92 dev: add apps module, migrate AppInformationService
There are now several services related to apps, and
RecommendedAppsService is about to be added, making this a good time to
create a separate module for these services and migrate the legacy
service AppInformationService.

During migration it was realized that most of the initialization needed
to occur at boot.consolidation rather than boot.init because the
database needs to be initialized first.
2024-12-30 10:19:02 -05:00
jelveh 3ffb3cbc74 Remove credentialless from Dev Center advanced section 2024-12-29 22:13:11 -08:00
jelveh a105192882 Update dev-center.js 2024-12-29 21:53:43 -08:00
jelveh 3b60e9913e Update dev-center.js 2024-12-29 19:25:13 -08:00
jelveh cc0abf9f3b Update style.css 2024-12-29 18:47:32 -08:00
jelveh 0d0f429bd8 Add icons to dev center sub tabs 2024-12-29 18:44:06 -08:00
jelveh c9fe08cea5 Update style.css 2024-12-29 18:00:12 -08:00
jelveh 5da8872315 Update dev-center.js 2024-12-29 17:20:59 -08:00
jelveh be24f2acec Update dev-center.js 2024-12-29 16:53:09 -08:00
jelveh bc0e7e12b5 Add better grouping and chart labeling for dev center analytics 2024-12-29 16:42:31 -08:00
jelveh 4f88ee37de Analytics for apps 😎 2024-12-29 14:55:59 -08:00
Nariman Jelveh 3b7a051d79 Add Ritesh Sahu to SECURITY-ACKNOWLEDGEMENTS.md 2024-12-29 10:24:33 -08:00
jelveh 2bdaac6177 Update fuzz.js 2024-12-28 16:49:26 -08:00
jelveh 14cb77d544 Update fuzz.js 2024-12-28 15:42:40 -08:00
jelveh c58788805d Update dev-center.js 2024-12-28 14:48:01 -08:00
jelveh 3eff05d97d add a little STYLE to analytics 2024-12-27 22:05:15 -08:00
jelveh 116c3d358a add simple analytics tab for Dev Center 2024-12-27 21:52:17 -08:00
jelveh ac8068a139 No need for params when passing params to Apps driver 2024-12-27 18:24:09 -08:00
jelveh d7aa08b345 Revert "if clichouse exists hit it in _refresh_app_stats"
This reverts commit 9867d26432.
2024-12-27 17:53:43 -08:00
jelveh 9867d26432 if clichouse exists hit it in _refresh_app_stats 2024-12-27 17:47:19 -08:00
jelveh 7252d2ef4f Check cache first when returning stats for the all period in the AppInformationService 2024-12-27 17:21:17 -08:00
jelveh 027f52d0fd Update AppInformationService.js 2024-12-27 16:55:31 -08:00
jelveh 9f5a138047 add analytics to the Apps driver 2024-12-27 14:39:51 -08:00
KernelDeimos c3fb0bca41 doc: document how to create a driver 2024-12-27 17:23:30 -05:00
KernelDeimos 396498f88a dev: try a different approach for trigger_download 2024-12-27 15:27:03 -05:00
KernelDeimos 5e844205b3 dev: update/cleanup PerformanceMonitor 2024-12-27 13:15:55 -05:00
KernelDeimos 33d094322f dev: change cache score for fs 2024-12-27 10:58:53 -05:00
jelveh 8daf1a5469 Update keyboard.js 2024-12-26 20:57:40 -08:00
jelveh c58c0facda Update get-launch-apps.js 2024-12-26 20:30:20 -08:00
jelveh 93aa83bdf7 change apps in taskbar and launcher 2024-12-26 20:21:46 -08:00
jelveh 5f5eeb2a06 Use alerts to show error message when signing up temp user 2024-12-26 17:28:46 -08:00
jelveh e74aa13187 Send puter.signup event before signup process starts 2024-12-26 17:14:11 -08:00
jelveh 76654e65de Fix the issue with contextmenu going completely nuts when opened near the right edge of the screen 2024-12-26 13:43:34 -08:00
jelveh 68fb7e8291 Update AppInformationService.js 2024-12-25 18:26:20 -08:00
jelveh e263c2be95 Update AppInformationService.js 2024-12-25 18:21:36 -08:00
jelveh 89eb6a80e1 AppInformationService can now use clickhouse to pull metrics 2024-12-25 17:57:22 -08:00
jelveh 3d32f4123b Send more infor in the puter.app_open event 2024-12-24 22:52:07 -08:00
KernelDeimos efd4730f75 fix: prefix peer addresses with protocol 2024-12-24 16:49:22 -05:00
KernelDeimos d386096467 feat: hash-based distributed cache inval 2024-12-24 16:19:58 -05:00
KernelDeimos eb7494ce55 dev: measure cache rate and fix an edge-case 2024-12-24 14:04:22 -05:00
KernelDeimos 7c29d7c16d dev: smaller readdir app icons 2024-12-24 13:11:39 -05:00
jelveh 0859543ca3 Update TRADEMARK.md 2024-12-23 21:51:15 -08:00
KernelDeimos 498d6ed3d8 clean: remove unnecessary additional method 2024-12-23 15:49:15 -05:00
KernelDeimos 728ecbfb03 fix: clone message object 2024-12-23 15:27:25 -05:00
jelveh 38adf9fce3 Update TRADEMARK.md 2024-12-23 12:13:29 -08:00
KernelDeimos 35cc83a560 dev: filter topic ARNs (and tweaks) 2024-12-23 14:58:39 -05:00
KernelDeimos 5ed2f39ec7 dev: add Amazon SNS integration
There were a few things which made this rather difficult:
- AWS SDK doesn't appear to have a utility to validate message
  signatures.
- The only available node.js module that does this is known to be
  unreliable.
- SNS sends 'text/plain' MIME type even though the data is in JSON
  format, so a middleware had to be added to account for this.
- We don't accept POST requests with no Origin header. Since SNS doesn't
  send the Origin header, an exception had to be made for this.
- The endpoint needs to be public and SNS doesn't seem to have a
  proxying utility for developers such as what Stripe has.
- Because of the above point, debugging time was affected by deployment
  time to the staging server.
2024-12-23 14:53:18 -05:00
KernelDeimos 2dc6c4737b fix: timing for PrefixLogger call to /whoami
This commit fixes the timing of the /whoami call used for the
PrefixLogger (a logger for puter.js that displays app names) to ensure
the API origin and token are available. This is done by waiting for a
service called 'api-access' to be initialized first.

This was discovered while testing changes for /whoami responses that
display icons, because the current behavior breaks the call for
non-puter.com instances.
2024-12-23 11:50:30 -05:00
KernelDeimos cb2653b84d dev: no icons form /whoami calls without icon_size
Calls to `/whoami` generally don't require app icons. Fetching icons of
the smallest size still incurs round-trip latency from the database and
S3, as well as additional delay for any retries due to failed icon
generation.

Although this is technically a regression in `/whoami`, the impact is
localized to Puter's desktop only because apps are not allowed to
receive taskbar icons.
2024-12-23 11:26:44 -05:00
KernelDeimos d1bec45df6 dev: fallback icon read 2024-12-23 10:45:04 -05:00
jelveh 665f5559e1 make email confirmation window responsive 2024-12-23 06:59:09 -08:00
KernelDeimos e56a62c539 fix: try catching icon read errors before stream
Current issue with get-launch-apps wasn't fixed by catching errors while
reading the stream so this next attempt catches errors from the call to
start reading.

If the error occurs asynchronously this may not work either.
2024-12-23 09:50:01 -05:00
jelveh e736e428d6 disable email confirmation digit input while confirming 2024-12-23 06:43:46 -08:00
KernelDeimos ada051b9b8 fix: try catching on stream_to_buffer 2024-12-23 09:40:22 -05:00
jelveh d922c848ce request 64x64 icon sizes when opening apps 2024-12-23 06:17:16 -08:00
Nariman Jelveh eb26eacdc2 Merge pull request #1078 from HeyPuter/revert-1076-patch-1
Revert "Create devcontainer.json"
2024-12-22 12:07:28 -08:00
Nariman Jelveh ce0b4b9394 Revert "Create devcontainer.json" 2024-12-22 12:07:17 -08:00
Nariman Jelveh 613c75f1ed Merge pull request #1076 from akamas/patch-1
Create devcontainer.json
2024-12-22 12:07:09 -08:00
jelveh 6c1226bc8c emit an event when an app is opened 2024-12-21 22:44:20 -08:00
jelveh 55073189bb cleanup 2024-12-21 21:30:32 -08:00
jelveh 0beb442fa6 remove unused imports in helpers.js 2024-12-21 21:10:08 -08:00
jelveh e5f8127e21 Update app.js 2024-12-21 18:40:17 -08:00
KernelDeimos 5d049e8f06 fix: check if row.timestamp is Date 2024-12-21 14:57:37 -05:00
SAnker f4d36a271d Create devcontainer.json 2024-12-21 08:52:16 +01:00
Nariman Jelveh 770b957b42 Merge pull request #1024 from HatemLamia/add-french-translation
feat: Complete the  French (Français) translation of Puter #975
2024-12-20 17:59:24 -08:00
jelveh 76fbe9b4ce request 64x64 icons for Taskbar via /whoami 2024-12-20 14:06:37 -08:00
KernelDeimos e732859ff8 dev: icon_size for taskbar items 2024-12-20 16:39:05 -05:00
jelveh 530db18bae request 64x64 icons for taskbar and launch menu 2024-12-20 13:29:01 -08:00
KernelDeimos ee3f0c6e08 dev: do base64 svg check outside of get-launch-apps 2024-12-20 16:09:49 -05:00
Nariman Jelveh 77db3da1cf Merge pull request #1075 from joswin18/add-malalayalam-translations
Complete Malayalam translation based on English file #754
2024-12-20 12:48:22 -08:00
KernelDeimos df10a7c332 dev: add icon_size query for get-launch-apps 2024-12-20 15:08:10 -05:00
joswin18 3921241c46 Add Malayalam translations for missing keys in ml.js 2024-12-21 01:23:06 +05:30
KernelDeimos f14e1fefcf fix: AppES PD alert
This happened because the return signature of get_app_icon was changed
so that the MIME type can be returned when the uploaded or default icon
is being used as a fallback. AppES was not updated to account for this
change.
2024-12-20 13:56:32 -05:00
KernelDeimos a504c6ba2a perf: optimize recommended apps 2024-12-20 13:16:00 -05:00
KernelDeimos 3da571c39a test: unit-test get-launch-apps 2024-12-20 12:07:34 -05:00
KernelDeimos c6c3844763 chore: update kv.js 2024-12-20 12:07:24 -05:00
KernelDeimos 2a5073687d perf: reorder get-launch-apps behavior
As the recommended app list is hard-coded, these apps should be fetched
first as they don't depend on a database request.
2024-12-20 12:07:24 -05:00
jelveh e6194f028d support icon_size in the apps module of Puter.js and Dev Center 2024-12-20 06:58:02 -08:00
KernelDeimos 648d6e036d fix: fix for previous fix 2024-12-20 09:25:30 -05:00
KernelDeimos 4f3a1618b1 fix: fix fallback icon behavior in get_icon_stream 2024-12-20 09:12:50 -05:00
jelveh b1833ce1d7 close #1073 2024-12-19 19:35:22 -08:00
Hatem Lamia 4a77c93ce6 Merge branch 'main' into add-french-translation 2024-12-19 23:10:22 +01:00
KernelDeimos 9c86614df5 fix: revert test change 2024-12-19 13:22:50 -05:00
KernelDeimos 0d53020739 dev: fix a timestamp bug in old name expiry 2024-12-19 13:22:00 -05:00
KernelDeimos 6d2966f314 dev: AppES predicate transform for old name retry lookup 2024-12-19 13:22:00 -05:00
KernelDeimos c775a2e860 dev: option to follow old app names in get_app 2024-12-19 13:22:00 -05:00
KernelDeimos 0ccb3b2eed dev: track old app names 2024-12-19 13:22:00 -05:00
maria touilzak 408631dce9 Bug: Success Message Not Displayed After Deployment 2024-12-19 11:39:03 +01:00
Nariman Jelveh 40abd568e3 Merge pull request #1067 from bill-c-law/explorer-table-too-wide
Fix explorer table extra white space on right
2024-12-18 16:06:36 -08:00
jelveh 7a98616c86 Restore package-lock.json from master 2024-12-18 15:39:11 -08:00
jelveh 8c9f92cb61 cleanup 2024-12-18 15:31:14 -08:00
KernelDeimos c69006e185 fix: acl check for subdomain on access 2024-12-18 14:51:30 -05:00
KernelDeimos 81ad3243b1 dev: entity storage parameters + app icon size 2024-12-18 14:12:42 -05:00
KernelDeimos f032faa06d dev: add fallback for missing icons 2024-12-18 13:04:52 -05:00
KernelDeimos 7ec6621111 dev: make code more compatible with migration branch 2024-12-18 12:20:47 -05:00
KernelDeimos 90967ab109 dev: add ico support 2024-12-18 12:05:11 -05:00
KernelDeimos 8a3d74d30c dev: add bmp support for app icons 2024-12-18 11:23:04 -05:00
KernelDeimos d67a6f0e0c doc: document and cleanup app icons 2024-12-17 15:17:31 -05:00
KernelDeimos fc87897a3d dev: parallelize app icon generation 2024-12-17 14:56:07 -05:00
KernelDeimos 925ebd5310 fix: attempt fix for prod issue with app icons 2024-12-17 13:51:33 -05:00
bill-c-law c5198a03fe Fix explorer table extra white space on right
Fix explorer table was always too wide with extra white space on right side causing an unnecessary horizontal scrollbar.  Changed width for both the header row and item rows from 100vw to 100%, and added min-width.
2024-12-17 13:25:42 -05:00
KernelDeimos 046ef3cb4f dev: add endpoint to read app icons 2024-12-17 12:57:24 -05:00
KernelDeimos 20d27d59bf dev: create pre-sized icons for apps 2024-12-17 12:57:03 -05:00
jelveh 905be23854 Larger launch icons 2024-12-17 09:17:38 -08:00
jelveh 453b7d9ac9 Enforce taskbar height 2024-12-17 09:13:43 -08:00
Nariman Jelveh 971383ef58 Merge pull request #1065 from bestlaw66/patch-1
Update README.zh.md
2024-12-17 09:01:40 -08:00
KernelDeimos 4a0e4d51b5 git: update .gitignore 2024-12-17 10:27:11 -05:00
KernelDeimos f87769b445 fix: remove redundant notification query 2024-12-17 10:23:20 -05:00
KernelDeimos 2336a62b4f fix: share only emails email_confirmed recipients 2024-12-17 10:00:43 -05:00
jelveh 63efee390a Fix login using QR code 2024-12-17 06:48:40 -08:00
jelveh 47908f01a9 Add that sweet sweet subtle shadow for taskbar 2024-12-16 16:17:35 -08:00
jelveh 3c9a6b9d19 swipe to scroll Explore on mobile 2024-12-16 16:01:43 -08:00
jelveh c9ab994042 Make progress window mobile friendly 2024-12-16 15:30:42 -08:00
jelveh 8019fd6b73 Update style.css 2024-12-16 15:21:17 -08:00
jelveh ec2cb250b8 Update initgui.js 2024-12-16 15:16:04 -08:00
jelveh 35059098c3 Update style.css 2024-12-16 15:08:37 -08:00
jelveh 08d23ffca9 Update style.css 2024-12-16 14:58:03 -08:00
jelveh a06f9c1ec1 Update style.css 2024-12-16 14:52:43 -08:00
jelveh 24ca4e6ad8 Update style.css 2024-12-16 14:44:55 -08:00
jelveh b1c057e3a6 Update style.css 2024-12-16 14:35:15 -08:00
jelveh 276c9aab96 allow smooth swipe-to-scroll on mobile 2024-12-16 14:29:43 -08:00
jelveh 4e964d82ad ok, apple is horrible. 2024-12-16 14:22:10 -08:00
jelveh 1c5d59da79 Update style.css 2024-12-16 14:19:05 -08:00
jelveh 07de2aba30 Update style.css 2024-12-16 14:13:53 -08:00
jelveh ba7247e75d More aggressive measures to disable pinch/pan zoom on touch devices 2024-12-16 14:05:17 -08:00
KernelDeimos fd6f8bf225 perf: single request for gui boot kv keys 2024-12-16 16:54:08 -05:00
KernelDeimos 7ba1b7656b fix: database issue with KBKV update 2024-12-16 16:54:08 -05:00
jelveh 7f036223f6 Update initgui.js 2024-12-16 13:35:18 -08:00
jelveh 380a4b45ef Add user-scalable=no to the desktop 2024-12-16 13:30:16 -08:00
jelveh 89aa02ccec allow web-share in iframes 2024-12-16 12:58:51 -08:00
KernelDeimos 5a68691290 perf: multiple kv keys 2024-12-16 15:38:30 -05:00
jelveh 29d4eefbae Update style.css 2024-12-16 07:25:11 -08:00
jelveh 6014b1ea36 append custom_script_tags_str to the HTML of homepage 2024-12-16 07:09:37 -08:00
jelveh 3d761f008b Emit add_script_tags_to_homepage_html event before building the HTML of homepage 2024-12-16 07:01:44 -08:00
jelveh 556258847a Fix sizing for windows snapping given the new taskbar 2024-12-15 21:49:31 -08:00
jelveh d7c6229aea update search position in both desktop and launcher 2024-12-15 21:39:05 -08:00
jelveh b893a47595 Update style.css 2024-12-15 19:28:46 -08:00
jelveh ab5bc17991 set correct size for home screen on mobile 2024-12-15 19:23:30 -08:00
jelveh 949f97eb2e add mobile responsiveness for otp, login, and password recovery 2024-12-15 17:52:57 -08:00
jelveh 66bcf8a296 Update style.css 2024-12-14 20:55:10 -08:00
jelveh 1266fb8a29 Update style.css 2024-12-14 20:44:20 -08:00
jelveh 37ef58eb04 make Launcher mobile-friendly 2024-12-14 20:32:34 -08:00
jelveh 5ba957b14a add smooth scrolling for mobile taskbar 2024-12-14 19:31:41 -08:00
jelveh a90beab0b1 show all taskbar items on mobile as well. 2024-12-14 19:18:56 -08:00
jelveh cfbf98efdd fix more mobile styles 2024-12-14 17:09:03 -08:00
jelveh 803f54dec2 Update style.css 2024-12-14 16:57:19 -08:00
jelveh 6565c740f3 fix minimize not working on mobile 2024-12-14 16:50:43 -08:00
jelveh 26b046b512 Fix multiple issues with mobile responsiveness 2024-12-14 16:39:12 -08:00
jelveh 1a99581d0e fix minor css issues 2024-12-14 13:39:23 -08:00
jelveh 2061d571b0 fix issue with empty file associations input breaking the save process in Dev Center 2024-12-14 13:26:52 -08:00
jelveh ce36a685fc new taskbar is here! 2024-12-14 10:52:53 -08:00
jelveh 94e7f5deb4 fix: taskbar items of apps should always appear before Trash 2024-12-13 20:42:56 -08:00
jelveh 134f9d2934 Update UIWindowPublishWebsite.js 2024-12-13 19:18:06 -08:00
jelveh 54b93cc349 add a copy button next to App UID in Dev Center 2024-12-13 18:37:43 -08:00
jelveh 65d918866e fix: fullpage mode 2024-12-13 16:10:44 -08:00
KernelDeimos 45f6bc12eb dev: move and simplify writeFile write 2024-12-13 16:49:04 -05:00
KernelDeimos 8045d60e88 clean: cleanup copy and move 2024-12-13 16:04:48 -05:00
KernelDeimos e208b99d21 fix(security): verify dest_node uid matches signature 2024-12-13 15:53:12 -05:00
KernelDeimos e840544ee0 dev: DRY destination node handling 2024-12-13 15:30:55 -05:00
KernelDeimos 6b6c295a87 dev: rewrite and move writeFile rename 2024-12-13 14:49:03 -05:00
KernelDeimos 298609c6e9 fix: bug in writeFile rename 2024-12-13 13:35:55 -05:00
KernelDeimos 96a5c3c213 dev: move and simplify writeFile trash and delete 2024-12-13 13:18:34 -05:00
KernelDeimos d23c33c377 dev: cleanup writeFile: copy, move, mkdir 2024-12-13 12:37:16 -05:00
KernelDeimos 4b3f71b25e dev: migrate listenerutil, remove duplicate 2024-12-13 10:20:31 -05:00
bestlaw66 05a7e28f55 Update README.zh.md
在国内有大部分用户都在使用宝塔面板管理服务器,因此增加使用宝塔面板部署的教程,可视化的部署方式可以帮助用户更加便捷的部署
2024-12-13 12:13:10 +08:00
jelveh c792f4a345 fix: remove unnecessary item_path definition in delete fs api 2024-12-12 18:07:50 -08:00
KernelDeimos 06aeae518b clean: miscellaneous cleanups 2024-12-12 16:42:16 -05:00
KernelDeimos 332939308e clean: remove test functions 2024-12-12 14:47:26 -05:00
KernelDeimos 168dbad295 dev: organize share sequence 2024-12-12 14:47:26 -05:00
KernelDeimos 69e9df1ae2 fix: add missing permissions 2024-12-12 14:46:25 -05:00
Nariman Jelveh b89cd9529d Merge pull request #1063 from charlottekatzmann/patch-1
Update da.js #875
2024-12-12 11:46:49 -08:00
Charlotte Katzmann 46365beb7b Update da.js #875 2024-12-12 20:36:19 +01:00
Nariman Jelveh 54076d9d7f Merge pull request #1060 from biocyberman/translation/danish
Finish Danish translation, resolve issue #875
2024-12-12 11:00:37 -08:00
Nariman Jelveh 0a18cbb19d Merge branch 'main' into translation/danish 2024-12-12 11:00:30 -08:00
Nariman Jelveh 1aaba0016a Merge pull request #1061 from MPiya/#875
#875 Complete the Danish (Dansk) translation of Puter
2024-12-12 10:58:56 -08:00
Nariman Jelveh a879c83369 Merge branch 'main' into #875 2024-12-12 10:58:47 -08:00
Nariman Jelveh 63c5aa2215 Merge pull request #1062 from lauritsbonde/laurits/danish-translation
add missing danish translations
2024-12-12 10:58:20 -08:00
lauritsbonde 5126571217 add missing danish translations 2024-12-12 19:48:34 +01:00
KernelDeimos 651076a39b doc: document permission scanning 2024-12-12 13:47:03 -05:00
Chris fb346807e7 Add Danish missing translation 2024-12-12 19:45:38 +01:00
Vang Le-Quy 78cf0f403f Finish Danish translation, resolve issue #875 2024-12-12 19:41:39 +01:00
KernelDeimos 4e47c8bf9d clean: cleanup utils directory 2024-12-12 13:02:22 -05:00
KernelDeimos d5ecac4d0f dev: update deprecated use of __proto__ 2024-12-12 12:23:58 -05:00
KernelDeimos 951fb32f57 dev: add another response to AIChatService 2024-12-12 10:51:08 -05:00
Nariman Jelveh ee85a6d5e2 Merge pull request #1055 from themermabrouk/feature/issue-#975/finish-French-translations
feature(issue #975) finish French translations
2024-12-12 07:42:58 -08:00
Nariman Jelveh 713226081e Merge branch 'main' into feature/issue-#975/finish-French-translations 2024-12-12 07:42:45 -08:00
Nariman Jelveh 07d8e3b229 Merge pull request #1058 from hexsproductions/update-fr-translation
Add missing French translations (#975)
2024-12-12 07:38:32 -08:00
hexsproductions 52d077cc19 Add missing French translations (#975) 2024-12-12 15:59:55 +01:00
KernelDeimos d4ca9d438c dev: fix issue with prompt validation 2024-12-12 09:51:43 -05:00
Nariman Jelveh 5f37f7f48f Merge pull request #1047 from dev-wonny/#966-korean-translation-update
Complete Korean translation for ko.js (#966)
2024-12-12 06:39:34 -08:00
Nariman Jelveh 4a6dfc31e8 Merge pull request #1057 from HeyPuter/revert-1043-patch-1
Revert "Resolved Issue #965: Completed Kurdish Translations"
2024-12-11 18:47:44 -08:00
Nariman Jelveh 1b71184b13 Revert "Resolved Issue #965: Completed Kurdish Translations" 2024-12-11 18:47:34 -08:00
Nariman Jelveh 3203159f59 Merge pull request #1043 from Abdulbasit0123/patch-1
Resolved Issue #965: Completed Kurdish Translations
2024-12-11 18:47:30 -08:00
Nariman Jelveh 3bd32bb13b Merge branch 'main' into patch-1 2024-12-11 18:46:52 -08:00
jelveh 51ad4e12d4 Update index.html 2024-12-11 18:40:38 -08:00
Nariman Jelveh d570c2fbff Merge pull request #1056 from alizargit/main
Update dev-center.js to improve UX
2024-12-11 18:39:45 -08:00
Ali Z 5412408538 Update dev-center.js 2024-12-11 18:36:13 -08:00
KernelDeimos 6ca701139a fix: logic from previous commit 2024-12-11 20:55:49 -05:00
KernelDeimos c6e814daa8 fix: add fallback moderation in case openai goes down 2024-12-11 20:51:23 -05:00
themer 0efac5c77e feature(issue #975) finish French translations 2024-12-12 00:43:55 +01:00
Nariman Jelveh 97a1616305 Merge pull request #1054 from landof/patch-1
Fix languages orders in translations.js
2024-12-11 15:16:36 -08:00
landof 56a5671488 Fix languages orders in translations.js 2024-12-11 15:06:33 -08:00
KernelDeimos 4ff5bec40e clean: remove spans on deprecated calls 2024-12-11 16:52:14 -05:00
KernelDeimos cbe15a42bd dev: update TelemetryService 2024-12-11 16:36:20 -05:00
KernelDeimos 08dbef7b8c dev: add a feature to hook tracing into context 2024-12-11 16:02:45 -05:00
KernelDeimos c2b094a351 dev: return otel/jaegar tracing to working state 2024-12-11 15:25:55 -05:00
KernelDeimos dac5458b2e dev: migrate DatabaseFSEntryFetcher to puterfs module 2024-12-11 13:35:37 -05:00
KernelDeimos 4e0ce06982 clean: remove unused caching mechanism 2024-12-11 13:35:37 -05:00
KernelDeimos df20cb8e6c clean: filesystem batch 2024-12-11 13:35:16 -05:00
Nariman Jelveh 04cc9c2e05 Merge branch 'main' into #966-korean-translation-update 2024-12-11 09:54:50 -08:00
Nariman Jelveh 658af1fff0 Update ko.js 2024-12-11 09:45:37 -08:00
Nariman Jelveh fb0a091506 Merge pull request #1053 from HeyPuter/revert-1051-fix/stuck-new-app-loading-983
Revert "fix: resolve issue #983 - Stuck on Creating new app loading s…
2024-12-11 09:45:04 -08:00
Nariman Jelveh 51ab24314e Revert "fix: resolve issue #983 - Stuck on Creating new app loading screen" 2024-12-11 09:44:31 -08:00
Nariman Jelveh f800cf2dc9 Merge pull request #1051 from mariatouil/fix/stuck-new-app-loading-983
fix: resolve issue #983 - Stuck on Creating new app loading screen
2024-12-11 09:44:27 -08:00
Nariman Jelveh 040a6a7513 Merge pull request #1052 from vasarmilan/feature-hun-translation
Add Hungarian translations
2024-12-11 09:43:42 -08:00
Nariman Jelveh 653f493d27 Merge branch 'main' into feature-hun-translation 2024-12-11 09:43:30 -08:00
Nariman Jelveh 5422a239e4 Merge pull request #1048 from phellinger/hungarian-translation-update-#972
Complete Hungarian translation of Puter #972
2024-12-11 09:41:30 -08:00
vasarmilan e148bcb909 Add Hungarian translations 2024-12-11 18:00:57 +01:00
KernelDeimos ed48a16ced clean: remove newly-unused imports 2024-12-11 12:00:42 -05:00
KernelDeimos 4d9cc9bd83 fix: permission strings for ES services 2024-12-11 11:25:29 -05:00
Nariman Jelveh 2cf959dc2c Merge pull request #1046 from nicola-laura/korean-translation
Korean translation improvement (#966)
2024-12-11 08:24:07 -08:00
Nariman Jelveh 74d95aa366 Update ko.js 2024-12-11 08:21:47 -08:00
Nariman Jelveh 530b7ac647 Merge pull request #1044 from ismailix/965
kurdish translate ismailix
2024-12-11 08:20:43 -08:00
Nariman Jelveh 13518d0ff6 Update ku.js 2024-12-11 08:20:24 -08:00
maria touilzak c75c9d0383 fix: resolve issue #983 - Stuck on Creating new app loading screen 2024-12-11 16:56:21 +01:00
maria touilzak 96c7576607 Fix: drag-and-drop issue: files not appearing on desktop automatically 2024-12-11 15:34:05 +01:00
phellinger 7d2787d26b feat: complete Hungarian translation of Puter #972 2024-12-11 13:08:01 +01:00
“devwonny” ca3d669a10 Complete Korean translation for ko.js (#966)
Complete Korean translation for ko.js (#966)
https://github.com/HeyPuter/puter/issues/966
2024-12-11 19:44:48 +09:00
Nicola fefc4ac304 added missing translations and suggested improvements to existing translations (#966) 2024-12-11 17:56:14 +09:00
Nariman Jelveh 5889e4c25c Merge pull request #1045 from rdsingh120/main
Added Spanish translations for all the missing translations.
2024-12-10 19:07:21 -08:00
Ripudaman Singh 4b454a8706 Added Spanish translations for all the missing translations. 2024-12-10 20:38:47 -05:00
jelveh df34ee048a fix bug with 'Show All' in taskbar items 2024-12-10 17:04:33 -08:00
KernelDeimos 1dc2a6af81 dev: simplify get-launch-apps 2024-12-10 17:10:53 -05:00
KernelDeimos 1beda5b23d clean: cleanup filesystem routes 2024-12-10 16:40:38 -05:00
KernelDeimos cd7755da6b clean: misc cleanups 2024-12-10 15:58:22 -05:00
KernelDeimos ff62d9009e refactor: allow service-specific API errors to be registered 2024-12-10 15:23:54 -05:00
igorunmek af3b6fd152 kurdish translate upwork ismailix 2024-12-10 22:41:27 +03:00
KernelDeimos 8557c54527 clean: cleanup log outputs 2024-12-10 14:19:01 -05:00
KernelDeimos 1b578019f9 fix: provide actor context to ws event 2024-12-10 14:06:14 -05:00
KernelDeimos 96008233ba fix: context error in user connected event 2024-12-10 13:45:31 -05:00
KernelDeimos 6bb9437268 clean: remove legacy driver support 2024-12-10 13:18:42 -05:00
KernelDeimos b9d53b77a2 refactor: migrate kv driver invocation 2024-12-10 12:54:13 -05:00
KernelDeimos 2fcc257ae1 refactor: migrate entity storage driver invocation 2024-12-10 11:40:49 -05:00
KernelDeimos 193833f4f9 clean: remove legacy driver module 2024-12-10 10:38:40 -05:00
Ken 9965f219d8 refactor: adjust max_tokens for specific models
fix: fix issue when there is an assistant role
2024-12-10 09:17:16 -05:00
KernelDeimos 01395f302e fix: signup 500 for temp user 2024-12-10 09:09:25 -05:00
Nariman Jelveh 192958e88b Merge pull request #1042 from saud-saeed/main
Update Swedish translations in sv.js
2024-12-10 05:44:27 -08:00
Nariman Jelveh 62f4318914 Update sv.js 2024-12-10 05:44:14 -08:00
Abdulbasit 9d97ee849d Resolved issue #965, completed Kurdish translations
I completed the translation for Kurdish and fixed some typos of the already translated phrases and sentences.
2024-12-10 13:42:38 +03:00
Saud Saeed 84c1efbf5f Update Swedish translations in sv.js
fix: Resolve issue #960 by adding missing Swedish (Svenska) translations
2024-12-10 11:21:18 +01:00
Nariman Jelveh 56f57e4ab9 Merge pull request #1039 from Agastya18/feat/add-Escape-key
feat: add Escape key functionality to UIPrompt for closing the prompt
2024-12-09 23:08:54 -08:00
Nariman Jelveh 13c34211ed Merge pull request #1040 from twuttiwat/patch-1
Add missing Thai translations in th.js
2024-12-09 22:04:28 -08:00
Nariman Jelveh cf845d3ac1 Update th.js 2024-12-09 22:03:45 -08:00
Teerawat Wuttiwat 529c5376e4 Add missing Thai translations in th.js 2024-12-10 11:58:01 +07:00
agastya gaur e1b6c83813 feat: add Escape key functionality to UIPrompt for closing the prompt 2024-12-10 08:26:55 +05:30
Nariman Jelveh dd43c0acfa Merge pull request #1038 from Exclusiveideas/igbo-translation-updates
fixed "Complete the Igbo translation of Puter #969" issue
2024-12-09 18:43:42 -08:00
Nariman Jelveh bc30012087 Merge branch 'main' into igbo-translation-updates 2024-12-09 18:43:31 -08:00
Exclusiveideas cb7d4eaaf9 fixed "Complete the Igbo translation of Puter #969" issue 2024-12-10 03:31:48 +01:00
jelveh f2e2473a7d Create TRADEMARK.md 2024-12-09 18:24:51 -08:00
jelveh 6eec8a821b Merge branch 'main' of https://github.com/heyputer/puter 2024-12-09 18:19:30 -08:00
jelveh 7aa056f1e3 remove Missing translations comment from ig.js 2024-12-09 16:50:52 -08:00
Nariman Jelveh cd472f30e7 Merge pull request #1036 from HeyPuter/revert-1035-main
Revert "Update missing translations for Igbo"
2024-12-09 16:45:03 -08:00
Nariman Jelveh b04b09042e Revert "Update missing translations for Igbo" 2024-12-09 16:44:23 -08:00
Nariman Jelveh 6dfa795423 Merge pull request #1035 from Nathaniyell/main
Update missing translations for Igbo
2024-12-09 16:44:00 -08:00
Nariman Jelveh 49d7ad8eaa Update ig.js 2024-12-09 16:41:37 -08:00
Nathaniel Essien 803377868c Merge branch 'main' into main 2024-12-10 01:38:57 +01:00
Nariman Jelveh 444950ef8d Merge pull request #1034 from Victor-Evogor/main
Complete Igbo translations for missing keys (#969)
2024-12-09 16:37:17 -08:00
Nathaniyell 6f4d57a3c6 fix: correct Igbo translation for "Free" in billing terms 2024-12-10 01:36:05 +01:00
Nathaniyell f0f19e727e feat: add missing Igbo translations for billing-related terms 2024-12-10 01:35:24 +01:00
Victor Evogor 6b15eaed1c Complete Igbo translations for missing keys (#969) 2024-12-10 01:16:57 +01:00
KernelDeimos acf8ae302e fix: bad import for TeePromise 2024-12-09 18:03:45 -05:00
KernelDeimos 7acb096add fix: sorting bug in AIChatService 2024-12-09 16:31:53 -05:00
KernelDeimos 0f2641b88f clean: remove some unused code/comments 2024-12-09 16:31:53 -05:00
Nguyễn Tuấn Anh b2ea8a3888 feat: set max token to 8096 2024-12-09 16:31:36 -05:00
KernelDeimos 6c0f04706d move: MountpointService 2024-12-09 16:03:18 -05:00
KernelDeimos 4917848c60 refactor: move SizeService and DRY capacity usage
This commit also fixes a but that was discovered in calculating the size
of files during a copy operation.
2024-12-09 15:50:44 -05:00
KernelDeimos db00f0ae67 dev: cleanup filesystem utilities 2024-12-09 14:42:14 -05:00
KernelDeimos 3f5bc7163f dev: cleanup config.js 2024-12-09 14:08:46 -05:00
KernelDeimos 537d0d47ec dev: cleanup RuntimeEnvironment.js 2024-12-09 13:49:40 -05:00
KernelDeimos 7839d52925 dev: address TODO comment in Kernel.js 2024-12-09 13:14:10 -05:00
KernelDeimos c36dd1b3d3 refactor: extension loading 2024-12-09 12:05:23 -05:00
KernelDeimos 070937c7e6 clean: remove some unused vars 2024-12-09 12:05:23 -05:00
KernelDeimos 7af8afb053 refactor: address TODO; de-couple some services from FilesystemService 2024-12-09 12:05:11 -05:00
Nariman Jelveh bec3a28d33 Merge pull request #1028 from loismbferraz/issue-963-complete-portuguese-translation
portuguese translations for #963 issue added
2024-12-09 08:41:22 -08:00
loismbferraz c614b8a789 portuguese translations for #963 issue added 2024-12-09 16:23:38 +00:00
Nariman Jelveh 4c3a053a0a Merge pull request #1026 from nathnapa88/patch-1
Update th.js
2024-12-09 07:58:49 -08:00
nathnapa88 0a746f1e32 Update th.js 2024-12-09 15:42:10 +00:00
Nariman Jelveh d075718bf2 Merge pull request #1025 from hoursing/main
feat: Complete the Vietnamese translation of Puter #954
2024-12-09 06:37:07 -08:00
Nariman Jelveh c7e0ce6dd1 Merge branch 'main' into main 2024-12-09 06:36:55 -08:00
Nariman Jelveh 333f0ea42f Merge pull request #1023 from lephuongnam22/main
(#954) Add Vietnamese translations for billing-related terms
2024-12-09 06:21:16 -08:00
Nariman Jelveh 4643e8a523 Merge branch 'main' into main 2024-12-09 06:21:07 -08:00
Nariman Jelveh 25d3bac454 Merge pull request #1021 from vulct174/main
feat: add Vietnamese translations for billing in vi.js
2024-12-09 06:18:25 -08:00
Nariman Jelveh 0197e1489c Merge branch 'main' into main 2024-12-09 06:18:16 -08:00
Nariman Jelveh a1858fb495 Merge pull request #1020 from lvluu/feature/issue-954
feat: (#954) Add Vietnamese translations for billing-related terms
2024-12-09 06:14:06 -08:00
Nariman Jelveh 6890935d01 Update vi.js 2024-12-09 06:13:43 -08:00
hoursing 56489c33f6 feat: Complete the Vietnamese translation of Puter #954 2024-12-09 17:33:28 +07:00
lamia c840bc8161 feat: Complete the French (Français) translation of Puter #975 2024-12-09 09:49:41 +01:00
Nam Le ba876745b3 Update translation 2024-12-09 19:04:58 +11:00
Nam Le bbd0183320 Update text translation 2024-12-09 18:59:16 +11:00
Nariman Jelveh 4477f8f6e8 Merge pull request #1022 from akuumaa/issue-952
feat: Complete the German (Deutsch) translation of Puter #952
2024-12-08 23:20:20 -08:00
Nam Le 2dfc58fc2d (#954) Add Vietnamese translations for billing-related terms 2024-12-09 18:13:15 +11:00
akuumaa 05fef6749e feat: Complete the German (Deutsch) translation of Puter 2024-12-09 07:17:31 +01:00
lvluu 267a55aae5 feat: (#954) Add Vietnamese translations for billing-related terms 2024-12-09 12:59:38 +07:00
VuLCT 3e26dbe6a0 feat: add vietnamese translations for billing in vi.js 2024-12-09 12:42:18 +07:00
Nariman Jelveh d98b6e385c Merge pull request #1010 from cprogrammer1209/PUTER-ta-dec8
Added to new Tamil Words to the ta.js file.
2024-12-08 20:14:46 -08:00
Nariman Jelveh 9104ac0bd9 Merge pull request #1019 from Elisassa/update-zhTW-translation
Added Traditional Chinese translations
2024-12-08 17:27:44 -08:00
Nariman Jelveh fc09a26277 Update zhtw.js 2024-12-08 17:27:29 -08:00
Elisassa 35f2a4f594 Added Traditional Chinese translations 2024-12-08 19:35:55 -05:00
Nariman Jelveh a16fd36ad3 Merge pull request #1018 from dmytro-nesteruk/main
tweak: update ua translations;
2024-12-08 15:50:55 -08:00
Nariman Jelveh 3ad7c8437f Merge pull request #1017 from RamiIbrahim2002/arabic-translation-issue-948
Update Arabic translations for issue #948
2024-12-08 15:49:23 -08:00
Nariman Jelveh 80e4d040c7 Merge branch 'main' into arabic-translation-issue-948 2024-12-08 15:49:01 -08:00
Nariman Jelveh 89819204c1 Merge pull request #1016 from hasanayoub/fix-ar-translation_issue_948
Completed Arabic translations for issue #948
2024-12-08 15:46:03 -08:00
jelveh 320278dfdf Update ar.js 2024-12-08 15:45:19 -08:00
Nariman Jelveh 183b8105f9 Update ar.js 2024-12-08 15:19:52 -08:00
Dmytro Nesteruk 118605f054 tweak: updated ua translations; 2024-12-09 00:34:55 +02:00
Dmytro Nesteruk 208a38603d tweak: update ua translations; 2024-12-08 23:17:35 +02:00
hasanayoub 4c1b78f73b Completed Arabic translations for issue #948 2024-12-09 00:11:59 +03:00
RamiIbrahim2002 3f0f3dab51 Update Arabic translations for issue #948 2024-12-08 22:07:51 +01:00
Nariman Jelveh 974feeade3 Merge pull request #1015 from nafisa45/main
Add Bengali translations for billing module strings
2024-12-08 13:00:09 -08:00
Nariman Jelveh 05ecd2547b Update bn.js 2024-12-08 12:59:23 -08:00
nafisa45 de6e5ddb25 I have updated the undefined part of the translation with the intact %strong% and (%%) 2024-12-09 01:32:19 -05:00
Nariman Jelveh c4931c30ee Merge pull request #1014 from gwyneblaidd/main
Complete the Ukrainian (Українська) translation of Puter · Issue #956 · HeyPuter/puter
2024-12-08 12:39:03 -08:00
jelveh ceaf6cb24a Update ua.js 2024-12-08 12:38:38 -08:00
gwyneblaidd 2bbf11f91b Update ua.js 2024-12-08 22:31:59 +02:00
gwyneblaidd 255f102d16 Update ua.js 2024-12-08 22:24:18 +02:00
Nariman Jelveh e7f3ac6fa8 Merge pull request #1013 from CriDM/add-italian-translations
Added missing Italian translations (#968)
2024-12-08 11:49:59 -08:00
Nariman Jelveh badd4c218e Merge branch 'main' into add-italian-translations 2024-12-08 11:48:32 -08:00
Nariman Jelveh 7e1766bbdc Merge pull request #1012 from danielpetrica/patch-2
Update it.js
2024-12-08 11:47:46 -08:00
Nariman Jelveh 77c7d347a4 Update it.js 2024-12-08 11:47:15 -08:00
Daniel, Petrica Andrei-Daniel 5d8854f628 Update it.js 2024-12-08 20:39:36 +01:00
CriDM c6fa98b3b7 Added missing Italian translations (#968) 2024-12-08 20:35:56 +01:00
Nariman Jelveh 996c8097b7 Merge pull request #1011 from HeyPuter/revert-1009-warning_dialog
Revert "Created test cases for issue #878 "
2024-12-08 11:32:04 -08:00
Nariman Jelveh 40ea2a3f02 Revert "Created test cases for issue #878 " 2024-12-08 11:31:47 -08:00
Nariman Jelveh 575b4bd34c Merge pull request #1009 from LeeMEow23/warning_dialog
Created test cases for issue #878
2024-12-08 11:31:42 -08:00
Nariman Jelveh c8894c7d4c Merge branch 'main' into warning_dialog 2024-12-08 11:29:52 -08:00
root 019a8c1d93 Added to new Tamil Words 2024-12-08 23:30:21 +05:30
e5z26 2ca1f71595 removed jsdom in test file
removed because wasn't being used
2024-12-07 19:09:22 -05:00
Nariman Jelveh 4c5f427ac2 Merge pull request #1008 from HeyPuter/revert-1007-patch-1
Revert "Update id.js"
2024-12-07 11:46:15 -08:00
Nariman Jelveh e6a171e8f1 Revert "Update id.js" 2024-12-07 11:46:05 -08:00
Nariman Jelveh 777ac3a8ca Merge pull request #1007 from zefta27/patch-1
Update id.js
2024-12-07 11:45:36 -08:00
Nariman Jelveh f97394ded1 Merge branch 'main' into patch-1 2024-12-07 11:45:17 -08:00
Nariman Jelveh 0b71e2a723 Merge pull request #1004 from wildanhkm/wildanhkm/feat/id-translations
update id translations
2024-12-07 11:21:23 -08:00
Nariman Jelveh 8fc570d076 Merge branch 'main' into wildanhkm/feat/id-translations 2024-12-07 11:21:15 -08:00
Nariman Jelveh e030cd3d03 Merge pull request #1006 from arrafi-ahmed/issue-970
Fix issue #970
2024-12-07 10:34:01 -08:00
Nariman Jelveh e9ac20b8b0 Update id.js 2024-12-07 10:30:28 -08:00
Nariman Jelveh aa82e06e14 Merge pull request #1005 from arthur-adriansens/main
Close apps by clicking on icons (issue #944) + awesome animations!
2024-12-07 10:27:11 -08:00
jelveh 383b4841ae fix the issue with windows losing focus right after they're opened 2024-12-07 10:16:25 -08:00
Zefta Adetya b3426b52d1 Update id.js
Replacing undefined text
2024-12-08 00:37:18 +07:00
raf 34ab6dbdff Fix issue #970: [updated undefined values for bahasa translation] 2024-12-07 23:47:58 +07:00
wildanhkm 1d6bc54ae6 update id translations 2024-12-07 23:20:47 +07:00
Arthur 6a2f5f0eee Added sattisfying taskbar icon animation 2024-12-07 16:20:22 +00:00
Arthur 90b7e449b7 Added "Toggling apps to minimize once it clicked" #944 feature 2024-12-07 15:46:01 +00:00
Nariman Jelveh 8ea6ac1b48 Merge pull request #1003 from sumi1239/feature/kr-translations
feat: added a few Korean translatations
2024-12-06 17:52:33 -08:00
William Shiozawa b23e800f4e feat: added a few Korean translatations 2024-12-06 17:36:21 -08:00
jelveh 71bb8ba881 remove "Missing translations" comment from Hebrew i18n file. 2024-12-06 14:09:32 -08:00
KernelDeimos b34b8efea9 clean: remove some unused variables 2024-12-06 17:03:16 -05:00
KernelDeimos cb4bcba7ec clean: cleanup helpers.js 2024-12-06 17:03:16 -05:00
KernelDeimos 7db3be5716 clean: remove unused variables in filesystem 2024-12-06 17:03:16 -05:00
Nariman Jelveh f93a754273 Merge pull request #1002 from Tristramit/Tristramit-patch-1
Update he.js
2024-12-06 14:02:50 -08:00
KernelDeimos c566d48433 clean: fix errors found by find-unused-exports 2024-12-06 15:40:59 -05:00
Amos Weislib 197be1c0bc Update he.js
Few corrections
2024-12-06 21:36:58 +01:00
KernelDeimos 7232406680 clean: remove unused imports from phoenix 2024-12-06 15:28:07 -05:00
jelveh 87f4f3d2dd fix unmatched double quote 2024-12-06 12:23:52 -08:00
KernelDeimos c87db23faa refactor: combine parsely and strataparse into @heyputer/parsers 2024-12-06 15:08:23 -05:00
KernelDeimos 62a010b1b2 doc: clarify the distinction between CoreModule and Core2Module 2024-12-06 13:05:03 -05:00
KernelDeimos 73f738c9d9 doc: add more extensions documentation 2024-12-06 13:05:03 -05:00
KernelDeimos 1679648780 doc: document the test kernel 2024-12-06 13:05:03 -05:00
KernelDeimos 1e0fb1c3c5 doc: document kernel behavior 2024-12-06 13:05:03 -05:00
KernelDeimos 9aeecb650a doc: generate and edit comments for tools 2024-12-06 13:05:03 -05:00
Amos Weislib 299a88103e Update he.js
referencing issue
#974
2024-12-06 19:05:00 +01:00
Nariman Jelveh c6455d53e4 Merge pull request #1001 from HeorhiiPavlovskyi/Issue-961
Issue #961, filled missing translations, Updating ru.js
2024-12-06 09:59:44 -08:00
Nariman Jelveh 0935c56842 Update ru.js 2024-12-06 09:58:01 -08:00
unknown 9d91649ca1 Update ru.js 2024-12-06 19:48:47 +02:00
KernelDeimos 545e7db5bd fix: test issues from contextlink removal
Apparently there were two things:
- had to remove contextlink from the test command (that was expected)
- can't import libs from putility in the test environment. The error
  produced for this doesn't really explain why.
2024-12-06 12:09:23 -05:00
Nariman Jelveh fad2c944ab Merge pull request #999 from JJooaa/finnish-translations
Fixes issue [#976]: Add missing Finnish translations.
2024-12-06 08:59:52 -08:00
Nariman Jelveh 741d8f0bb4 Update fi.js 2024-12-06 08:46:41 -08:00
KernelDeimos 2c24fe5532 doc: document tools directory (README.md) 2024-12-06 11:39:07 -05:00
KernelDeimos d1e8d51173 clean: remove contextlink
Updates references in phoenix shell to use context from putility.
2024-12-06 11:17:14 -05:00
Justin Oeni 540132cc71 Added two files to test hasGitDirectory and showGitWarningDialog 2024-12-06 10:42:44 -05:00
KernelDeimos 72c496df4b clean: remove early typescript trial 2024-12-06 10:38:55 -05:00
JJooaa 6abbf8440b update: add missing finnish translations 2024-12-06 16:55:05 +08:00
Nariman Jelveh 7f37c42219 Merge pull request #997 from bertsrl/patch-1
Update ro.js
2024-12-05 23:53:24 -08:00
Nariman Jelveh 50a2f3d275 Merge pull request #998 from smikayel/improvement/Armenian_localozation
add translation for missing sentancies
2024-12-05 23:46:26 -08:00
Nariman Jelveh e2fbe80cce Merge pull request #995 from kirney23/main
japanese translations
2024-12-05 23:44:41 -08:00
Nariman Jelveh 1e573b654a Merge branch 'main' into main 2024-12-05 23:44:23 -08:00
Nariman Jelveh aa00830168 Merge pull request #996 from hutajoullach/main
Japanese translation issue number 967
2024-12-05 23:40:19 -08:00
smikayel d6e20dcb20 add translation for missing sentancies 2024-12-06 11:39:09 +04:00
Berty 76308479c6 Update ro.js
Updated the romanian translations.

I kept the terms "Professional" and "Business" in English as they are commonly used this way in Romanian in IT services context

I adapted the forms of address to second person singular ("tu") instead of formal ("dumneavoastră") to maintain a friendly and modern tone

I maintained consistency with existing translations in the file
Placeholders (%strong%, %%) were kept in grammatically correct positions for Romanian language
2024-12-06 09:36:50 +02:00
HutaJoullach 0ed5aaed2c japanese-translation-issue-number-967 2024-12-06 16:24:14 +09:00
kirney23 b3ce0e93fb Update ja.js 2024-12-06 11:38:53 +09:00
Nariman Jelveh 984b5d617d Merge pull request #994 from samueldev900/samueldev900_brazillian_translation
feat: add brazillian translations for billing-related terms in br.js
2024-12-05 15:43:32 -08:00
Nariman Jelveh b41e8b09ad Update br.js 2024-12-05 15:40:32 -08:00
Samuel Oliveira fdfc90a931 feat: add brazillian translations for billing-related terms in br.js (revision) 2024-12-05 20:29:37 -03:00
Samuel Oliveira e66df14862 feat: add brazillian translations for billing-related terms in br.js 2024-12-05 20:18:41 -03:00
KernelDeimos e301247bfc dev: add an example module and service 2024-12-05 16:58:15 -05:00
KernelDeimos 82457fbc9f doc: document smol (SmolUtil) lib 2024-12-05 16:16:44 -05:00
KernelDeimos 7de23ce68d move: SmolUtil and ServerHealthService 2024-12-05 16:16:44 -05:00
Nariman Jelveh f9c6f82440 Merge pull request #993 from paulinek13/polish-translation
sync(i18n): add Polish translations for billing-related terms
2024-12-05 12:55:17 -08:00
Paulina Kalicka 15f9aded26 sync(i18n): add Polish translations for billing-related terms 2024-12-05 21:18:20 +01:00
KernelDeimos 09b0d744d5 clean: remove redundant promise.js 2024-12-05 15:08:33 -05:00
KernelDeimos 86a9c959e0 doc: document commonly-used putility libraries 2024-12-05 14:36:34 -05:00
KernelDeimos 58dea19cd9 move strutil and time.js to putility 2024-12-05 14:00:21 -05:00
KernelDeimos e279dc6e5f fix: add missing import 2024-12-05 13:56:08 -05:00
KernelDeimos 7424fd888d doc: update and generate docs 2024-12-05 13:29:10 -05:00
KernelDeimos 3df5f649a4 dev: migrate ExpectationService and PagerService 2024-12-05 13:20:06 -05:00
KernelDeimos a2072c5fac doc: move/clean ErrorService
Some documentation comments were missing or inaccurate so these were
also edited after moving.
2024-12-05 12:10:07 -05:00
KernelDeimos e5a7d1c1bb doc: edit/generate CoreModule2 docs 2024-12-05 12:10:07 -05:00
Nariman Jelveh f1ece26418 Merge pull request #990 from ICODER32/patch-1
Update ur.js
2024-12-05 08:59:03 -08:00
Nariman Jelveh f17a53018b Update ur.js 2024-12-05 08:57:31 -08:00
Nariman Jelveh a6b86c5947 Merge pull request #989 from arthur-adriansens/dutch
Added new Dutch translation
2024-12-05 08:56:16 -08:00
KernelDeimos 036016b20b dev: move/clean AlarmService and related utils 2024-12-05 11:41:41 -05:00
M Ibtisam Anwar d9a08de959 Update ur.js
Updated undefined urdu translations
2024-12-05 21:09:21 +05:00
Arthur f1d9ac5208 changed to single quotes 2024-12-05 16:41:38 +01:00
Arthur 18784b2677 completed Dutch translation #979 2024-12-05 16:33:03 +01:00
KernelDeimos 13a895b76b fix: fake_chat default model and usage errors 2024-12-05 09:34:51 -05:00
KernelDeimos 1e2f9df110 doc: remove comment error 2024-12-05 09:14:30 -05:00
Nariman Jelveh 9ddaab3010 Merge pull request #981 from rowin-C/filetype-association
feat: added tagify in Filetype-Association input in dev center
2024-12-04 18:13:46 -08:00
KernelDeimos a1c2226561 fix: update test kernel 2024-12-04 20:40:42 -05:00
Nariman Jelveh 223802f631 Merge pull request #986 from githubalexliu/translate_zh
Translated to Chinese
2024-12-04 16:53:10 -08:00
Nariman Jelveh 4653273d9a Update zh.js 2024-12-04 16:51:29 -08:00
githubalexliu c1aa637005 Translated to Chinese 2024-12-04 19:26:32 -05:00
jelveh 591cf0f45e tweak for fluid ux 2024-12-04 16:22:06 -08:00
jelveh 12ca609046 invalidate user cache when hitting /get-dev-profile 2024-12-04 15:13:54 -08:00
KernelDeimos 169c1aa3a7 doc: generate puterai docs and is a docgen bug 2024-12-04 16:58:45 -05:00
KernelDeimos 8848055f1b doc: update CONTRIBUTING.md 2024-12-04 16:33:45 -05:00
KernelDeimos 9992252083 doc: add file structure image 2024-12-04 16:32:30 -05:00
KernelDeimos 7eb5e59d94 dev: move some utils, LogService, to new module 2024-12-04 14:45:42 -05:00
KernelDeimos 5c3a65060d dev: include library functions in module docgen 2024-12-04 14:42:22 -05:00
KernelDeimos 5fa0a0263d dev: cleanup docgen and add method logging 2024-12-04 14:42:22 -05:00
KernelDeimos 0b36e72c80 doc: re-comment LogService 2024-12-04 14:42:22 -05:00
KernelDeimos 2453baa234 dev: make a module where utilities will go 2024-12-04 14:42:22 -05:00
Nariman Jelveh 5e7ea5f3b0 Merge pull request #985 from Agastya18/farsi-translation
Translate billing-related strings to Persian in fa.js
2024-12-04 10:20:35 -08:00
Nariman Jelveh a99ee51b00 Update fa.js 2024-12-04 10:19:09 -08:00
agastya gaur e395571256 Translate billing-related strings to Persian in fa.js 2024-12-04 22:32:45 +05:30
KernelDeimos 9e5429b9ab dev: improve module docgen
- fixes some bugs
- adds list of relative requires
2024-12-04 10:43:49 -05:00
jelveh b2dae896e6 expand support for more filestypes 2024-12-04 07:17:06 -08:00
Nariman Jelveh c0257c482f Merge pull request #982 from rowin-C/hindi-translation
tweak: added missing hindi translation
2024-12-04 07:00:23 -08:00
Nariman Jelveh cc7683a7fe Update hi.js 2024-12-04 06:59:59 -08:00
Nariman Jelveh b6e4f518fd Merge pull request #984 from ulaski/add-missing-turkish-translations
Add missing turkish translations
2024-12-04 06:53:04 -08:00
Nariman Jelveh 8cfefebfb6 Update tr.js 2024-12-04 06:52:36 -08:00
Ulas Kilicaslan e2f603d792 Add missing turkish translations 2024-12-04 15:12:25 +03:00
ron 4f82658d94 tweak: added missing hindi translation 2024-12-04 14:26:04 +05:30
ron 0cd1f151b5 feat: added tagify in Filetype-Association input in dev center 2024-12-04 12:35:36 +05:30
Nariman Jelveh 70c2fd6ee5 Merge pull request #980 from LeeMEow23/warning_dialog
Added the warning dialog
2024-12-03 19:17:32 -08:00
jelveh 59ac89db85 handle the return value of skipWarning 2024-12-03 19:10:14 -08:00
jelveh b4938659d1 disable copy/paste from local environment.
It never worked and has ruined the experience with regular copy/paste on Puter
2024-12-03 18:58:22 -08:00
Your Name 5302d3a62e Added the warning dialog
If the system detects any sensitive files, it will pop up the dialog showing the warning and provide the user with options of continuing or not.
2024-12-03 18:08:08 -05:00
jelveh 02e62f1625 wake up babe new i18n keys dropped 2024-12-03 14:18:19 -08:00
KernelDeimos c1bcd84715 chore: update package-lock.json 2024-12-03 17:07:37 -05:00
KernelDeimos 67ab8a1710 doc: first run of module documenter 2024-12-03 17:07:37 -05:00
KernelDeimos ac372204fa dev: move web service utilities 2024-12-03 17:07:37 -05:00
KernelDeimos 1922feab1e dev: add module documentation generator 2024-12-03 17:07:37 -05:00
Nariman Jelveh 46263cc1ad Update #DoesItRunPuter.md 2024-12-03 12:05:19 -08:00
KernelDeimos 10f6e5458e refactor: move WebServerService and socketio to module 2024-12-03 14:19:26 -05:00
KernelDeimos 3887ce05da dev: de-couple legacy mkdir and remove it
A legacy mkdir function was still being used by the
generate_system_fsentries function. However, it wasn't necessary because
we now associate fsentries by uuid, eliminating the requirement to
create the home directory separately from its subdirectories.

The old mkdir function was removed, and generate_system_fsentries was
moved to a new service called UserService, which is intended to
eventually hold all methods related creating, removing, and updating
users.
2024-12-03 13:04:12 -05:00
KernelDeimos 87db20de14 dev: add user.email-changed event 2024-12-03 10:05:24 -05:00
Nariman Jelveh e8d4408dca Revert "File association format (#946)" (#947)
This reverts commit f0d1de7e44.
2024-12-03 06:43:40 -08:00
Sauhbagya Prasad f0d1de7e44 File association format (#946)
* added validation function

* tagify implementation (incomplete)

* tagify implementation (completed)

* feat:implemented Tagify and filetype validation on filetype associaction in dev center

* tweak: removed unnessary tagify from dependency (its streamed from CDN)

* removed unnecessary tagify import
2024-12-03 06:43:16 -08:00
KernelDeimos 614f065e17 tweak: disable 4o-mini and mistral in comment writer 2024-12-02 12:18:46 -05:00
KernelDeimos b40d4534a7 fix: correct AI comment faults
Currently the AI comment writer is trusting the AI to write comment
markers. This means sometimes the syntax of a source file is broken by
comment generation. The instructions in the prompt were pretty clear, so
rather than --fixup'ing the previous commit I'm adding these changes
separately as an interesting case study of how different models behave.

Following this result, I am going to be removing mistral from the
comment writer. It is the most likely to misbehave.

I will also be removing gpt-4o-mini, which sometimes included source
lines despite the "no surrounding text" instruction.
2024-12-02 12:05:13 -05:00
KernelDeimos f75010b355 doc: (skip if using git bisect) ai comments 2024-12-02 11:47:47 -05:00
KernelDeimos 0a1be464d1 tweak: fix "all" option 2024-12-02 11:45:13 -05:00
KernelDeimos aadb261b29 dev: interactive prompt for file limit 2024-12-02 11:09:50 -05:00
KernelDeimos ac44aaf393 doc: make comment writer self-commented 2024-12-02 11:01:23 -05:00
KernelDeimos 7e4ae19aff dev: tweak comment writer to fix some problems 2024-12-02 11:00:50 -05:00
KernelDeimos 857718538b fix: update package-lock.json 2024-12-02 10:26:52 -05:00
KernelDeimos 7a8687cd2c doc: ai generated comments 2024-12-02 10:26:52 -05:00
KernelDeimos 2dfeeeda27 dev: update comment generator 2024-12-02 10:22:58 -05:00
Nariman Jelveh 67ee264239 Merge pull request #945 from MherFrangyan/patch-1
Update hy.js
2024-12-01 22:30:05 -08:00
jelveh 40dccb7741 Update en.js 2024-12-01 22:27:40 -08:00
Mher 1d217e2d59 Update hy.js
added translate
2024-12-02 10:24:09 +04:00
jelveh 6e6bd34463 Update en.js 2024-12-01 22:09:39 -08:00
jelveh 61f54369d7 add more i18n keys for billing 2024-12-01 19:20:25 -08:00
jelveh 9dda9c8dbf add more i18n keys 2024-12-01 19:13:51 -08:00
jelveh 349ae24636 add more keys for billing i18n 2024-12-01 18:51:47 -08:00
jelveh 5ced83195d add more i18n keys for billing 2024-12-01 16:45:53 -08:00
KernelDeimos ab4ba76433 fix: ignore two calls with undefined origin 2024-12-01 19:41:08 -05:00
KernelDeimos 340c7a821f fix: undefined APIOrigin 2024-12-01 19:29:47 -05:00
Nariman Jelveh ae42f6301f Merge pull request #938 from mithunmunsi/fix-issue-871
Fixes issue #871
2024-12-01 14:51:46 -08:00
Nariman Jelveh f0b5765cd7 Merge branch 'main' into fix-issue-871 2024-12-01 14:50:13 -08:00
KernelDeimos 3d2648e4ec chore: update package-lock.json 2024-12-01 15:29:35 -05:00
jelveh e056fafc50 clean up unsed imports 2024-12-01 10:10:30 -08:00
jelveh b874863986 Update signup.js 2024-11-30 23:01:04 -08:00
jelveh 88339c4044 add more billing keys for i18n 2024-11-30 17:40:54 -08:00
Nariman Jelveh a715cec1e6 Merge pull request #943 from enweazudaniel/patch-1
Update ig.js
2024-11-30 13:26:11 -08:00
enweazudaniel f672c28245 Update ig.js 2024-11-30 21:16:36 +01:00
jelveh badc654968 add i18n entries for billing and offerings 2024-11-30 11:13:01 -08:00
jelveh 67ca4ccf20 fix: add id to the setting menu item in user option menu 2024-11-29 19:40:54 -08:00
jelveh e662c782b7 fix: add an id to My Websites content menu item 2024-11-29 19:26:13 -08:00
Nariman Jelveh 73864c93cf Merge pull request #942 from Aliieeee/update-finnish-translations
Review Undefined Words and Correct it
2024-11-29 15:49:25 -08:00
Ali Hassan e9ba0833da Review Undefined Words and Correct it 2024-11-30 00:34:06 +02:00
jelveh 9b74a2e177 Update it.js 2024-11-29 14:22:56 -08:00
Nariman Jelveh 0223429e3b Merge pull request #940 from mkalevo/finnish-translation-#871
#871 added missing Finnish translations in fi.js
2024-11-29 13:48:11 -08:00
Nariman Jelveh c97d64da91 Update fi.js 2024-11-29 13:47:10 -08:00
Nariman Jelveh 489eba0423 Merge pull request #939 from danielpetrica/patch-1
Update it.js
2024-11-29 13:44:30 -08:00
Nariman Jelveh 5d5b20f40a Merge branch 'main' into patch-1 2024-11-29 13:44:01 -08:00
Nariman Jelveh ac21708c46 Merge pull request #937 from puyab91/italian_translation
PR_836_italian translation
2024-11-29 13:41:07 -08:00
Daniel, Petrica Andrei-Daniel 8c0c31cd09 Update it.js 2024-11-29 22:35:38 +01:00
mkalevo 60e87bdf92 #871 added missing Finnish translations in fi.js 2024-11-29 20:44:56 +00:00
Daniel, Petrica Andrei-Daniel cb70bb2b62 Update it.js 2024-11-29 21:28:56 +01:00
Mithun Munsi 57bdd39d7a Fixes issue #871 2024-11-29 22:25:06 +02:00
KernelDeimos 9f726b3e75 dev: add ai comment generator 2024-11-29 15:22:24 -05:00
puya.bahrani f2243859cf italian translation 2024-11-29 21:12:17 +01:00
Nariman Jelveh c3a042371c Merge pull request #936 from HeyPuter/revert-935-update-italian-translations
Revert "Update Italian translations"
2024-11-29 10:29:55 -08:00
Nariman Jelveh 4ac33675a3 Revert "Update Italian translations" 2024-11-29 10:29:46 -08:00
Nariman Jelveh f4e05440ae Merge pull request #935 from RidvanPlluzhina/update-italian-translations
Update Italian translations
2024-11-29 10:28:52 -08:00
RidvanPlluzhina d2bab8c7e8 Update Italian translations 2024-11-29 19:26:17 +01:00
Nariman Jelveh 1cfb3f5a75 Merge pull request #934 from ria147/ria147/update-dev-center
Enable Save button in Dev Center only when settings change and add a Reset button
2024-11-29 07:27:10 -08:00
jelveh 9ba0f2410c set correct base64 value for icon and socialImage 2024-11-29 07:16:59 -08:00
jelveh 92cd65261e also track icon and socialImage 2024-11-29 06:53:29 -08:00
ria147 3f1804eb2a dev: enable/disable reset button iff changes are made 2024-11-29 01:03:53 -05:00
ria147 e5788b6e47 dev: add functionality to reset edit button 2024-11-29 00:58:09 -05:00
ria147 55ffd801e0 feat: add reset edit changes button to dev-center 2024-11-29 00:47:40 -05:00
ria147 63a0053da8 feat: enable/disable save button in dev-center iff changes made 2024-11-29 00:30:57 -05:00
Nariman Jelveh 42378ecc4c Merge pull request #932 from kingflamez/polish-translation
Added missing Polish translation
2024-11-28 01:30:15 -08:00
kingflamez 09665a8d7b added missing polish translation 2024-11-28 08:16:34 +01:00
kingflamez bd35710548 added missing polish translation 2024-11-28 08:15:32 +01:00
jelveh 6bef127c24 Update de.js 2024-11-27 19:13:55 -08:00
Nariman Jelveh 061341db19 Merge pull request #929 from ahamiltonnn/German-translation
Added German translation
2024-11-27 19:12:09 -08:00
Austin Hamilton 80f3ffa5fa Added missing placeholders 2024-11-27 20:08:31 -07:00
jelveh c30f06b0f2 Update he.js 2024-11-27 19:08:05 -08:00
Nariman Jelveh 210e08b678 Merge pull request #930 from AmitMaymon/patch-1
Update he.js
2024-11-27 19:06:23 -08:00
AmitMaymon 8d846d3c37 Update he.js
Translated the unfinished hebrew translation
2024-11-28 05:01:16 +02:00
Austin Hamilton 73d7152652 Added german translation 2024-11-27 20:01:00 -07:00
jelveh 8dec78b090 fix: remove unnecessary integrity and crossorigin attributes in dev center when linking to jquery 2024-11-27 17:56:45 -08:00
KernelDeimos c5cd8cc219 dev: register PermissionUtil 2024-11-27 16:29:57 -05:00
KernelDeimos d014814c36 dev: allow services to register usage info 2024-11-27 16:19:50 -05:00
jelveh f94631949f tweak: return created timestamp of apps in query 2024-11-27 13:16:02 -08:00
KernelDeimos d2c1878ed4 dev: add usage check hook for ai services 2024-11-27 16:09:04 -05:00
Nariman Jelveh 237dc94377 Merge pull request #928 from Nathaniyell/main
Update Igbo translation of words #864
2024-11-27 11:41:56 -08:00
Nariman Jelveh 7c41396a62 Update ig.js 2024-11-27 11:40:21 -08:00
Nathaniyell 589ca4771e update ig.js 2024-11-27 20:31:22 +01:00
Nathaniyell 5ac5b8bd48 git add update translation of words 2024-11-27 20:27:26 +01:00
KernelDeimos 9ddc84e6cf dev: record token-based usages 2024-11-27 13:53:33 -05:00
Nariman Jelveh e96bae5b7d Merge pull request #927 from keimindev/feature/add-Korean
Issues #861-Add missing Korean translations
2024-11-27 06:19:52 -08:00
Nariman Jelveh f60834f043 Merge branch 'main' into feature/add-Korean 2024-11-27 06:19:29 -08:00
Nariman Jelveh a6e31ee7f5 Merge pull request #925 from Fumnanya92/Fumnanya92-update-igbo-translations
Update ig.js
2024-11-27 05:57:35 -08:00
Nariman Jelveh 1c4a66da44 Update ig.js 2024-11-27 05:53:36 -08:00
Nariman Jelveh 9397004b86 Merge pull request #926 from hpark75/korean-000861-ko-js-missing
KOREAN-000861: Missing translations done
2024-11-27 05:43:35 -08:00
Nariman Jelveh d7f31e91e1 Merge branch 'main' into korean-000861-ko-js-missing 2024-11-27 05:43:25 -08:00
Nariman Jelveh e9888c12ac Merge pull request #922 from anapimolodec/861-korean
added Korean translations
2024-11-27 05:40:43 -08:00
Nariman Jelveh 27f65e54c8 Update ko.js 2024-11-27 05:40:07 -08:00
keimindev 55e9fabf35 Add missing Korean translations 2024-11-27 19:05:58 +09:00
Hee b8e358b658 KOREAN-000861: Missing translations done 2024-11-27 06:58:16 -03:00
Fumnanya92 da3251d2cc Update ig.js
Complete missing Igbo translations in src/gui/src/i18n/translations/ig.js

- Translated all missing keys in the Igbo localization file.
- Ensured cultural appropriateness and accurate representation of English text.
- Carefully handled placeholders like %strong% for proper placement within the translated text.
2024-11-27 09:15:56 +01:00
Nariman Jelveh 6204ddd5c6 Merge pull request #924 from denisugiarto/update-id-translation
update id.js
2024-11-26 20:54:53 -08:00
Nariman Jelveh bc95875f2d Merge pull request #923 from monyxie/zh-translations
Update zh translations
2024-11-26 20:50:54 -08:00
deni sugiarto 0592d2709e update id.js 2024-11-27 11:18:52 +07:00
Aiaru 71e7a12b35 added translations 2024-11-27 13:00:19 +09:00
Max Xie 77eb1c0a3d Update zh translations 2024-11-27 11:54:06 +08:00
Nariman Jelveh 6d6e3e67ab Merge pull request #921 from junian/patch-1
Update id.js #865
2024-11-26 19:15:42 -08:00
Nariman Jelveh a4217ae169 Update id.js 2024-11-26 19:14:30 -08:00
Junian Triajianto 2f6d7323ca Update id.js 2024-11-27 10:08:28 +07:00
Junian Triajianto 2238b933a7 Update id.js #865 2024-11-27 10:04:10 +07:00
KernelDeimos 811732cb56 dev: switch xai to openai client, get streaming counts 2024-11-26 16:45:33 -05:00
KernelDeimos 0d90b588aa dev: get streaming token counts on everything (except xAI) 2024-11-26 16:45:33 -05:00
KernelDeimos 2dd9417234 dev: get token counts on all services 2024-11-26 16:45:33 -05:00
jelveh f3d270ccbc fix: remove inactive links in README 2024-11-26 13:39:42 -08:00
Nariman Jelveh bcf36491b4 Merge pull request #920 from gng92/patch-2
Update hy.js
2024-11-26 11:23:13 -08:00
Nariman Jelveh e4f2066bb4 Update hy.js 2024-11-26 11:22:52 -08:00
gng92 63660b004d Update hy.js
Missing translations added
2024-11-26 23:19:04 +04:00
Nariman Jelveh ecedba4120 Merge pull request #919 from Rebandradha/main
"Complete Kurdish Translation for ku.js"Completed missing Kurdish translations in ku.js
2024-11-26 10:22:26 -08:00
jelveh 4686e210c3 Update ku.js 2024-11-26 10:21:23 -08:00
KernelDeimos fe1a4cfd4d fix: improve backend mod error handling 2024-11-26 13:20:44 -05:00
Nariman Jelveh 885a58c97d Update ku.js 2024-11-26 10:19:13 -08:00
Nariman Jelveh f27c824682 Merge pull request #918 from HeyPuter/revert-917-main
Revert "Improve your word choice to make it easier for Indonesians to underst…"
2024-11-26 09:40:34 -08:00
Nariman Jelveh 2884fe7183 Revert "Improve your word choice to make it easier for Indonesians to underst…" 2024-11-26 09:40:02 -08:00
Nariman Jelveh 1c145119f0 Merge pull request #917 from rhecustein/main
Improve your word choice to make it easier for Indonesians to underst…
2024-11-26 09:39:55 -08:00
Bintang Wijaya d0642d7806 Merge branch 'main' into main 2024-11-27 00:04:12 +07:00
rebandradha 14cc4904bd Completed missing Kurdish translations in ku.js 2024-11-26 20:04:06 +03:00
jelveh 63450ccd49 Update id.js 2024-11-26 08:58:35 -08:00
Nariman Jelveh e424e905aa Merge pull request #916 from DigitalGenius-ui/update-transulation
new transulations are added
2024-11-26 08:56:24 -08:00
rhecustein ab1bceab06 Improve your word choice to make it easier for Indonesians to understand. 2024-11-26 23:37:58 +07:00
KernelDeimos b25d55e596 dev: configurable extension dirs 2024-11-26 11:10:28 -05:00
DigitalGenius-ui b3f5a7b846 new transulations are added 2024-11-26 23:54:51 +08:00
Nariman Jelveh a54f51db90 Merge pull request #915 from bestlucky123/fix_issue_862
Fix: Japanese Translation for i18n (Issue 862)
2024-11-26 06:19:07 -08:00
Nariman Jelveh 0cf9304683 Update ja.js 2024-11-26 06:18:44 -08:00
bestlucky123 fceaf714c3 Fix: Japanese Translation for i18n 2024-11-26 18:35:29 +09:00
KernelDeimos 871416f461 dev: migrate openai to new controller (last one) 2024-11-25 15:54:11 -05:00
KernelDeimos 3f4efb9948 dev: implement ai model fallback 2024-11-25 14:58:21 -05:00
KernelDeimos 0d86233b45 dev: migrate together-ai to new controller 2024-11-25 12:10:22 -05:00
KernelDeimos 5746c7156a dev: migrate Mistral to new controller 2024-11-25 12:10:22 -05:00
KernelDeimos e6928cf6c7 sync: add llama-3.1-70b-specdec 2024-11-25 12:10:22 -05:00
KernelDeimos 4015c531f5 dev: migrate Groq to new controller 2024-11-25 12:10:22 -05:00
KernelDeimos 2c3eb93d22 sync: model info 2024-11-25 12:10:22 -05:00
Nariman Jelveh 0b4adb6bc1 Merge pull request #914 from JessicaFredin/update-swedish-translations
Update Swedish translations in sv.js
2024-11-25 08:29:28 -08:00
Nariman Jelveh ecd6c4e781 Update sv.js 2024-11-25 08:27:02 -08:00
Nariman Jelveh c86b1175b3 Merge pull request #912 from BertramYe/BertramYe-patch-add-Chinese-(中文)-translation-of-Puter
Update zh.js
2024-11-25 08:14:03 -08:00
Nariman Jelveh d65828930a Merge branch 'main' into BertramYe-patch-add-Chinese-(中文)-translation-of-Puter 2024-11-25 08:13:49 -08:00
Nariman Jelveh 91b4ca77cb Merge pull request #913 from SoarUI/main
update issues/#845
2024-11-25 08:11:54 -08:00
Nariman Jelveh 0273192105 Update zh.js 2024-11-25 08:11:34 -08:00
JessicaFredin b734ed75b6 Update Swedish translations in sv.js 2024-11-25 17:10:09 +01:00
BertramYe 76faf79f5a Update zh.js
fix the issue of `Complete the Chinese (中文) translation of Puter #845`
2024-11-25 23:57:03 +08:00
Nariman Jelveh b51618d5aa Merge pull request #911 from mardax007/main
Updated nl.js with missing translations
2024-11-25 07:39:59 -08:00
Mardax d590f53c46 Update nl.js 2024-11-25 15:39:21 +00:00
jelveh e0a577f5a5 Update nl.js 2024-11-25 07:35:50 -08:00
soarui 957513737d update issues/#845 2024-11-25 10:35:31 -05:00
Mardax 638c805a95 Update nl.js 2024-11-25 15:32:08 +00:00
Nariman Jelveh 0c6e8ca4ed Merge pull request #910 from monish-j/fix-hindi-translations
Fix missing Hindi translations in hi.js
2024-11-25 06:57:51 -08:00
jelveh b73a3bbfd8 Update hi.js 2024-11-25 06:57:22 -08:00
Monish Jaiswal 5ec3bbcf24 Fix missing Hindi translations in hi.js 2024-11-25 14:07:19 +05:30
jelveh 9a0edc80e4 tweak: decrease the opacity of the overlay for showSpinner 2024-11-24 21:09:45 -08:00
jelveh 8817a25b65 Update UIWindowQR.js 2024-11-24 15:51:36 -08:00
KernelDeimos 7fa11a4ca0 dev: apply openai moderation to claude and xai 2024-11-24 18:14:50 -05:00
KernelDeimos ef7047ede4 dev: allow extensions to audit prompts 2024-11-24 18:14:50 -05:00
KernelDeimos df42d433c9 ops: don't allow no origin 2024-11-24 18:14:50 -05:00
Nariman Jelveh 39c7df9bb5 Merge pull request #909 from Zac0511/patch-3
Update fr.js
2024-11-24 15:06:00 -08:00
jelveh 66016b9db6 feat: record signup metadata for abuse prevention 2024-11-24 13:00:43 -08:00
KernelDeimos e0df5429ce dev: add validator middleware 2024-11-24 14:27:37 -05:00
KernelDeimos 78da140cd6 dev: add server id 2024-11-24 13:37:13 -05:00
KernelDeimos 86bf08ccc0 dev: add metadata column 2024-11-24 13:34:54 -05:00
Zac0511 6b90c3f44d Update fr.js 2024-11-24 09:23:54 +01:00
Nariman Jelveh 4ed0af7921 Merge pull request #908 from AmirH-Sal/patch-1
Update fa.js
2024-11-23 21:07:18 -08:00
jelveh ff0cbef37b Update fa.js 2024-11-23 21:05:49 -08:00
AmirH-Sal 3b3d8cb316 Update fa.js 2024-11-23 20:56:45 -08:00
jelveh 3cedd17b8e fix: app query should return app metadata 2024-11-23 19:08:40 -08:00
jelveh f77f05062f tweak: improve minor ux for dev center 2024-11-23 14:50:02 -08:00
jelveh 7cf215ab67 feat: add support for categories in the Dev Center 2024-11-23 14:35:46 -08:00
jelveh 10b2ae6542 style: improve the flow and code of the Save Account flow 2024-11-23 14:14:30 -08:00
jelveh fc5aca1f72 feat: puter.js's showSpinner() will keep the spinner active for at least 1200ms 2024-11-23 13:23:20 -08:00
jelveh 966d98e469 tweak: showWorking -> showSpinner 2024-11-23 13:04:53 -08:00
jelveh 0980f7c585 tweak: trim description in the output html for homepage 2024-11-23 11:03:54 -08:00
jelveh b6a9d957aa tweak: clean up some dead imports 2024-11-23 10:44:45 -08:00
jelveh 5ec2d8f6ba Merge branch 'main' of https://github.com/heyputer/puter 2024-11-23 08:48:34 -08:00
jelveh a2c7b379f8 fix: safe parsing of app metadata 2024-11-23 08:48:14 -08:00
Nariman Jelveh 06996d238b Merge pull request #907 from rsdribeiroIT/portuguese_language
Update pt.js
2024-11-23 08:32:57 -08:00
jelveh d35308fd04 Update pt.js 2024-11-23 08:25:59 -08:00
[email protected] f5fc234dbb Update pt.js 2024-11-23 16:17:35 +00:00
Nariman Jelveh 2e6f10bee9 Merge pull request #905 from yeldynov/main
update ru.js
2024-11-23 07:14:21 -08:00
jelveh 2adf836f8a Update ru.js 2024-11-23 07:09:56 -08:00
Nariman Jelveh b7ceacfb8d Merge pull request #906 from PeterZsigmond/complete-hungarian-translation
Complete the Hungarian (Magyar) translation of Puter (Issue #867)
2024-11-23 06:39:33 -08:00
Peter Zsigmond b84c6a04a7 Add missing Hungarian translations in hu.js 2024-11-23 12:39:46 +01:00
Nikita Yeldynov 5de3fe8b46 update ru.js 2024-11-23 11:02:05 +02:00
jelveh be36d31509 feat: allow developers to set social media images for their apps 2024-11-22 17:59:00 -08:00
KernelDeimos 791c6f11f4 dev: max tokens for claude 2024-11-22 17:42:01 -05:00
KernelDeimos 3ed1453939 tool: token count testing 2024-11-22 17:21:48 -05:00
Nariman Jelveh 4b5a3128f3 Merge pull request #904 from saltimbanc/main
Update ro.js
2024-11-22 14:05:46 -08:00
Titus 53e00bec4f Update ro.js 2024-11-22 23:50:30 +02:00
KernelDeimos aa3dcea462 refactor: central controller for all LLM services
Adds AIChatService, an implementor of puter-chat-completion which can
delegate to other implementors (implementors that have registered with
AIChatService at initialization) based on details of the request.

Makes AIChatService the test implementation. AIChatService then
delegates to FakeChatService when in test mode.

Adds `models()` method to puter-chat-completion. This method, instead of
returning only the names of supported models, includes other details
such as the cost and maximum output size.

Implements `models()` on Claude and XAI.

Registers Claude and XAI with AIChatService.
2024-11-22 15:52:37 -05:00
KernelDeimos 791f7748c7 fix: configuration for browser launch
Makes browser launch on startup configurable. Also, by default, users of
Arch Linux will not be subjected to this behavior (they won't like it).
2024-11-22 13:58:33 -05:00
KernelDeimos 960a9ec9ee dev: set claude back 2024-11-22 11:28:44 -05:00
Nariman Jelveh d77c5f40b2 Merge pull request #903 from Kumara2mahe/missing-translation-issue851-mahendra
Add missing tamil translations; issue #851
2024-11-22 08:07:18 -08:00
Nariman Jelveh 35e4089a6f Update ta.js 2024-11-22 08:02:43 -08:00
Kumara2mahe ae9317a9ed Add missing tamil translations 2024-11-22 21:20:50 +05:30
KernelDeimos ee7bedd558 fix: previous fix 2024-11-22 10:37:00 -05:00
KernelDeimos 56710e17f3 fix: always adapt model for ClaudeEnough 2024-11-22 10:34:21 -05:00
KernelDeimos 1e15696096 Eh, Claude enough...
Replaces Claude with Grok pretending to be Claude. This is in lieu of a
proper fallback system which will be implemented later.

Grok will always say it's pretending to be Claude rather than
identifying itself as Claude.
2024-11-22 10:13:49 -05:00
jelveh f500fb4706 fix: automatically open browser when starting only if in dev env 2024-11-22 07:11:05 -08:00
jelveh 70096a8d6f fix(deps): update multiple dependencies 2024-11-22 06:35:22 -08:00
KernelDeimos f533dca1a6 fix: image generation supports test mode 2024-11-22 09:22:24 -05:00
jelveh 2d4312972a feat: automatically open the browser when starting Puter 2024-11-21 22:51:43 -08:00
jelveh 1062363096 feat: spinner for the showWorking() overlay in puter.js 2024-11-21 19:41:39 -08:00
Nariman Jelveh 1811545818 Merge pull request #902 from DavidReque/feat/loading-overlay
Improved Work Overlay Behavior
2024-11-21 19:28:42 -08:00
David Requeno 0385a2b32d tweak: enhance working overlay behavior 2024-11-21 21:14:13 -06:00
Nariman Jelveh 93d7340cc0 Merge pull request #898 from kemal-akar/main
Turkish translations completed and missing parts fixed (Issue #849)
2024-11-21 16:07:20 -08:00
jelveh d36e63c519 Update tr.js 2024-11-21 16:06:55 -08:00
Nariman Jelveh 21c99a90eb Merge pull request #900 from HeyPuter/revert-715-main
Revert "Added installation instructions for public hosting to readme"
2024-11-21 16:02:42 -08:00
Nariman Jelveh 971aa4cd0a Revert "Added installation instructions for public hosting to readme" 2024-11-21 16:02:27 -08:00
Nariman Jelveh 3f34301fc5 Merge pull request #715 from decipher2k/main
Added installation instructions for public hosting to readme
2024-11-21 16:02:08 -08:00
Nariman Jelveh 90c3acdef5 Merge pull request #899 from pashak1207/main
Fix: Resolved issue #848 - Ukrainian translation
2024-11-21 15:26:11 -08:00
pashak1207 ee705e5c1c Fix: Resolved issue #848 - Ukrainian translation 2024-11-21 23:39:51 +02:00
Kemal Akar 325483c2ac Turkish translations completed and missing parts fixed (Issue #849) 2024-11-22 00:26:57 +03:00
KernelDeimos 7f30ec46e7 test: add more thumbnailer tests 2024-11-21 15:45:37 -05:00
Nariman Jelveh 41e28badcd Merge pull request #897 from mark10112/thai-translation
Update th.js
2024-11-21 12:08:41 -08:00
jelveh 73c66bebf7 Update th.js 2024-11-21 12:08:31 -08:00
DESKTOP-Q7DI747\User 7e888248d1 thai missing translations 2024-11-22 02:32:42 +07:00
KernelDeimos 03817cd5c7 dev: thumbnail tests and readings 2024-11-21 14:09:56 -05:00
Nariman Jelveh 415d39e86d Merge pull request #896 from afaq-karim/translation/urdu-847
feat(i18n): update Urdu localization with missing translations
2024-11-21 10:48:53 -08:00
jelveh c140cd158b Update ur.js 2024-11-21 10:48:37 -08:00
afaq-karim 0c4b994644 feat(i18n): update Urdu localization with missing translations 2024-11-21 23:42:18 +05:00
KernelDeimos 1363de7cbf text: add test for privacy_aware_path 2024-11-21 12:06:02 -05:00
KernelDeimos d30d62f558 fix: share issue with prefix usernames 2024-11-21 11:40:08 -05:00
KernelDeimos d93fd419e4 dev: add human_readable_age to /whoami 2024-11-21 11:03:40 -05:00
Nariman Jelveh 14f52bcd1f Merge pull request #892 from nlaburu/i18n_gui_french
fix french missing translations
2024-11-21 05:51:49 -08:00
jelveh 4ce0670370 Update fr.js 2024-11-21 05:51:35 -08:00
Noah 6992ce06cb Merge branch 'HeyPuter:main' into i18n_gui_french 2024-11-21 11:05:36 +01:00
nlaburu a998e4b4cc fix missing placeholders in fr.js 2024-11-21 11:04:58 +01:00
Nariman Jelveh dd11cc0256 Merge pull request #895 from kiwipix/patch-3
Update zhtw.js
2024-11-20 20:07:13 -08:00
jelveh 46053f3e7c Update zhtw.js 2024-11-20 20:04:00 -08:00
kiwipix 2f15d129b6 Update zhtw.js
add translation for missing items
2024-11-21 11:53:08 +08:00
Nariman Jelveh cf8bf308a7 Merge pull request #894 from tien0412/patch-1
finish translation for vi.js
2024-11-20 19:49:40 -08:00
Nariman Jelveh 4d0d8e125b Update vi.js 2024-11-20 19:49:26 -08:00
tien0412 12cc753903 finish translation for vi.js 2024-11-21 10:29:42 +07:00
KernelDeimos 16257a7b54 fix: permission grants in open_item 2024-11-20 21:00:03 -05:00
nlaburu 99cd9b2315 fix french missing translations 2024-11-21 00:48:36 +01:00
jelveh bfacfc2a4e fix: sharing notification click opening directories 2024-11-20 15:44:17 -08:00
Nariman Jelveh 505865f3bf Merge pull request #891 from LuizGribner/feature/br-translation
Translate completed to Portuguese-BR
2024-11-20 15:25:19 -08:00
Nariman Jelveh ca2f7b4326 Update br.js 2024-11-20 15:23:19 -08:00
jelveh 035de8e73e Update UIDesktop.js 2024-11-20 15:21:05 -08:00
Luiz Gribner f5247c9dfe Translate completed to Portuguese-BR 2024-11-20 19:55:38 -03:00
KernelDeimos 5e463e1db8 dev: validate metadata 2024-11-20 17:17:23 -05:00
KernelDeimos e6986d5216 dev: add share metadata and messages 2024-11-20 17:01:32 -05:00
Nariman Jelveh 9dff04f8d5 Merge pull request #890 from HeyPuter/revert-886-motabbir
Revert "Added missing translations for Bengali localization (#842)"
2024-11-20 12:55:42 -08:00
Nariman Jelveh 63d4a604fa Revert "Added missing translations for Bengali localization (#842)" 2024-11-20 12:53:02 -08:00
Nariman Jelveh 1b98f0486f Merge pull request #886 from motabbirhossain/motabbir
Added missing translations for Bengali localization (#842)
2024-11-20 12:52:54 -08:00
Nariman Jelveh 546a268ed9 Merge branch 'main' into motabbir 2024-11-20 12:52:44 -08:00
KernelDeimos c7419d18df dev: add /acl/set-user-user 2024-11-20 15:36:00 -05:00
KernelDeimos 70d8e837af dev: prevent sharing a file to the same user twice 2024-11-20 15:23:46 -05:00
KernelDeimos 4396630453 dev: add /acl/stat-user-user
This new endpoint shows permissions granted by the current user to the
specified user in the scope of a specified filesystem node, including
permissions on the affecting parent nodes.

This is related to two future tasks:
- prevent users from sharing a file with the same user twice
- add an endpoint to modify the access mode of a shared file
2024-11-20 14:57:20 -05:00
Nariman Jelveh ea4cde82fc Merge pull request #889 from Barkatzx/update-bn.js
issue #842
2024-11-20 11:37:43 -08:00
Nariman Jelveh b76ab955b1 Merge branch 'main' into update-bn.js 2024-11-20 11:37:35 -08:00
Nariman Jelveh cedde40cd4 Merge pull request #887 from kazi331/patch-2
Update bn.js
2024-11-20 11:27:38 -08:00
jelveh d0bf94c5d0 Update bn.js 2024-11-20 11:18:59 -08:00
Nariman Jelveh 3bb4de4f90 Merge pull request #888 from NadaAly56/fix-arabic-translation
fixixng arabic translation
2024-11-20 10:27:15 -08:00
jelveh ac4cc95be5 Update ar.js 2024-11-20 10:26:21 -08:00
Nariman Jelveh 0abddf5fea Merge branch 'main' into patch-2 2024-11-20 10:24:44 -08:00
Barkatzx b0046ceb26 issue #842 2024-11-21 00:23:25 +06:00
Nariman Jelveh dc5f699ec6 Merge pull request #885 from FahimFBA/issue-842
Filled the missing Bengali translation and updated the old translation
2024-11-20 10:15:47 -08:00
jelveh be566cb7c1 Update bn.js 2024-11-20 10:15:30 -08:00
nada f0012fdf87 fixixng arabic translation 2024-11-20 19:30:26 +02:00
KernelDeimos d911754e2b dev: fix test_mode flag 2024-11-20 12:03:39 -05:00
Kazi Shariful Islam 4ca1bddbd1 Update bn.js
updated with manual translation
2024-11-20 22:57:27 +06:00
motabbirhossain d43e79243a Added missing translations for Bengali localization (#842) 2024-11-20 22:46:17 +06:00
FahimFBA 0d1e676ce1 update translation: login2fa_otp_instructions 2024-11-20 22:22:53 +06:00
FahimFBA 98e2331a56 update translation: setup2fa_4_instructions 2024-11-20 22:22:33 +06:00
FahimFBA af7be2c917 update translation: setup2fa_3_step_heading 2024-11-20 22:21:59 +06:00
FahimFBA f85adbe7ec update translation: setup2fa_1_instructions 2024-11-20 22:21:46 +06:00
FahimFBA 43a2afc843 update translation: undo 2024-11-20 22:20:49 +06:00
FahimFBA d2eae20223 update translation:two_factor_enabled 2024-11-20 22:20:26 +06:00
FahimFBA 16e6307bca update translation: two_factor_disabled 2024-11-20 22:20:11 +06:00
FahimFBA 9fd977761c update translation: skip 2024-11-20 22:19:15 +06:00
FahimFBA fdd0c67b1d update translation: reset_colors 2024-11-20 22:18:28 +06:00
FahimFBA 7a8da04634 update translation: replace_all 2024-11-20 22:17:50 +06:00
FahimFBA b89a5ad523 update translation: refer_friends_social_media_c2a 2024-11-20 22:17:27 +06:00
FahimFBA eb19ec0c48 update translation: refer_friends_c2a 2024-11-20 22:17:11 +06:00
FahimFBA 26250800de update translation: personalization 2024-11-20 22:16:08 +06:00
FahimFBA fd7e762850 update translation: passwords_do_not_match 2024-11-20 22:15:51 +06:00
FahimFBA 47717f1d41 update translation: password_reset_sent 2024-11-20 22:15:33 +06:00
FahimFBA 90a2a44c45 update translation: password_requirements 2024-11-20 22:15:10 +06:00
FahimFBA 90fa5f184c update translation: password_recovery_rate_limit 2024-11-20 22:14:45 +06:00
FahimFBA 38fec34d56 update translation: open_with 2024-11-20 22:14:12 +06:00
FahimFBA af2e1687ca update translation: open_in_new_window 2024-11-20 22:13:57 +06:00
FahimFBA 88efa1c89c update translation: lightness 2024-11-20 22:13:11 +06:00
FahimFBA c6a734896d update translation: items_in_trash_cannot_be_renamed 2024-11-20 22:12:43 +06:00
FahimFBA f6a4a7864a update translation: hide_all_windows 2024-11-20 22:12:23 +06:00
FahimFBA b8adacabc1 update translation: force_quit 2024-11-20 22:11:44 +06:00
FahimFBA 9314b949ff update translation: feedback_sent_confirmation 2024-11-20 22:11:04 +06:00
FahimFBA 9e918042b1 update translation: email_invalid 2024-11-20 22:09:31 +06:00
FahimFBA faf5a48ee1 update translation: email_change_confirmation_sent 2024-11-20 22:09:11 +06:00
FahimFBA 67cc5b03ad update translation: dont_allow 2024-11-20 22:08:45 +06:00
FahimFBA 3bbacdeaea update translation: disable_2fa_instructions 2024-11-20 22:08:21 +06:00
FahimFBA 451b23eb4c update translation: disable_2fa_confirm 2024-11-20 22:08:06 +06:00
FahimFBA a7f032a325 update translation: disable_2fa 2024-11-20 22:07:52 +06:00
FahimFBA b267547ea7 update translation: deploy_as_app 2024-11-20 22:07:23 +06:00
FahimFBA c2da4527b7 update translation: date_modified 2024-11-20 22:06:59 +06:00
FahimFBA 6bef43468a update translation: close_all 2024-11-20 22:06:34 +06:00
FahimFBA 20c49b6a05 update translation: clock_visible_auto 2024-11-20 22:06:14 +06:00
FahimFBA 127a241b84 update translation: confirm_delete_user 2024-11-20 22:05:30 +06:00
FahimFBA 4555a21fa1 update translation: confirm_code_2fa_instruction 2024-11-20 22:04:54 +06:00
FahimFBA e5229f4c7e update translation: confirm_code_2fa_instruction 2024-11-20 22:04:32 +06:00
FahimFBA 3114eb2dd5 update translation: confirming too many request
confirm_code_generic_too_many_requests
2024-11-20 22:04:12 +06:00
FahimFBA 3c07c30933 update translation: confirmation for referral
confirm_account_for_free_referral_storage_c2a
2024-11-20 22:03:17 +06:00
FahimFBA 41ec3a9698 update translation: confirm_2fa_recovery 2024-11-20 22:02:34 +06:00
FahimFBA 3c31791fe6 update translation: confirm 2024-11-20 22:01:58 +06:00
FahimFBA d9d5c09f15 update translation: confirm 2024-11-20 22:01:14 +06:00
FahimFBA c6a01e3060 update translation: change_always_open_with 2024-11-20 22:00:05 +06:00
FahimFBA 0d75306379 update translation: close_all_windows_and_log_out 2024-11-20 21:58:59 +06:00
FahimFBA ea1d46e27d update translation: change_ui_colors 2024-11-20 21:57:59 +06:00
FahimFBA 8ade96a54d update translation: change_email 2024-11-20 21:57:42 +06:00
FahimFBA 7b15d804df update translation: change_desktop_background 2024-11-20 21:57:22 +06:00
FahimFBA ede6ed4a0c add translation: This user already has access to this item 2024-11-20 21:54:25 +06:00
FahimFBA b76d2922c3 add translation: You can't share with yourself. 2024-11-20 21:53:25 +06:00
FahimFBA 3bd07dfabd add translation: Owner 2024-11-20 21:52:59 +06:00
FahimFBA 712852b3aa add translation: Share With… 2024-11-20 21:52:39 +06:00
FahimFBA e43e646f54 add translation: People with access 2024-11-20 21:52:20 +06:00
FahimFBA efbe0e0f7e add translation: Viewer 2024-11-20 21:51:48 +06:00
FahimFBA 6ac6870b9a add translation: Editor 2024-11-20 21:51:29 +06:00
FahimFBA f468c172f4 add translation: zipping 2024-11-20 21:51:10 +06:00
FahimFBA 84a68a3688 add translation: sequencing 2024-11-20 21:50:42 +06:00
FahimFBA f9b2a81d00 add translation: unzipping 2024-11-20 21:49:45 +06:00
FahimFBA 27da49dcd3 add translation: writing 2024-11-20 21:49:21 +06:00
FahimFBA be7d651f7f add translation: reading 2024-11-20 21:48:59 +06:00
FahimFBA a820721f74 add translation: password_strength_error 2024-11-20 21:47:09 +06:00
FahimFBA da2dee842a add translation: password_required 2024-11-20 21:45:49 +06:00
FahimFBA ae20fd5afa add translation: password_recovery_unknown_error 2024-11-20 21:45:19 +06:00
FahimFBA 86a54b9415 add translation: password_recovery_token_invalid 2024-11-20 21:43:36 +06:00
FahimFBA 1fa0bebfd5 update translation for: Clock Visibility 2024-11-20 21:42:44 +06:00
FahimFBA e3782f7b42 add translation for: clock_visibility 2024-11-20 21:41:41 +06:00
FahimFBA 2d522537ee add translation for: change 2024-11-20 21:41:07 +06:00
Nariman Jelveh 5ab87979bc Merge pull request #882 from Abhinav-Bansal751/main
Update es.js
2024-11-19 21:45:34 -08:00
jelveh 2c86240399 fix: add placeholders 2024-11-19 21:42:29 -08:00
Bansal b2afeb162a Update es.js 2024-11-20 11:02:54 +05:30
jelveh 35fd15854a fix: capitalize Hindi in i18n 2024-11-19 17:54:28 -08:00
jelveh f693211348 add: missing translation keys to different language files 2024-11-19 17:02:47 -08:00
KernelDeimos 36ca7f63aa dev: update referral and share notifs 2024-11-19 16:47:41 -05:00
KernelDeimos 0fa3be9d43 clean: cleanup backend logs 2024-11-19 15:00:04 -05:00
KernelDeimos dca7892fca sync: update CoreModule 2024-11-19 14:39:17 -05:00
KernelDeimos e0f4c527f4 dev: migrate referral service and use user.email-confirmed event 2024-11-19 14:31:33 -05:00
jelveh 65e6d6c09f fix: give camera and recorder write permission to Desktop 2024-11-19 10:52:42 -08:00
KernelDeimos 01725ffebf fix: potential null-or-undefined in DriverService 2024-11-19 13:08:58 -05:00
KernelDeimos 7ed557f375 dev: add fake chat service, for testing 2024-11-19 13:08:39 -05:00
KernelDeimos 86789920c4 dev: apply all relevant shares on verified email 2024-11-19 12:40:03 -05:00
KernelDeimos 0fd3b1e611 fix: usage bug 2024-11-19 11:08:54 -05:00
KernelDeimos 7e7234b2f3 fix: update share email 2024-11-19 10:28:42 -05:00
jelveh 4cc63b2580 Update UIWindowShare.js 2024-11-18 11:29:15 -08:00
jelveh 905b5d851e fix: allow scrolling of user list in share window 2024-11-18 10:40:15 -08:00
jelveh 0e45132c05 feat: show profile pics in sharing notifications 2024-11-18 07:22:13 -08:00
jelveh b11016dab3 fix: mobile detection 2024-11-17 11:33:42 -08:00
jelveh 7a7c14fb04 fix: mobile-friendly taskbar 2024-11-17 11:06:10 -08:00
jelveh 0885937f03 feat: Implement profile pictures 2024-11-16 19:07:09 -08:00
KernelDeimos 59fa600f2b dev: edge rate limit for email share 2024-11-16 20:04:23 -05:00
KernelDeimos e0128aa88c fix: prevent permission cycles 2024-11-15 18:47:47 -05:00
jelveh e482b00a30 fix: launchApp on explorer supports ~ now 2024-11-15 15:38:59 -08:00
jelveh 8fefd4a61f feat: allow launchApp to open explorer at a specific path 2024-11-15 15:29:23 -08:00
jelveh cdd1a8c4e3 feat: Require email confirmation before sharing 2024-11-15 12:07:48 -08:00
Eric Dubé 98bd10c82b Revert "added a chime playback"
This reverts commit 2eaf1080d6.
2024-11-15 13:41:31 -05:00
Eric Dubé 5fd11cc607 Revert "added event listener to play chime on the first click"
This reverts commit 4885a76a75.
2024-11-15 13:41:31 -05:00
Eric Dubé fa5d731641 Revert "."
This reverts commit 1919cb3d99.
2024-11-15 13:41:31 -05:00
Eric Dubé f8ac0dbdb7 Revert "play chime only once"
This reverts commit edeb79d92c.
2024-11-15 13:41:31 -05:00
KernelDeimos 08779ac455 dev: make share feature flag reflect user state 2024-11-15 13:40:24 -05:00
KernelDeimos 14b962b459 dev: add function-flag feature flag type 2024-11-15 13:34:56 -05:00
4nshuman edeb79d92c play chime only once 2024-11-15 12:43:17 -05:00
4nshuman 1919cb3d99 . 2024-11-15 12:43:17 -05:00
4nshuman 4885a76a75 added event listener to play chime on the first click 2024-11-15 12:43:17 -05:00
4nshuman 2eaf1080d6 added a chime playback 2024-11-15 12:43:17 -05:00
KernelDeimos 69bfa60199 fix: only allow UserActorType for ShareService 2024-11-15 12:09:31 -05:00
jelveh 045259cefb feat: show unread notification count in the browser tab's title 2024-11-14 17:19:21 -08:00
KernelDeimos b1ffb8eca1 fix: new sessions miss notifications 2024-11-14 19:26:15 -05:00
jelveh d0f16c8105 fix: don't allow sharing with recipient just shared with 2024-11-14 15:38:26 -08:00
KernelDeimos 085d808817 fix: add username to comments 2024-11-14 18:09:46 -05:00
jelveh d91435db57 Merge branch 'main' of https://github.com/heyputer/puter 2024-11-14 14:45:43 -08:00
jelveh cf4b6aa1c2 feat: in Share window, display access level next to recipient 2024-11-14 14:45:35 -08:00
KernelDeimos db79a72daa feat(backend): add comments for fsentries 2024-11-14 17:45:20 -05:00
jelveh 0cbe0139d7 feat: when sharing, users can choose between 'viewer' and 'editor' for permissions 2024-11-14 14:08:49 -08:00
jelveh a6650ee2d8 feat: handle notif.ack in desktop 2024-11-14 12:52:15 -08:00
KernelDeimos 9e303a2f7c fix: occasional db error from notics 2024-11-14 15:18:28 -05:00
KernelDeimos 00e0fb350a dev: add notif.ack message 2024-11-14 15:18:28 -05:00
KernelDeimos 3f3f4e6cb9 fix: un-awked notif check in wrong place 2024-11-14 15:18:28 -05:00
jelveh 9d40ad9b4e Update UIWindow.js 2024-11-14 09:55:39 -08:00
jelveh 9d7987fae5 fix: disabled sortable on sharing section in the sidebar 2024-11-14 09:37:06 -08:00
KernelDeimos 665471f9f0 fix: add mixxing context to BroadcastService 2024-11-13 23:25:44 -05:00
KernelDeimos 22dd42ef7f fix: attempt at fixing broadcast 2024-11-13 23:13:45 -05:00
KernelDeimos cd22425a3d fix: replace ll_readshares with better approach
Recursively checking for files with 'see' permission? What was I
thinking? This replaces the disasterously awful approach of scanning a
user's entire file tree to find shares, with an approach which instead
selects on the permissions table and extracts file UUIDs from
permissions.
2024-11-13 22:44:54 -05:00
KernelDeimos 34836e374f fix: only add enabled_logs when not empty 2024-11-13 22:15:09 -05:00
KernelDeimos caf8d2a055 dev: track ll_readshares depth 2024-11-13 21:14:56 -05:00
KernelDeimos 249dc06201 fix: don't check share permission anymore 2024-11-13 20:39:58 -05:00
jelveh 94b10c78b7 tweak: sharing style 2024-11-13 17:30:03 -08:00
jelveh b5bb95e2d7 feat: add error handling to the share flow 2024-11-13 15:59:29 -08:00
jelveh 9a311058ef tweak: disable sidebar_items polling 2024-11-13 15:45:02 -08:00
jelveh 599c7ad0a1 Update UIElement.js 2024-11-13 14:43:30 -08:00
jelveh 622205ae51 tweak: enable sharing 2024-11-13 13:49:17 -08:00
KernelDeimos 27cc07e985 fix: files shared array in notification 2024-11-13 15:02:10 -05:00
KernelDeimos 89aab03905 tweak: enable share 2024-11-13 13:15:22 -05:00
KernelDeimos 8f59c2614d tweak: put groups manager behind a flag 2024-11-13 12:54:54 -05:00
KernelDeimos 5725bd8c66 fix: report path for broken files as /-void/ 2024-11-13 12:11:48 -05:00
Nariman Jelveh c53107db67 Merge pull request #830 from Zac0511/patch-2
Update README.fr.md
2024-11-12 22:28:23 -08:00
jelveh 7ca0a02fa4 tweak: safe data URI strings for icons in search 2024-11-12 20:45:53 -08:00
jelveh 55d2af189e feat: search 2024-11-12 20:20:43 -08:00
KernelDeimos b589512c9d feat: search endpoint 2024-11-12 17:58:43 -05:00
jelveh ac3317aea9 fix: issue with popover closing when clicked 2024-11-12 13:27:29 -08:00
jelveh 1adfe5c709 feat: the socialLink UI component 2024-11-12 12:40:14 -08:00
jelveh 45ecce4653 Update style.css 2024-11-11 20:49:49 -08:00
jelveh a70cb49a30 tweak: style improvement 2024-11-11 17:31:43 -08:00
jelveh 27c01c9bd9 feat: Reaload App option in the window title bar context menu 2024-11-11 11:46:28 -08:00
KernelDeimos a08e9758fe fix: groups manager location 2024-11-11 14:40:50 -05:00
jelveh a9679910c6 Update style.css 2024-11-10 10:46:13 -08:00
KernelDeimos 402ffb0fd1 fix: don't show kvstore in usages 2024-11-10 13:33:41 -05:00
KernelDeimos 4f9d9a54ef fix: add missing id for task_manager menu item 2024-11-10 12:46:42 -05:00
Nariman Jelveh 6c44032293 fix: Update security.txt canonical URL 2024-11-10 08:55:51 -08:00
Nariman Jelveh d6307cc389 Create FUNDING.yml 2024-11-10 08:48:12 -08:00
KernelDeimos fc0cb2dde4 tweak: usage endpoint 2024-11-09 17:41:16 -05:00
KernelDeimos 85020109b3 dev: add virtual groups for computed permissions 2024-11-09 17:40:47 -05:00
KernelDeimos a324c91560 dev: add quick window to see what groups a user is in
I need this for development/debugging purposes. I figure I may as well
start developing the system dialog we'll eventually have to create
rather than make a temporary debugging element. This window could
eventually become a full-featured group manager, and can easily be moved
to a settings tab.
2024-11-09 15:57:28 -05:00
KernelDeimos 59984bb930 dev: recursive log toggle for puter.js 2024-11-09 15:14:37 -05:00
KernelDeimos 6f5f11da09 dev: allow other backend services to set gui_params 2024-11-08 16:04:55 -05:00
jelveh e8f67da9a3 fix: update apps cache by reading from primary db 2024-11-08 10:56:00 -08:00
KernelDeimos 164d5ef167 test: update TestKernel 2024-11-08 12:13:30 -05:00
Zac0511 acfa912cde Update README.fr.md 2024-11-08 10:17:55 +01:00
Zac0511 bb3b38c9ed Update README.fr.md
Added a link to Puter.com
2024-11-08 10:12:58 +01:00
KernelDeimos 28adcf533f feat(ai): add xAI grok-beta 2024-11-07 15:01:13 -05:00
KernelDeimos d613c5fc83 log: when app is launched 2024-11-07 14:27:02 -05:00
KernelDeimos 5caa2c0e3a fix: logging in AppConnection 2024-11-07 14:26:30 -05:00
KernelDeimos 5d416e2316 refactor: simplify module constructors
This was a really small refactor - about 30mins - that moves the concern
of common constructor args for modules outside of each individual call.

A Context object is now used for common constructor arguments. Some of
the values on this object - such as APIOrigin and authToken - are
following values on the instance of the Puter class. This means that for
some modules it is already possible to eliminate the setAuthToken and
setAPIOrigin listeners (out of scope for this commit). Any which remain
could eventually be replaced with a listener on the Context object
itself.

This commit also moves the initSubmodules method to the top of the class
so that it's easier for new devs to find, in case they're looking into
an issue on a specific module rather than the Puter class itself.
2024-11-07 13:29:18 -05:00
Nariman Jelveh 63d6573fba docs: add link to Self-Hosting Documentation in README.md 2024-11-06 17:34:32 -08:00
jelveh 1a6d648a6e fix: persist clock visibility change 2024-11-05 18:31:03 -08:00
KernelDeimos ba2eb716f5 dev: add prefix logger 2024-11-05 15:57:55 -05:00
KernelDeimos da0022abf0 feat: add puter.auth.whoami() 2024-11-05 15:49:51 -05:00
KernelDeimos 755736edee feat: add puter.log 2024-11-05 15:31:44 -05:00
KernelDeimos e71fe11e32 dev: add toggle logging, and fix issues in logger 2024-11-05 15:31:17 -05:00
KernelDeimos b0cbcdf743 dev: add logger to putility 2024-11-05 15:03:21 -05:00
KernelDeimos fe8d6af1b5 sync: update claude model (take 2) 2024-11-04 22:46:57 -05:00
KernelDeimos 52a54d2248 sync: update claude model 2024-11-04 22:28:34 -05:00
jelveh 9263cbaedd Merge branch 'main' of https://github.com/heyputer/puter 2024-11-04 17:33:13 -08:00
jelveh 9590bbdad1 fix: don't access metadata.credentialless if it doesn't exist 2024-11-04 17:33:08 -08:00
KernelDeimos 16b9f09e66 fix: reinitialize settings tabs for DOM events 2024-11-04 19:25:04 -05:00
KernelDeimos 856688f884 dev: add database and config access for extensions 2024-11-04 16:42:42 -05:00
jelveh c44b9ab8d5 fix: use correct cursor when hovering over sidebar items 2024-11-04 10:08:11 -08:00
jelveh 79cff7ba29 Update style.css 2024-11-04 09:33:48 -08:00
jelveh 4e7979b50e Update style.css 2024-11-03 20:57:53 -08:00
jelveh 1056231004 feat: collapsible sidebar menu in Dev Center 2024-11-03 20:50:46 -08:00
jelveh 06d5dd763d tweak: dev center table visible when overflowing 2024-11-03 20:13:35 -08:00
jelveh 666912a8a3 revert style update 2024-11-03 17:20:09 -08:00
jelveh 452e3383e8 Update style.css 2024-11-03 17:18:12 -08:00
jelveh 05950b0fc3 tweak: automatically update sidebar_items every 2 seconds 2024-11-03 17:13:24 -08:00
jelveh 2e122c2cab Update style.css 2024-11-03 16:16:00 -08:00
jelveh ff30de1d69 feat: customize the order of Explorer sidebar items 2024-11-03 16:00:39 -08:00
jelveh 121043d312 fix: issue with context menu divider item stealing the event from previous item 2024-11-02 18:54:30 -07:00
jelveh 0315cb3337 fix: issue with non-scrollable window body and document Context Menu 2024-11-02 17:51:07 -07:00
KernelDeimos 05573dad51 tweak: load mods from extensions directory 2024-11-01 19:29:16 -04:00
KernelDeimos f836ac30a9 fix: temporary fix because .on can't call ensure_service 2024-11-01 18:21:05 -04:00
KernelDeimos 84989367a7 dev: hook extensions into service event bus 2024-11-01 17:42:12 -04:00
KernelDeimos 58f34b948a dev: simplify module/extension setup 2024-11-01 16:13:00 -04:00
KernelDeimos 7569e8a703 tweak: endpoints are authorized by default 2024-11-01 15:43:40 -04:00
KernelDeimos 4b6c70fa5e dev: expose more core definitions to extensions 2024-11-01 15:43:27 -04:00
KernelDeimos a614145250 dev: run npm install after copying extensions 2024-11-01 15:26:39 -04:00
KernelDeimos d958c01111 dev: add support for single-file extensions 2024-11-01 14:42:42 -04:00
KernelDeimos 3f6900f26b dev: add get() and post() to extension API 2024-11-01 14:41:29 -04:00
KernelDeimos d1ebbbe3c7 chore: update kdmod package.json to avoid confusion 2024-10-31 18:20:00 -04:00
KernelDeimos 0a47daa289 fix: issues in kdmod
The kdmod module was broken since we renamed packages/ to src/. Also,
the update to mod loading for some unknown reason now requires each call
to require to end with `.js`. As far as I know, this was working
previously.
2024-10-31 18:15:41 -04:00
KernelDeimos 14d45a27ed feat: add extension API for modules
Allows modules to register a listener to the 'install' event without
creating a Module class. This changes how external modules are
installed.

External modules are now referred to as "extensions"; this commit does
not update the term but does use 'extension' as the name of the global.
2024-10-31 18:08:27 -04:00
KernelDeimos f36718005f sync: add wiki as a submodule 2024-10-31 18:08:30 -04:00
Zac0511 f2fc8ba5cf Edit "Puter version" title and description in the bug report template
A quick edit to replace "Puter version (if accessible)" by "Puter version" and a new description to say that its not required.
2024-10-31 13:54:42 -04:00
KernelDeimos 9a0c5b4f74 dev: support no-response endpoints in Collector
The no_response option is added to Collector::post. If an endpoint
returns an empty response, this option must be set to avoid a JSON parse
error.
2024-10-30 18:52:47 -04:00
Nariman Jelveh 96b64f6b53 Merge pull request #817 from djelacik/main
minor documentation fixes
2024-10-30 08:26:35 -07:00
DeveloperDaniell 05169e9e1e minor documentation fixes 2024-10-30 16:36:43 +02:00
jelveh dc478382fb tweak: don't break if contact_us is not found 2024-10-29 23:44:54 -07:00
jelveh fc5e15f2a6 feat: first extension that implements a custom user options menu 2024-10-29 22:55:26 -07:00
jelveh b018571a86 feat: add support for extensions 2024-10-29 18:37:32 -07:00
KernelDeimos 14f477a633 fix: Collector bug on undefined body 2024-10-29 18:56:11 -04:00
KernelDeimos b9625945ae dev: expose save account and email confirm 2024-10-29 18:56:11 -04:00
KernelDeimos 463c96c69a fix: hyphenize_confirm_code bug 2024-10-29 18:56:11 -04:00
KernelDeimos 38adb5741b fix: app close issue in phoenix 2024-10-29 16:19:58 -04:00
KernelDeimos b30de5bf78 fix: reading JSON string from service_usage_monthly
This was hilariously difficult to debug. This isn't the first time an
issue like this occurred; this happens because of a deviation between
mysql and sqlite, where a JSON-typed column in mysql will return as a
native object in queries, whereas a JSON-typed column in sqlite is a
string column and will therefore return as an un-parsed JSON string in
queries.
2024-10-29 13:18:53 -04:00
KernelDeimos 7ba16d1c21 fix: recently broke counting service sql 2024-10-28 19:14:15 -04:00
KernelDeimos f1087953b5 fix: ignore invalid entries from service_usage_monthly 2024-10-28 19:09:17 -04:00
KernelDeimos 193da63304 fix: service usage screen
This fixes service monthly usage counts as shown in Settings.
2024-10-28 18:47:40 -04:00
KernelDeimos c0b109d4d2 dev: add get_proxy_object to util/context 2024-10-28 15:11:26 -04:00
KernelDeimos 3649dff9aa dev: add module lib installation to useapi 2024-10-28 15:11:26 -04:00
jelveh 3d85edf537 Update UIWindow.js 2024-10-27 21:33:08 -07:00
jelveh 54ae69b7b7 feat: add an 'Upload' button at the bottom of OpenFilePicker 2024-10-27 21:32:39 -07:00
jelveh cd8a080d72 tweak: user-friendly badges for apps in Dev Center 2024-10-27 21:09:18 -07:00
Nariman Jelveh b7c50fc2bb docs: add Garry's Mod to #DoesItRunPuter 2024-10-27 15:58:54 -07:00
jelveh af511c05e3 feat: Allow apps to toggle credentialless via Dev Center 2024-10-27 14:44:06 -07:00
KernelDeimos 4dc1e01682 fix: continue work on blocked_email_domains (2) 2024-10-27 15:46:21 -04:00
jelveh 161be7fe6b remove 'About' from taskbar apps 2024-10-26 09:56:57 -07:00
KernelDeimos 515051dabf fix: continue work on blocked_email_domains 2024-10-26 03:28:45 -04:00
KernelDeimos c22a69ffb1 fix: errors thrown by launch_app
Fixes errors that were noticed being thrown by launch_app, specifically
in the branch of logic when launch_app is called NOT via ExecService.
This branch of logic was added to fix an issue where notepad wasn't
prompting to save unsaved changes on close because data-appusessdk was
not properly set to true. The fix still worked, despite throwing these
errors, because setting data-appUsesSDK to true is the first thing it
does. However, broadcast messages to apps launched with launch_app NOT
via ExecService would have been broken.
2024-10-26 03:07:02 -04:00
jelveh a9bbcf908d Update style.css 2024-10-25 11:36:50 -07:00
KernelDeimos f3a9e784a3 dev: add can iterate check 2024-10-25 14:27:42 -04:00
KernelDeimos b98c5a349e dev: make anti-csrf more convenient 2024-10-24 23:11:07 -04:00
KernelDeimos f55b7ac0b8 dev: ensure existing app tokens don't break (for now) 2024-10-24 19:54:29 -04:00
KernelDeimos 6b8fbda14c dev: allow app tokens to identify user sessions 2024-10-24 19:51:54 -04:00
KernelDeimos bc51d4bd52 fix: notepad save issue 2024-10-24 02:28:19 -04:00
KernelDeimos 87f7fc0265 tweak: clarify blocked domain message 2024-10-24 00:57:21 -04:00
KernelDeimos 955b087297 feat: add config for blocked email domains 2024-10-24 00:38:40 -04:00
KernelDeimos 988039eade dev: src prop for images 2024-10-23 22:59:18 -04:00
KernelDeimos 25e9ed8227 dev: make el() yet more convenient 2024-10-23 01:08:16 -04:00
KernelDeimos 5965ab5de0 dev: allow UIElement to be used as settings tab 2024-10-22 23:55:42 -04:00
KernelDeimos 0bb80d2933 doc: add todo regarding /whoami 2024-10-22 21:54:48 -04:00
KernelDeimos 37bb98b965 dev(gui): add UIElement 2024-10-22 21:54:48 -04:00
jelveh 37aa2b1d06 tweak: improve the usage bar visibility 2024-10-22 17:39:38 -07:00
jelveh 4e8c7455aa tweak: Move clock settings to the 'Personalization' tab of 'Settings' 2024-10-22 17:18:16 -07:00
jelveh 6f702c3927 Going to /settings will open the Settings in full page mode 2024-10-22 16:46:06 -07:00
KernelDeimos c6bc42f551 fix: height 100% on flexer and step view 2024-10-22 18:10:16 -04:00
KernelDeimos 368c20cf57 dev: updates and URL collector 2024-10-21 22:57:25 -04:00
KernelDeimos 12e0cecf02 fix: wait no 2024-10-21 18:12:08 -04:00
KernelDeimos c8f913d710 fix: phoenix incorrect lookup order 2024-10-21 18:07:45 -04:00
ProgrammerIn-wonderland 891e799e5e WIP symlink, net_device virtio, move fixes, upload binary fixes 2024-10-21 17:04:57 -04:00
jelveh 13248a99bf feat: add support for fadeIn effect for UIWindow 2024-10-21 07:48:06 -07:00
jelveh 99ce3bde19 fix: turns out we don't support utm_source I learn something new about Puter every day! 2024-10-20 20:42:34 -07:00
jelveh 5e27055215 tweak: add utm_source to GitHub link 2024-10-20 20:26:31 -07:00
jelveh 920a2f2427 tweak: make backdrop darker to increase focus on active window 2024-10-20 20:15:19 -07:00
KernelDeimos 60fdce9052 sync: put app-center in the taskbar 2024-10-20 20:30:35 -04:00
KernelDeimos 8b1a935c93 sync: developer is in /dist now 2024-10-20 20:30:11 -04:00
KernelDeimos e0b9072129 fix: issue with service scripts that use TestView 2024-10-19 21:17:57 -04:00
Nariman Jelveh 90e7098cc7 Merge pull request #787 from 4nshuman/issue/zip-operation
Issue/zip operation
2024-10-19 15:45:39 -07:00
KernelDeimos b5535ae3ca dev: add dev2 env 2024-10-19 18:22:09 -04:00
KernelDeimos 0fb4f73d76 chore: remove noisy logs 2024-10-19 17:31:46 -04:00
4nshuman 63b4da5be8 connected upload's inbuilt progress counter 2024-10-20 02:07:07 +05:30
4nshuman fabc21ecf7 fixed sorting logic on directory list 2024-10-20 02:00:58 +05:30
4nshuman a646b02e45 provide incremental directories to mkdir 2024-10-20 02:00:35 +05:30
jelveh c29122c23f tweak: use different icons for system directories in the sidebar 2024-10-19 12:59:24 -07:00
4nshuman 4fdea7db66 offloaded write operations to Upload module 2024-10-20 00:06:30 +05:30
4nshuman f32b1cfce8 added option to create parent directories for programmatic file drops 2024-10-20 00:05:40 +05:30
4nshuman fc461c8735 added absolute file path processing 2024-10-20 00:04:36 +05:30
4nshuman d39b7a8972 record unique directory list 2024-10-19 23:52:21 +05:30
jelveh 74baab49f4 tweak: improve welcome window footer link color 2024-10-19 10:35:56 -07:00
jelveh 564ff65363 feat: welcome screen to quickly explain what Puter is 2024-10-19 10:28:03 -07:00
KernelDeimos 480d996279 dev: proof-of-concept for fs postMessage relay
Adds a filesystem relay service to GUI-side which currently reports an
exmaple fsentry for /stat and /readdir. Added filesystem services for
both sides. Moved filesystem implementations from src/modules to src/lib
since they're being called by services now rather than modules.

This functionality is effectively disabled unless
src/puter-js/src/services/Filesystem.js is updated to use init_app_fs_()
when the environment is 'app'.
2024-10-19 03:46:47 -04:00
KernelDeimos 6e5d5c2021 dev: clone property descriptors in Context 2024-10-19 03:45:41 -04:00
KernelDeimos c2a475f3c0 dev: lay the groundwork for client FS relay
Adds XDIncomingService to manage messages from another window. IPC now
registers with XDIncoming and reports whether it was handled, that way
messages intended to reach GUI can be reliably ignored.

On GUI-side, XDIncomingService will be used by FSRelayService (not yet
implemented) to handle requests for filesystem operations from another
window.

On App-side, XDIncomingService might be used by the PostMessageFS
client-side filesystem implementation terminal to listen for filesystem
events that were relayed by GUI (after a permission check) from their
original websocket source. Either that, or we'll open a filesystem
socket for each app using that app's token.

NoPuterYetService was added because IPC.js is loaded before
globalThis.puter exists, and was the easiest way to still allow IPC's
listener to be registered with XDIncomingService.

APIAccessService was added. This service currently holds auth_token and
api_token and does nothing else. FilesystemService listens to this to
maintain a websocket connection. APIAccessService will help to manage
the complexity of all further code dependent on being informed about
changes to the auth token or origin. Currently in puter.js these are
passed around to several modules which manage the same piece of state
information independantly.
2024-10-18 23:10:19 -04:00
KernelDeimos bc5d09fe31 dev: hooks and sequencing functions for ServiceManager 2024-10-18 23:10:19 -04:00
jelveh 2f6f2b7d7c Set autoDedupe to true for creating new apps in Dev Center 2024-10-18 18:44:06 -07:00
KernelDeimos 143cfb5654 fix: 1954f8-related issue #2
mkdir operation was passing user instead if actor. I really think I
changed this already; getting a crazy deja-vu feeling about it. Maybe a
commit was lost somewhere along the road, but not sure.
2024-10-18 21:24:05 -04:00
jelveh b1411cd622 Add dedupeName for to puter.apps and Dev Center 2024-10-18 18:02:37 -07:00
jelveh 8ed5db1734 Merge branch 'main' of https://github.com/heyputer/puter 2024-10-18 17:50:25 -07:00
jelveh 14fc963dd4 Show approval badges and lock in Dev Center 2024-10-18 17:48:14 -07:00
KernelDeimos b9c157b28e tweak: start from 1 2024-10-18 20:48:09 -04:00
KernelDeimos 66e8b37f70 dev: add dedupe_name option for app creation 2024-10-18 20:42:41 -04:00
KernelDeimos 4ce2dccc76 dev: update app approved_for props visibility
Allows owner users to read the approved_for properties on their own apps
2024-10-18 20:12:19 -04:00
KernelDeimos f5865daede fix: 1954f8-related issue
get-user-app-token was calling ll_mkdir with 'user' instead of 'actor'
2024-10-18 19:58:44 -04:00
KernelDeimos 1954f86680 fix(security): always use actor 2024-10-18 19:15:40 -04:00
KernelDeimos 94e15dbfa8 test: fix topics test and ServiceManager 2024-10-18 19:13:06 -04:00
jelveh 598a08ec45 Allow users to cancel a deploy operation before start 2024-10-18 16:07:01 -07:00
KernelDeimos 3c5d2af8c8 fix: small issue in Service.js 2024-10-18 15:53:40 -04:00
jelveh 29f5820129 Fix settings sidebar margin 2024-10-18 12:45:27 -07:00
KernelDeimos fb1216d488 fix: prevent code from breaking just because it was bundled 2024-10-18 15:06:08 -04:00
KernelDeimos 7922314840 dev: add generic pub/sub system for use anywhere
Dispatching and listening to events is non-trivial. The apparent
triviality is in implementing a list of listeners and calling them. The
non-triviality is in the nature of what happens to a system when it has
multiple different interfaces to register listeners and publish events.

This commit adds TopicsFeature, which allows any class extending
AdvancedBase to declare topics. A topic is a simple pub/sub channel.
TopicsFeature will manage the state of listeners so the class doesn't
need to. A GC-friendly mechanism for detaching listeners is also provided.
2024-10-17 22:56:00 -04:00
KernelDeimos 9b1f1817f5 dev: move service interface to trait 2024-10-17 22:56:00 -04:00
KernelDeimos 273a51fc53 dev: add ServiceManager
The ServiceManager will replace manual management of services within
initgui, and will also be used within puter.js. Eventually Puter's
backend might use this instead of the existing Container class, although
this will be a large change that needs to be done incrementally.

The difference between ServiceManager and Container is the logic behind
when initialization occurs. Rather than have all services initialized at
once when Container's init() method is called, services are initialized
as soon as their dependencies have been initialized.
2024-10-17 22:56:00 -04:00
jelveh 2a81825a6b Update default apps in the Launch menu 2024-10-17 16:14:24 -07:00
KernelDeimos 9535100c85 doc: add brainstorming for mountpoints 2024-10-17 03:00:35 -04:00
KernelDeimos 7980aafbd9 doc: add devlog from puter.js 2024-10-17 01:19:06 -04:00
ProgrammerIn-wonderland f0b7214a07 working persistence 2024-10-15 18:30:08 -04:00
ProgrammerIn-wonderland aae6fff340 adding locking to puter-save 2024-10-15 18:30:08 -04:00
ProgrammerIn-wonderland f0bc10f1e8 WIP persistence 2024-10-15 18:30:08 -04:00
KernelDeimos 1ea6d270f8 dev: add endpoint for GUI to query app file access 2024-10-15 16:19:11 -04:00
KernelDeimos fd7bd339ca dev: add Context to putility 2024-10-15 16:17:37 -04:00
Nariman Jelveh a2216aaea2 Merge pull request #805 from lohitkotni/patch-1
Update README.te.md
2024-10-14 20:53:37 -07:00
Surya Lohith Kotni a8e843297e Update README.te.md
fixed typo
2024-10-15 09:20:10 +05:30
Ibrahim H. 12a38b8258 Show a badge on README 2024-10-14 22:18:36 -04:00
Ibrahim H. f9b9565dab Create test workflow
basic test workflow setup, this allows checking that everything is fine on node v18 up to v22.
2024-10-14 22:18:36 -04:00
Zac0511 40f8634f24 Update bug_report.yaml 2024-10-14 22:16:04 -04:00
Zac0511 a22d9199f3 Update bug_report.yaml 2024-10-14 22:16:04 -04:00
Zac0511 551aed30be Update bug_report.yaml 2024-10-14 22:16:04 -04:00
Zac0511 0cd8404e87 Update and rename bug_report.md to bug_report.yaml 2024-10-14 22:16:04 -04:00
KernelDeimos 149684de01 dev: allow emulator app to access user files 2024-10-14 15:46:19 -04:00
KernelDeimos 9e88096e7e clean: remove a console.log 2024-10-14 15:19:52 -04:00
KernelDeimos e011df1a20 move: PuterAPIFilesystem 2024-10-14 15:19:18 -04:00
Nariman Jelveh 0f5f8bc591 Merge pull request #803 from lohitkotni/main
added telugu language translation
2024-10-14 09:20:57 -07:00
KernelDeimos 6d23369512 sync: add new page 2024-10-14 12:18:04 -04:00
loko 14bd643d4f added telugu language translation 2024-10-14 21:40:57 +05:30
KernelDeimos 3762037576 dev: oops 2024-10-12 00:01:33 -04:00
KernelDeimos 11fbcb27b0 dev: cache readdir 2024-10-11 23:51:38 -04:00
KernelDeimos 77f6bdcd6d dev: make puter.fs cache togglable 2024-10-11 18:39:58 -04:00
KernelDeimos 6ee7caaee1 dev: apply TTL cache for stat entries
Adds CachedFilesystem layer to client filesystem chain. Currently only
stat is implemented. The stat implementation will hold onto an entry for
3 seconds as per hardcoded configuration. Eventually, once invalidation
via websockets is working, this TTL should be extended.
2024-10-11 18:39:58 -04:00
KernelDeimos fc9a371e09 dev: add more to NariMethodsFeature 2024-10-11 18:39:58 -04:00
KernelDeimos 43c5402b7c feat(putility): trait method override support
Support for trait method overrides will make it possible to use putility
traits with the decorator pattern while using a proxy class to avoid
redundant re-implementation of proxy methods.

Use of the pattern described above will occur in the implementation of
client-side filesystem caching.
2024-10-11 18:39:58 -04:00
KernelDeimos c12ae2a923 dev: prepare puter.js fs for decorator pattern
- de-coupled xhr callback passing from the interface of the underlying
  filesystem implementation.
- This makes the interface to delegate calls more suitable for use with
  the decorator pattern.
- The decorator pattern will be used to manage the complexity of the
  caching layer by separating the concerns of different caching methods.
2024-10-11 18:39:58 -04:00
ProgrammerIn-wonderland 4f8304ec15 switch ne2k_pci to virtio 2024-10-11 18:14:38 -04:00
ProgrammerIn-wonderland d9805c0cab delete prompt-path 2024-10-11 17:06:32 -04:00
ProgrammerIn-wonderland fb41d2a51c change PWD to not use prompt-path and fix unicode issues 2024-10-11 17:06:32 -04:00
KernelDeimos 010282edf2 fix: don't display all apps for extensionless files
This hides database entries with empty types from the list of suggested
apps for files that have no extension. These entries should also be
removed from the database and the bug causing them should be fixed in
dev center.
2024-10-11 14:51:52 -04:00
KernelDeimos 38dcb60d3f fix: creating app shortcut in self-hosted
For some reason ll_write has an undefined `actor` when clicking "Add
Shortcut to Desktop" from Dev Center. This should be investigated
further.
2024-10-11 14:50:35 -04:00
Nariman Jelveh 3157186f4f close #798 2024-10-10 17:40:17 -07:00
KernelDeimos d4b96a17c8 dev: add RWLock to putility 2024-10-10 18:47:07 -04:00
KernelDeimos 37e7b6ad70 fix: disable thumbnails for AppData uploads 2024-10-10 15:03:22 -04:00
KernelDeimos 823ab28448 test: update test invocation 2024-10-10 03:19:28 -04:00
ProgrammerIn-wonderland b8490248c5 update 9p-puter driver with error handling 2024-10-09 20:36:03 -04:00
ProgrammerIn-wonderland 1e7e516d73 change submodule url 2024-10-09 20:36:03 -04:00
ProgrammerIn-wonderland 979bd06d70 9p automounting 2024-10-09 20:36:03 -04:00
ProgrammerIn-wonderland b145e30a90 feat: v86 9p server support 2024-10-09 20:36:03 -04:00
Nariman Jelveh d449367db5 Update loading.svg 2024-10-09 10:04:09 -07:00
Nariman Jelveh 9890e3a8be close #771 2024-10-08 19:51:57 -07:00
Nariman Jelveh d0940ccd21 close #776 2024-10-08 18:59:14 -07:00
KernelDeimos 0b9a9eec99 doc: oops 2024-10-08 18:41:01 -04:00
KernelDeimos 57d6da0858 doc: add scratch.md 2024-10-08 18:39:55 -04:00
KernelDeimos 7f1b870d30 feat: support readdir for directory symlinks 2024-10-08 18:31:39 -04:00
KernelDeimos c2a9506b48 fix: thumbnail service updates 2024-10-08 01:41:18 -04:00
ProgrammerIn-wonderland ed0a83ca9d dev: update v86, switch twisp to epoxy-server with twisp feature 2024-10-07 22:04:41 -04:00
4nshuman 857c3b88b3 added fflate to lint check 2024-10-06 21:27:03 +05:30
4nshuman 822d850513 purge JSZip 2024-10-06 21:25:46 +05:30
4nshuman e252567c88 Added progress dialog details 2024-10-06 21:19:42 +05:30
4nshuman f0f8e454f9 added Promises to handle multiple file creation and closing progress dialog 2024-10-06 20:27:12 +05:30
4nshuman a09dd29416 added empty directory check and file creation 2024-10-06 20:25:40 +05:30
4nshuman e992e4d5d4 unzipped directory creation 2024-10-06 20:25:10 +05:30
4nshuman 2a82579eb8 added unzip error handler 2024-10-06 20:23:10 +05:30
4nshuman a79cc040e8 implemented fflate unzip operation 2024-10-06 20:22:50 +05:30
4nshuman e5f0f46633 added blob to uInt8Array conversion 2024-10-06 20:22:07 +05:30
4nshuman 9a2e701683 eleminate JSZip invocation 2024-10-06 20:21:29 +05:30
4nshuman 00f2dbdcf0 added window hide delay config 2024-10-06 20:18:30 +05:30
4nshuman b9d7a1d2a1 added zip support for empty directories 2024-10-06 17:33:30 +05:30
4nshuman b9b8229099 fixed comments phrasing 2024-10-06 16:19:46 +05:30
4nshuman 5b477c2cac fixed module name 2024-10-06 16:10:40 +05:30
4nshuman 09d10cb29b rectified progress window for unzip operation 2024-10-06 16:03:09 +05:30
4nshuman f6541fc793 convention implemented definition header 2024-10-06 16:01:18 +05:30
4nshuman deb8c4e13b added status message terms 2024-10-06 16:00:01 +05:30
4nshuman a93236118f redirected unzip to helper method 2024-10-06 15:32:31 +05:30
4nshuman a9bebdd7f0 fixed typo 2024-10-06 15:26:26 +05:30
4nshuman dfe71d5965 modified zipping operationand integrated fflate 2024-10-05 23:47:22 +05:30
4nshuman f05f7454e9 added helper method to convert binary large object to uInt8Array for zipping operations 2024-10-05 23:45:54 +05:30
4nshuman 582c411c00 added fflate min js to the library 2024-10-05 23:44:04 +05:30
4nshuman f3625ed907 added terms for status message on zip operation 2024-10-05 23:43:43 +05:30
4nshuman 4c7b75ed67 added fflate on static asset and libPath 2024-10-05 23:43:15 +05:30
4nshuman 1929aaf5ef added fflate on libPath on puter-gui 2024-10-05 23:42:43 +05:30
4nshuman 01aaa07e87 added zip progress counter configurations 2024-10-05 23:41:45 +05:30
KernelDeimos c7b08d1b5e doc: tweak 2024-10-04 16:09:02 -04:00
KernelDeimos 1e0b8cfe7c doc: add troubleshooting steps for no build-essentials 2024-10-04 16:02:05 -04:00
KernelDeimos c135649551 move: notes.md 2024-10-03 18:20:51 -04:00
KernelDeimos 196531d118 dev: update handling of duplicate emails 2024-10-03 17:04:47 -04:00
KernelDeimos 822f3b8c45 dev: add notes and some updates to email logic 2024-10-03 14:54:40 -04:00
KernelDeimos 2c3065a70f test: register test for CleanEmailService 2024-10-02 21:30:14 -04:00
KernelDeimos 054b9c2864 dev: add service for cleaning email addresses 2024-10-02 17:51:43 -04:00
KernelDeimos 9db55fc5f7 fix: remove redundant openai model fallback 2024-10-02 15:14:46 -04:00
KernelDeimos 29fd595cf9 dev: rootfs-v0.2.0 2024-10-02 15:13:57 -04:00
KernelDeimos 9985996686 fix: app pseudonym in wrong conditional block 2024-09-30 20:38:25 -04:00
KernelDeimos 4febd81169 dev: app pseudonyms 2024-09-30 19:35:34 -04:00
KernelDeimos 8bc4122bea tweak: change phoenix help text when launched with -c 2024-09-30 19:16:10 -04:00
KernelDeimos 5ed8823a16 tidy: remove a console log 2024-09-30 18:11:25 -04:00
KernelDeimos 5317adf8a4 feat: allow passing cli args via url 2024-09-30 18:09:28 -04:00
KernelDeimos b6c0cb6abc feat: add -c flag for phoenix 2024-09-30 16:50:18 -04:00
KernelDeimos 6e1ed7ab04 dev: update emu load indicator 2024-09-30 16:50:03 -04:00
KernelDeimos 04c05a5bb8 fix: properly add owner object to fsentries 2024-09-27 16:30:13 -04:00
KernelDeimos a70d0dd088 fix: add progress bar fix 2024-09-27 15:08:19 -04:00
KernelDeimos eab2721f89 dev: use streaming decompression 2024-09-26 18:49:29 -04:00
KernelDeimos 545ac0097f tweak: ascii tux (important) 2024-09-26 18:28:13 -04:00
KernelDeimos 45cd3b79bb tweak: disable grace period by default 2024-09-26 15:47:47 -04:00
KernelDeimos 259877b677 fix: allow ETX to propagate to bash 2024-09-26 15:47:35 -04:00
KernelDeimos 08601ae2af feat: progress indicator for emulator 2024-09-25 23:47:10 -04:00
KernelDeimos d0535cf10b dev: add wasm bench 2024-09-25 21:45:03 -04:00
KernelDeimos fff8993200 fix: error deleting entry from My Websites window
This could not be tested locally due to another but only affecting
self-hosted installations. This will be tested in staging in the
meantime while the other bug is being fixed.
2024-09-23 17:55:54 -04:00
KernelDeimos b1b725a2eb tweak: image from CDN (for real this time) 2024-09-23 15:07:26 -04:00
KernelDeimos 68c4274dc3 tweak: image from CDN 2024-09-23 14:54:01 -04:00
Nariman Jelveh 288411c377 Update style.css 2024-09-22 15:46:48 -07:00
KernelDeimos 27b66254e3 dev: compress default image with brotli 2024-09-22 17:49:00 -04:00
Nariman Jelveh 3ce8da37eb close #772 2024-09-22 12:40:38 -07:00
KernelDeimos 07d3592d88 tweak: don't auto-start puter-linux for now 2024-09-21 15:39:19 -04:00
Nariman Jelveh 18fed60341 Merge pull request #770 from ruthwikchikoti/issue#736
feat: translate README.md to Dutch
2024-09-21 12:15:48 -07:00
Ruthwik Chikoti 31e2773743 feat: translate README.md to Dutch 2024-09-21 18:21:27 +05:30
Nariman Jelveh bd91839551 Don't allow background processes to change the browser's URL 2024-09-19 17:41:37 -07:00
KernelDeimos 4311b482fd fix: second half of connectToInstance 2024-09-18 21:02:51 -04:00
KernelDeimos cb324cc125 fix: error in process.handle_connection 2024-09-18 20:55:00 -04:00
KernelDeimos f4dd195245 dev: fix previous commit 2024-09-18 17:04:48 -04:00
KernelDeimos afc0ac8548 dev: attempt to fix process select issue 2024-09-18 17:01:02 -04:00
KernelDeimos 439653458e fix: quick patch to avoid columnify error 2024-09-18 16:22:26 -04:00
KernelDeimos 0456893789 dev: add emulator prod deployment 2024-09-18 16:21:07 -04:00
KernelDeimos f2acd83b72 fix: upsert subdomain check to insert only 2024-09-18 16:21:07 -04:00
KernelDeimos e3431cd7f5 dev: add build script for relay 2024-09-18 16:21:07 -04:00
KernelDeimos 48873b6d23 git: add epoxy-tls submodule 2024-09-18 16:21:07 -04:00
KernelDeimos 8aed3d9454 dev: prep for network build 2024-09-18 16:21:07 -04:00
KernelDeimos 25817bf6a2 dev: add puter-linux app to db migrations 2024-09-18 16:21:07 -04:00
KernelDeimos 4589ed95be dev: handle pty close
Return to phoenix shell when a pty stream is closed by twisp.

Pipes in phoenix with commands from the emulator do not appear to be
working properly, but something in there is working.
2024-09-18 16:21:07 -04:00
KernelDeimos 404fbaa4cb dev: add terminal multiplexing
This involves establishing the protocol through which phoenix instances
run a command on the emulator. The pty is able to communicate with the
terminal in both directions. This commit adds logs to be removed later.

There are a few things left that this commit does not address:
- handling close of delegate process
- handling sigint from phoenix to delegate process
- closing the connection to twisp
2024-09-18 16:21:07 -04:00
KernelDeimos bc83e90e33 tweak: use virtualization-optimized kernel 2024-09-18 16:21:07 -04:00
KernelDeimos e3d4a5f3b3 dev: multi-instance many-to-many app-to-app comms
I'll elaborate here because the commit name is confusing. Any time an
app gets a connection to another app, either because it launched that
app (or was launched by that app) or requested a connection to that app,
the ID the app gets to represent the app it's communicating with is now
a pseudo app id rather than the app instance ID. This accomplishes two
things:

1. It's more secure. There are multiple places where GUI assumes that
   knowing an app's instance ID means you can do things as that app.
2. Between the same two apps, there may now be more than one connection.
   This is useful for situations like Phoenix shell talking to the
   emulator in multiple separate instances to pipe commands. (this is
   coming later)
2024-09-18 16:21:07 -04:00
KernelDeimos 62634b0afe feat: add connectToInstance method to puter.ui 2024-09-18 16:21:07 -04:00
KernelDeimos e2cb6194bb dev: add startup apps, start emulator by default 2024-09-18 16:21:07 -04:00
KernelDeimos e1ec84877a dev: resize handling 2024-09-18 16:21:07 -04:00
KernelDeimos db3e0b5ce8 fix: simplify callback listener and fix async bug 2024-09-18 16:21:07 -04:00
KernelDeimos 21383eec3c dev: get basic PTY integration working 2024-09-18 16:21:07 -04:00
KernelDeimos 28adc4e5d5 dev: add emulator page 2024-09-18 16:21:07 -04:00
KernelDeimos 41e7526372 dev: add twisp submodule 2024-09-18 16:21:07 -04:00
KernelDeimos 2c0b8428c5 dev: add emulator image build 2024-09-18 16:21:07 -04:00
Nariman Jelveh 95112a9de6 Merge pull request #765 from 4nshuman/issue/737
Added Swedish translation | Other fixes
2024-09-14 09:32:10 -07:00
4nshuman cadd7453c4 added german translation link to the list 2024-09-14 20:17:02 +05:30
4nshuman 50c6e74f99 added swedish translation to the list 2024-09-14 20:16:35 +05:30
4nshuman a45def27a5 fixed translation list alphabetical order 2024-09-14 20:15:59 +05:30
4nshuman 8f6b3c07a9 added swedish translation file 2024-09-14 20:15:09 +05:30
4nshuman cc794fb70b added translation for german alt on image tag 2024-09-14 20:14:52 +05:30
Nariman Jelveh 480a1c440c Merge pull request #763 from bibekp-dev/Issue670/EnglishToGerman
Issue670/english to german
2024-09-12 09:48:08 -07:00
Bibek Panda c204cd366a Created and updated README.de.md for English To German Translation
German translation changes are committed in README.de.md file
2024-09-12 13:03:07 +05:30
Bibek Panda c0b3010192 Create README.de.md 2024-09-12 12:58:03 +05:30
Nariman Jelveh 58040c7596 Merge pull request #762 from the-heidi/patch-1 2024-09-11 20:35:20 -07:00
the-heidi 0743189ddb Update README.ko.md to fix phrasing issues 2024-09-11 20:30:38 -07:00
KernelDeimos 33de98107f fix: email change on account with unverified email
Changing the email address on an account that did not already have a
confirmed email would result in the email_confirmed column never being
set. This commit fixes that.

Additionally, an SQL statement using the unconfirmed email to identify a
row was changed so it now uses the user ID instead, which is safer.

Resolves: 759
2024-09-10 14:04:32 -04:00
Nariman Jelveh d38fb9f0e1 Update README.md 2024-09-10 08:59:41 -07:00
Nariman Jelveh 351b8cca3b Merge pull request #760 from gyarfasB/huntext
feat: hungarian readme translation
2024-09-10 08:53:59 -07:00
Gyárfás Balázs 89d11e3b0f translation-hun-readme 2024-09-10 14:02:10 +02:00
Nariman Jelveh a4a349a64a Update README.md 2024-09-07 09:50:04 -07:00
Nariman Jelveh 11ddbf70c8 Add link to Ukrainian README from the English README 2024-09-07 09:49:40 -07:00
Nariman Jelveh 6e7def5a66 Merge pull request #757 from SergiyZyuzko/translation/ukrainian
Ukrainian Translation added
2024-09-07 09:47:02 -07:00
Sergiy abb44b6d68 Ukrainian Translation added 2024-09-07 16:41:31 +00:00
KernelDeimos cc4ab1cb36 fix: html-webpack-plugin dev dep 2024-09-04 23:56:23 -04:00
KernelDeimos 6bdcae769d fix: double-echo in phoenix 2024-09-04 23:56:23 -04:00
KernelDeimos a33d721e21 fix phoenix WINSZ handling 2024-09-04 23:56:23 -04:00
Nariman Jelveh 7139d29749 Add link to Malayalam README in the English README 2024-09-04 22:03:26 -04:00
Nariman Jelveh 9e988eb012 Merge pull request #753 from rinogodson/malayalam-translation
Add Malayalam translation to README.md
2024-09-04 21:59:43 -04:00
Rino Godson 72c90778e8 Add Malayalam translation to README.md 2024-09-05 07:12:27 +05:30
Nariman Jelveh 64597e28fb temporarily remove lang files for further testing 2024-09-03 14:56:14 -04:00
Nariman Jelveh 1c5f48d451 Merge pull request #741 from Pulkitxm/translation_Ukrainian
translate README.md to Ukrainian
2024-09-03 14:52:59 -04:00
Nariman Jelveh 43eb614499 Merge pull request #743 from Pulkitxm/translation_Dutch
Add Dutch Readme content
2024-09-03 14:52:34 -04:00
Nariman Jelveh 25bb0652b8 Merge pull request #742 from Pulkitxm/translation_Swedish
Add Swedish Readme content
2024-09-03 14:52:24 -04:00
KernelDeimos 4910838ab1 fix: webpack error reporting + unintentional whitespace changes 2024-09-03 14:44:51 -04:00
Nariman Jelveh 57c2d72e21 Update UIWindow.js 2024-09-03 14:24:58 -04:00
Nariman Jelveh 8e56ac5ec7 Update UIWindow.js 2024-09-03 14:14:19 -04:00
Nariman Jelveh 9528cb0614 Add link to Armenian README in the English README 2024-09-03 11:55:05 -04:00
Nariman Jelveh 377c9f04b1 Merge branch 'main' of https://github.com/HeyPuter/puter into main 2024-09-03 11:54:03 -04:00
Nariman Jelveh 9411f994e3 Merge pull request #751 from gng92/patch-1
Create README.hy.md
2024-09-03 11:53:36 -04:00
gng92 e8713dc5a5 Create README.hy.md
Added Armenian translation for ./doc/i18n/README.en.md (issue #735 )
2024-09-03 19:44:42 +04:00
KernelDeimos ed7d6dcbfb fix: dist 2024-09-02 21:30:22 -04:00
KernelDeimos d35026467e fix: use jq el for focus 2024-09-02 20:52:46 -04:00
KernelDeimos cd39bb5aa0 fix: fix sourcemap 2024-09-02 20:50:15 -04:00
KernelDeimos d07929da1b dev: add v86 submodule and app 2024-09-02 20:49:48 -04:00
Nariman Jelveh 1f7a4782d8 Merge branch 'main' of https://github.com/HeyPuter/puter into main 2024-09-02 17:44:24 -04:00
Nariman Jelveh 94ec23b4c7 Remove fa.js temporarily 2024-09-02 17:44:17 -04:00
KernelDeimos 5ab3d88393 cleanup 2024-09-02 17:37:38 -04:00
KernelDeimos 18a24f614f dev: update ipc ready and app launched events 2024-09-02 17:37:38 -04:00
Nariman Jelveh 65c23ecd93 Merge pull request #748 from Sky-De/FarsiReadme
README.en.md translated to Farsi and added to project
2024-09-02 16:02:03 -04:00
skyDe 512f22857a README.en.md translated to Farsi and added to project 2024-09-01 06:18:06 -08:00
Nariman Jelveh 8e5711bf38 add link to Hebrew README 2024-08-31 14:41:49 -04:00
Nariman Jelveh 9acbd09da9 Merge pull request #747 from OrelsProjects/issue-732-translate-readme.md-from-english-to-hebrew
Create README.he.md
2024-08-31 14:41:00 -04:00
Orelsgit 4c936197e7 Create README.he.md 2024-08-31 21:00:25 +03:00
Nariman Jelveh e58de0db84 Merge pull request #746 from fauzipadlaw/main
No need word repetition for gambar  in Indonesian
2024-08-31 13:46:09 -04:00
Muhammad Fauzi 3acabc6c79 Merge branch 'HeyPuter:main' into main 2024-08-31 23:46:25 +07:00
Muhammad Fauzi ddbb4207f2 Update Pictures translation to Gambar, no word repetition for plural
The literal translation for Pictures IS Gambar-gambar, but after reviewing how it looks on live demo Puter, this translation seems a bit off, since other word like Videos is not Video-video, documents is not Dokumen-dokumen.

So, I think it's better to just translate Pictures to Gambar only. Indonesian actually does not care about singular and plural. If we really need to emphasize it plural, we just repeat the word. Which in this context, it is not that necessary to emphasize it.
2024-08-31 23:46:06 +07:00
Pulkit 4d1dd7a6db Add Dutch Readme content 2024-08-31 12:15:07 +05:30
Pulkit 194b150636 Add Swedish Readme content 2024-08-31 12:10:07 +05:30
Pulkit fe5ee39584 Add Ukrainian Readme content 2024-08-31 12:02:58 +05:30
Nariman Jelveh e295f64a90 Update README.md 2024-08-31 00:19:04 -04:00
Nariman Jelveh bb787a9ffc Merge pull request #740 from Pulkitxm/main
translate README.md to finnish
2024-08-30 21:14:52 -07:00
Pulkit ee0f063e22 Add finnish Readme content 2024-08-31 07:50:48 +05:30
KernelDeimos c9d09a78b6 fix: remove now-redundant loadScript call 2024-08-30 15:24:01 -07:00
KernelDeimos 46a0f714d1 fix: env for dev build 2024-08-30 15:24:01 -07:00
KernelDeimos 3092300a01 fix: mistakes 2024-08-30 15:24:01 -07:00
KernelDeimos 4b8910169a fix: add env to EmitPlugin config 2024-08-30 15:24:01 -07:00
KernelDeimos 72946f920c fix: remove accidentally left-over code 2024-08-30 15:24:01 -07:00
KernelDeimos 8ad435a0ea dev: bundle gui in dev 2024-08-30 15:24:01 -07:00
Nariman Jelveh 0d01d1f800 Update package-lock.json 2024-08-29 19:45:05 -07:00
KernelDeimos a4e9c7bdd7 rename folder 2024-08-29 22:24:55 -04:00
KernelDeimos cf24c3dd2a rename 2024-08-29 22:21:07 -04:00
KernelDeimos 3361043b9d chore: rename putil 2024-08-29 14:14:35 -07:00
KernelDeimos 5f7d1f589a fix: don't var when no var 2024-08-29 17:03:51 -04:00
Nariman Jelveh d43fc62d89 Remove menu-aim from the list of statically linked libs 2024-08-29 13:33:37 -07:00
KernelDeimos 1cd21ee658 tweak: cleanup and comment 2024-08-28 19:10:35 -07:00
KernelDeimos c86df11abd dev: launchApp as registered ipc handler
Add launchApp as a registered ipc handler, which will allow communication
between iframes (apps/puter.js) to be simplified.
2024-08-28 19:10:35 -07:00
KernelDeimos 813ee95cee fix: fallback to read access in /sign 2024-08-28 17:53:36 -04:00
Nariman Jelveh fa4bef8873 Update README.md 2024-08-28 14:35:39 -07:00
Nariman Jelveh 2c3d30d119 Merge pull request #727 from EngrAdnanAhmad/README-URDU
Translated README section to Urdu with correct clickable links
2024-08-28 14:34:30 -07:00
EngrAdnanAhmad a17f8408eb Translated README section to Urdu with correct clickable links 2024-08-29 02:26:52 +05:00
Nariman Jelveh f11dd8609d Merge pull request #726 from Zac0511/main
Update README.md
2024-08-28 13:09:24 -07:00
pikagaufre 8e4962beed Update README.md 2024-08-28 20:07:12 +00:00
Nariman Jelveh 18cfef65b8 Attempt to open apps from URL only if user is authenticated and desktop is loaded 2024-08-27 20:02:01 -07:00
KernelDeimos d1d0a9cccc tweak: update license for puter-wisp 2024-08-27 22:40:27 -04:00
KernelDeimos a4766278e4 tweak: package name for @heyputer/puter-wisp 2024-08-27 22:37:22 -04:00
KernelDeimos 2d1cb0050d dev: puter-wisp 2024-08-27 22:20:32 -04:00
Nariman Jelveh 2385457d12 Remove the redundant image/ prefix in base64 encoded app icons in dev center 2024-08-27 18:04:04 -07:00
Nariman Jelveh d285c2097f use flexbox for app navbar in dev center 2024-08-27 17:34:09 -07:00
Nariman Jelveh b1c91758da Fix sort bug in dev center 2024-08-27 17:27:40 -07:00
Nariman Jelveh 45925bacb6 Improve the usability of the Settings tab in Dev Center 2024-08-27 17:11:48 -07:00
KernelDeimos aa61c3009c fix: typo in a default file 2024-08-26 17:43:33 -04:00
KernelDeimos d2c7477b3b fix(docker): ensure temp admin pass shows 2024-08-26 17:42:15 -04:00
Nariman Jelveh 683c20ca7f Add links to Korean and Polish READMEs in the English README 2024-08-26 09:22:39 -07:00
Nariman Jelveh 4eda3244de Merge pull request #719 from VinayakPaka/issue-688
translated README.en.md from English to Polish
2024-08-26 09:19:27 -07:00
Nariman Jelveh 262cbc8de2 Merge pull request #718 from yomalbalooshi/main
Added README.ar.md
2024-08-26 08:51:52 -07:00
VinayakPaka 11304d82c3 translated README.en.md from English to Polish 2024-08-26 20:34:51 +05:30
Yasmeen Albalooshi 577e0d4ed9 Update README.md to have Arabic Translation 2024-08-26 10:54:05 +03:00
Yasmeen 5857248651 Add Arabic Translation file 2024-08-26 10:49:51 +03:00
decipher 155aab57d3 Removed else statement for closing registration in signup.js 2024-08-26 04:59:08 +02:00
Nariman Jelveh da5635b576 Show an error if file containing puter.js is loaded using the file: protocol 2024-08-25 14:38:19 -07:00
KernelDeimos 9a622004ea fix: fix 500 when check-app has bad url 2024-08-25 16:54:19 -04:00
Eric Dubé d8dc3ac122 Update instructions.md 2024-08-25 16:21:48 -04:00
Nariman Jelveh cd2eb656a1 Add link to Thai README in the English README 2024-08-25 12:30:42 -07:00
Nariman Jelveh dd5eff9780 Merge pull request #717 from Panyakornk/patch-1
Create README.th.md
2024-08-25 12:21:39 -07:00
Panyakornk 28a7f0ba1f Create README.th.md 2024-08-26 01:00:44 +07:00
decipher 222d7dede3 Added configuration option for closing registration
Set config.registration_closed=true; in ./src/backend/src/config.js to close registration
2024-08-25 19:28:12 +02:00
decipher 56b73b385d Update README.md 2024-08-25 18:06:21 +02:00
decipher 9c7dc53fc9 Update README.md
Added "Installation on public server"
2024-08-25 18:03:15 +02:00
Nariman Jelveh b43ecb490a Place github link and icon in the toolbar 2024-08-24 11:41:42 -07:00
Nariman Jelveh 3a82d13985 Merge pull request #712 from catalin-lungu/feature/english-to-romanian
Fixes issue #677: Translate README.md from English to Romanian
2024-08-24 10:46:59 -07:00
Catalin ea87223c46 Fixes issue #677: Translate README.md from English to Romanian 2024-08-24 20:31:47 +03:00
Nariman Jelveh 852f2ea944 Update README.md 2024-08-23 23:09:04 -07:00
Nariman Jelveh 9b0bd4f820 Add link to Romanian README in the English README 2024-08-23 23:08:15 -07:00
Nariman Jelveh 5af56a64c1 Merge pull request #711 from Atharva089/main
Added the README.ro.md file
2024-08-23 23:06:53 -07:00
Nariman Jelveh b5e4962e71 Update README.ro.md 2024-08-23 23:06:10 -07:00
Atharva Chavan 02c2801891 Added the README.ro.md file
Translated the README.en.md file from English to Romanian language.
2024-08-24 10:50:37 +05:30
KernelDeimos eb18550f41 fix(puterai): close streams 2024-08-23 19:42:53 -04:00
KernelDeimos 5a616f67dd fix(puterjs): fix settings object check 2024-08-23 16:39:30 -04:00
KernelDeimos 7f9d1e90b1 chore(puterai): update model 2024-08-23 16:09:22 -04:00
KernelDeimos 6cf7d0ae27 doc: update CONTRIBUTING.md 2024-08-23 15:09:25 -04:00
Nariman Jelveh cdc3947585 Merge pull request #709 from fauzipadlaw/main
Add link to Indonesian in main readme
2024-08-23 10:47:06 -07:00
Muhammad Fauzi c1ac30820d Merge branch 'main' of github.com:fauzipadlaw/puter 2024-08-24 00:29:06 +07:00
Muhammad Fauzi 194d0bcc6d Add link to Indonesian Readme in the English Readme 2024-08-24 00:28:27 +07:00
Nariman Jelveh 48324735ee Merge pull request #708 from fauzipadlaw/main
Add README.id.md
2024-08-23 10:18:51 -07:00
Muhammad Fauzi a549fc86bc Add README.id.md 2024-08-24 00:05:28 +07:00
KernelDeimos 53e7a91f18 feat(puterai): add groq 2024-08-23 00:16:29 -04:00
KernelDeimos 937528f767 fix(security): signing in public folders 2024-08-22 23:48:30 -04:00
Nariman Jelveh 2d39b9be77 Update index.js 2024-08-22 20:47:02 -07:00
KernelDeimos 055c628afd feat(puterai): add mistral 2024-08-22 23:28:08 -04:00
KernelDeimos fd86934bc9 feat: add method to list models 2024-08-22 22:24:03 -04:00
Nariman Jelveh 702618f81d Add link to Tamil Readme in the English Readme 2024-08-22 12:52:17 -07:00
Nariman Jelveh 617d7d7f55 Merge pull request #706 from yanniro2/main
Add Tamil readme file
2024-08-22 12:50:50 -07:00
Nariman Jelveh ff02b7bb9f Delete .vscode/settings.json 2024-08-22 12:50:29 -07:00
Nariman Jelveh d4e955a9e0 Add link to French README in the English README 2024-08-22 11:57:53 -07:00
Nariman Jelveh 9de4067e33 Merge pull request #707 from Morraycage/feat/fr-readme
feat(readme): add french readme respecting format and styling
2024-08-22 11:56:28 -07:00
Niroyan Kugaruban 2b507d1dd0 change 2024-08-22 14:47:24 -04:00
Nariman Jelveh 766a388660 fix badge url 2024-08-22 11:45:28 -07:00
Nariman Jelveh d36ef2d770 Fix image tag for the badge 2024-08-22 11:38:19 -07:00
Sayf Roumane 02e7e27796 feat(readme): add french readme respecting format and styling 2024-08-22 20:30:43 +02:00
KernelDeimos 7600d9b07c feat: add streaming to XHR driver client 2024-08-22 14:28:43 -04:00
Niroyan Kugaruban bdd24c69a5 Add Tamil readme file 2024-08-22 13:44:12 -04:00
Nariman Jelveh fa96c6d146 Add link to Bengali README to English README 2024-08-22 08:22:18 -07:00
Nariman Jelveh 502b346039 Merge pull request #705 from Priyanshu1035/readme
Added README.bn.md
2024-08-22 08:16:23 -07:00
Nariman Jelveh 07ca9ff6ea Fix license link 2024-08-22 08:15:27 -07:00
Priyanshu1035 ae1469e760 Merge branch 'readme' of https://github.com/Priyanshu1035/puter into readme 2024-08-22 19:29:49 +05:30
Priyanshu1035 4415e76a0b readmeinbengali 2024-08-22 19:29:10 +05:30
Nariman Jelveh 67e5219639 Merge branch 'main' of https://github.com/HeyPuter/puter into main 2024-08-21 20:59:51 -07:00
Nariman Jelveh 6135054b3b add stream flag to the chat() method of puter.ai 2024-08-21 20:59:42 -07:00
KernelDeimos c08b897d4a fix(puterai): adapt message role for claude 2024-08-21 23:50:09 -04:00
Nariman Jelveh 3bface8c66 if first args in puter.chat is a string, it's the prompt 2024-08-21 20:38:03 -07:00
Nariman Jelveh dadaf5e8b1 Merge branch 'main' of https://github.com/HeyPuter/puter into main 2024-08-21 20:19:34 -07:00
Nariman Jelveh 43c18377eb Add support for multiple AI drivers via puter.js 2024-08-21 20:19:26 -07:00
KernelDeimos 21539a1651 tweak: let driver be called service 2024-08-21 23:18:12 -04:00
KernelDeimos bdfdf2331b feat(puterai): add togetherai 2024-08-21 23:17:02 -04:00
KernelDeimos 7b254e8676 tweak(puerai): add model parameter 2024-08-21 23:15:53 -04:00
KernelDeimos 439f52b5a3 feat(puterjs): add drivers module 2024-08-21 18:31:16 -04:00
KernelDeimos 32f0edb93a feat(api): add /lsmod 2024-08-21 18:31:16 -04:00
KernelDeimos d009cd0aaf feat(puterai): add claude 2024-08-21 18:31:16 -04:00
KernelDeimos 9d5963cdf5 feat(puterai): add streaming 2024-08-21 18:31:16 -04:00
Nariman Jelveh 2678679ab7 Correct the order of README translation links 2024-08-21 14:11:16 -07:00
Nariman Jelveh 7024e2ec91 Add ketboards.js to prod dependencies 2024-08-20 19:51:21 -07:00
Nariman Jelveh 921f522732 Remove redundant console.log 2024-08-20 19:37:35 -07:00
Nariman Jelveh 0b97bff1a2 Open public folders via URL only if deskotp has finished loading 2024-08-20 19:29:11 -07:00
Nariman Jelveh 5caf59f1bc make logger return empty string 2024-08-20 19:05:34 -07:00
KernelDeimos a002ad08e5 fix(security): remove unconfirmed_email from /whoami for apps 2024-08-20 21:42:42 -04:00
Nariman Jelveh b737570f73 Merge pull request #703 from FabioDePalma/ita
added readme file in Italian
2024-08-20 00:19:18 -07:00
FabioDePalma aa610befb1 added readme file in Italian 2024-08-20 09:05:13 +02:00
Nariman Jelveh 45d35eec72 Merge pull request #702 from Sam-SSTU/main
add Chinese, add language tag
2024-08-19 19:36:37 -07:00
Nariman Jelveh a3eb52702d Remove language badges and add link to the Chinese README inside the English README 2024-08-19 19:36:20 -07:00
Sam-SSTU fca88a82cc add Chinese, add language tag 2024-08-20 09:56:16 +08:00
KernelDeimos a7cdb70251 fix: ll_write 2024-08-19 21:27:53 -04:00
Nariman Jelveh 0705c2919f Remove redundant console.log()s 2024-08-19 15:21:51 -07:00
KernelDeimos cb4cab529a fix: don't try to sanitize null owners 2024-08-19 16:46:49 -04:00
KernelDeimos 3d92d0c619 tweak: show full scan in dev console 2024-08-19 14:50:32 -04:00
KernelDeimos 14820481b9 fix: missing key for feature flag perm check 2024-08-19 14:49:17 -04:00
KernelDeimos 6b4a19e12a fix: implicit app permissions bug 2024-08-19 00:58:23 -04:00
KernelDeimos 48fea77a20 fix: share services and features with apps 2024-08-18 22:44:27 -04:00
KernelDeimos 3819584d11 fix: admin user public folder 2024-08-18 15:55:01 -04:00
KernelDeimos 2386d87229 feat: add writable attribute to fs items 2024-08-18 15:55:01 -04:00
Nariman Jelveh fc26f88e60 Add link to the Vietnamese README in the English README 2024-08-18 11:22:17 -07:00
Nariman Jelveh d6c0af0b88 Merge pull request #700 from Priyanshu1035/readme
Added Readme in Vietnamese
2024-08-18 11:19:33 -07:00
Nariman Jelveh 625ae0eade Fix URL encoding of Vietnamese string 2024-08-18 11:18:42 -07:00
Priyanshu1035 380e946bbf updated PR to revert accidental changes 2024-08-18 23:23:58 +05:30
KernelDeimos b6b64d3bcc fix: add anti-csrf token for /revoke-session 2024-08-18 01:07:04 -04:00
KernelDeimos 9fa12d43fc fix: only show 2fa when available 2024-08-18 00:42:58 -04:00
KernelDeimos 6e325fa000 fix: requirement for email_confirmed in backend 2024-08-18 00:42:58 -04:00
Nariman Jelveh 38a6793c16 Merge pull request #698 from jsdmas/korean-language 2024-08-17 20:12:35 -07:00
JinHo Jang 11fb02c67b Create README.ko.md 2024-08-18 11:55:53 +09:00
KernelDeimos ef245b70df fix: do primary read of user after setting email_confirmed 2024-08-17 17:20:31 -04:00
KernelDeimos 0519b4a71b fix: require confirmed email for public folder 2024-08-17 16:36:59 -04:00
Nariman Jelveh 3f520e13f3 remove cover iframe for public folders 2024-08-17 12:29:32 -07:00
KernelDeimos ceecf54357 chore: sync versions 2024-08-17 15:13:12 -04:00
Nariman Jelveh 4e37064f47 fix issues public folder paths 2024-08-17 11:34:53 -07:00
Nariman Jelveh 88e8e33dc2 take into account feature flags for sharing 2024-08-17 11:11:36 -07:00
Nariman Jelveh 54d248e40b Add link to Turkish README in the English Readme 2024-08-17 09:53:38 -07:00
Nariman Jelveh 933ff7f1d0 Merge pull request #695 from emrhngngr/turkish-language
Created Read.me in Turkish.
2024-08-17 09:22:39 -07:00
Nariman Jelveh f43b52b0e1 fix the markdown link for the license 2024-08-17 09:15:00 -07:00
Emirhan 1c0adfc89a Created Read.me in Turkish. 2024-08-17 13:50:52 +03:00
KernelDeimos 4561b8937d feat: report feature flags in /whoami 2024-08-15 19:14:59 -04:00
Nariman Jelveh 8e39f41dd4 Encode Japanese string in the badge URL in README 2024-08-15 15:11:23 -07:00
Nariman Jelveh 8cb415675b Add link to Japanese README in the English Readme 2024-08-15 15:06:55 -07:00
Nariman Jelveh 276ace9f51 Merge pull request #691 from calreed-prof/main
Translate README.md to japanese
2024-08-15 15:04:24 -07:00
calreed-prof ac673cfae5 Created README.jp.md 2024-08-15 15:58:07 -06:00
Nariman Jelveh ada4bf9bbd Merge pull request #690 from abhishekpaturkar/issue-666-readme-hindi
added readme translation into hindi
2024-08-15 12:15:28 -07:00
abhishekpaturkar 70bf4bdfa1 translate README.md into hindi 2024-08-15 23:01:29 +05:30
Nariman Jelveh c5d112248a Merge pull request #689 from eltociear/patch-4
chore: update SystemFSEntryService.js
2024-08-15 08:38:46 -07:00
Ikko Eltociear Ashimine 959a0f4e39 chore: update SystemFSEntryService.js
propery -> property
2024-08-16 00:25:30 +09:00
KernelDeimos d032ab7d24 chore: update tiktoken 2024-08-14 21:08:29 -04:00
KernelDeimos a821dc67d5 tweak: add driver to implicit admin permissions 2024-08-14 19:42:57 -04:00
Nariman Jelveh 471514ea43 Add link to Spanish README in the English Readme 2024-08-14 15:05:51 -07:00
Nariman Jelveh 81cba63ea8 Merge pull request #685 from juank0205/issue-664-readme-spanish
translate README.md to spanish
2024-08-14 15:04:03 -07:00
KernelDeimos 209555c1d9 feat: make public folders a config opt-in 2024-08-14 17:20:49 -04:00
KernelDeimos 461ea3eae6 feat: add feature flag for /share 2024-08-14 17:20:49 -04:00
KernelDeimos d4319ea072 fix: sqlite condition in MonthlyUsageService 2024-08-14 17:20:09 -04:00
juank0205 0d3af0048f translate README.md to spanish 2024-08-14 16:09:26 -05:00
Nariman Jelveh bf4ba3f1d6 Update README.md 2024-08-14 12:38:00 -07:00
Nariman Jelveh df8ec416cd Merge pull request #683 from NFFY88/fix-readme-links
fix broken links in readme
2024-08-14 12:18:03 -07:00
Danil Buslaev 11695846fa fix broken links in readme 2024-08-14 21:34:44 +03:00
Nariman Jelveh 4cd94df90c Use the correct local dev address in README files 2024-08-14 10:54:09 -07:00
Nariman Jelveh 4a553ca67c Merge pull request #681 from NFFY88/russian-readme 2024-08-14 10:13:38 -07:00
Danil Buslaev 82dec20c07 added translation link to readme 2024-08-14 19:45:14 +03:00
Danil Buslaev 93d475b6b3 added readme translation into Russian 2024-08-14 19:20:18 +03:00
Nariman Jelveh c98d1ca25e Add link to the Portuguese README in the English README 2024-08-14 08:23:09 -07:00
Nariman Jelveh eea26207af Merge pull request #680 from TatianaMagnus/672-add-readme-portuguese-translation
672 Adding readme portuguese translation
2024-08-14 08:20:51 -07:00
Tatiana Magnus Vianna 3dd3ae02ae Adding readme portuguese translation 2024-08-14 11:51:38 -03:00
Nariman Jelveh 4f8786fc8f Add link to Danish README in the English Readme 2024-08-14 07:40:37 -07:00
Nariman Jelveh 94124eb576 Merge pull request #679 from JesHansen/issue/678-translate-readme-to-danish
Add Danish translation of README.en.md
2024-08-14 07:30:20 -07:00
Jes Bak Hansen ebaec99741 Add Danish translation of README.en.md 2024-08-14 15:40:45 +02:00
Nariman Jelveh f7924f30bc Create README.en.md 2024-08-14 00:59:58 -07:00
Nariman Jelveh f00e0cf4a6 Add YouTube link to README.md 2024-08-13 20:42:40 -07:00
Nariman Jelveh 448da65366 Merge pull request #662 from looz0/patch-1
Add security email to contact section
2024-08-12 19:33:24 -07:00
looz0 902bde3c2d Add security email to contact section 2024-08-12 19:20:21 -07:00
Nariman Jelveh e44d3d8133 Merge pull request #661 from Ranegg/Ranegg-fi-translations
Added Finnish translations related to issue #536
2024-08-12 10:04:01 -07:00
Ranegg cb8d0fa011 Added Finnish translations related to issue #536 2024-08-12 19:35:41 +03:00
Nariman Jelveh 5c7701d5de Merge pull request #659 from JoelSjogren/fix-548
completed translation english to swedish in sv.js
2024-08-11 09:59:42 -07:00
Joel Sjögren 0c4690e39c completed translation english to swedish in sv.js 2024-08-11 10:54:57 +02:00
Nariman Jelveh 37edb78fe9 Merge pull request #658 from NGunjyal01/fix/533/Translation-English-To-Danish
completed translation english to danish in da.js
2024-08-10 16:30:46 -07:00
KernelDeimos 3f07ead1b9 fix: add context to event listener aiife 2024-08-09 16:50:39 -04:00
unknown 00e8b81d16 completed translation english to danish in da.js 2024-08-09 23:16:52 +05:30
Nariman Jelveh 2898ff681f Merge pull request #657 from NGunjyal01/fix/531-Translatio-English-To-Portuguese
Completed Translation of English To Portuguese(Portugal)
2024-08-09 09:37:36 -07:00
unknown 200cc4680b Completed Transaltion of English To Portuguese from Portugal 2024-08-09 20:34:23 +05:30
KernelDeimos e60632343b sync: cross origin + small gui updates 2024-08-08 21:24:10 -04:00
KernelDeimos 783cf57934 sync: update hardcoded permissions 2024-08-08 17:23:30 -04:00
KernelDeimos 5b74b4affa fix: missing method in SLink 2024-08-08 17:22:34 -04:00
KernelDeimos e2f35b4844 dev: CLink and SLink classes 2024-08-08 15:13:32 -04:00
KernelDeimos c213b21bee move: BroadcastService to [+] BroadcastModule 2024-08-08 15:13:32 -04:00
KernelDeimos cea29645fe feat: add message encryption between Puter peers 2024-08-08 15:13:32 -04:00
KernelDeimos 476acae0e0 fix: disable unconfigured ai services 2024-08-05 16:04:25 -04:00
KernelDeimos c97688706e tweak: add boot error help 2024-08-05 15:59:09 -04:00
KernelDeimos 7aece26f4b tweak: add default driver mapping 2024-08-03 21:07:56 -04:00
KernelDeimos 9a9bd5eaf0 feat: add test_mode flag 2024-08-03 21:07:56 -04:00
KernelDeimos 78fa77d920 feat: add tts driver to puterai module 2024-08-03 21:07:56 -04:00
KernelDeimos fb26fdbc56 feat: add image generation driver to puterai module 2024-08-03 21:07:56 -04:00
KernelDeimos 4e3bd1831e feat: add chat completions driver to puterai module 2024-08-03 21:07:56 -04:00
KernelDeimos ef6671da18 feat: add --overwrite-config and configurable uuid masking
This is in preparation for the chat completions driver. OpenAI asks that
a user ID be provided in requests when service is being provided to
other users, so we deterministically generate different UUIDs for this
purpose to prevent user information from being exposed.
2024-08-03 21:07:56 -04:00
KernelDeimos f924d48b02 feat: add textract driver to puterai module 2024-08-03 21:07:56 -04:00
KernelDeimos b520783bf4 fix: add missing driver parameter to /call endpoint 2024-08-03 21:07:56 -04:00
KernelDeimos 1f059c330c dev: update FileFacade to use LLRead 2024-08-03 21:07:56 -04:00
Nariman Jelveh 475eb13fb3 add checkmark to selected language in the settings window 2024-08-02 14:00:44 -07:00
Nariman Jelveh 5db00abeaf Merge pull request #654 from Razy-F/Hebrew-translation 2024-08-02 08:01:06 -07:00
Nariman Jelveh fcb38aee87 Update translations.js to add Hebrew files 2024-08-01 23:53:56 -07:00
Razy F fa2702183c Add the new he.js translation filee 2024-08-02 09:06:34 +03:00
Nariman Jelveh a2255521f2 Escape rootItems in Dev Center before printing 2024-08-01 18:54:10 -07:00
Nariman Jelveh 09289b5004 Update README.md 2024-08-01 17:04:45 -07:00
Nariman Jelveh 53b67b3631 Merge pull request #650 from de1eb/main
Updated Korean translation file
2024-08-01 00:14:15 -07:00
Nariman Jelveh 11658beb18 Merge branch 'main' into main 2024-08-01 00:03:03 -07:00
Nariman Jelveh ed4d74d27d Merge pull request #648 from ljyamada/issue514
Complete Korean translation #541
2024-07-31 23:53:54 -07:00
Noru V e8b57debe9 Updated plural suffix problem related to showing the number of items when you use Explorer 2024-08-01 11:09:18 +09:00
Noru V 1063b6c1ab Updated Korean translation file 2024-08-01 10:28:24 +09:00
haruto eeda878554 Complete Korean translation #541
Complete Korean translation based on English file #541
2024-08-01 10:00:19 +09:00
Nariman Jelveh b35428ddd3 Merge pull request #646 from RandomStrangerOnTheInternet/main
Update Dutch translations
2024-07-31 17:07:16 -04:00
KernelDeimos 8b11937365 dev: fix incomplete support for multipart driver requests 2024-07-31 17:06:50 -04:00
KernelDeimos 7a09c5c47a doc: add example requests 2024-07-31 17:06:50 -04:00
KernelDeimos c28f2cb4df dev: add service to test images through drivers 2024-07-31 17:06:50 -04:00
Nariman Jelveh ade66bd1da escape unescaped single quote causing syntax error 2024-07-31 17:04:22 -04:00
RandomStrangerOnTheInternet c7ab7e04a6 Update Dutch translations (fixes https://github.com/HeyPuter/puter/issues/543) 2024-07-31 22:56:36 +02:00
Nariman Jelveh 1e753843d2 Remove some of the unused component imports 2024-07-28 12:41:52 -07:00
KernelDeimos 02504690cf test: add database migration tests 2024-07-28 04:02:16 -04:00
KernelDeimos d0e461e206 fix: sqlite migrations error
This issue was caused by an INSERT statement which adds the admin user
to the admin group. The admin user is created at initialization, so for
new installs it does not exist at the time migration scripts are run.
Additionally, new javascript-coded migrations (.mig.js) would not have
run for new installs because of redundant (WET; not DRY) code for
initial setup.

This commit also improves error handling of the migration service, which
was necessary to diagnose this issue.

In the future, setup always needs to be tested after updating migration
scripts, even though migration of existing databases is where most of
the issues will happen.

Resolves: #639
2024-07-27 18:54:17 -04:00
Nariman Jelveh 1c5ef01668 Merge pull request #640 from BryarGh/edit-kurdish-template
Update Kurdish language template
2024-07-27 14:47:04 -07:00
Nariman Jelveh c717746646 Use the english version of the license header but retain the credit to Bryar Ghafoor 2024-07-27 14:07:24 -07:00
Bryar Ghafoor fe119756b5 Update Kurdish language template 2024-07-27 23:19:24 +03:00
KernelDeimos 70787ffa2c tweak: print new password when resetting pass via server console 2024-07-26 22:43:11 -04:00
Nariman Jelveh 840436a04c Merge pull request #638 from fauzipadlaw/main
Add Indonesian Translation for i18n
2024-07-26 12:54:05 -07:00
Muhammad Fauzi 033643b0e7 feat: Add Indonesian Translation for i18n 2024-07-27 02:45:05 +07:00
KernelDeimos 654e0b9333 move: move selfhosting-related services to a module 2024-07-26 01:23:22 -04:00
KernelDeimos 6213806aba dev: move driver arg types to a registry 2024-07-25 23:19:54 -04:00
KernelDeimos af3180a57f dev: add monthly usage to new call method 2024-07-25 23:19:54 -04:00
KernelDeimos 8be7a7d219 dev: add logical rate-limit to new call method 2024-07-25 23:19:54 -04:00
KernelDeimos 780a993465 dev: move policy selection to call_new_ 2024-07-25 23:19:54 -04:00
KernelDeimos ea409d1578 dev: begin using Invoker for driver calls 2024-07-25 23:19:54 -04:00
KernelDeimos 20b58ddcb5 dev: add Invoker 2024-07-25 23:19:54 -04:00
KernelDeimos 9e38e048c1 dev: prepare to implement policy enforcer 2024-07-25 23:19:54 -04:00
KernelDeimos e514dfcf50 fix: prevent large logs from service events (2) 2024-07-25 23:19:54 -04:00
KernelDeimos d5ec40078f dev: begin adding new driver call method 2024-07-25 23:19:54 -04:00
KernelDeimos e0d30f041b dev: move implied system perms 2024-07-25 23:19:54 -04:00
KernelDeimos 984ae9e6a2 feat: add password reset from server console 2024-07-25 23:19:54 -04:00
KernelDeimos 580fbdb113 tweak: record time for permission scans 2024-07-25 23:19:54 -04:00
KernelDeimos cca19ad495 dev: remove svc_permission.check 2024-07-25 23:19:54 -04:00
KernelDeimos 191be84e32 dev: migrate svc_permission check() to scan() 2024-07-25 23:19:54 -04:00
KernelDeimos 3b85e4eeba dev: migrate ACLService to use scan() 2024-07-25 23:19:54 -04:00
KernelDeimos a0f0151446 dev: improve permission scan reading 2024-07-25 23:19:54 -04:00
KernelDeimos 4a6055d239 dev: add user-app to permission scanning 2024-07-25 23:19:54 -04:00
KernelDeimos 54471fada9 feat: add server command to scan permissions 2024-07-25 23:19:54 -04:00
KernelDeimos c9ded89b22 feat: grant user driver perms from admin 2024-07-25 23:19:54 -04:00
KernelDeimos f0c36a1cdf feat: replace default_user with admin 2024-07-25 23:19:54 -04:00
KernelDeimos d1261460ba dev: obtain driver permission from system user 2024-07-25 23:19:54 -04:00
KernelDeimos ab156297a7 feat: add system user 2024-07-25 23:19:54 -04:00
KernelDeimos 2cd68100d2 refactor: add traits and services as drivers 2024-07-25 23:19:54 -04:00
KernelDeimos 8beda66328 data: add extra sound 2024-07-25 18:28:16 -04:00
KernelDeimos 5fee393b67 data: add startup and shutdown chimes 2024-07-25 18:01:10 -04:00
Nariman Jelveh f30bbbd375 Add translation template for Kurdish 2024-07-25 14:48:12 -07:00
Nariman Jelveh e7c72e079b Merge pull request #633 from Zac0511/main
Add badges
2024-07-25 10:36:35 -07:00
Zac0511 6cfea963a0 Add badges
Added install badges, Puter.js badges, and source Figma files
2024-07-25 17:33:10 +02:00
Nariman Jelveh a28df490ba Merge pull request #632 from Zac0511/patch-2
Update README.md
2024-07-25 08:07:41 -07:00
Zac0511 5c49e83378 Update README.md
Added the license shield
2024-07-25 13:00:28 +02:00
Zac0511 d22abb36cb Update README.md
Added two shields displaying the repo size and latest version, and gets updated automatically
2024-07-25 12:22:24 +02:00
Nariman Jelveh 8a5302c8e2 Merge pull request #619 from secondtruth/issue-template-meta
Add issue template for meta suggestions
2024-07-24 16:34:46 -07:00
Nariman Jelveh 9250e23d96 Update meta.md 2024-07-24 16:34:33 -07:00
Zac0511 bef38dfc96 meta: Create config.yml to add Puter Discord to the issue screen (#631)
This adds a config file which will show the Puter Discord Server in the issue menu, allowing users to quickly ask help on the Puter Discord
2024-07-24 16:24:19 -04:00
Nariman Jelveh 22d7134802 Pass window.crossOriginIsolated value to the popup 2024-07-24 12:36:19 -07:00
KernelDeimos 48c819ac73 chore: update SLA for chat model
Resolves: #630
2024-07-24 13:35:26 -04:00
KernelDeimos fa9cc8efcf fix: prevent large logs from service events (1) 2024-07-24 02:31:45 -04:00
KernelDeimos 5d5f5660b4 feat: add options to disable winston and devwatch 2024-07-24 01:52:07 -04:00
Nariman Jelveh cc0800d60a Remove unnecessary console.log calls 2024-07-22 19:43:50 -07:00
KernelDeimos 203669a79f release: v2.4.2 2024-07-22 20:23:40 -04:00
Nariman Jelveh f8b39630ab Merge pull request #628 from HeyPuter/eric/fix-templates
Write contents from template when creating a file from a tempalte
2024-07-22 16:53:01 -07:00
Nariman Jelveh 5d58764316 Use join. to build target path 2024-07-22 16:38:45 -07:00
KernelDeimos 5d2a6fce30 fix: fix templates 2024-07-22 17:10:58 -04:00
Nariman Jelveh 1f7f094282 Merge pull request #627 from Koppeks/koppeks/templates_folder_contextmenu
Templates folder feature
2024-07-22 11:33:02 -07:00
Nariman Jelveh d8dd218089 Don't show No templates found for now. 2024-07-22 11:31:01 -07:00
Nariman Jelveh a9801fc10d place available_templates call in update_auth_data to guarantee that user object exists 2024-07-22 11:07:57 -07:00
Nariman Jelveh 2d5a0bb894 closes #614 2024-07-21 17:01:24 -07:00
Koppeks a0113788f9 remove extra comments 2024-07-21 17:32:33 -03:00
Nariman Jelveh 5cf74a0ad9 Merge pull request #624 from enweazudaniel/main
Update ig.js
2024-07-21 09:18:31 -07:00
enweazudaniel 382fb24dbb Update ig.js 2024-07-21 17:04:33 +01:00
KernelDeimos 8f87770ceb fix: popup login in co isolation mode 2024-07-20 20:46:03 -04:00
KernelDeimos 2a5cec7ee9 fix: add necessary iframe attributes for co isolation 2024-07-20 18:54:08 -04:00
Nariman Jelveh 1579cbccf0 Merge pull request #620 from pvhuwung/i18n/vietnamese-translation
Add Vietnamese Translation for i18n
2024-07-20 14:12:24 -07:00
pvhuwung 02e1b1e8f5 chore: fix confirm for type_confirm_to_delete_account 2024-07-21 04:03:37 +07:00
Pham Viet Hung *David f4a45d74e7 Merge branch 'HeyPuter:main' into i18n/vietnamese-translation 2024-07-21 04:53:48 +08:00
pvhuwung c2d3d69dbe feat: add vietnamese localization-a 2024-07-21 03:53:14 +07:00
Nariman Jelveh 71f4b4d71f When setting size/position of app window make sure it's not an empty string 2024-07-20 13:34:36 -07:00
Nariman Jelveh 452b7495b1 use app-request as label for app idea issues 2024-07-20 11:46:20 -07:00
Nariman Jelveh ace14e99fa Merge pull request #618 from secondtruth/issue-template-app-idea
Add issue template for app ideas
2024-07-20 11:41:50 -07:00
Christian Neff fe63839bbb Add issue template for meta suggestions 2024-07-20 19:38:22 +02:00
Christian Neff b3c1b128e2 Add issue template for app ideas 2024-07-20 18:09:37 +02:00
Nariman Jelveh b6a433ce0c Merge pull request #616 from stariver1862/patch-1
Complete Traditional Chinese translation based on English file #550
2024-07-20 08:06:07 -07:00
Nariman Jelveh 3a09e84838 fix: syntax error and formatting issue 2024-07-20 08:05:14 -07:00
Nariman Jelveh 4990ba01cc Merge branch 'main' into patch-1 2024-07-20 07:47:38 -07:00
Nariman Jelveh 6b5c31ddfe Merge pull request #615 from mlgzackfly/update-translations
fix(i18n): Complete Traditional Chinese translation based on English file #550
2024-07-20 07:33:49 -07:00
WHL b9e73b7288 Update zhtw.js, Complete Traditional Chinese translation based on English file #550 2024-07-20 22:18:05 +08:00
mlgzackfly 37fd666a9a fix(i18n): update zhtw.js to match en.js 2024-07-20 19:36:45 +08:00
Koppeks f897e84498 Temporal commit for issue #432 2024-07-19 19:42:47 -03:00
Nariman Jelveh eae51e945b Merge branch 'main' of https://github.com/HeyPuter/puter into main 2024-07-19 13:11:35 -07:00
Nariman Jelveh 98e69642d0 fix: launch_app not considering explorer as a special case 2024-07-19 13:11:26 -07:00
Nariman Jelveh 45c29b6220 Merge pull request #611 from Alfika07/main
Fixed Tamil translation
2024-07-19 08:52:58 -07:00
Nariman Jelveh f2bb551e75 Change english_name from English to Tamil 2024-07-19 08:52:19 -07:00
Alfika07 8a3d0430f3 Add Tamil translation to translations.js 2024-07-19 09:46:04 +02:00
Alfika07 333d6e3b65 Move Tamil translation to the rest of translations 2024-07-19 09:43:23 +02:00
KernelDeimos e58da265ba try cross-origin isolation only on sites 2024-07-18 20:58:09 -04:00
KernelDeimos 7043b9400c fix: well kinda (HOSTNAME in phoenix) 2024-07-18 20:16:08 -04:00
Nariman Jelveh eeda9fb568 close #409 2024-07-18 16:06:45 -07:00
KernelDeimos ae25711a13 update package.json for local testing 2024-07-18 17:02:31 -04:00
KernelDeimos 602a19895c fix: it was github actions the entire time 2024-07-18 16:58:36 -04:00
KernelDeimos 614f2c5061 fix: fix CI attempt #7 2024-07-18 16:44:11 -04:00
KernelDeimos 9d549b192d fix: fix CI attempt #6 2024-07-18 16:38:56 -04:00
KernelDeimos 74adcddc1d fix: fix CI attempt #5 2024-07-18 16:36:44 -04:00
Nariman Jelveh 5a4328e449 Update Dockerfile 2024-07-18 13:33:02 -07:00
Nariman Jelveh 8b5f58c156 Merge branch 'main' of https://github.com/HeyPuter/puter into main 2024-07-18 13:30:14 -07:00
Nariman Jelveh d9a90a67c1 let me try fixing mocha! 2024-07-18 13:30:05 -07:00
KernelDeimos 84b993bce9 fix: fix CI attempt #4 2024-07-18 16:27:36 -04:00
KernelDeimos 3bca973f5f fix: fix CI attempt #3 2024-07-18 16:20:57 -04:00
KernelDeimos aebe89a1ac fix: fix CI attempt #2 2024-07-18 16:16:31 -04:00
KernelDeimos 58c199c153 fix: run mocha within packages in monorepo 2024-07-18 16:10:45 -04:00
Nariman Jelveh 82fa2d0862 close #169 2024-07-18 13:01:14 -07:00
KernelDeimos ad3d318d07 fix: make webpack output not look like errors 2024-07-18 14:50:53 -04:00
KernelDeimos e539932070 feat: add cross_origin_isolation option 2024-07-18 14:23:03 -04:00
KernelDeimos 8c8904cb36 doc: update documentation for boot sequence 2024-07-18 14:23:03 -04:00
Nariman Jelveh f9333b3d1e feat: add option to disable temporary users 2024-07-18 12:59:42 -04:00
KernelDeimos ba50d0f96d feat: add some default groups 2024-07-18 01:08:49 -04:00
Nariman Jelveh 8e7306c23b Add support for dropping multiple Puter items onto Dev Center (close #311) 2024-07-17 20:56:36 -07:00
Nariman Jelveh e6833253c7 close #276 2024-07-17 20:14:07 -07:00
Nariman Jelveh 4d6edff169 Escape arguments passed to dev-center 2024-07-17 18:32:02 -07:00
KernelDeimos 29f919c98a sync: package-lock.json 2024-07-17 17:15:29 -04:00
Nariman Jelveh 45f131f8ea No scrollbar for session list 2024-07-17 14:05:49 -07:00
Nariman Jelveh d80f2fa847 fix: fix path issues under win32 platform 2024-07-17 13:36:22 -07:00
KernelDeimos 5c636d4fd2 fix: remove abnoxious debug file 2024-07-17 13:55:55 -04:00
Nariman Jelveh f28836180e Merge pull request #603 from ohm69/pl-trans
Translation improvements, mainly style and context-based
2024-07-17 08:06:30 -07:00
Michal Hobot 8bece96f62 Translation improvements, mainly style and context-based
After using a Polish-translated puter I found out several places for improvement
2024-07-17 15:43:23 +02:00
Nariman Jelveh 6c29427e16 close #174 2024-07-16 19:06:46 -07:00
Nariman Jelveh 9bfee0862f Merge pull request #600 from Koppeks/koppeks/translation-es
Translation to Spanish
2024-07-16 18:14:44 -07:00
Nariman Jelveh 9d8a46814d Merge pull request #597 from bryanthaboi/main
Directions for Windows / Docker Composer
2024-07-16 16:38:42 -07:00
Nariman Jelveh c19c18bfcf Bring both Windows and Linux/Mac instructions under Docker Compose 2024-07-16 16:32:42 -07:00
Koppeks 151527825f update translation file es.js to be up to date with the file en.js 2024-07-16 20:30:42 -03:00
Nariman Jelveh cc4c93b77f Update README.md 2024-07-16 15:56:59 -07:00
Nariman Jelveh 3ca92955cb Make the screenshot a little larger 2024-07-16 15:56:37 -07:00
Nariman Jelveh 9bc427ced2 Merge pull request #598 from ohm69/patch-1
Translate en.js as of 2024-07-10
2024-07-16 09:09:44 -07:00
Michal Hobot 8e297cd7e3 Translate en.js as of 2024-07-10 2024-07-16 17:55:34 +02:00
bryanthaboi 5833b391f1 Update README.md 2024-07-16 09:17:35 -04:00
bryanthaboi 64e4299ac0 Update README.md 2024-07-16 09:10:38 -04:00
KernelDeimos 747d7dea89 Update SECURITY-ACKNOWLEDGEMENTS.md 2024-07-15 20:03:14 -04:00
Nariman Jelveh c80526900b Merge pull request #594 from Szab54/patch-1
Update translations.js to Hungarian lang
2024-07-15 12:39:07 -07:00
Nariman Jelveh 1b12a413fe Merge pull request #595 from Szab54/patch-3
Create hu.js hungarian language
2024-07-15 12:38:33 -07:00
XYCert 69a80ab3d2 Create hu.js hungarian language 2024-07-15 21:04:38 +02:00
XYCert 56820cf6ee Update translations.js to Hungarian lang 2024-07-15 20:58:31 +02:00
KernelDeimos a259755fe5 Fix broken link 2024-07-15 13:22:15 -04:00
KernelDeimos 7a12e699de Update SECURITY-ACKNOWLEDGEMENTS.md 2024-07-15 13:21:05 -04:00
Nariman Jelveh 7f0365202e Merge pull request #593 from Varun710/tamil-translation
Tamil translation
2024-07-14 22:36:13 -07:00
Varun710 81781f80af Tamil translation 2024-07-15 00:27:35 -05:00
Nariman Jelveh 93f4e52983 Update README.md to add Mastodon link 2024-07-14 16:43:56 -07:00
Nariman Jelveh b52c31133e Merge pull request #591 from LNLenost/patch-1
Fixed grammar issues/untranslated stings in italian translation
2024-07-14 10:44:37 -07:00
LNLenost 84e31eff2f Update it.js 2024-07-14 19:34:09 +02:00
Nariman Jelveh 46cbe077bc Merge pull request #590 from narek-gh/armenian-translation
Update Armenian translation based on English file
2024-07-13 14:25:31 -07:00
Narek 3b8af7cc5c Update Armenian translation file 2024-07-14 00:11:15 +04:00
Nariman Jelveh 9afb1b78b8 Fix blackfortresslabs.com URL 2024-07-11 18:36:29 -07:00
Nariman Jelveh ae04a09c90 Take into account that godmode might be either integer or boolean 2024-07-11 18:07:09 -07:00
KernelDeimos e8f4c328bf fix: read_only fields in ES 2024-07-11 21:00:14 -04:00
Nariman Jelveh 7b4e95139f Shorten Reddit link 2024-07-11 17:24:57 -07:00
KernelDeimos 6a2fbc1925 fix(security): hoist acl check in ll_read 2024-07-11 20:09:39 -04:00
KernelDeimos ab74f1ee8d release: v2.4.1 2024-07-11 19:41:08 -04:00
Nariman Jelveh b790bab9c0 Merge pull request #585 from HeyPuter/eric/rename-traits-to-features
refactor(backend): rename traits to features
2024-07-11 14:37:12 -07:00
KernelDeimos f7d15bae41 refactor(backend): rename traits to features 2024-07-11 16:50:09 -04:00
Nariman Jelveh 01a248e96e Merge pull request #579 from Waheed4719/issue#530
Issue#530 - Update bengali translations
2024-07-10 17:55:59 -07:00
Waheed Uddin Ahmed cff488f4f4 Update bn.js file formatting 2024-07-11 06:46:34 +06:00
Waheed Uddin Ahmed 92abc9947f Issue#530 - Update bengali translations 2024-07-11 06:42:52 +06:00
KernelDeimos 7aadae58ce fix: remove flag that breaks puter-js webpack 2024-07-10 17:18:54 -04:00
KernelDeimos 5b1924f312 chore: remove duplicate headers 2024-07-10 16:53:54 -04:00
KernelDeimos e6e92dc7b2 dev(license-headers): add dupe detector 2024-07-10 16:50:41 -04:00
KernelDeimos 6728dd2571 dev(license-headers): fix excludes list 2024-07-10 16:25:14 -04:00
KernelDeimos 2bf9f60bb0 dev(license-headers): implement skip and replace 2024-07-10 16:12:09 -04:00
KernelDeimos d0a5a57c88 dev(tools): add conflict prompt to license-headers 2024-07-10 14:57:39 -04:00
Nariman Jelveh f006c9ed26 Rename #DoesItRunPuter?.md to #DoesItRunPuter.md 2024-07-10 11:53:11 -07:00
Nariman Jelveh 6013466bcb Rename DoesItRunPuter.md to #DoesItRunPuter?.md 2024-07-10 11:52:34 -07:00
Nariman Jelveh 435e1786a3 Rename doesitrunputer.md to DoesItRunPuter.md 2024-07-10 11:38:56 -07:00
Nariman Jelveh e96bba850f move #DoesItRunPuter from README.md to ./awesome 2024-07-10 11:38:03 -07:00
Nariman Jelveh 2378f1a833 Delete .vscode directory 2024-07-10 11:30:15 -07:00
KernelDeimos 713b1f5889 dev(tools): add missing header adding to license-headers 2024-07-10 14:10:31 -04:00
KernelDeimos fac08c4152 doc: remove extra log in doc snippet 2024-07-10 13:52:20 -04:00
Nariman Jelveh 059a1fe565 Merge pull request #576 from sbondor/fix/romanian-translations
Added missing Romanian translations.
2024-07-10 10:43:59 -07:00
Sergiu Bondor 8440f566b9 Added missing Romanian translations. 2024-07-10 19:49:45 +03:00
Nariman Jelveh adb0f9dc23 Merge pull request #575 from xslendix/main
Add Romanian translations
2024-07-10 06:25:05 -07:00
Slendi 473b6512c6 Add 2FA Romanian translations
Signed-off-by: Slendi <[email protected]>
2024-07-10 11:37:06 +03:00
KernelDeimos 67139ef91b dev(tools): add license header adder thingy 2024-07-10 00:41:08 -04:00
Nariman Jelveh c76af1ab21 Merge pull request #574 from askdkc/japanese-translation
Add Japanese translation
2024-07-09 19:29:31 -07:00
askdkc 31748506b7 Create ja.js for Japanese Translation 2024-07-10 11:22:16 +09:00
askdkc 47ec74f0aa Add Japanese Translation 2024-07-10 11:20:29 +09:00
Nariman Jelveh 5e4582dda6 Update README.md 2024-07-09 19:18:14 -07:00
Nariman Jelveh 3bd3be7dee Update README.md 2024-07-09 19:15:50 -07:00
Nariman Jelveh e5243ec560 Delete .github/ISSUE_TEMPLATE/driver-request.md 2024-07-09 19:05:04 -07:00
Nariman Jelveh e745f67273 Add 'Support' section to README.md 2024-07-09 19:04:09 -07:00
Nariman Jelveh 831b2e259e Add ladybird to #DIRP and move the license section to the bottom 2024-07-09 16:54:54 -07:00
Nariman Jelveh 069b5e0033 Merge pull request #573 from HeyPuter/fix-CI-network-issues
Move `.commit` to `/tools`
2024-07-09 16:18:10 -07:00
KernelDeimos fafa36c73f move: move dev-server.js back to gui
I'm not sure why it was here, I thought I moved it already.
2024-07-09 19:01:49 -04:00
Nariman Jelveh eebf379205 Move .commit to /tools 2024-07-09 15:58:55 -07:00
Nariman Jelveh 4e15c5fcf4 Merge pull request #572 from HeyPuter/fix-CI-network-issues
retry npm 3 times to account for the flakiness of the process
2024-07-09 15:14:21 -07:00
Nariman Jelveh 10d77f17aa retry npm 3 times to account for the flakiness of the process 2024-07-09 15:12:19 -07:00
Nariman Jelveh 4daa1f2c25 Merge pull request #571 from micheledinelli/main
Add documentation instructions to get started with My Websites
2024-07-09 14:56:40 -07:00
micheledinelli 6c4c73a9e8 Add documentation instructions to get started with My Websites 2024-07-09 23:33:11 +02:00
Nariman Jelveh 00eabd7b10 remove duplicate and/or incorrect license headers 2024-07-09 13:50:20 -07:00
Nariman Jelveh 3b59ecedd1 Merge pull request #567 from stronkexe/main
Completing Arabic translation based on English file.
2024-07-09 08:21:04 -07:00
Nariman Jelveh 871f4cab0c Merge branch 'main' into main 2024-07-09 08:16:28 -07:00
Nariman Jelveh 1d52a559ff Remove more duplicate license headers 2024-07-09 08:14:33 -07:00
Nariman Jelveh ab164c3a0a Merge pull request #570 from micheledinelli/main
Completing Italian translation based on English file
2024-07-09 07:59:11 -07:00
micheledinelli f5a8ee1c6a Completing Italian translation based on English file 2024-07-09 16:55:45 +02:00
Nariman Jelveh 7fa2dd535f remove all duplicated license headers 2024-07-09 07:51:54 -07:00
micheledinelli a96abb5793 Completing Italian translation based on English file. 2024-07-09 16:49:19 +02:00
Nariman Jelveh 1f4297f746 Remove extra license header from ar.js 2024-07-09 07:48:35 -07:00
stronkexe 78a0acea69 Completing Arabic translation based on English file 2024-07-09 09:35:07 +01:00
KernelDeimos 3a7221dba5 chore: cleanup root directory 2024-07-09 04:18:55 -04:00
KernelDeimos bda4aed2e8 chore: add missing license headers 2024-07-09 04:10:33 -04:00
KernelDeimos 365d795c3f doc: omit cp of .env.example in local build instructions
This command contradicts the statement that Puter will find the
next available port when port 4100 is in use.
2024-07-09 04:03:58 -04:00
KernelDeimos a1ff375931 doc: update comment_prefixes.md 2024-07-09 03:40:46 -04:00
KernelDeimos 50036e954d dev: add js-parse-and-output experiment 2024-07-09 03:40:34 -04:00
KernelDeimos 0b39c76c40 move: incubator to experiments
This name is easier to understand and more generalizable.
2024-07-09 03:19:31 -04:00
KernelDeimos 47f76ccc89 dev: add file walker 2024-07-09 03:15:51 -04:00
Nariman Jelveh d3a9ba847a Move icon credits to the GUI project directory 2024-07-08 22:23:02 -07:00
Nariman Jelveh 338004474f Add jsdoc-style comments for a number of functions 2024-07-08 17:52:43 -07:00
Nariman Jelveh 535475b3c3 Improve getMimeType to remove trailing dot in the extension if preset 2024-07-08 17:33:09 -07:00
Nariman Jelveh 073b501e41 Merge pull request #566 from matheussss1/update-br-translation
feat: update BR translation
2024-07-08 14:40:29 -07:00
Matheus Carvalho 42a6b3938a feat: update BR translation 2024-07-08 18:33:39 -03:00
KernelDeimos a9338b45c1 chore: update package.json 2024-07-08 17:31:50 -04:00
Nariman Jelveh 8b9d57dc88 Merge pull request #565 from medelm1/update-arabic-translations
Update Arabic translations in ar.js
2024-07-08 14:03:09 -07:00
Nariman Jelveh 7d92304e7f Update ar.js 2024-07-08 13:59:45 -07:00
Nariman Jelveh 7844965489 Merge branch 'update-arabic-translations' of https://github.com/medelm1/puter into pr/565 2024-07-08 13:59:18 -07:00
Nariman Jelveh 8bdd489eaf Add missing commas 2024-07-08 13:59:13 -07:00
Med Elm fe5be7f3cf Update Arabic translations in src/gui/src/i18n/translations/ar.js to match English version in src/gui/src/i18n/translations/en.js 2024-07-08 13:59:13 -07:00
Nariman Jelveh 42496f9319 Add missing commas 2024-07-08 13:58:50 -07:00
KernelDeimos 48f99fb807 dev: add script to replace release-please 2024-07-08 16:57:02 -04:00
Med Elm bffa192805 Update Arabic translations in src/gui/src/i18n/translations/ar.js to match English version in src/gui/src/i18n/translations/en.js 2024-07-08 21:44:19 +01:00
Nariman Jelveh 26e9b0b2de Merge pull request #564 from Speedyjet/Russian_and_Ukrainian
Russian and ukrainian
2024-07-08 13:18:33 -07:00
Nariman Jelveh e061b1f488 Merge pull request #560 from Speedyjet/translations_russian_and_ukrainian
Russian translation fixed
2024-07-08 13:14:45 -07:00
Nariman Jelveh d2c68308bb Merge branch 'main' into translations_russian_and_ukrainian 2024-07-08 13:08:55 -07:00
Oleh Brusentsov e61039faf4 Ukrainian updated 2024-07-08 21:44:42 +02:00
Nariman Jelveh a1dd354787 Merge pull request #561 from julijatol/main
Update ru.js issue #547
2024-07-08 12:29:54 -07:00
KernelDeimos 3ed7916856 feat: JSON support for kv driver 2024-07-08 15:27:54 -04:00
Yuliya Tolstikova 17145d0be6 Update ru.js issue #547 2024-07-08 15:12:48 -04:00
Oleh Brusentsov 8836011428 Russian translation fixed 2024-07-08 20:44:53 +02:00
KernelDeimos 1f659f7c01 chore: fix release-please version 2024-07-08 13:47:44 -04:00
github-actions[bot] c84e15ba20 chore(main): release 1.0.0 2024-07-08 13:47:44 -04:00
Nariman Jelveh 86fd2f4bc4 Delete src/dev-center/.eslintignore 2024-07-08 10:06:09 -07:00
KernelDeimos 1f3eb08a70 chore: remove eslint 2024-07-08 00:53:40 -04:00
Nariman Jelveh cb8f0aa359 wtf is wrong with eslint?! 2024-07-07 21:40:53 -07:00
Nariman Jelveh 58ff7c279d Update .eslintignore 2024-07-07 21:38:39 -07:00
Nariman Jelveh 1f8cd7f613 Create .eslintignore 2024-07-07 21:36:37 -07:00
KernelDeimos 94c0449437 fix: docker runtime fail because stdout columns 2024-07-08 00:31:18 -04:00
KernelDeimos 6603c45093 sync: update gui paths in Dockerfile 2024-07-08 00:31:02 -04:00
Nariman Jelveh 30f9f29982 Merge branch 'main' of https://github.com/HeyPuter/puter into main 2024-07-07 20:44:04 -07:00
Nariman Jelveh 594424444a make Dev Center aware of the origin of the host environment 2024-07-07 20:43:57 -07:00
KernelDeimos 4078a63fe1 tweak: maximize dev center on start 2024-07-07 23:16:19 -04:00
Nariman Jelveh ad56091c2f Merge pull request #559 from TianLangStudio/translation_zh
[translation] improve Chinese translation fix issue 549
2024-07-07 19:47:36 -07:00
Nariman Jelveh fd39f92ea6 get username and appID from puter.js rather than iframe URL in Dev Center 2024-07-07 19:44:28 -07:00
KernelDeimos 283f409a66 fix: fix owner ids for default apps 2024-07-07 22:35:45 -04:00
FusionZhu a8474054cc improve Chinese translation fix issue 549 2024-07-08 10:27:53 +08:00
KernelDeimos 10f4d7d50c feat: register dev center to apps 2024-07-07 22:26:32 -04:00
Nariman Jelveh e73d55b2c0 Perform getDeveloperProfile only when on puter.com 2024-07-07 19:22:26 -07:00
Nariman Jelveh f2b551d5be Initial commit for Dev Center 2024-07-07 18:52:37 -07:00
KernelDeimos af083b0800 cleanup: feat: support canonical puter.js url in dev 2024-07-07 20:47:01 -04:00
KernelDeimos fd41ae217c feat: support canonical puter.js url in dev 2024-07-07 20:45:02 -04:00
Nariman Jelveh fdea7907be Update screenshot in README.md 2024-07-07 16:45:59 -07:00
Nariman Jelveh 11cfa83193 Update README.md 2024-07-07 16:38:12 -07:00
Nariman Jelveh c88ce8e68c Delete test.txt 2024-07-07 16:31:46 -07:00
Nariman Jelveh c47556d1b7 Update README.md 2024-07-07 16:09:07 -07:00
Nariman Jelveh e6cdca09cc Remove the FAQ section from README.md 2024-07-07 15:58:17 -07:00
Nariman Jelveh 5e5a18565f Update README.md 2024-07-07 15:22:06 -07:00
Nariman Jelveh 2fbe6a6b26 Update README.md 2024-07-07 15:18:27 -07:00
Nariman Jelveh c5f4ff5a49 Update README.md 2024-07-07 15:15:19 -07:00
Nariman Jelveh 841c8bf9f2 Update README.md to add emojis to heading for easier reading 2024-07-07 15:09:49 -07:00
Nariman Jelveh 70b9b6f088 Update README.md 2024-07-07 15:03:09 -07:00
Nariman Jelveh 45840067f9 Update readme and put self-hosting instructions in a separate document 2024-07-07 15:01:01 -07:00
KernelDeimos 2a91edb965 chore: add Buffer to eslint 2024-07-07 17:12:55 -04:00
KernelDeimos edc5743a61 chore: add incubator/ to eslint ignores 2024-07-07 17:12:55 -04:00
KernelDeimos d3f3e089d3 sync: update check-translations.js 2024-07-07 17:12:55 -04:00
KernelDeimos 7c227ad967 chore: update eslint config 2024-07-07 17:12:55 -04:00
KernelDeimos a43cab0c93 refactor: move puter gui to workspace 2024-07-07 17:12:55 -04:00
Nariman Jelveh c23e8931ab Merge pull request #218 from lsileoni/main
WIP: Barebones x86emu skeleton
2024-07-07 11:25:18 -07:00
Nariman Jelveh d6dd04f195 Merge pull request #476 from HeyPuter/eric/more-reserved-words
tweak: add more reserved words
2024-07-07 11:22:35 -07:00
Nariman Jelveh 7811294f33 Add puter to reserved_words.js 2024-07-07 11:21:49 -07:00
Nariman Jelveh 016633cfbb Merge pull request #557 from Ramanmishra09/main
Issue no-551 hindi translation
2024-07-07 10:23:23 -07:00
Nariman Jelveh 4c26ebe3ac Fix key references for the Hindi language 2024-07-07 10:11:17 -07:00
ramanfloyeedee ce50718f84 Issue no-551 hindi translation
I have created hi.js file under src/i18n/translations in the main branch.
please review the file.
Thanks
2024-07-07 21:31:43 +05:30
Nariman Jelveh cb5184f2f1 Confirming to delete accoutn works with both English and the chosen locale of the user 2024-07-07 08:47:09 -07:00
Nariman Jelveh ce2b38c084 Merge pull request #556 from mklr19/translate-german
Updated german translation file
2024-07-07 08:22:46 -07:00
Nariman Jelveh 69332e14e7 Merge pull request #555 from etnms/#537-french-translation
Issue #537 - updated French translation based on English file
2024-07-07 08:07:44 -07:00
mklr19 37dca86506 Updated german translation file 2024-07-07 15:42:27 +02:00
etnms 812480bbd0 updated French translation based on English file per issue #513 2024-07-07 10:23:35 +02:00
Sam Atkins ef298ce3aa feat: Display app icon and description in embeds 2024-07-06 22:24:43 -04:00
KernelDeimos c8abe2380f dev: small changes 2024-07-06 22:12:49 -04:00
Nariman Jelveh d0cb0a96de Add english_name attribute for the Polish i18n file 2024-07-06 11:20:01 -07:00
Nariman Jelveh ac7fe1e436 Merge pull request #526 from brodbar/main
Update and revise Turkish translation
2024-07-06 08:45:33 -07:00
brodbar 28a9469914 Update locale 2024-07-06 16:47:50 +03:00
Nariman Jelveh bf27811167 Merge pull request #523 from sysnajar/th
Add Thai translation. https://github.com/HeyPuter/puter/issues/522
2024-07-05 21:27:40 -07:00
Nariman Jelveh 31bf69f10e add the two missing keys 2024-07-05 21:25:48 -07:00
Sysnajar 5e78690b97 Add Thai translation. 2024-07-06 10:46:58 +07:00
Nariman Jelveh d0758631ea Add more English translation keys 2024-07-05 15:35:16 -07:00
Nariman Jelveh c9e2427ad6 Merge pull request #521 from Zuhaib-Asif/update-urdu-translations
Updated Urdu translations, added missing entries, and corrected inacc… fix #520
2024-07-05 14:38:15 -07:00
Zuhaib Asif a9c33da151 Updated Urdu translations, added missing entries, and corrected inaccuracies 2024-07-06 02:21:49 +05:00
KernelDeimos 7d2f6d256f fix: group permission audit table 2024-07-04 19:37:52 -04:00
KernelDeimos 4af279a72f feat: rate-limit for excessive groups 2024-07-04 19:37:52 -04:00
KernelDeimos 0855f2b36e fix: property validation on some permission endpoints 2024-07-04 16:42:17 -04:00
Nariman Jelveh dcbca2f829 Add i18n keys for multiple terms 2024-07-03 13:05:39 -07:00
KernelDeimos de7e2adabd doc: document /group/list 2024-07-03 15:41:23 -04:00
KernelDeimos d55f38ca68 feat: add /group/list endpoint 2024-07-03 15:41:23 -04:00
Nariman Jelveh 3633349700 Merge pull request #516 from guicazaroto/feature/translate-br.js
feature: add (pt-br) translation for system settings.
2024-07-02 15:59:23 -07:00
Guilherme Guimarães Cazaroto 77211c4f71 feature: add (pt-br) translation for system settings. 2024-07-02 19:42:49 -03:00
KernelDeimos c0063a871f fix: handling of batch requests with zero files 2024-07-02 15:38:56 -04:00
Nariman Jelveh 80ea655d05 close #512 2024-07-01 15:44:48 -07:00
KernelDeimos d9c4fbbd1d fix: ui color input attributes 2024-07-01 14:23:49 -04:00
Sam Atkins 75a989a7b6 feat(phoenix): Make clear clear scrollback unless -x is given
From what I understand, we shouldn't need both `\x1B[2J` and `\x1B[3J`
sequences to clear everything, but xterm.js would not correctly clear
the visible region with only `\x1B[3J`. So, we have both.
2024-07-01 13:59:43 -04:00
Sam Atkins d76e7130cb fix(phoenix): Gracefully handle completing a non-existent path
filesystem.readdir() can throw, which previously would crash Phoenix and
leave the terminal unresponsive. This change makes it return no results
instead.
2024-07-01 13:52:46 -04:00
Sam Atkins 4539408a21 feat(phoenix): Show actual host name in prompt and neofetch 2024-07-01 12:46:15 -04:00
Sam Atkins e2ea57fcf9 tweak(phoenix): Only take auth params from config message
Having the parent app send us arbitrary config values was a holdover
from when phoenix was an embedded iframe and not a separate app. It led
to a security issue previously. Let's only take the auth parameters
since we can't get those otherwise, and they're safe to read.
Everything else should be available in our own URL params.
2024-07-01 12:46:15 -04:00
Sam Atkins b7133760df tweak: Ensure puter.domain is always set for launched apps 2024-07-01 12:46:15 -04:00
Nariman Jelveh 91e9fa7c25 improve the ux of "Show Desktop" toolbar button 2024-06-30 23:30:55 -07:00
KernelDeimos 2f5b9cc4ee chore: add temp user-app permission 2024-06-30 16:40:25 -04:00
KernelDeimos 2f163221bd fix: update PD alert custom details 2024-06-30 16:31:02 -04:00
KernelDeimos a0f4292072 test: add more test scenarios for sharing 2024-06-30 15:09:49 -04:00
KernelDeimos 1429d6f57c fix: column nullability blunder 2024-06-30 15:06:10 -04:00
KernelDeimos b10302ad74 fix: add missing columns for public directory update 2024-06-28 22:26:57 -04:00
KernelDeimos 88d6bee954 feat: get first test working on share-test service 2024-06-28 17:43:45 -04:00
KernelDeimos 9ad04cd33f prereq: make it possible to access storage without context init 2024-06-28 17:43:45 -04:00
KernelDeimos 332371fccb feat: add service to test file share logic 2024-06-28 17:43:45 -04:00
Nariman Jelveh 95e1268527 Make contextmenu smooth as butter 2024-06-28 12:48:55 -07:00
Sam Atkins d077504f9b doc(git): Expand documentation and add FIXMEs 2024-06-28 14:19:23 -04:00
Sam Atkins 711dbc0d2f feat(git): Understand references like HEAD^ and main~3
There are a lot of ways of specifying a revision, but these are a couple
of common ones.
2024-06-28 14:19:23 -04:00
Sam Atkins adcd3db0ed refactor: Move parsely into top-level packages directory
Parsely was missed by fa7bec3854 because
it got merged afterwards.
2024-06-28 14:19:23 -04:00
Sam Atkins 45cdfcb5bf feat(git): Display ref names in git log and git show 2024-06-28 14:19:23 -04:00
Sam Atkins 351d3f50ba tweak(git): List git subcommands in git help with no arguments 2024-06-28 14:19:23 -04:00
Sam Atkins 73d0f5a90c fix(git): Make git commit display detached HEAD correctly 2024-06-28 14:19:23 -04:00
Sam Atkins dd10a37749 feat(git): Make shorten_hash() guaranteed to produce a unique hash
Until now we just relied on it being very unlikely that there would be a
collision. This new method ensures that the returned hash is unique.
2024-06-28 14:19:23 -04:00
Sam Atkins fa3df72f6e feat(git): Add a --debug option, which sets the DEBUG global
I ended up removing the debugging code that used this, but it seems
useful anyway for future debug logs.
2024-06-28 14:19:23 -04:00
Sam Atkins 2e4259d267 feat(git): Implement git cherry-pick
This is quite manual, and only handles the simple cases where no merge
conflicts occur. Should be useful for basing a `rebase` command off of
though.
2024-06-28 14:19:23 -04:00
Sam Atkins bab5204209 feat(git): Color output for git status files
Matching canonical git, staged changes are green and unstaged/untracked
are red.
2024-06-28 14:19:23 -04:00
Sam Atkins 4ba8a32b45 feat(git): Implement git restore
I tried implementing --source=foo too, but was bumping into weird
behaviour with isomorphic-git, so I've removed that for now. Eventually
we'll want it, but it seems fairly niche.
2024-06-28 14:19:23 -04:00
Sam Atkins a68037111a feat(git): Display file contents as a string for git show FILE_OID 2024-06-28 14:19:23 -04:00
Sam Atkins b6906bbcaa feat(git): Resolve more forms of commit reference
Specifically, we previously didn't resolve short commit hashes into the
full ones.

These functions provide a single place to later add more ways of
selection a commit, such as `HEAD~1`.
2024-06-28 14:19:23 -04:00
Sam Atkins 60976b1ed6 feat(git): Format output closer to canonical git
Make some parts colored or bold, and indent commit messages.
2024-06-28 14:19:23 -04:00
Sam Atkins 955154468f feat(git): Make git add work for deleted files
Previously, this:

```sh
> rm deleted.txt
> git add deleted.txt
```

...would unhelpfully complain that deleted.txt cannot be found. Now, it
records the deleted file to the index, just as canonical git does.
2024-06-28 14:19:23 -04:00
Sam Atkins 057b3acf00 feat(git): Allow checking out a commit instead of a branch 2024-06-28 14:19:23 -04:00
Sam Atkins 2c9b1a3ffc feat(git): Handle detached HEAD in git status and git branch --list 2024-06-28 14:19:23 -04:00
Sam Atkins d6dd1a5bb0 feat(git): Add --color and --no-color options
These allow the user to force color on or off. The chalk library is used
for the output, because it's already used elsewhere in Puter and seems
like a good choice.

Ideally, the default will be based on whether stdout is a tty, but Puter
doesn't yet have that concept, so we just default to color.
2024-06-28 14:19:23 -04:00
Sam Atkins 364d580ff8 feat(git): Add authentication to clone, fetch, and pull. 2024-06-28 14:19:23 -04:00
Sam Atkins 8c70229a18 feat(git): Implement git push
For now, the authentication is by --username and --password options,
which obviously is not good because the password is visible. But doing
it in a nicer way requires features that Phoenix or Puter are currently
missing.
2024-06-28 14:19:23 -04:00
Sam Atkins 3cad1ec436 feat(git): Add diff display to show and log subcommands 2024-06-28 14:19:23 -04:00
Sam Atkins c436460b8c tweak(git): Move proxy url definition into config files
We'll likely want to host our own proxy. Self-hosters likewise may have
their own, but it's convenient to use isomorphic-git's for development.
2024-06-28 14:19:23 -04:00
Sam Atkins a68194090e tweak(git): Check for 'ENOENT' instead of ErrorCodes.ENOENT
This is functionally the same, but removes one place where we
unnecessarily relied on Puter code.
2024-06-28 14:19:23 -04:00
Sam Atkins c0562d78a2 docs(git): Document git client 2024-06-28 14:19:23 -04:00
Sam Atkins 622b6a9b92 feat(git): Implement git diff 2024-06-28 14:19:23 -04:00
Sam Atkins 49c2f16351 feat(git): Add start-revision and file arguments to git log 2024-06-28 14:19:23 -04:00
Sam Atkins eb2b6a08b0 feat(git): Implement git pull 2024-06-28 14:19:23 -04:00
Sam Atkins 1822ace296 refactor(git): Use dir/gitdir variable names like isogit does
I prefer the other names, but being able to type `{ dir, gitdir }` is
shorter and a lot less error-prone than `{ dir: repository_dir, gitdir:
git_dir }`.
2024-06-28 14:19:23 -04:00
Sam Atkins 35e4453930 feat(git): Implement git checkout
For now this only lets you check out branches, not files.
2024-06-28 14:19:23 -04:00
Sam Atkins 98a4b9ede3 feat(git): Implement git fetch
Sporadically we hang while trying to fetch. I haven't been able to
identify why but it seems like a race condition in isomorphic-git
somewhere.
2024-06-28 14:19:23 -04:00
Sam Atkins c86e4dfdce Remove unused imports from git subcommands 2024-06-28 14:19:23 -04:00
Sam Atkins ad4f13255d feat(git): Implement git branch
Create, delete, copy, rename, and list branches.
2024-06-28 14:19:23 -04:00
Sam Atkins 43ce0d5b45 feat(git): Implement git remote 2024-06-28 14:19:23 -04:00
Sam Atkins 95c8235a4a feat(git): Implement git clone 2024-06-28 14:19:23 -04:00
Sam Atkins fa81dca950 feat(backend): Add tab completion to server console command arguments
A command can optionally define a `completer(args)` function. It takes
an array of strings for the current arguments, and returns an array of
completion results for the last argument.

Includes a few completers:
- alarm:info/clear/inspect completes the first argument as an alarm id
  or short_id
- script:run completes the first argument as a script name
- params:get/set completes the first argument as a parameter name
2024-06-28 11:18:29 -04:00
Sam Atkins e1e76c6be7 feat(backend): Add tab-completion to server console command names 2024-06-28 11:18:29 -04:00
KernelDeimos ecb997885c fix: bug introduced when refactoring /share to Sequence 2024-06-27 18:27:20 -04:00
KernelDeimos 2faaeaedb3 chore: add write request to kdmod 2024-06-27 18:27:20 -04:00
KernelDeimos e9ee3191e9 doc: document group endpoints 2024-06-27 18:27:20 -04:00
KernelDeimos c374b0cbca feat: add group permission endpoints 2024-06-27 18:27:20 -04:00
KernelDeimos 4216346384 feat: add group management endpoints 2024-06-27 18:27:20 -04:00
KernelDeimos 00149402e0 feat: add user-group permission check 2024-06-27 18:27:20 -04:00
KernelDeimos b817a78efa sql: group permissions table 2024-06-27 18:27:20 -04:00
KernelDeimos 0ddb13e8ee sql: group table 2024-06-27 18:27:20 -04:00
KernelDeimos e132a203d1 refactor: move check-user-permission to Sequence 2024-06-27 18:27:20 -04:00
Nariman Jelveh fbc02a5f62 Fix the issue with re-opening submenus using keyboard 2024-06-26 09:41:57 -07:00
Nariman Jelveh 8a763eab6f fix multiple issues with ctx menu event delegation and keyboard navigation 2024-06-26 00:57:12 -07:00
KernelDeimos b78c83a4ab refactor: share endpoint 2024-06-25 16:59:50 -04:00
KernelDeimos 5551326c98 doc: add documentation for app shares 2024-06-24 20:13:40 -04:00
Sam Atkins d81f6e5ede chore: Mark globals as being part of the window object
Silences eslint
2024-06-24 19:15:02 -04:00
Sam Atkins 00765d0fce chore: Add mods/ directory to eslint 2024-06-24 19:15:02 -04:00
KernelDeimos 9033f6f8c7 fix: update email share object 2024-06-24 19:12:21 -04:00
KernelDeimos 9751fd92a5 feat: add appdata permission (if applicable) on app share 2024-06-24 19:12:21 -04:00
KernelDeimos 13e2f72c9f feat: add subdomain permission (if applicable) on app share 2024-06-24 19:12:21 -04:00
KernelDeimos 0cf90ee39a fix: fix issues with apps in /share endpoint 2024-06-24 19:12:21 -04:00
Sam Atkins 46eb4ed2b9 fix: Throw an error when readdir is called on a non-directory 2024-06-24 19:08:56 -04:00
KernelDeimos a136ee5edd fix: oops 2024-06-24 14:05:08 -04:00
KernelDeimos 15465bfc50 fix: improve console experience on mac 2024-06-24 14:01:00 -04:00
KernelDeimos c79f500364 tweak: improve dev console 2024-06-24 13:53:00 -04:00
Nariman Jelveh 266e41f95c Remove extra height for iframe when menu bar is in desktop mode 2024-06-24 10:24:30 -07:00
KernelDeimos 2839e74420 doc: /sharelink/request 2024-06-24 01:11:40 -04:00
KernelDeimos 742f625309 feat: add /sharelink/request endpoint 2024-06-24 01:11:40 -04:00
KernelDeimos b0e067e4ae doc: misc doc additions 2024-06-23 17:35:19 -04:00
KernelDeimos 16b1649ff6 feat: add debug mod 2024-06-23 17:35:05 -04:00
Nariman Jelveh a094ae5683 Update en.js 2024-06-23 10:01:16 -07:00
Nariman Jelveh a521ff3d7c Merge pull request #490 from HeyPuter/customizable-menubar
Customizable menubar
2024-06-22 22:10:01 -07:00
Nariman Jelveh a58aa3f2e6 Close #480 2024-06-22 22:09:19 -07:00
Nariman Jelveh 0bd0eaf890 add the ability to pick between desktop and winow menubars 2024-06-22 19:51:29 -07:00
KernelDeimos a72ec9799a fix: readdir on file 2024-06-22 19:10:25 -04:00
Nariman Jelveh 704a4ead17 Show register form when user receiving a file is not the correctone 2024-06-21 12:16:42 -07:00
Nariman Jelveh e31625d0da Update IPC.js 2024-06-21 00:06:01 -07:00
Nariman Jelveh d0e3da9b3e Merge branch 'main' of https://github.com/HeyPuter/puter into main 2024-06-20 23:47:43 -07:00
Nariman Jelveh 61961b565e Update initgui.js 2024-06-20 23:47:35 -07:00
KernelDeimos 265f4d9d64 doc: document testing Puter with email 2024-06-20 22:59:45 -04:00
Nariman Jelveh 27ec2d7f1c Update initgui.js 2024-06-20 19:43:32 -07:00
Nariman Jelveh 88ce871601 Update initgui.js 2024-06-20 19:38:47 -07:00
Nariman Jelveh 2d4f5778a2 Update initgui.js 2024-06-20 19:37:27 -07:00
Nariman Jelveh 5cb5a75455 Verify share_token when launched 2024-06-20 19:31:03 -07:00
KernelDeimos 5a49074f95 doc: sharelink endpoints 2024-06-20 22:15:57 -04:00
KernelDeimos 301ffaf61d feat: add endpoints for share tokens 2024-06-20 22:15:57 -04:00
KernelDeimos db5990a989 feat: add share service and share-by-email to /share 2024-06-20 22:15:57 -04:00
KernelDeimos fc4ae19d99 chore: cleanup share.js 2024-06-20 22:15:57 -04:00
KernelDeimos bf63144f7a fix: null email in request to /share 2024-06-20 19:41:41 -04:00
Nariman Jelveh 1c2ba76db2 If items are dropped on the home directory of another user, try to share the items rather than copy/move 2024-06-20 14:06:43 -07:00
Nariman Jelveh 6f0706ffc5 rename show_or_hide_empty_folder_message to toggle_empty_folder_message 2024-06-20 13:28:45 -07:00
Nariman Jelveh a834fbcc6c remove scroll bar from 2024-06-20 11:32:03 -07:00
KernelDeimos c0fb470719 tweak: update gui 2024-06-20 12:58:04 -04:00
KernelDeimos dd5fde5130 feat: update share endpoint to support more things 2024-06-20 12:58:04 -04:00
KernelDeimos 18f9959776 doc: type-tagged objects, update share doc 2024-06-20 12:58:04 -04:00
KernelDeimos 5f4b922b19 doc: document future share endpoint 2024-06-20 12:58:04 -04:00
Sam Atkins 2355a43efa tweak: Re-add mime.js import
This got removed in 7006dcc31c, but we do
need it.
2024-06-20 14:21:41 +01:00
Nariman Jelveh 1500f84d46 close #483 2024-06-19 22:30:42 -07:00
KernelDeimos 82f86ee4ab doc(backend): protected apps; function and permissions 2024-06-20 00:43:52 -04:00
KernelDeimos 16c4907be5 feat: add permission rewriter for app by name 2024-06-20 00:32:12 -04:00
Nariman Jelveh f6a4413411 Merge branch 'main' of https://github.com/HeyPuter/puter into main 2024-06-19 21:07:48 -07:00
Nariman Jelveh feabbaf564 close #430 2024-06-19 21:07:41 -07:00
KernelDeimos 3ae0081b41 tweak: update this too to avoid confusion 2024-06-20 00:01:22 -04:00
KernelDeimos 3b9a74c0cb doc: meta documentation and common pattern tracking 2024-06-20 00:00:59 -04:00
KernelDeimos f2f3d6ff46 feat: add protected apps 2024-06-19 23:44:42 -04:00
Nariman Jelveh 7006dcc31c refactor item_icon 2024-06-19 18:39:32 -07:00
Nariman Jelveh 219cb63b73 refactor open_item 2024-06-19 18:27:49 -07:00
Nariman Jelveh 0726a11d11 refactor get_html_element_from_options 2024-06-19 17:59:48 -07:00
KernelDeimos 55c609b3fe fix: update test kernel 2024-06-19 19:55:50 -04:00
KernelDeimos 7f5f6f83d7 doc: add this doc/planning folder so it stops being in my index 2024-06-19 18:40:05 -04:00
KernelDeimos ceba309dbd fix: add stream limit 2024-06-19 18:33:56 -04:00
KernelDeimos 2008db0852 fix: validate size metadata 2024-06-19 18:33:56 -04:00
Nariman Jelveh 44d340d429 Update UIWindowShare.js 2024-06-19 14:16:48 -07:00
Nariman Jelveh ad079cdcc5 Use razzle dazzle to display icons of items being shared 2024-06-19 14:06:25 -07:00
KernelDeimos d14a30e089 devex: add command to start/stop recording logs to a file 2024-06-19 15:49:58 -04:00
KernelDeimos eb17d61fc1 security: address 7018641 2024-06-19 15:17:58 -04:00
Nariman Jelveh bfd896041e Update UIWindow.js 2024-06-19 12:13:01 -07:00
Nariman Jelveh bd958b3820 show the share dialog when items are dropped on a username in the sidebar 2024-06-19 12:11:05 -07:00
Nariman Jelveh c67674c889 Add license headers 2024-06-19 00:01:12 -07:00
Nariman Jelveh 41e307bd5b cast selectable_body and multiselectable to Boolean 2024-06-18 23:37:28 -07:00
Nariman Jelveh 892750788b Merge branch 'main' of https://github.com/HeyPuter/puter into main 2024-06-18 23:21:16 -07:00
Nariman Jelveh 4bd62c02dc close #309 2024-06-18 23:21:07 -07:00
KernelDeimos 5cda51e184 tweak: add missing file for previous commit 2024-06-19 02:10:58 -04:00
KernelDeimos fb1e2f21fb feat: start directory index frame 2024-06-19 02:03:02 -04:00
Nariman Jelveh 581964b655 Make GUI open the relavant directory when URL is provided 2024-06-18 22:11:14 -07:00
Nariman Jelveh c1647a5982 wip: bad commit message, I know. 2024-06-18 21:57:34 -07:00
KernelDeimos a813fbbb88 feat: add cookie for site token 2024-06-19 00:51:16 -04:00
KernelDeimos 86fca17fb1 feat: add protected subdomains 2024-06-19 00:51:16 -04:00
KernelDeimos e7c0b8320a feat: add querystring-informed errors 2024-06-19 00:51:16 -04:00
KernelDeimos 616f28d1d4 tweak: change default static hosting domain 2024-06-19 00:51:16 -04:00
KernelDeimos 56e527d3ee db: add protected flag to app and subdomain 2024-06-19 00:51:16 -04:00
KernelDeimos 360ad2e252 refactor: move FilesystemService to BaseService 2024-06-19 00:51:16 -04:00
KernelDeimos 3e98f1a8a8 tweak: acl update 2024-06-19 00:10:40 -04:00
Nariman Jelveh 174e2b7781 Take user to shared directory when clicked on share notif 2024-06-18 21:04:09 -07:00
KernelDeimos cd65217f5c fix: switch share notif username to sender 2024-06-18 23:43:10 -04:00
Nariman Jelveh 1d083efb67 We officially have one of the best web-based Context Menus 2024-06-18 20:25:42 -07:00
Nariman Jelveh 1904b92a9d Update jquery.menu-aim.js 2024-06-18 18:15:53 -07:00
Nariman Jelveh 5dc640bec1 Add a list of sharing users in the sidebar of Explore 2024-06-18 17:15:46 -07:00
KernelDeimos d96f924cad fix: type error in puter-site 2024-06-18 13:03:40 -04:00
Sam Atkins 85c6798448 fix: Make polyfilled import.meta.filename getter a valid function 2024-06-18 13:17:04 +01:00
KernelDeimos 7eabb43bd4 fix: i forgot to test reloading 2024-06-18 05:09:29 -04:00
KernelDeimos de5886698e fix: fix permission cascade properly this time 2024-06-18 03:56:38 -04:00
KernelDeimos 10cbf08233 fix: peers array assumption 2024-06-18 02:44:20 -04:00
KernelDeimos b126b67094 fix: fix that fix 2024-06-18 01:40:27 -04:00
KernelDeimos e63ab3a67f fix: add permission implicator for file modes 2024-06-18 01:39:13 -04:00
Nariman Jelveh 4aa72eaf15 Update jQuery UI to 1.13.2 2024-06-17 22:35:17 -07:00
Nariman Jelveh 91b7f7db1e simplify UI for sharing 2024-06-17 21:50:30 -07:00
Nariman Jelveh e9af6358bb Merge branch 'main' of https://github.com/HeyPuter/puter into main 2024-06-17 21:26:09 -07:00
Nariman Jelveh 7f516896be Add the ability to share and revoke permission through UiWindowShare 2024-06-17 21:26:00 -07:00
KernelDeimos 34d4d606c3 tweak: add more information to errors 2024-06-17 22:45:05 -04:00
KernelDeimos 831c29f23b tweak: report permission for file shares 2024-06-17 22:13:06 -04:00
KernelDeimos bbf09eb74e doc: document path property items in /share 2024-06-17 20:35:49 -04:00
KernelDeimos 11a135c7b7 doc: add request example for /share 2024-06-17 18:44:21 -04:00
KernelDeimos 807addb4ef doc: document /share endpoint 2024-06-17 18:34:45 -04:00
KernelDeimos 6cdbc92ae3 tweak: add dry-run and tweak response for /share 2024-06-17 18:34:45 -04:00
KernelDeimos 846fdc20d4 feat: multi-recipient multi-file share endpoint 2024-06-17 18:34:45 -04:00
Nariman Jelveh afe37a69d6 Update IPC.js 2024-06-17 14:51:48 -07:00
KernelDeimos ce0eee3e29 tweak: add more reserved words 2024-06-17 17:45:33 -04:00
KernelDeimos f7a054956b fix: add app_uid param to kv interface 2024-06-17 17:33:37 -04:00
Nariman Jelveh 21c537fe22 Refactor to use KV exclusively 2024-06-17 14:33:24 -07:00
Nariman Jelveh 5f8b8a2147 Make sure an iframe is focused after app is loaded 2024-06-17 13:17:37 -07:00
Nariman Jelveh 2a748f1884 Close all other contextmenus when a new menu item is opened 2024-06-17 09:41:22 -07:00
Nariman Jelveh b2f2c557e9 Update UIWindowShare.js 2024-06-16 23:29:40 -07:00
Nariman Jelveh ccf6ebef4d Add support for disabled context menu items through puter.js 2024-06-16 20:18:11 -07:00
Nariman Jelveh 04adade80e Update launch_app.js 2024-06-16 19:25:06 -07:00
Nariman Jelveh fe2c8bc249 Merge branch 'main' of https://github.com/HeyPuter/puter into main 2024-06-16 19:24:58 -07:00
Nariman Jelveh f185c02f4c Update UIContextMenu.js 2024-06-16 19:00:53 -07:00
KernelDeimos 35cbec43e6 tweak: add full fsentry to share notification 2024-06-16 22:00:15 -04:00
Nariman Jelveh 4ef6fd6148 Make mouseMoved event take into account window head height 2024-06-16 18:48:34 -07:00
Nariman Jelveh 2a0fb8fe6d Merge branch 'main' of https://github.com/HeyPuter/puter into main 2024-06-16 18:35:50 -07:00
Nariman Jelveh b789bb7078 Refactor launch_app to add support for fullpage apps on landing 2024-06-16 18:10:37 -07:00
KernelDeimos 31d4eb090e feat: implicit access from apps to shared appdata dirs 2024-06-16 21:09:04 -04:00
KernelDeimos a2a10b94be fix: do not delegate to select on read like ever that is really dumb 2024-06-16 20:57:32 -04:00
KernelDeimos 9b39309e18 fix: database migration 2024-06-16 18:59:45 -04:00
Nariman Jelveh 6d1c1d3ed2 Add support for the metadata attribute for the App object in puter.js 2024-06-16 15:12:33 -07:00
KernelDeimos cb050b079a chore: update eslint config 2024-06-16 16:41:28 -04:00
KernelDeimos f7216b9567 feat: add app metadata 2024-06-16 16:41:28 -04:00
Nariman Jelveh 8ebf1cec3f Update UIContextMenu.js 2024-06-16 13:41:16 -07:00
Nariman Jelveh 0fea080ba9 Blur context menu items when mouse leaves 2024-06-16 13:25:46 -07:00
KernelDeimos 632c536616 fix: correct shown flag behavior 2024-06-16 02:19:37 -04:00
Nariman Jelveh c35ecec5a4 Focus back on the parent window when an item in context menu is clicked 2024-06-15 23:17:45 -07:00
Nariman Jelveh e466dc8057 Merge branch 'main' of https://github.com/HeyPuter/puter into main 2024-06-15 22:58:31 -07:00
Nariman Jelveh 476f408a13 Take into account the menubar height when positioning the contextmenu via puter.js 2024-06-15 22:58:24 -07:00
KernelDeimos 8c49ba2553 feat: add share list to stat 2024-06-16 01:54:25 -04:00
Nariman Jelveh 0dbc6aad0f Don't show 'Cut' and 'Delete' options on shared items 2024-06-15 22:14:14 -07:00
Nariman Jelveh 705b9de28c Add basic sharing UI 2024-06-15 20:36:40 -07:00
KernelDeimos b648817f27 fix: incorrect error from suggested_apps 2024-06-15 23:21:54 -04:00
KernelDeimos 1389298f8c doc: document share endpoints 2024-06-15 22:39:47 -04:00
KernelDeimos 2f6c428a40 feat: send notification when file gets shared 2024-06-15 22:39:47 -04:00
KernelDeimos f9d2a87d25 chore: choose end-user-facing name for fs nodes 2024-06-15 22:39:47 -04:00
KernelDeimos 0f05a41ea8 tweak: add improvements to share/file-by-username 2024-06-15 22:39:47 -04:00
KernelDeimos 9ac8535832 Add support for optional auth 2024-06-15 22:39:47 -04:00
Nariman Jelveh ea84c2f26d Fix issues with inconsistent path formats for owned files vs shared files 2024-06-15 22:39:47 -04:00
KernelDeimos f2c6e01296 fix: remove legacy permission check in stat 2024-06-15 22:39:47 -04:00
KernelDeimos d128ceed6f fix: handle subpaths under another user 2024-06-15 22:39:47 -04:00
KernelDeimos 19a5eb0076 feat: add readdir delegate for sharing user homedirs 2024-06-15 22:39:47 -04:00
KernelDeimos 8424d44609 feat: add readdir delegate for shares in a user directory 2024-06-15 22:39:47 -04:00
KernelDeimos 1166e69c76 fix: remove last component when share URL is file 2024-06-15 22:39:47 -04:00
KernelDeimos 079e25a9fe feat: add /show urls 2024-06-15 22:39:47 -04:00
KernelDeimos 5d214c7b52 feat: add /share/file-by-username endpoint 2024-06-15 22:39:47 -04:00
Nariman Jelveh 1859668257 Add proper handling of the close event handler in UINotification 2024-06-15 17:28:11 -07:00
KernelDeimos 7015cfcd31 chore: update doc too 2024-06-15 19:26:08 -04:00
KernelDeimos d5d987ead6 chore: fix typo because acknowledge is not spelled awknowledge in any variant of the english language 2024-06-15 19:25:09 -04:00
KernelDeimos 6f333bf262 doc: update notification doc 2024-06-15 19:13:11 -04:00
KernelDeimos 5f5bd6bd24 doc: add notification documentation 2024-06-15 18:59:32 -04:00
KernelDeimos 20542b0565 tweak: update notification format 2024-06-15 18:59:32 -04:00
KernelDeimos ef8f4de962 tweak: use timestamps to track notif awks 2024-06-15 18:59:32 -04:00
KernelDeimos f06cb30447 tweak: set limit to 200 for notification select 2024-06-15 18:59:32 -04:00
KernelDeimos c5334b0e19 feat: introduce notification selection via driver 2024-06-15 18:59:32 -04:00
KernelDeimos d5cbc24cfe chore: update lint config 2024-06-15 18:59:32 -04:00
KernelDeimos 0101f425d4 feat: add mark-read endpoint 2024-06-15 18:59:32 -04:00
KernelDeimos 02fc4d86b7 feat: re-send unreads on login 2024-06-15 18:59:32 -04:00
KernelDeimos a1e6887bf9 feat: add service for notifications 2024-06-15 18:59:32 -04:00
Nariman Jelveh 7e13ab16c9 Update style.css 2024-06-15 14:24:16 -07:00
KernelDeimos a623c94728 tweak: set app/subdomain query limit very high 2024-06-15 16:41:51 -04:00
KernelDeimos ba58c3fbeb Add a debug logger for backend 2024-06-15 16:02:07 -04:00
Nariman Jelveh 7b724ff1eb show the "Close All" button on multiple notifications 2024-06-15 13:01:33 -07:00
Nariman Jelveh b74315c7f5 add "fade up?!" animation to disappearing notifications 2024-06-15 12:31:14 -07:00
Nariman Jelveh e18766a651 Add support for value and click options to UINotification 2024-06-15 12:02:09 -07:00
Nariman Jelveh 9ecd5170e7 Merge branch 'main' of https://github.com/HeyPuter/puter into main 2024-06-15 11:31:39 -07:00
Nariman Jelveh 82c60414b9 Add support for icon, title, and text in notifications 2024-06-15 11:31:26 -07:00
KernelDeimos 502c9a36c7 chore: cleanup console log in BroadcastService 2024-06-15 13:53:53 -04:00
Nariman Jelveh 40c0ef4567 reimplement stacked notifications 2024-06-15 01:28:35 -07:00
Nariman Jelveh 5a47ba4110 Update UIDesktop.js 2024-06-15 01:02:14 -07:00
Nariman Jelveh f047c6b738 implement naive notification stacking 2024-06-15 01:01:29 -07:00
KernelDeimos e77c5f8bbc chore: update lint config 2024-06-14 23:22:23 -04:00
KernelDeimos 6c20ababfb chore: sync package.json 2024-06-14 23:17:58 -04:00
KernelDeimos 1207a158bd feat: add cross-server event broadcasting 2024-06-14 23:17:58 -04:00
KernelDeimos 3ae0773ce8 chore: revive static-assets (for now) 2024-06-14 23:06:38 -04:00
Eric Dubé d6d6fb0c37 Update build-and-test.yml 2024-06-14 22:42:19 -04:00
KernelDeimos 2cc1c5ac6c chore: fix linter errors 2024-06-14 22:01:31 -04:00
Nariman Jelveh 981066c4a1 Refactor helpers.js 2024-06-14 16:38:07 -07:00
Nariman Jelveh cb60759687 Fix html encode/decode issue in item rename 2024-06-13 11:46:54 -07:00
Nariman Jelveh cf08244b6f Enable keyboard navigation in the menubar 2024-06-13 00:05:48 -07:00
Nariman Jelveh 0c4728fbc1 Refactor 2024-06-12 21:41:02 -07:00
Nariman Jelveh 72641c66a2 Support the modification of individual items withing a menu bar 2024-06-12 19:18:24 -07:00
KernelDeimos cdff12e4e0 Remove repo links from Phoenix shell init 2024-06-12 01:50:13 -04:00
KernelDeimos dfdf1dd973 chore: appease linter so it stops ruining my index 2024-06-11 22:46:11 -04:00
KernelDeimos d38bf63f8e Get rid of old typo'd debug log 2024-06-11 13:57:25 -04:00
KernelDeimos 8e0f150fab Fix ESM-interop issue 2024-06-11 13:57:03 -04:00
KernelDeimos 684b0dc059 Support configurable mod locations 2024-06-10 03:02:17 -04:00
KernelDeimos 8d22276f13 fix(backend): remove a bad thing that really doesn't work 2024-06-09 14:21:07 -04:00
KernelDeimos b85cb50ea2 tweak: update eslint config 2024-06-09 13:14:48 -04:00
KernelDeimos 431b0da027 tweak: fix package-lock.json
Using npm install appears to have different results depending on whether
or not the parent directory of the puter repository happens to have a
package.json file (ex: nested workspaces).
2024-06-09 13:14:48 -04:00
KernelDeimos eb05fbd2dc feat: add external mod loading
A package called "useapi" is introduced to provide a dynamic import
system. This import system, rather than relying on the state of the
filesystem, is populated as modules are installed into Puter's kernel.

The "useapi" package is then used to add support for loading external
mod directories as Puter kernel modules, making it possible to mod puter
without any tooling.
2024-06-09 13:14:48 -04:00
Eric Dubé fa7bec3854 refactor: flatten the monorepo 2024-06-08 01:07:42 -04:00
KernelDeimos f88c4a5c9c doc(backend): document modules, services, and service-scripts 2024-06-06 20:10:23 -04:00
Ben Hählen 6ef283d7ef Docker CI - Update actions (#460)
* Update docker-image.yaml

* Update docker-image.yaml

* Update docker-image.yaml

* Update docker-image.yaml

* Update docker-image.yaml

* Create Docker on Tag and push on main
2024-06-06 16:41:19 -04:00
Nariman Jelveh 5e9617f6cc Add support for ContextMenu icons via Puter.js 2024-06-05 14:39:52 -07:00
KernelDeimos 30550fcddd feat(backend): add script service
The script service allows other services to register re-runnable tasks
called "scripts". These can be invoked via "script:run" in the console.
2024-06-05 16:17:03 -04:00
Nariman Jelveh 1416807c9d Merge pull request #454 from eltociear/patch-3
chore: update UI.js
2024-06-05 10:39:43 -07:00
KernelDeimos 41f378e403 Somehow this got lost earlier 2024-06-04 16:53:29 -04:00
KernelDeimos 0b0707363c Fix potential race condition 2024-06-04 16:28:53 -04:00
Nariman Jelveh 04fefc0761 Update README.md 2024-06-04 13:07:02 -07:00
Ikko Eltociear Ashimine de974f0551 chore: update UI.js
occured -> occurred
2024-06-05 01:17:23 +09:00
Eric Dubé aec5cd5148 Merge pull request #451 from HeyPuter/eric/drivers-1
refactor(backend): de-couple driver registration from DriverService
2024-06-03 18:11:53 -04:00
Eric Dubé 2a2a42c153 Merge pull request #424 from AtkinsSJ/sed
Actually parse sed scripts
2024-06-03 12:22:15 -04:00
Nariman Jelveh 66639ea110 Merge pull request #449 from wamynobe/main
fix: fix typo
2024-06-03 00:50:31 -07:00
Nariman Jelveh 1ae82b3210 turns out ESLint is garbage 2024-06-02 16:30:29 -07:00
Nariman Jelveh a81f461b54 Implement the contextMenu API for Puter.js 2024-06-02 16:15:35 -07:00
Nariman Jelveh cf8a07286a Fix typo sanitizeItems to sanitize_items 2024-06-02 10:23:41 -07:00
Nariman Jelveh 6efff83616 Support separator in the setMenubar API 2024-06-02 10:21:11 -07:00
Nariman Jelveh 233a2719c6 Add temp-email driver implementation to the SDK 2024-06-01 16:34:37 -07:00
Nariman Jelveh 49f61c4782 Update UIContextMenu.js 2024-06-01 15:56:32 -07:00
KernelDeimos 665b2d4e4e refactor(backend): de-couple driver registration from DriverService 2024-06-01 18:20:27 -04:00
Mason Nguyen ce328b7245 fix: fix typo 2024-06-01 11:00:03 +07:00
Eric Dubé 135b5eccc5 Merge pull request #448 from HeyPuter/eric/log-update
feat(backend): improve logger and reduce logs
2024-05-31 20:38:10 -04:00
KernelDeimos 2d8e6240c6 feat(backend): add tip of day 2024-05-31 20:36:14 -04:00
KernelDeimos 4bdad75766 feat(backend): improve logger and reduce logs 2024-05-31 19:40:13 -04:00
KernelDeimos 522664d415 feat(backend): allow services to provide user properties 2024-05-31 18:10:11 -04:00
KernelDeimos 71e2310fa4 tweak(ui): expose UIAlert to service scripts 2024-05-31 18:09:15 -04:00
KernelDeimos d2b37fc436 tweak(ui): fix NotifCard accessing on_click 2024-05-31 18:03:45 -04:00
Nariman Jelveh e6e058c0a0 Update UIContextMenu.js 2024-05-31 10:58:18 -07:00
Sam Atkins 6de4c89c25 refactor(phoenix): Combine similar sed command classes
These make more sense combined into one Command which is controlled by
constructor parameters:

- b, t and T
- d and D
- g and G
- h and H
- p and P
2024-05-31 15:49:32 +01:00
Sam Atkins 0d4f907b66 feat(phoenix): Implement parsing of sed scripts
Sed is now finally able to actually run scripts, instead of ignoring all
input and running a hard-coded test script!
2024-05-31 15:49:32 +01:00
Sam Atkins e047b0bf30 fix(phoenix): Add missing newlines to sed command output 2024-05-31 15:49:32 +01:00
Sam Atkins f250f86446 feat(phoenix): Add --dump and --file options to sed 2024-05-31 15:49:32 +01:00
Sam Atkins 4067c82486 feat(phoenix): Expose parsed arg tokens to apps that request them
Some shell apps care about what order the arguments appear in. When
`parseArgs()` is called with `tokens: true`, it produces this `tokens`
array which represents all the command line options and arguments, in
order, which is useful for these more advanced cases.
2024-05-31 15:49:32 +01:00
Sam Atkins 306014adc7 feat(phoenix): Add more commands to sed, including labels and branching
This is ported over from an old forgotten branch I'd deleted, then
thankfully managed to dig up again. 😅

Instead of making GroupCommand contain child commands, use a flat array
for commands and implement groups as GroupStartCommand and
GroupEndCommand. This makes it much simpler to iterate the commands
list in order to jump to labels.

Then implement those labels and the commands that use them: b, t, and T.

Also add the s SubstituteCommand, and combine the code for the q and Q
commands.
2024-05-31 15:49:32 +01:00
Sam Atkins 6aae8fc63b refactor(phoenix): Split up sed code
Let's organise this a bit.
2024-05-31 15:49:32 +01:00
Sam Atkins 9b4d16fbe9 fix(parsely): Make Repeat parser work when no separator is given 2024-05-31 15:49:32 +01:00
Sam Atkins d46b043c5d feat(parsely): Add stringUntil() parser
The counterpart of stringOf(), it reads characters until it matches its
parameter.
2024-05-31 15:49:32 +01:00
Sam Atkins 5656d9d42f feat(parsely): Add a fail() parser
I've found this useful for stubbing out parts of a grammar during
development.
2024-05-31 15:49:32 +01:00
Nariman Jelveh c9a43ce5c0 Update UIContextMenu.js 2024-05-30 18:16:32 -07:00
Nariman Jelveh 7c8492ba43 Fix the issue of checkmark's wrong color in ctx menu disabled items on hover 2024-05-30 17:09:18 -07:00
Nariman Jelveh 16d5ac6abb Delay opening the submenu for smoother mouse navigation on the menu 2024-05-30 15:24:50 -07:00
Nariman Jelveh a8515e0a41 Switch font to Inter 🎉 2024-05-30 15:14:25 -07:00
KernelDeimos fccabf1bc0 feat(backend): allow services to provide whoami values 2024-05-30 17:11:06 -04:00
Eric Dubé dd1d129693 Merge pull request #444 from HeyPuter/eric/ui-updates
UI Updates
2024-05-30 16:48:28 -04:00
KernelDeimos 124596058a feat(ui): allow component-based settings tabs 2024-05-30 16:14:32 -04:00
KernelDeimos be38df32ec tweak(ui): allow setting render more for JustHTML 2024-05-30 16:14:32 -04:00
KernelDeimos 577bd59b6c feat(ui): add new components
This commit adds the following components:
- ActionCard
- Frame
- NotifCard
2024-05-30 16:14:32 -04:00
KernelDeimos f8780d032b fix(ui): improve Component base class
The following improvements were made:
- do not require empty object in constructor
- allow components to override render mode based on constructor values
- improve error handling in get()
- allow array of property names in on_ready()->listen()
- allow components to be attached to shadow roots
2024-05-30 16:07:16 -04:00
KernelDeimos 38ba42575c feat(ui): add new components
This commit adds the following components:
- Glyph
2024-05-30 16:04:52 -04:00
Nariman Jelveh 60f0ade3c1 Improve the UX of the menubar and context menu 2024-05-30 13:02:00 -07:00
KernelDeimos 8e083d20d2 tweak(ui): allow size changing on spinner 2024-05-30 15:59:05 -04:00
Eric Dubé a62a56fd7b Merge pull request #413 from AtkinsSJ/extract-posix-error
refactor: Move PosixError class where it can be accessed outside of Phoenix
2024-05-30 12:43:41 -04:00
Eric Dubé 895358e6e5 Merge pull request #423 from AtkinsSJ/parsely
Tidy up "newparser" so it can be used properly
2024-05-30 12:42:03 -04:00
Eric Dubé d57980c6cb Merge pull request #421 from AtkinsSJ/exit-status
Add exit status codes to `puter.exit()`, and an `exit` builtin to Phoenix
2024-05-30 12:28:36 -04:00
Eric Dubé 0672562c8a Merge pull request #442 from HeyPuter/eric/extensibility
class registry for service scripts
2024-05-28 20:10:03 -04:00
KernelDeimos d047abf31c Update eslint 2024-05-28 19:06:00 -04:00
KernelDeimos e050506a05 Add class registry (second pass)
ExportService gets removed and instead a global class registry is added.
The `init.js` file is split into `init_sync.js` and `init_async.js`
so that synchronous code that isn't dependent on imports is guarenteed
to run before initgui.js. The globalThis scope and service-script API
now expose `def`, a function for registering class definitions, and
`use`, a function for obtaining registered classes.
2024-05-28 19:06:00 -04:00
KernelDeimos cd574c87ef Fix the previous fix 2024-05-28 16:10:43 -04:00
KernelDeimos 4e3a24e609 fix: check subdomain earlier for /apps 2024-05-28 15:51:22 -04:00
Eric Dubé c495ccff65 Merge pull request #408 from AtkinsSJ/git-client
Add a git client
2024-05-28 12:10:01 -04:00
KernelDeimos 51bac4486f Add class registry (first pass)
In the first pass I add a `register` method and update `defineComponent`
so it calls `register` as well. This made it possible to create a
proof-of-concept for registered classes. Additionally ExportService was
added to expose registered classes to service scripts. This first pass
works, but it would be better if all types of classes (components or
otherwise) were registered via the same method.
2024-05-27 21:16:50 -04:00
Eric Dubé 146ce659e2 Merge pull request #434 from HeyPuter/eric/get-user-service
refactor: add GetUserService
2024-05-26 00:44:03 -04:00
KernelDeimos c0cb1cd2b8 refactor: add GetUserService 2024-05-26 00:31:51 -04:00
Eric Dubé f4d41891d9 Merge pull request #426 from HeyPuter/eric/service-scripts
refactor(gui): add service scripts
2024-05-25 17:35:55 -04:00
KernelDeimos 06f41659f5 Add function to import UIWindow from service scripts 2024-05-25 17:20:22 -04:00
KernelDeimos cbfad2ef7a refactor(gui): add service scripts 2024-05-24 19:29:07 -04:00
Eric Dubé 8de94d3f1c Merge pull request #422 from HeyPuter/eric/gui-loading
GUI loading refactor + service-registered gui scripts
2024-05-24 17:42:14 -04:00
Eric Dubé f20870544d Update docker-image.yaml 2024-05-24 16:53:13 -04:00
Eric Dubé 4d91ef14f4 Update docker-image.yaml 2024-05-24 16:49:43 -04:00
Eric Dubé 6ed9f0a01d Update docker-image.yaml 2024-05-24 16:41:20 -04:00
Eric Dubé 94e9f8fd34 Update docker-image.yaml 2024-05-24 16:37:01 -04:00
Eric Dubé fc51424f86 Merge pull request #332 from HeyPuter/release-please--branches--main--components--puter.com
chore(main): release 1.0.0
2024-05-24 16:25:34 -04:00
github-actions[bot] 5146dc4981 chore(main): release 2.3.0 2024-05-24 16:22:55 -04:00
Sam Atkins 03123faa8a Finish concept JSON parser
This now can parse JSON correctly in various configurations.
2024-05-24 16:23:26 +01:00
Sam Atkins 7fccf79591 Make stringOf() take a callback instead of an array of accepted values
THe `a.stringOf(' \r\n\t'.split('')),` pattern works fine for small sets
of characters, but is horrible for situations like "any alphanumeric".
Instead, let's make it take a callback function that is run on each
character.
2024-05-24 16:23:26 +01:00
Sam Atkins d3dff8c20e Throw errors if parsing fails
Not consuming all input is now treated as an error, unless the
`must_consume_all_input` flag is set to false when parsing.
2024-05-24 16:23:26 +01:00
Sam Atkins 0bc4c3fde2 Move StringStream into Parsely 2024-05-24 16:23:26 +01:00
Sam Atkins 873dee7e51 Implement 'trailing' parameter for repeat() parser 2024-05-24 13:30:45 +01:00
Sam Atkins 837ec68371 Reorganize and document Parsely classes
- lib.js only holds Parser so rename it parser.js
- Move Symbol and None into terminals.js
- Briefly document all parser classes
2024-05-24 12:26:04 +01:00
Sam Atkins f8525c6f6c Rename newparser to Parsely
We're going to actually use this so let's give it a more permanent name.
2024-05-24 11:48:34 +01:00
KernelDeimos a1cfe7aef2 Allow services to register additional js files for gui 2024-05-23 18:41:34 -04:00
KernelDeimos 5042d49935 Simplify debugging runtime config object changes 2024-05-23 18:40:41 -04:00
KernelDeimos c89b50bf31 Refactor gui loading 2024-05-23 18:13:57 -04:00
Nariman Jelveh 103f9d209d Update README.md 2024-05-23 14:32:24 -07:00
KernelDeimos 4508bfac73 Fix cookie issue 2024-05-23 13:30:02 -04:00
Sam Atkins 3184d3482c feat(phoenix): Implement an exit builtin 2024-05-23 15:27:15 +01:00
Sam Atkins 5de3052026 feat(phoenix): Respond to exit status codes
- Detect exit status of Puter apps, now that that's available.
- Store the exit status of each pipeline.
- Display a message when the exit status was non-zero.

That message is temporary, until we have a better way of displaying or
querying it, such as the `$?` shell variable.
2024-05-23 15:26:43 +01:00
Sam Atkins 7674da4cd2 feat: Add exit status code to apps
`puter.exit()` now takes a status code, similar to the exit status on
desktop OSes. This is passed to the appClosed event, so that eg a
parent app can know whether its child app ran successfully.
2024-05-23 12:54:06 +01:00
Eric Dubé b15dc316d3 Merge pull request #406 from AtkinsSJ/fs-upload-data-type-error
Explicitly reject invalid types for puter.fs.upload() and .write() payloads
2024-05-22 12:13:24 -04:00
Sam Atkins 10f715f726 Implement git show 2024-05-22 16:00:42 +01:00
Sam Atkins 0377015190 Implement git config
This is also basic:

git config key             # To read a value
git config key value       # To set a value
git config --unset key     # To delete a value

As noted, --list is not possible to implement currently.
2024-05-22 16:00:42 +01:00
Sam Atkins 98c33fb3cc Implement git log
This is quite barebones for now.

Commit formatting is done in a separate file, as this is used by other
git commands, such as `show`.
2024-05-22 16:00:42 +01:00
Sam Atkins b4e2ba4544 Implement git commit 2024-05-22 16:00:42 +01:00
Sam Atkins 32c172d145 Implement git add 2024-05-22 16:00:42 +01:00
Sam Atkins 5a308a2a53 Implement git status 2024-05-22 16:00:42 +01:00
Sam Atkins 71873a9c27 Add a helper function for finding the git repo 2024-05-22 16:00:42 +01:00
Sam Atkins 5e3db870ec Implement git init 2024-05-22 16:00:42 +01:00
Sam Atkins 85b7587c42 Implement git help, git version, and subcommand infrastructure
Each subcommand is its own file, modeled after Phoenix's coreutils.
2024-05-22 16:00:42 +01:00
Sam Atkins b75c42b39f Implement Puter filesystem wrapper for git app 2024-05-22 08:56:50 +01:00
Sam Atkins 0d2ffdb380 Add boilerplate for empty git app
It does nothing but output a message to the console.
2024-05-22 08:56:50 +01:00
Sam Atkins 8f1c4fcda9 feat(Phoenix): Pass command line arguments and ENV when launching apps 2024-05-22 08:56:50 +01:00
Sam Atkins bf33fd752d Remove outdated FIXMEs about consuming extra stdin data 2024-05-22 08:56:50 +01:00
Sam Atkins c08c8bd073 Expose POSIX error name as PosixError.code
This matches the behaviour of Node.JS's errors, and some libraries
expect it.
2024-05-22 08:56:50 +01:00
Sam Atkins 8098dc9dcc Move error-conversion functions into PosixError
Specifically, this makes the Puter->PosixError conversion available to
the in-progress git client.
2024-05-22 08:56:50 +01:00
Sam Atkins e43b21387c Move PosixError into puter-js-common
The in-progress git client also needs to use this. puter-js-common uses
commonjs modules, so it had to be adjusted for that.
2024-05-22 08:56:50 +01:00
KernelDeimos 1f6a2093fb Disallow negative size values 2024-05-21 18:46:34 -04:00
KernelDeimos 90463a0732 Add support for webhook endpoints 2024-05-21 17:25:28 -04:00
Sam Atkins acf7eabef9 Expose POSIX error name as PosixError.code
This matches the behaviour of Node.JS's errors, and some libraries
expect it.
2024-05-20 12:14:22 +01:00
Sam Atkins 017077f8cb Move error-conversion functions into PosixError
Specifically, this makes the Puter->PosixError conversion available to
the in-progress git client.
2024-05-20 12:14:18 +01:00
Sam Atkins e798576a87 Move PosixError into puter-js-common
The in-progress git client also needs to use this. puter-js-common uses
commonjs modules, so it had to be adjusted for that.
2024-05-20 12:11:12 +01:00
Karan Parmar cc45a08388 updated the github links displayed in the Terminal welcome message 2024-05-19 11:52:26 +01:00
KernelDeimos 8cca067991 Fix 8688ha84v 2024-05-17 22:55:40 -04:00
Eric Dubé 80b763c47c Merge pull request #407 from AtkinsSJ/clean-suggested-apps
fix: Remove null or duplicate app entries from suggest_app_for_fsentry()
2024-05-17 15:46:06 -04:00
Eric Dubé 8786024559 Merge pull request #404 from secondtruth/patch-1
Update de.js
2024-05-17 15:42:02 -04:00
Eric Dubé bbb43f53d0 Merge pull request #403 from Zac0511/patch-3
Update fr.js
2024-05-17 15:39:06 -04:00
KernelDeimos 639e40d355 Phoenix shell deployment update 2024-05-17 13:26:44 -04:00
KernelDeimos f964f06f3f Fix 8688h4bwg 2024-05-17 13:05:13 -04:00
KernelDeimos e4543c5f35 Fix 8688ggu00 (2) 2024-05-17 12:32:16 -04:00
Sam Atkins 6900233c5a fix: Remove null or duplicate app entries from suggest_app_for_fsentry() 2024-05-17 15:34:36 +01:00
Sam Atkins 03fe3b6a0d Reject invalid types for puter.fs.upload() items or .write() data
Previously, this would crash in upload() when trying to iterate the
`entries` array, which is undefined when the `items` parameter is an
unsupported type.
2024-05-17 14:39:31 +01:00
Sam Atkins a9c89cef19 refactor: Reduce boilerplate for returning errors from puter.fs.upload() 2024-05-17 14:39:31 +01:00
Zac0511 340b9202c0 Update fr.js 2024-05-17 14:36:54 +02:00
Zac0511 99ca8755f3 Update fr.js 2024-05-17 14:22:22 +02:00
Zac0511 eaf1e96fa2 Update fr.js 2024-05-17 14:19:19 +02:00
Zac0511 f9b5353058 Update fr.js 2024-05-17 14:15:49 +02:00
Zac0511 e0af914c90 Update fr.js 2024-05-17 14:00:43 +02:00
Zac0511 8f19f4dc5b Update fr.js
Complete rework of the file, completly remade from en.js
2024-05-17 13:58:33 +02:00
Zac0511 5f47e7f0fa Update fr.js
Bug repairing... again
2024-05-17 09:55:25 +02:00
Zac0511 9c39b0453d Update fr.js
Little update for some bugs
2024-05-17 09:16:12 +02:00
Zac0511 545fc103b8 Update fr.js
Complete rework of the file for the latest updates
2024-05-17 09:10:55 +02:00
KernelDeimos c55b1e4680 Remove verification requirement on contact us form 2024-05-16 19:08:51 -04:00
Eric Dubé 297db58e68 Merge pull request #405 from HeyPuter/eric/path-builder
Add path builder
2024-05-16 19:08:56 -04:00
KernelDeimos e3f57ee20e Add path builder 2024-05-16 19:02:58 -04:00
KernelDeimos 5031cea040 Update _default.js for deployment purposes 2024-05-16 18:55:59 -04:00
Eric Dubé 6fe126ad5a Merge pull request #386 from HeyPuter/eric/socket-auth
fix(security): Move token for socket.io to request body
2024-05-16 18:02:12 -04:00
KernelDeimos 49b257ecff fix(security): Move token for socket.io to request body
Currently this commit breaks websocket events and needs to
be updated.
2024-05-16 17:58:44 -04:00
KernelDeimos f042b095f1 Fix 8688gxkuj 2024-05-16 17:25:41 -04:00
Christian Neff 43d0936533 Update de.js
Translated:
- 2FA strings
- Task Manager strings
- 2 other scattered strings
2024-05-16 19:51:42 +02:00
KernelDeimos b68873c5f4 Fix 8688grpf1 2024-05-16 12:48:57 -04:00
Zac0511 e1ae9241af Update fr.js 2024-05-16 18:27:12 +02:00
Zac0511 b6ea37c517 Update fr.js
Since there was a lot of text and menus added, and they were not translated, so i just translated them.
2024-05-16 18:06:21 +02:00
KernelDeimos bee0e19eaf Fix 8688ggu00 2024-05-15 20:59:20 -04:00
Eric Dubé f54657a569 Merge pull request #402 from HeyPuter/eric/email-lock
Add locking to save_account
2024-05-15 18:49:03 -04:00
Eric Dubé 1aa27084d0 Merge pull request #396 from AtkinsSJ/xterm-fix
fix(Terminal): Accept input from Chrome on Android
2024-05-15 18:24:02 -04:00
KernelDeimos 691c8f1436 Add locking to save_account 2024-05-15 18:22:54 -04:00
Eric Dubé b72e5b7e02 Merge pull request #401 from HeyPuter/eric/service-patches
Allow patching services
2024-05-15 15:47:14 -04:00
KernelDeimos c70e378973 Add error id for expired auth tokens 2024-05-15 15:42:00 -04:00
KernelDeimos 21444daefb Add jsdoc comments to registerService and patchService 2024-05-15 15:41:37 -04:00
KernelDeimos 2e0d7361cb Add method to patch services 2024-05-15 15:32:18 -04:00
Eric Dubé 6e0b6d84d2 Merge pull request #400 from AtkinsSJ/fix-apierror-includes
fix: Correct APIError imports
2024-05-15 13:51:04 -04:00
Eric Dubé ec59abe3ae Merge pull request #399 from AtkinsSJ/fix-db-scripts
fix: Add missing file extension to 0009_app-prefix-fix.sql in DB init
2024-05-15 13:45:30 -04:00
Sam Atkins 062e23b5c9 fix: Correct APIError imports
APIError is the only thing exported from its file, so we must not wrap
it in {}.
2024-05-15 17:47:15 +01:00
Sam Atkins a8160a8cdc fix: Add missing file extension to 0009_app-prefix-fix.sql in DB init 2024-05-15 10:18:28 +01:00
KernelDeimos 0b093dd57e Revoke other sessions when password is changed 2024-05-14 19:40:57 -04:00
KernelDeimos 923d5878c3 Prevent enable of 2FA without configure 2024-05-14 17:33:14 -04:00
Eric Dubé 9c5849fbce Merge pull request #397 from HeyPuter/eric/anti-csrf
Update for /logout
2024-05-14 14:08:35 -04:00
Sam Atkins 4ef3e53de3 fix(Terminal): Accept input from Chrome on Android
Xterm.js produces two kinds of events: onKey and onData. On a desktop,
these are effectively the same, but on mobile, IME inputs produce data
but not key presses. By listening to onData instead of onKey, we get
that input.

With some experimentation, I also found that we don't need the code to
handle enter, home, end, or Ctrl-Shift-V. All of these function as
expected without that code, so we can remove it and simplify this
further. :^)
2024-05-14 16:10:30 +01:00
Sam Atkins 2656b47640 chore: Update xterm
From version 5.4.0 onwards, xterm scopes its package names as
`@xterm/foo` instead of just `xterm-foo`.

We currently have a copy of xterm.css which we use instead of directly
including the one from the `@xterm/xterm` package, so I've updated the
contents of that too.
2024-05-14 16:10:30 +01:00
Sam Atkins fafbc292ca Remove xterm dependency from Phoenix
This is used by Terminal, not Phoenix.
2024-05-14 16:10:30 +01:00
KernelDeimos 800aef1942 Implement anti-CSRF for logout 2024-05-13 20:40:27 -04:00
KernelDeimos da7f73baa6 Add AntiCSRFService 2024-05-13 19:08:51 -04:00
KernelDeimos afb9d866b5 fix: Fix phoenix app prefix and TokenService test 2024-05-13 18:17:39 -04:00
Eric Dubé 7dc5929cfd Merge pull request #385 from HeyPuter/eric/dry-middleware
Add password requirement to: disable 2FA, change email
2024-05-13 16:38:59 -04:00
KernelDeimos c2f1694107 Require password entry to disable 2FA 2024-05-13 16:00:07 -04:00
KernelDeimos 23215bd6f7 Move change_email/start to password-protected endpoint 2024-05-13 16:00:07 -04:00
KernelDeimos 1493cacb69 Add rate-limiting to new password change endpoint 2024-05-13 16:00:07 -04:00
KernelDeimos 9076fddc0d Add new password change endpoint 2024-05-13 16:00:07 -04:00
KernelDeimos a89c9d59cf Add UserProtectedEndpointsService 2024-05-13 16:00:07 -04:00
KernelDeimos 15dec21118 doc(backend): Document the boot sequence
Now that the boot sequence is better formalized it may be documented.
2024-05-13 16:00:07 -04:00
KernelDeimos d800b12569 refactor(backend): Trigger webserver events in webserver
We were triggering webserver events in Kernel. This change improves
adherence to separation-of-concerns and ensures event cascading is
working as expected. This also better formalizes the boot sequence.
2024-05-13 01:05:49 -04:00
Eric Dubé 89ac491120 Merge pull request #391 from AtkinsSJ/truncate-filename
refactor: Put truncate_filename() helper in its own file
2024-05-10 12:54:46 -04:00
Eric Dubé 981a0f08fe Merge pull request #390 from AtkinsSJ/task-manager-components
refactor: Convert Task Manager to Components
2024-05-10 12:54:30 -04:00
Sam Atkins e53bfe6b62 refactor: Put truncate_filename() helper in its own file
Every user previously set the max_length as window.TRUNCATE_LENGTH, so
I've moved that constant into the truncate_filename file and set it as
the default if max_length is not specified.
2024-05-10 17:46:09 +01:00
Sam Atkins 9bb4570126 Re-use existing Task Manager rows if possible instead of recreating them
Most of the time, we'll already have a TaskManagerRow for the given
process, so we can just update its properties.

Iterating the results from #iter_tasks means we also insert the rows in
the correct order, regardless of their previous order.
2024-05-10 17:41:13 +01:00
Sam Atkins 5b43358219 fix: Only run Component initialization functions once
If the Component gets removed from the DOM and then re-added, it already
has contents, and we don't need to create them again. It also has
already had on_ready called, so that doesn't need to happen again
either.

This fix stops Components duplicating their content elements and
listener callbacks whenever they're moved around the document.
2024-05-10 17:41:01 +01:00
Sam Atkins cf605c8a38 refactor: Convert Task Manager to use Components
This currently behaves the same as it did before: It still recreates the
table contents every half a second. It should also look identical,
though it's possible I missed some small differences.

The component structure is:

TaskManagerTable
- Table
  - TaskManagerRow
  - TaskManagerRow
  - TaskManagerRow
  - ...

TaskManagerRow is implemented so that we can later move to modifying
them in place as the process tree changes, instead of having to replace
them all.

Otherwise, most of the code is just moved around, and not changed much.
2024-05-10 17:41:01 +01:00
Sam Atkins e304f6fc3a Add ability to look up a process by its uuid 2024-05-10 17:38:00 +01:00
Sam Atkins 09cee986f2 Add a Table component, based on the TaskManager table
For now, this is quite basic. The main feature is the sticky header.
2024-05-10 17:38:00 +01:00
Eric Dubé 3992fe1a45 Merge pull request #384 from AtkinsSJ/progress-dialogs
refactor: Replace several existing progress dialogs with one configurable one
2024-05-10 12:25:32 -04:00
Eric Dubé 17e08cafce Merge pull request #380 from AtkinsSJ/eslint-ci
Run ESLint on CI
2024-05-10 12:24:31 -04:00
Sam Atkins 7243ed718f Merge pull request #388 from AtkinsSJ/no-docker-images-for-prs
ci: Stop producing Docker images for PRs
2024-05-10 09:39:31 +01:00
Sam Atkins 387cfd758f Merge pull request #387 from ghostxbh/patch-1
fix: Eliminates duplicate translation keys
2024-05-10 09:31:52 +01:00
Sam Atkins c75a0bd311 ci: Wrap Docker images name with quotes
Not sure if this is required, but my IDE was complaining about it.
2024-05-10 09:29:49 +01:00
Sam Atkins 18633dcd88 ci: Stop producing Docker images for PRs 2024-05-10 09:28:55 +01:00
ghostxbh 5800350b25 fix: Eliminates duplicate translation keys 2024-05-10 10:41:21 +08:00
KernelDeimos cd2daa1910 Require email verification for contact form 2024-05-09 19:40:34 -04:00
KernelDeimos 8b6bbe003d fix(security) Disable 2FA configure if 2FA is enabled 2024-05-09 18:04:58 -04:00
Sam Atkins edebbee9e7 feat: Display upload errors in UIWindowProgress dialog
The object returned from UIWindowProgress() now has a `show_error()`
method, taking a title and message. Calling it will replace the content
of the window with those messages.

I've made use of this for file uploads. The only other place we
currently have errors we could show is for zipping and downloading
files, but we do not always have a progress dialog in that case, so I'll
leave that for now.

I think ideally, we would always create a progress dialog, and it would
then support being invisible initially, but appearing after a delay.
Then we'd always have an object to call `show_error()` on, and it could
then immediately show the dialog. But I'll get to that another day. :^)
2024-05-09 19:00:55 +01:00
Sam Atkins f3269693de Stop dumping binary data to the console
This was freaking out and freezing the Puter server, and my entire
terminal app. XD
2024-05-09 18:28:39 +01:00
Sam Atkins c2c87bf0ba refactor: Replace UIWindowDownloadDirProg with UIWindowProgress 2024-05-09 18:28:39 +01:00
Sam Atkins e525747002 refactor: Replace UIWindowCopyProgress with UIWindowProgress 2024-05-09 18:28:39 +01:00
Sam Atkins 6d8c709de8 Delete unused UIWindowDownloadProgress.js 2024-05-09 18:28:39 +01:00
Sam Atkins f07c13a50c feat: Show "Deleting /foo" in progress window when deleting files
Previously we showed "Moving /foo" which was confusing.

Also, make use of i18n replacements instead of gluing strings together,
because other languages might put the words in a different order. For
now, I've modified all the translations so that the "Moving foo" text
will appear as it did before, but these will require someone who
actually knows the different languages to check and correct them.
2024-05-09 18:19:05 +01:00
Sam Atkins c12312cbd3 refactor: Replace UIWindowMoveProgress with UIWindowProgress 2024-05-09 18:18:27 +01:00
Sam Atkins cb6c098f95 refactor: Replace UIWindowProgressEmptyTrash with UIWindowProgress
I noticed during this that emptying the trash from inside the Trash
window uses a different code path without a progress dialog, so I've
added a TODO to merge that in. I tried just using it directly but the
behaviour is a bit different. (The Trash one makes all the items fade
out.)
2024-05-09 18:17:15 +01:00
Sam Atkins 09ca82e1d8 refactor: Replace UIWindowNewFolderProgress with UIWindowProgress
This previously had code for the cancel button, but that cancel button
didn't exist. I've left the previous on-cancel code commented out with
a TODO.
2024-05-09 15:51:45 +01:00
Sam Atkins 5b565a69d7 refactor: Replace UIWindowUploadProgress with UIWindowProgress 2024-05-09 15:51:45 +01:00
Sam Atkins 52ddfc8801 Introduce a general-purpose progress window
We have 7 of these, which all have very similar code. Let's deduplicate
them! :^)
2024-05-09 15:51:45 +01:00
Sam Atkins df3f7e9a6e Allow Button component to not have button-block class
This needs a better solution for configuring the button's CSS classes,
but this works for now.
2024-05-09 12:38:29 +01:00
Sam Atkins 05aaa5b667 chore: Remove dead code from 2FA development
No `.qr-code-checkbox input`s now exist. Also, `.code-confirm-btn` is
only used by CodeEntryView, which doesn't use this Button component.
2024-05-09 12:12:33 +01:00
KernelDeimos df24c663df Invalidate email confirmation on password change 2024-05-08 22:28:41 -04:00
KernelDeimos 45e7f162a2 Add password change notification 2024-05-08 16:01:20 -04:00
Sam Atkins fbda8c8286 Run ESLint on CI
Run the ESLint static analysis tool on any code that is submitted, to
find possible bugs such as undefined functions and variables. We may
want to adjust the ESLint settings over time, but this seems like a
good start.

This is merged into the previous check-translations.yml action, because
that's also a form of linting. Possibly that could be reimplemented as
an ESLint plugin.
2024-05-08 18:53:37 +01:00
Sam Atkins 8c70efa058 Suppress remaining eslint errors
These two seem like bugs but are unclear to me how to fix, so I've added
FIXMEs.

/puter/packages/backend/src/routers/kvstore/clearItems.js
  41:32  error  'DB_MODE_WRITE' is not defined  no-undef

/puter/packages/backend/src/routers/whoami.js
  104:35  error  'db' is not defined  no-undef
2024-05-08 18:53:36 +01:00
Eric Dubé 65b489883d Merge pull request #381 from AtkinsSJ/web-components
Convert UIWindowThemeDialog to components
2024-05-08 12:15:23 -04:00
Sam Atkins 1b2608d6ee refactor: Replace component definition boilerplate with a function
Also, we can ask the CustomElementRegistry if it has an entry with a
given name, instead of polluting the window object.
2024-05-08 14:46:58 +01:00
Sam Atkins 9267b50666 Convert UIWindowThemeDialog to components
This also fixes the "Reset Colors" button not adjusting the sliders.
2024-05-08 14:46:58 +01:00
Sam Atkins 2604dae83c Resolve eslint issues in new 2FA code
/puter/src/UI/Settings/UITabSecurity.js
  13:13  error  'user' is not defined        no-undef
  31:13  error  'user' is not defined        no-undef
  32:70  error  'user' is not defined        no-undef
  36:30  error  'user' is not defined        no-undef
  40:82  error  'user' is not defined        no-undef
  41:83  error  'user' is not defined        no-undef
  87:41  error  'api_origin' is not defined  no-undef

/puter/src/UI/UIWindow2FASetup.js
  39:33  error  'api_origin' is not defined  no-undef
  51:37  error  'api_origin' is not defined  no-undef
  69:37  error  'api_origin' is not defined  no-undef

/puter/src/UI/UIWindowLogin.js
  202:73  error  'api_origin' is not defined  no-undef
  271:73  error  'api_origin' is not defined  no-undef
2024-05-08 09:49:58 +01:00
Sam Atkins 6778aa4343 Resolve eslint issues in Russian translation
/puter/src/i18n/translations/ru.js
  180:34  error  Irregular whitespace not allowed    no-irregular-whitespace
  257:9   error  Duplicate key 'storage_puter_used'  no-dupe-keys
2024-05-08 09:44:31 +01:00
KernelDeimos 5890b7e7bf Disable password reset token when email or password is changed 2024-05-07 20:18:11 -04:00
KernelDeimos d58aa33d2b Remove taskbar items from localstorage 2024-05-07 20:01:05 -04:00
KernelDeimos f62617a8bf Remove auth_token from /down call 2024-05-07 14:29:09 -04:00
KernelDeimos d20249f29a Send email notifications when 2FA state changes 2024-05-06 21:13:00 -04:00
Eric Dubé 0e16a3f3b4 Merge pull request #370 from HeyPuter/eric/2fa
2FA
2024-05-06 19:33:50 -04:00
Nariman Jelveh 5409547bba Make the 2fa disable prompt a child of the Settings window 2024-05-06 16:16:57 -07:00
KernelDeimos db8e2c3bf2 Address next batch of UX issues 2024-05-06 19:09:28 -04:00
KernelDeimos 4c53ec6dd3 Address UX issues 2024-05-06 18:53:43 -04:00
KernelDeimos b2d678ca95 Cleanup dead code 2024-05-06 16:45:03 -04:00
KernelDeimos adbefb4622 Cleanup log messages 2024-05-06 16:44:23 -04:00
KernelDeimos 429b7033a4 Improve error handling for 2FA rate limit 2024-05-06 16:35:35 -04:00
KernelDeimos 7f3e2852c6 Add rate limits 2024-05-06 16:12:54 -04:00
KernelDeimos 57d9c246c0 Fix css in firefox 2024-05-06 15:47:09 -04:00
KernelDeimos 7fce223a6d Fix OTP test endpoint 2024-05-06 15:40:34 -04:00
KernelDeimos abbbf0d030 Add confirmation for disabling 2FA 2024-05-06 15:36:38 -04:00
KernelDeimos a628358c9f Fix OTP time window 2024-05-06 15:02:14 -04:00
KernelDeimos 918eb3bb67 Put otpauth back on 9.2.4 2024-05-06 02:10:22 -04:00
KernelDeimos ecae1997aa Maybe this?? 2024-05-06 01:58:55 -04:00
KernelDeimos e4c7caa8ea Worth a try 2024-05-06 01:54:02 -04:00
KernelDeimos 54d1f05851 Install otpauth in root package.json because that... matters? 2024-05-06 01:48:25 -04:00
KernelDeimos 1592bc44fc Fix spinner getting stuck 2024-05-06 01:30:32 -04:00
KernelDeimos 77fedee58a Remove artifact 2024-05-06 00:13:24 -04:00
KernelDeimos 63e72a22e0 Fix settings card update 2024-05-06 00:02:46 -04:00
KernelDeimos 00c8ece07e Finish recovery codes 2024-05-06 00:02:46 -04:00
KernelDeimos 60a561c84c Re-use CodeEntryView for login 2024-05-06 00:02:46 -04:00
KernelDeimos 5cbe256120 Add missing part of previous commit 2024-05-06 00:02:46 -04:00
KernelDeimos 4ad50b14d6 Fix the duplicate loading issue 2024-05-06 00:02:46 -04:00
KernelDeimos df88373519 Remove test window open 2024-05-06 00:02:46 -04:00
KernelDeimos 099699198c Tweak QR code sizes 2024-05-06 00:02:46 -04:00
Nariman Jelveh 75bd1bc4c8 Update UIWindow2FASetup.js 2024-05-06 00:02:46 -04:00
Nariman Jelveh 12c883b6fd Remove the confirmation prompt when closing the 2FA setup winow
When exiting a window there should be a confirmation if exiting that window will irreversibly destroy work. For example, when you're working on a document and if you exit unsaved changes will be lost.
This doesn't seem to be the case. What work will be irreversibly lost?
2024-05-06 00:02:46 -04:00
Nariman Jelveh 144d647540 Improve styling 2024-05-06 00:02:46 -04:00
Nariman Jelveh c8a6d109ce Add icon for Security tab and warning/success styling for 2fa card 2024-05-06 00:02:46 -04:00
KernelDeimos 5fa3c6511f Fix padding and enable code 2024-05-06 00:02:46 -04:00
KernelDeimos a2a8f9de74 Fix cache state 2024-05-06 00:02:46 -04:00
KernelDeimos d72d83d0f3 Add i18n entries for 2FA setup 2024-05-06 00:02:46 -04:00
KernelDeimos c91c0afa71 Complete the 2FA setup flow 2024-05-06 00:02:46 -04:00
KernelDeimos a95fcc96be Add text components and styling 2024-05-06 00:02:46 -04:00
KernelDeimos f9c5a688b1 Fix code entry focus on init 2024-05-06 00:02:46 -04:00
KernelDeimos e9b8c452b9 Temporarily disable real check for testing 2024-05-06 00:02:46 -04:00
KernelDeimos 3e380ba844 Add otp test endpoint and next wizard step 2024-05-06 00:02:46 -04:00
KernelDeimos 22234ad1c1 Add the wizardy behaviour 2024-05-06 00:02:46 -04:00
KernelDeimos 662fd13548 Add code entry to 2FA wizard 2024-05-06 00:02:46 -04:00
KernelDeimos a672b8a58c Add UIWindow2FASetup 2024-05-06 00:02:46 -04:00
KernelDeimos 6e0cdb8a6b Document 2FA wizard structure 2024-05-06 00:02:46 -04:00
KernelDeimos 0baa678c8b Add Flexer 2024-05-06 00:02:46 -04:00
KernelDeimos c99747d7f2 Make using web components easier 2024-05-06 00:02:46 -04:00
KernelDeimos 2681a78501 Use username as otp label 2024-05-06 00:02:46 -04:00
KernelDeimos 3bf7737790 Add recovery codes 2024-05-06 00:02:46 -04:00
KernelDeimos 455d3946d6 Add checkboxes and cancel action for 2FA setup 2024-05-06 00:02:46 -04:00
KernelDeimos 2dfecb5287 Add 2fa setting and complete login flow 2024-05-06 00:02:46 -04:00
KernelDeimos abc12bd407 Add otp input at login 2024-05-06 00:02:46 -04:00
KernelDeimos bbf352caa4 Add missing package-lock.json changes 2024-05-06 00:02:46 -04:00
KernelDeimos d7c5c37cf8 Implement backend for 2FA 2024-05-06 00:02:46 -04:00
KernelDeimos 038373cbbc Fix filename inconsistency that breaks Linux support 2024-05-06 00:02:33 -04:00
Nariman Jelveh 321520741d Merge pull request #372 from nyedidikeke/naming-convention-patch-1
refactor: nomenclature, typo fixes, IDE and documentation enhancement 🔨
2024-05-05 19:46:16 -07:00
Didi Keke 2c75c636af docs: environment variable configuration 🌱 2024-05-06 01:21:59 +00:00
Didi Keke 01b7e523d0 chore: comment and fine tune .gitignore settings 🔨 2024-05-06 01:18:40 +00:00
Didi Keke 05d4a28adc chore: format content 📝 2024-05-06 01:14:36 +00:00
Didi Keke b89142c45c chore: include .vscode/extensions.json ⚓
- For recommendation of extensions or otherwise.
2024-05-05 20:31:08 +00:00
Didi Keke f9359bfb73 chore: ignore nested folders 🐜 2024-05-05 20:23:05 +00:00
Didi Keke 4d30740198 fix: typographical errors 🐛 2024-05-05 08:34:50 +00:00
Didi Keke 2d6dfd9002 chore: add word spelling dictionary 👼 2024-05-05 08:15:30 +00:00
Didi Keke 3914a14a2a chore: update .gitignore settings for VS Code 🚀
- All files within the `.vscode/` directory are ignored except for `settings.json`, `tasks.json`, and `launch.json`.
2024-05-05 08:11:13 +00:00
Didi Keke 2949f71691 fix: typographical error 🐛 2024-05-05 07:54:11 +00:00
Didi Keke 551121524c refactor: name from SelfhostedModule to SelfHostedModule 🔨 2024-05-05 07:53:55 +00:00
Nariman Jelveh 038c5e9a6e Merge pull request #371 from mafendi/main
Added Russian translation
2024-05-04 17:22:12 -07:00
Efendi 467aabe5ee Update translations.js
Added ru
2024-05-05 00:09:52 +03:00
Efendi 4f73641f46 Add files via upload 2024-05-05 00:07:07 +03:00
Nariman Jelveh 48e97b5ec2 Update UITaskbarItem.js 2024-05-04 12:34:28 -07:00
KernelDeimos a86106c0c1 Fix save_account token 2024-05-04 14:19:09 -04:00
Nariman Jelveh c9f3693785 Merge branch 'main' of https://github.com/HeyPuter/puter into main 2024-05-03 21:32:26 -07:00
Nariman Jelveh 5151863a94 disable context menu on settings sidebar 2024-05-03 21:32:23 -07:00
Nariman Jelveh 16a81cdc7f Merge pull request #369 from nyedidikeke/patch-1
fix: reliability issue 🐛
2024-05-03 21:10:21 -07:00
Nariman Jelveh ebb6cf2a91 clean up console messages and errors 2024-05-03 20:49:12 -07:00
Didi Keke 1d546d9ef7 fix: reliability issue 🐛 2024-05-04 03:23:28 +00:00
Nariman Jelveh 6bef35b406 Fix issue with passive event listeners via jQuery 2024-05-03 20:21:26 -07:00
Nariman Jelveh ecd9d5493f Fix issue with trash not opening from taskbar 2024-05-03 19:57:48 -07:00
Nariman Jelveh 33a6f4c49f quick fix 2024-05-03 16:56:27 -07:00
Nariman Jelveh 3c92cd3198 Update initgui.js 2024-05-03 12:04:38 -07:00
Eric Dubé 4d0e6b4772 Merge pull request #336 from AtkinsSJ/app-tab-completion
Phoenix: Add tab-completion for command names
2024-05-03 12:39:07 -04:00
Eric Dubé ebdf0d9148 Merge pull request #348 from AtkinsSJ/eslint
Set up eslint, and try to resolve the issues it finds
2024-05-03 12:28:21 -04:00
Sam Atkins 44aa4f1b0a chore: Remove debugger calls
/puter/packages/phoenix/src/ansi-shell/arg-parsers/simple-parser.js
  30:38  warning  Unexpected 'debugger' statement  no-debugger

/puter/packages/phoenix/src/ansi-shell/pipeline/Coupler.js
  71:32  warning  Unexpected 'debugger' statement  no-debugger
2024-05-02 17:41:14 +01:00
Sam Atkins fa7c6bee96 fix: Correct variables used in errors in sign.js
I couldn't figure out how to get a name for the no_suitable_app error
unfortunately, so that's just commented out.

/puter/packages/backend/src/routers/sign.js
   65:74  error  'subject' is not defined  no-undef
  114:59  error  'subject' is not defined  no-undef
2024-05-02 17:39:01 +01:00
Sam Atkins fa3b86fa7e chore: Amend empty blocks in upload.js
/puter/packages/puter-js/src/modules/FileSystem/operations/upload.js
   63:22  error  Empty block statement  no-empty
  173:22  error  Empty block statement  no-empty
2024-05-02 17:31:17 +01:00
Sam Atkins 52d5299374 fix: Use correct variable for version number
/puter/packages/backend/src/services/ComplainAboutVersionsService.js
  30:36  error  'current_version' is not defined  no-undef
2024-05-02 17:30:53 +01:00
Sam Atkins 23d959bf64 chore: Clarify usage of window fields in index.js
/puter/src/index.js
  58:15  error  'loadScript' is not defined  no-undef
  59:15  error  'loadScript' is not defined  no-undef
  65:13  error  'gui_env' is not defined     no-undef
  66:15  error  'loadScript' is not defined  no-undef
  68:15  error  'loadCSS' is not defined     no-undef
  69:15  error  'loadScript' is not defined  no-undef
  73:5   error  'initgui' is not defined     no-undef
2024-05-02 17:26:41 +01:00
Sam Atkins 5198081c2b chore: Fix eslint issues in initgui.js
Almost entirely clarifying use of window fields

/puter/src/initgui.js
    82:28   error  'api_origin' is not defined                                   no-undef
   118:34   error  'url_query_params' is not defined                             no-undef
   120:17   error  'app_query_params' is not defined                             no-undef
   136:8    error  'url_query_params' is not defined                             no-undef
   136:51   error  'url_query_params' is not defined                             no-undef
   136:105  error  'url_query_params' is not defined                             no-undef
   138:14   error  'url_query_params' is not defined                             no-undef
   138:57   error  'url_query_params' is not defined                             no-undef
   138:110  error  'url_query_params' is not defined                             no-undef
   154:8    error  'url_query_params' is not defined                             no-undef
   154:54   error  'url_query_params' is not defined                             no-undef
   154:110  error  'url_query_params' is not defined                             no-undef
   164:17   error  'openerOrigin' is not defined                                 no-undef
   171:30   error  'openerOrigin' is not defined                                 no-undef
   173:37   error  'is_auth' is not defined                                      no-undef
   184:23   error  'getUserAppToken' is not defined                              no-undef
   184:39   error  'openerOrigin' is not defined                                 no-undef
   186:41   error  'is_auth' is not defined                                      no-undef
   195:23   error  'getUserAppToken' is not defined                              no-undef
   195:39   error  'openerOrigin' is not defined                                 no-undef
   205:8    error  'url_query_params' is not defined                             no-undef
   206:32   error  'url_query_params' is not defined                             no-undef
   218:23   error  'url_query_params' is not defined                             no-undef
   219:22   error  'openerOrigin' is not defined                                 no-undef
   219:38   error  'url_query_params' is not defined                             no-undef
   220:26   error  'url_query_params' is not defined                             no-undef
   228:29   error  'embedded_in_popup' is not defined                            no-undef
   238:20   error  'url_query_params' is not defined                             no-undef
   239:21   error  'url_query_params' is not defined                             no-undef
   270:36   error  'openerOrigin' is not defined                                 no-undef
   271:30   error  'checkUserSiteRelationship' is not defined                    no-undef
   271:56   error  'openerOrigin' is not defined                                 no-undef
   274:44   error  'logged_in_users' is not defined                              no-undef
   274:76   error  'userAppToken' is not defined                                 no-undef
   274:92   error  'url_query_params' is not defined                             no-undef
   284:17   error  'userAppToken' is not defined                                 no-undef
   288:25   error  'is_auth' is not defined                                      no-undef
   302:13   error  'url_query_params' is not defined                             no-undef
   303:38   error  'url_query_params' is not defined                             no-undef
   309:17   error  'logout' is not defined                                       no-undef
   331:13   error  'update_auth_data' is not defined                             no-undef
   363:8    error  'is_auth' is not defined                                      no-undef
   388:13   error  'update_auth_data' is not defined                             no-undef
   394:23   error  'get_auto_arrange_data' is not defined                        no-undef
   395:31   error  'desktop_path' is not defined                                 no-undef
   403:30   error  'url_query_params' is not defined                             no-undef
   405:38   error  'getUserAppToken' is not defined                              no-undef
   405:62   error  'openerOrigin' is not defined                                 no-undef
   415:35   error  'user' is not defined                                         no-undef
   417:24   error  'openerOrigin' is not defined                                 no-undef
   430:24   error  'openerOrigin' is not defined                                 no-undef
   438:20   error  'openerOrigin' is not defined                                 no-undef
   439:37   error  'getAppUIDFromOrigin' is not defined                          no-undef
   439:57   error  'openerOrigin' is not defined                                 no-undef
   444:35   error  'url_query_params' is not defined                             no-undef
   508:46   error  'url_query_params' is not defined                             no-undef
   630:54   error  'busy_indicator_hide_delay' is not defined                    no-undef
   636:49   error  'busy_indicator_hide_delay' is not defined                    no-undef
   647:13   error  'update_sites_cache' is not defined                           no-undef
   656:9    error  'refresh_desktop_background' is not defined                   no-undef
   661:9    error  'is_auth' is not defined                                      no-undef
   661:23   error  'first_visit_ever' is not defined                             no-undef
   662:12   error  'logged_in_users' is not defined                              no-undef
   679:14   error  'is_auth' is not defined                                      no-undef
   679:27   error  'first_visit_ever' is not defined                             no-undef
   693:12   error  'url_query_params' is not defined                             no-undef
   696:47   error  'url_query_params' is not defined                             no-undef
   704:18   error  'gui_origin' is not defined                                   no-undef
   715:17   error  'update_auth_data' is not defined                             no-undef
   728:8    error  'feature_flags' is not defined                                no-undef
   746:19   error  'get_auto_arrange_data' is not defined                        no-undef
   747:27   error  'desktop_path' is not defined                                 no-undef
   755:26   error  'url_query_params' is not defined                             no-undef
   758:34   error  'getUserAppToken' is not defined                              no-undef
   758:58   error  'openerOrigin' is not defined                                 no-undef
   768:31   error  'user' is not defined                                         no-undef
   770:20   error  'openerOrigin' is not defined                                 no-undef
   783:20   error  'openerOrigin' is not defined                                 no-undef
   792:16   error  'openerOrigin' is not defined                                 no-undef
   793:33   error  'getAppUIDFromOrigin' is not defined                          no-undef
   793:53   error  'openerOrigin' is not defined                                 no-undef
   801:31   error  'url_query_params' is not defined                             no-undef
   864:42   error  'url_query_params' is not defined                             no-undef
   987:50   error  'busy_indicator_hide_delay' is not defined                    no-undef
   993:45   error  'busy_indicator_hide_delay' is not defined                    no-undef
  1021:13   error  'update_explorer_footer_selected_items_count' is not defined  no-undef
  1057:13   error  'active_item_container' is not defined                        no-undef
  1061:17   error  'active_item_container' is not defined                        no-undef
  1065:21   error  'active_item_container' is not defined                        no-undef
  1071:9    error  'active_element' is not defined                               no-undef
  1179:21   error  'select_ctxmenu_item' is not defined                          no-undef
  1185:21   error  'select_ctxmenu_item' is not defined                          no-undef
  1198:21   error  'select_ctxmenu_item' is not defined                          no-undef
  1211:21   error  'select_ctxmenu_item' is not defined                          no-undef
  1222:25   error  'select_ctxmenu_item' is not defined                          no-undef
  1255:22   error  'active_item_container' is not defined                        no-undef
  1256:39   error  'active_item_container' is not defined                        no-undef
  1257:21   error  'active_element' is not defined                               no-undef
  1258:23   error  'active_item_container' is not defined                        no-undef
  1263:27   error  'active_item_container' is not defined                        no-undef
  1264:39   error  'active_item_container' is not defined                        no-undef
  1267:27   error  'active_item_container' is not defined                        no-undef
  1268:39   error  'active_element' is not defined                               no-undef
  1268:74   error  'active_element' is not defined                               no-undef
  1268:93   error  'active_element' is not defined                               no-undef
  1271:27   error  'active_item_container' is not defined                        no-undef
  1272:39   error  'active_item_container' is not defined                        no-undef
  1275:39   error  'active_element' is not defined                               no-undef
  1275:74   error  'active_element' is not defined                               no-undef
  1275:93   error  'active_element' is not defined                               no-undef
  1323:114  error  'active_item_container' is not defined                        no-undef
  1331:21   error  'active_element' is not defined                               no-undef
  1334:27   error  'active_item_container' is not defined                        no-undef
  1390:37   error  'active_element' is not defined                               no-undef
  1407:31   error  'delete_item' is not defined                                  no-undef
  1419:37   error  'active_element' is not defined                               no-undef
  1419:115  error  'trash_path' is not defined                                   no-undef
  1436:31   error  'delete_item' is not defined                                  no-undef
  1438:55   error  'trash_path' is not defined                                   no-undef
  1445:59   error  'trash_path' is not defined                                   no-undef
  1446:61   error  'trash_path' is not defined                                   no-undef
  1452:37   error  'active_element' is not defined                               no-undef
  1456:25   error  'move_items' is not defined                                   no-undef
  1456:53   error  'trash_path' is not defined                                   no-undef
  1467:16   error  'keypress_item_seach_term' is not defined                     no-undef
  1468:30   error  'keypress_item_seach_buffer_timeout' is not defined           no-undef
  1470:13   error  'keypress_item_seach_buffer_timeout' is not defined           no-undef
  1471:17   error  'keypress_item_seach_term' is not defined                     no-undef
  1474:13   error  'keypress_item_seach_term' is not defined                     no-undef
  1477:38   error  'active_item_container' is not defined                        no-undef
  1480:108  error  'keypress_item_seach_term' is not defined                     no-undef
  1485:30   error  'active_item_container' is not defined                        no-undef
  1487:78   error  'keypress_item_seach_term' is not defined                     no-undef
  1505:19   error  'active_item_container' is not defined                        no-undef
  1509:17   error  'update_explorer_footer_selected_items_count' is not defined  no-undef
  1509:63   error  'active_element' is not defined                               no-undef
  1518:16   error  'keypress_item_seach_term' is not defined                     no-undef
  1519:30   error  'keypress_item_seach_buffer_timeout' is not defined           no-undef
  1521:13   error  'keypress_item_seach_buffer_timeout' is not defined           no-undef
  1522:17   error  'keypress_item_seach_term' is not defined                     no-undef
  1525:13   error  'keypress_item_seach_term' is not defined                     no-undef
  1531:97   error  'keypress_item_seach_term' is not defined                     no-undef
  1538:67   error  'keypress_item_seach_term' is not defined                     no-undef
  1581:39   error  'active_element' is not defined                               no-undef
  1583:39   error  'active_element' is not defined                               no-undef
  1590:17   error  'update_explorer_footer_selected_items_count' is not defined  no-undef
  1600:36   error  'active_element' is not defined                               no-undef
  1602:36   error  'active_element' is not defined                               no-undef
  1615:15   error  'mouseover_window' is not defined                             no-undef
  1616:15   error  'mouseover_window' is not defined                             no-undef
  1616:55   error  'trash_path' is not defined                                   no-undef
  1621:38   error  'active_element' is not defined                               no-undef
  1623:38   error  'active_element' is not defined                               no-undef
  1628:21   error  'clipboard' is not defined                                    no-undef
  1629:21   error  'clipboard_op' is not defined                                 no-undef
  1632:58   error  'trash_path' is not defined                                   no-undef
  1636:25   error  'clipboard' is not defined                                    no-undef
  1648:38   error  'active_element' is not defined                               no-undef
  1650:38   error  'active_element' is not defined                               no-undef
  1655:21   error  'clipboard' is not defined                                    no-undef
  1656:21   error  'clipboard_op' is not defined                                 no-undef
  1658:25   error  'clipboard' is not defined                                    no-undef
  1668:107  error  'last_enter_pressed_to_rename_ts' is not defined              no-undef
  1682:21   error  'launch_app' is not defined                                   no-undef
  1705:21   error  'select_ctxmenu_item' is not defined                          no-undef
  1713:21   error  'active_item_container' is not defined                        no-undef
  1714:37   error  'active_item_container' is not defined                        no-undef
  1717:25   error  'open_item' is not defined                                    no-undef
  1736:16   error  'clipboard' is not defined                                    no-undef
  1745:37   error  'trash_path' is not defined                                   no-undef
  1745:74   error  'trash_path' is not defined                                   no-undef
  1745:96   error  'clipboard_op' is not defined                                 no-undef
  1748:20   error  'clipboard_op' is not defined                                 no-undef
  1749:21   error  'copy_clipboard_items' is not defined                         no-undef
  1750:25   error  'clipboard_op' is not defined                                 no-undef
  1751:21   error  'move_clipboard_items' is not defined                         no-undef
  1760:13   error  'undo_last_action' is not defined                             no-undef
  1767:9    error  'mouseX' is not defined                                       no-undef
  1768:9    error  'mouseY' is not defined                                       no-undef
  1771:13   error  'mouseX' is not defined                                       no-undef
  1771:29   error  'mouseY' is not defined                                       no-undef
  1771:38   error  'toolbar_height' is not defined                               no-undef
  1771:63   error  'mouseX' is not defined                                       no-undef
  1771:78   error  'mouseY' is not defined                                       no-undef
  1772:13   error  'current_active_snap_zone' is not defined                     no-undef
  1774:17   error  'mouseX' is not defined                                       no-undef
  1774:32   error  'mouseY' is not defined                                       no-undef
  1774:49   error  'mouseY' is not defined                                       no-undef
  1774:58   error  'desktop_height' is not defined                               no-undef
  1775:13   error  'current_active_snap_zone' is not defined                     no-undef
  1777:17   error  'mouseX' is not defined                                       no-undef
  1777:32   error  'mouseY' is not defined                                       no-undef
  1777:41   error  'desktop_height' is not defined                               no-undef
  1778:13   error  'current_active_snap_zone' is not defined                     no-undef
  1780:17   error  'mouseX' is not defined                                       no-undef
  1780:26   error  'desktop_width' is not defined                                no-undef
  1780:48   error  'mouseY' is not defined                                       no-undef
  1780:65   error  'mouseY' is not defined                                       no-undef
  1780:74   error  'desktop_height' is not defined                               no-undef
  1781:13   error  'current_active_snap_zone' is not defined                     no-undef
  1783:18   error  'mouseX' is not defined                                       no-undef
  1783:27   error  'desktop_width' is not defined                                no-undef
  1783:50   error  'mouseY' is not defined                                       no-undef
  1783:59   error  'toolbar_height' is not defined                               no-undef
  1783:84   error  'mouseX' is not defined                                       no-undef
  1783:93   error  'desktop_width' is not defined                                no-undef
  1783:115  error  'mouseY' is not defined                                       no-undef
  1784:13   error  'current_active_snap_zone' is not defined                     no-undef
  1786:17   error  'mouseX' is not defined                                       no-undef
  1786:26   error  'desktop_width' is not defined                                no-undef
  1786:48   error  'mouseY' is not defined                                       no-undef
  1786:58   error  'desktop_height' is not defined                               no-undef
  1787:13   error  'current_active_snap_zone' is not defined                     no-undef
  1789:17   error  'mouseY' is not defined                                       no-undef
  1789:26   error  'toolbar_height' is not defined                               no-undef
  1789:49   error  'mouseX' is not defined                                       no-undef
  1789:66   error  'mouseX' is not defined                                       no-undef
  1789:75   error  'desktop_width' is not defined                                no-undef
  1790:13   error  'current_active_snap_zone' is not defined                     no-undef
  1793:13   error  'current_active_snap_zone' is not defined                     no-undef
  1802:21   error  'mouseX' is not defined                                       no-undef
  1802:41   error  'mouseX' is not defined                                       no-undef
  1802:75   error  'mouseY' is not defined                                       no-undef
  1802:95   error  'mouseY' is not defined                                       no-undef
  1819:21   error  'mouseX' is not defined                                       no-undef
  1819:41   error  'mouseX' is not defined                                       no-undef
  1819:75   error  'mouseY' is not defined                                       no-undef
  1819:95   error  'mouseY' is not defined                                       no-undef
  1840:12   error  'mouseover_window' is not defined                             no-undef
  1841:15   error  'mouseover_window' is not defined                             no-undef
  1876:17   error  'upload_items' is not defined                                 no-undef
  1934:21   error  'logout' is not defined                                       no-undef
  1936:17   error  'logout' is not defined                                       no-undef
  1946:22   error  'gui_origin' is not defined                                   no-undef
  1951:50   error  'auth_token' is not defined                                   no-undef
  1958:18   error  Empty block statement                                         no-empty
2024-05-02 17:23:20 +01:00
Sam Atkins b6c491171c chore: Fix eslint issues in helper/ files
/puter/src/helpers/determine_active_container_parent.js
  22:30  error  'active_element' is not defined         no-undef
  25:30  error  'active_element' is not defined         no-undef
  29:30  error  'active_element' is not defined         no-undef
  32:41  error  'active_element' is not defined         no-undef
  32:61  error  'active_element' is not defined         no-undef
  33:30  error  'active_element' is not defined         no-undef
  36:41  error  'active_item_container' is not defined  no-undef
  37:28  error  'active_item_container' is not defined  no-undef

/puter/src/helpers/download.js
  51:27  error  'api_origin' is not defined           no-undef
  52:59  error  'auth_token' is not defined           no-undef
  92:16  error  'operation_cancelled' is not defined  no-undef

/puter/src/helpers/new_context_menu_item.js
  38:21  error  'create_folder' is not defined  no-undef
  48:21  error  'create_file' is not defined    no-undef
  56:21  error  'create_file' is not defined    no-undef
  70:25  error  'create_file' is not defined    no-undef

/puter/src/helpers/refresh_item_container.js
   83:13  error  'update_window_layout' is not defined                no-undef
   86:13  error  'update_details_layout_sort_visuals' is not defined  no-undef
  124:35  error  'trash_path' is not defined                          no-undef
  162:29  error  Empty block statement                                no-empty
  166:51  error  'path' is not defined                                no-undef
  168:34  error  'trash_path' is not defined                          no-undef
  168:62  error  'appdata_path' is not defined                        no-undef
  171:38  error  'desktop_item_positions' is not defined              no-undef
  178:37  error  'item_icon' is not defined                           no-undef
  207:31  error  'trash_path' is not defined                          no-undef
  216:21  error  'sort_items' is not defined                          no-undef
  217:26  error  Empty block statement                                no-empty
  222:13  error  'sort_items' is not defined                          no-undef
  233:17  error  'update_explorer_footer_item_count' is not defined   no-undef

/puter/src/helpers/update_title_based_on_uploads.js
  21:41  error  'active_uploads' is not defined  no-undef
  22:59  error  'active_uploads' is not defined  no-undef
  23:51  error  'active_uploads' is not defined  no-undef
  27:51  error  'active_uploads' is not defined  no-undef
2024-05-02 17:02:53 +01:00
Sam Atkins eefc0d41e1 chore: Fix eslint issues in helpers.js
Most of these are window fields that wanted `window.` prepended, but a
couple of issues are code that was using undefined variables (`ht` and
`dir_uuid`) and some switch-cases that I believe are intentionally
falling through.

/puter/src/helpers.js
    39:55   error  'auth_token' is not defined                                                                                            no-undef
    47:14   error  'api_origin' is not defined                                                                                            no-undef
    55:40   error  'auth_token' is not defined                                                                                            no-undef
    59:17   error  'logout' is not defined                                                                                                no-undef
   199:14   error  'api_origin' is not defined                                                                                            no-undef
   208:40   error  'auth_token' is not defined                                                                                            no-undef
   212:17   error  'logout' is not defined                                                                                                no-undef
   224:14   error  'api_origin' is not defined                                                                                            no-undef
   234:40   error  'auth_token' is not defined                                                                                            no-undef
   238:17   error  'logout' is not defined                                                                                                no-undef
   316:13   error  Expected a 'break' statement before 'case'                                                                             no-fallthrough
   323:13   error  Expected a 'break' statement before 'case'                                                                             no-fallthrough
   330:13   error  Expected a 'break' statement before 'case'                                                                             no-fallthrough
   337:13   error  Expected a 'break' statement before 'case'                                                                             no-fallthrough
   367:47   error  Unnecessary escape character: \/                                                                                       no-useless-escape
   411:14   error  'isString' is not defined                                                                                              no-undef
   420:47   error  'config' is not defined                                                                                                no-undef
   519:21   error  'globToRegExp' is not defined                                                                                          no-undef
   651:14   error  Empty block statement                                                                                                  no-empty
   656:9    error  'update_auth_data' is not defined                                                                                      no-undef
   678:36   error  'api_origin' is not defined                                                                                            no-undef
   722:5    error  'update_user_preferences' is not defined                                                                               no-undef
   740:24   error  'uuidv4' is not defined                                                                                                no-undef
   746:9    error  'appCallbackFunctions' is not defined                                                                                  no-undef
   789:14   error  'api_origin' is not defined                                                                                            no-undef
   794:40   error  'auth_token' is not defined                                                                                            no-undef
   861:33   error  'trash_path' is not defined                                                                                            no-undef
   867:21   error  Empty block statement                                                                                                  no-empty
   889:70   error  'trash_path' is not defined                                                                                            no-undef
   891:59   error  'trash_path' is not defined                                                                                            no-undef
   894:49   error  'trash_path' is not defined                                                                                            no-undef
   907:29   error  'docs_path' is not defined                                                                                             no-undef
   909:35   error  'pictures_path' is not defined                                                                                         no-undef
   911:35   error  'home_path' is not defined                                                                                             no-undef
   913:35   error  'videos_path' is not defined                                                                                           no-undef
   915:35   error  'desktop_path' is not defined                                                                                          no-undef
  1037:5    error  'getItem' is not defined                                                                                               no-undef
  1041:17   error  'setItem' is not defined                                                                                               no-undef
  1070:54   error  Empty block statement                                                                                                  no-empty
  1089:51   error  'ht' is not defined                                                                                                    no-undef
  1091:20   error  'desktop_loading_fade_delay' is not defined                                                                            no-undef
  1150:27   error  'operation_id' is not defined                                                                                          no-undef
  1151:5    error  'operation_cancelled' is not defined                                                                                   no-undef
  1169:21   error  'activate_item_name_editor' is not defined                                                                             no-undef
  1172:21   error  'actions_history' is not defined                                                                                       no-undef
  1181:54   error  'copy_progress_hide_delay' is not defined                                                                              no-undef
  1187:37   error  'copy_progress_hide_delay' is not defined                                                                              no-undef
  1211:21   error  'activate_item_name_editor' is not defined                                                                             no-undef
  1214:21   error  'actions_history' is not defined                                                                                       no-undef
  1245:22   error  'operation_id' is not defined                                                                                          no-undef
  1246:5    error  'operation_cancelled' is not defined                                                                                   no-undef
  1249:5    error  'update_explorer_footer_selected_items_count' is not defined                                                           no-undef
  1263:24   error  'clipboard' is not defined                                                                                             no-undef
  1264:29   error  'clipboard' is not defined                                                                                             no-undef
  1273:20   error  'operation_cancelled' is not defined                                                                                   no-undef
  1302:38   error  'clipboard' is not defined                                                                                             no-undef
  1303:38   error  'clipboard' is not defined                                                                                             no-undef
  1327:9    error  'actions_history' is not defined                                                                                       no-undef
  1335:40   error  'copy_progress_hide_delay' is not defined                                                                              no-undef
  1341:29   error  'copy_progress_hide_delay' is not defined                                                                              no-undef
  1354:22   error  'operation_id' is not defined                                                                                          no-undef
  1377:20   error  'operation_cancelled' is not defined                                                                                   no-undef
  1432:9    error  'actions_history' is not defined                                                                                       no-undef
  1440:40   error  'copy_progress_hide_delay' is not defined                                                                              no-undef
  1446:29   error  'copy_progress_hide_delay' is not defined                                                                              no-undef
  1486:17   error  'update_explorer_footer_item_count' is not defined                                                                     no-undef
  1487:17   error  'update_explorer_footer_selected_items_count' is not defined                                                           no-undef
  1500:8    error  'clipboard' is not defined                                                                                             no-undef
  1501:24   error  'clipboard' is not defined                                                                                             no-undef
  1502:61   error  'clipboard' is not defined                                                                                             no-undef
  1505:13   error  'move_items' is not defined                                                                                            no-undef
  1508:5    error  'clipboard' is not defined                                                                                             no-undef
  1537:23   error  'api_origin' is not defined                                                                                            no-undef
  1537:84   error  'auth_token' is not defined                                                                                            no-undef
  1556:34   error  'uuidv4' is not defined                                                                                                no-undef
  1565:45   error  'get_apps' is not defined                                                                                              no-undef
  1572:13   error  This branch can never execute. Its condition is a duplicate or covered by previous conditions in the if-else-if chain  no-dupe-else-if
  1639:21   error  'root_dirname' is not defined                                                                                          no-undef
  1684:37   error  'gui_origin' is not defined                                                                                            no-undef
  1711:60   error  'app_domain' is not defined                                                                                            no-undef
  1723:64   error  'auth_token' is not defined                                                                                            no-undef
  1737:49   error  'auth_token' is not defined                                                                                            no-undef
  1748:12   error  'api_origin' is not defined                                                                                            no-undef
  1749:64   error  'api_origin' is not defined                                                                                            no-undef
  1800:13   error  'launch_apps' is not defined                                                                                           no-undef
  1803:13   error  'launch_apps' is not defined                                                                                           no-undef
  1803:43   error  'launch_apps' is not defined                                                                                           no-undef
  1806:13   error  'launch_apps' is not defined                                                                                           no-undef
  1806:34   error  'launch_apps' is not defined                                                                                           no-undef
  1810:22   error  'api_origin' is not defined                                                                                            no-undef
  1819:48   error  'auth_token' is not defined                                                                                            no-undef
  1867:56   error  'trash_path' is not defined                                                                                            no-undef
  1873:34   error  'trash_path' is not defined                                                                                            no-undef
  1942:30   error  'busy_indicator_hide_delay' is not defined                                                                             no-undef
  1948:25   error  'busy_indicator_hide_delay' is not defined                                                                             no-undef
  1954:48   error  'user_preferences' is not defined                                                                                      no-undef
  1955:9    error  'launch_app' is not defined                                                                                            no-undef
  1956:19   error  'user_preferences' is not defined                                                                                      no-undef
  1967:9    error  'launch_app' is not defined                                                                                            no-undef
  1978:25   error  'item_icon' is not defined                                                                                             no-undef
  1992:9    error  'window_nav_history' is not defined                                                                                    no-undef
  1992:45   error  'window_nav_history' is not defined                                                                                    no-undef
  1992:88   error  'window_nav_history_current_position' is not defined                                                                   no-undef
  1993:9    error  'window_nav_history' is not defined                                                                                    no-undef
  1994:9    error  'window_nav_history_current_position' is not defined                                                                   no-undef
  1996:9    error  'update_window_path' is not defined                                                                                    no-undef
  2009:22   error  'api_origin' is not defined                                                                                            no-undef
  2017:48   error  'auth_token' is not defined                                                                                            no-undef
  2021:25   error  'logout' is not defined                                                                                                no-undef
  2025:20   error  Empty block statement                                                                                                  no-empty
  2029:70   error  'suggest_apps_for_fsentry' is not defined                                                                              no-undef
  2040:17   error  'unzipItem' is not defined                                                                                             no-undef
  2057:17   error  'trigger_download' is not defined                                                                                      no-undef
  2065:13   error  'launch_app' is not defined                                                                                            no-undef
  2087:22   error  'operation_id' is not defined                                                                                          no-undef
  2088:5    error  'operation_cancelled' is not defined                                                                                   no-undef
  2129:12   error  'operation_cancelled' is not defined                                                                                   no-undef
  2166:30   error  Empty block statement                                                                                                  no-empty
  2173:20   error  'operation_cancelled' is not defined                                                                                   no-undef
  2182:34   error  'trash_path' is not defined                                                                                            no-undef
  2196:55   error  'trash_path' is not defined                                                                                            no-undef
  2196:116  error  'trash_path' is not defined                                                                                            no-undef
  2197:57   error  'trash_path' is not defined                                                                                            no-undef
  2201:46   error  'trash_path' is not defined                                                                                            no-undef
  2215:47   error  'trash_path' is not defined                                                                                            no-undef
  2254:25   error  'update_explorer_footer_item_count' is not defined                                                                     no-undef
  2255:25   error  'update_explorer_footer_selected_items_count' is not defined                                                           no-undef
  2260:34   error  'trash_path' is not defined                                                                                            no-undef
  2270:25   error  'update_window_path' is not defined                                                                                    no-undef
  2274:34   error  'trash_path' is not defined                                                                                            no-undef
  2279:46   error  'dir_uuid' is not defined                                                                                              no-undef
  2302:33   error  'item_icon' is not defined                                                                                             no-undef
  2303:42   error  'trash_path' is not defined                                                                                            no-undef
  2309:47   error  'trash_path' is not defined                                                                                            no-undef
  2331:41   error  'item_icon' is not defined                                                                                             no-undef
  2343:21   error  'sort_items' is not defined                                                                                            no-undef
  2348:21   error  'sort_items' is not defined                                                                                            no-undef
  2391:47   error  'trash_path' is not defined                                                                                            no-undef
  2397:51   error  'trash_path' is not defined                                                                                            no-undef
  2398:53   error  'trash_path' is not defined                                                                                            no-undef
  2413:34   error  'trash_path' is not defined                                                                                            no-undef
  2414:9    error  'actions_history' is not defined                                                                                       no-undef
  2418:40   error  'trash_path' is not defined                                                                                            no-undef
  2419:9    error  'actions_history' is not defined                                                                                       no-undef
  2428:12   error  'copy_progress_hide_delay' is not defined                                                                              no-undef
  2641:21   error  'upload_items' is not defined                                                                                          no-undef
  2659:21   error  'trash_path' is not defined                                                                                            no-undef
  2679:21   error  'show_save_account_notice_if_needed' is not defined                                                                    no-undef
  2683:17   error  'active_uploads' is not defined                                                                                        no-undef
  2695:17   error  'active_uploads' is not defined                                                                                        no-undef
  2714:17   error  'actions_history' is not defined                                                                                       no-undef
  2722:25   error  'show_save_account_notice_if_needed' is not defined                                                                    no-undef
  2723:33   error  'upload_progress_hide_delay' is not defined                                                                            no-undef
  2726:24   error  'active_uploads' is not defined                                                                                        no-undef
  2733:24   error  'active_uploads' is not defined                                                                                        no-undef
  2739:24   error  'active_uploads' is not defined                                                                                        no-undef
  2766:17   error  'uuidv4' is not defined                                                                                                no-undef
  2772:16   error  'trash_path' is not defined                                                                                            no-undef
  2782:47   error  'trash_path' is not defined                                                                                            no-undef
  2782:108  error  'trash_path' is not defined                                                                                            no-undef
  2783:37   error  'trash_path' is not defined                                                                                            no-undef
  2786:36   error  'trash_path' is not defined                                                                                            no-undef
  2788:13   error  'update_explorer_footer_item_count' is not defined                                                                     no-undef
  2788:71   error  'trash_path' is not defined                                                                                            no-undef
  2793:28   error  'copy_progress_hide_delay' is not defined                                                                              no-undef
  2799:28   error  'copy_progress_hide_delay' is not defined                                                                              no-undef
  2815:18   error  'api_origin' is not defined                                                                                            no-undef
  2818:42   error  'auth_token' is not defined                                                                                            no-undef
  2991:28   error  'copy_progress_hide_delay' is not defined                                                                              no-undef
  2998:28   error  'copy_progress_hide_delay' is not defined                                                                              no-undef
  3066:24   error  'copy_progress_hide_delay' is not defined                                                                              no-undef
  3074:24   error  'copy_progress_hide_delay' is not defined                                                                              no-undef
  3086:17   error  'actions_history' is not defined                                                                                       no-undef
  3095:17   error  'suggest_apps_for_fsentry' is not defined                                                                              no-undef
  3104:95   error  'truncate_filename' is not defined                                                                                     no-undef
  3104:123  error  'TRUNCATE_LENGTH' is not defined                                                                                       no-undef
  3111:84   error  'item_icon' is not defined                                                                                             no-undef
  3150:23   error  'update_sites_cache' is not defined                                                                                    no-undef
  3153:27   error  'determine_website_url' is not defined                                                                                 no-undef
  3158:17   error  'update_window_path' is not defined                                                                                    no-undef
  3166:17   error  'sort_items' is not defined                                                                                            no-undef
  3171:34   error  'truncate_filename' is not defined                                                                                     no-undef
  3171:66   error  'TRUNCATE_LENGTH' is not defined                                                                                       no-undef
  3205:9    error  'actions_history' is not defined                                                                                       no-undef
  3206:29   error  'actions_history' is not defined                                                                                       no-undef
  3211:13   error  'undo_create_file_or_folder' is not defined                                                                            no-undef
  3214:13   error  'rename_file' is not defined                                                                                           no-undef
  3217:13   error  'undo_upload' is not defined                                                                                           no-undef
  3220:13   error  'undo_copy' is not defined                                                                                             no-undef
  3223:13   error  'undo_move' is not defined                                                                                             no-undef
  3226:13   error  'undo_delete' is not defined                                                                                           no-undef
  3249:26   error  'get_html_element_from_options' is not defined                                                                         no-undef
  3251:9    error  'move_items' is not defined                                                                                            no-undef
  3257:26   error  'get_html_element_from_options' is not defined                                                                         no-undef
  3259:9    error  'move_items' is not defined                                                                                            no-undef
  3265:21   error  'global_element_id' is not defined                                                                                     no-undef
  3282:23   error  'determine_website_url' is not defined                                                                                 no-undef
  3324:42   error  'byte_format' is not defined                                                                                           no-undef
  3381:116  error  'truncate_filename' is not defined                                                                                     no-undef
  3381:148  error  'TRUNCATE_LENGTH' is not defined                                                                                       no-undef
  3396:5    error  'is_auto_arrange_enabled' is not defined                                                                               no-undef
  3398:5    error  'desktop_item_positions' is not defined                                                                                no-undef
  3408:8    error  'reset_item_positions' is not defined                                                                                  no-undef
  3409:9    error  'delete_desktop_item_positions' is not defined                                                                         no-undef
  3415:26   error  'desktop_item_positions' is not defined                                                                                no-undef
  3426:44   error  'desktop_item_positions' is not defined                                                                                no-undef
  3430:5    error  'desktop_item_positions' is not defined                                                                                no-undef
  3438:28   error  'is_fullscreen' is not defined                                                                                         no-undef
  3462:14   error  'window_for_app_instance' is not defined                                                                               no-undef
  3469:31   error  'iframe_for_app_instance' is not defined                                                                               no-undef
  3483:23   error  'window_for_app_instance' is not defined                                                                               no-undef
  3514:42   error  Unnecessary escape character: \[                                                                                       no-useless-escape
  3514:59   error  Unnecessary escape character: \/                                                                                       no-useless-escape
2024-05-02 16:54:17 +01:00
Sam Atkins e5cd2bed87 chore: Clarify usage of window fields in globals.js
/puter/src/globals.js
  124:65  error  'first_visit_animation' is not defined  no-undef
2024-05-02 11:21:51 +01:00
Sam Atkins 766da39138 chore: Clarify usage of window fields in UIWindowSignup.js
/puter/src/UI/UIWindowSignup.js
  154:22  error  'is_email' is not defined                 no-undef
  170:35  error  'check_password_strength' is not defined  no-undef
  188:22  error  'gui_origin' is not defined               no-undef
  203:21  error  'update_auth_data' is not defined         no-undef
2024-05-02 11:21:51 +01:00
Sam Atkins 72c0e118c3 chore: Clarify usage of window fields in UIWindowSessionList.js
/puter/src/UI/UIWindowSessionList.js
   33:117  error  'icons' is not defined             no-undef
   34:41   error  'logged_in_users' is not defined   no-undef
   35:32   error  'logged_in_users' is not defined   no-undef
  134:36   error  'logged_in_users' is not defined   no-undef
  141:17   error  'update_auth_data' is not defined  no-undef
2024-05-02 11:21:51 +01:00
Sam Atkins 66cdf98190 chore: Clarify usage of window fields in UIWindowSaveAccount.js
/puter/src/UI/UIWindowSaveAccount.js
  130:22  error  'api_origin' is not defined        no-undef
  142:48  error  'auth_token' is not defined        no-undef
  145:21  error  'update_auth_data' is not defined  no-undef
2024-05-02 11:21:51 +01:00
Sam Atkins e5d4be6250 chore: Clarify usage of window fields in UIWindowRefer.js
/puter/src/UI/UIWindowRefer.js
  25:20  error  'gui_origin' is not defined  no-undef
  25:37  error  'user' is not defined        no-undef
  73:30  error  'socialLink' is not defined  no-undef
2024-05-02 11:21:51 +01:00
Sam Atkins 130b57b986 chore: Clarify usage of window fields in UIWindowRecoverPassword.js
/puter/src/UI/UIWindowRecoverPassword.js
   84:16  error  'is_email' is not defined    no-undef
   91:22  error  'api_origin' is not defined  no-undef
  101:25  error  'logout' is not defined      no-undef
2024-05-02 11:21:51 +01:00
Sam Atkins 2f30ae7a82 fix: Make url variable accessible to all users of it
Line 107 tries to use `url` but can't see it.

Also, clarify usage of window fields.

/puter/src/UI/UIWindowPublishWebsite.js
   67:67  error  'generate_identifier' is not defined  no-undef
  107:54  error  'url' is not defined                  no-undef
  110:17  error  'update_sites_cache' is not defined   no-undef
2024-05-02 11:21:50 +01:00
Sam Atkins e983e9e9b7 chore: Clarify usage of window fields in UIWindowNewPassword.js
/puter/src/UI/UIWindowNewPassword.js
   48:38  error  'api_origin' is not defined               no-undef
  153:35  error  'check_password_strength' is not defined  no-undef
  163:22  error  'api_origin' is not defined               no-undef
2024-05-02 11:21:50 +01:00
Sam Atkins b042f3c738 chore: Clarify usage of window fields in UIWindowMyWebsites.js
/puter/src/UI/UIWindowMyWebsites.js
  156:30  error  'api_origin' is not defined  no-undef
  164:56  error  'auth_token' is not defined  no-undef
  168:33  error  'logout' is not defined      no-undef
2024-05-02 11:21:50 +01:00
Sam Atkins ece37b62f2 chore: Clarify usage of window fields in progress dialogs
/puter/src/UI/UIWindowMoveProgress.js
  74:9  error  'operation_cancelled' is not defined  no-undef

/puter/src/UI/UIWindowNewFolderProgress.js
  67:9  error  'operation_cancelled' is not defined  no-undef

/puter/src/UI/UIWindowProgressEmptyTrash.js
  67:9  error  'operation_cancelled' is not defined  no-undef
2024-05-02 11:21:50 +01:00
Sam Atkins abc70f2e92 chore: Clarify usage of window fields in UIWindowManageSessions.js
/puter/src/UI/UIWindowManageSessions.js
   91:41  error  'api_origin' is not defined  no-undef
  122:37  error  'api_origin' is not defined  no-undef
2024-05-02 11:21:50 +01:00
Sam Atkins 2ed258cb69 chore: Clarify usage of window fields in UIWindowLogin.js
/puter/src/UI/UIWindowLogin.js
  141:16  error  'is_email' is not defined          no-undef
  160:22  error  'gui_origin' is not defined        no-undef
  167:21  error  'update_auth_data' is not defined  no-undef
  180:59  error  'gui_origin' is not defined        no-undef
  186:29  error  'app_domain' is not defined        no-undef
  188:54  error  'gui_origin' is not defined        no-undef
2024-05-02 11:21:50 +01:00
Sam Atkins 6903ce0043 chore: Clarify usage of window fields in UIWindowItemProperties.js
/puter/src/UI/UIWindowItemProperties.js
  135:26   error  Empty block statement              no-empty
  147:120  error  'byte_format' is not defined       no-undef
  155:395  error  'extractSubdomain' is not defined  no-undef
2024-05-02 11:21:50 +01:00
Sam Atkins 0ebcbe516c chore: Clarify usage of window fields in UIWindowFontPicker.js
/puter/src/UI/UIWindowFontPicker.js
  45:12  error  'isString' is not defined             no-undef
  95:21  error  'scrollParentToChild' is not defined  no-undef
2024-05-02 11:21:50 +01:00
Sam Atkins c44e0ca737 chore: Clarify usage of window fields in UIWindowFeedback.js
/puter/src/UI/UIWindowFeedback.js
  79:22  error  'api_origin' is not defined  no-undef
  84:48  error  'auth_token' is not defined  no-undef
2024-05-02 11:21:50 +01:00
Sam Atkins 7f050dc61a chore: Clarify usage of window fields in UIWindowDownloadProgress.js
/puter/src/UI/UIWindowDownloadProgress.js
  74:9  error  'operation_cancelled' is not defined  no-undef
2024-05-02 11:21:50 +01:00
Sam Atkins 93e13cdb06 chore: Clarify usage of window fields in UIWindowDesktopBGSettings.js
/puter/src/UI/UIWindowDesktopBGSettings.js
  168:26  error  'api_origin' is not defined  no-undef
  178:52  error  'auth_token' is not defined  no-undef
  182:29  error  'logout' is not defined      no-undef
  188:24  error  Empty block statement        no-empty
2024-05-02 11:21:50 +01:00
Sam Atkins dea3bc1a7f chore: Clarify use of window fields in UIWindowEmailConfirmationRequired
/puter/src/UI/UIWindowEmailConfirmationRequired.js
  113:26  error  'api_origin' is not defined         no-undef
  121:52  error  'auth_token' is not defined         no-undef
  125:29  error  'logout' is not defined             no-undef
  131:29  error  'refresh_user_data' is not defined  no-undef
  160:22  error  'api_origin' is not defined         no-undef
  165:48  error  'auth_token' is not defined         no-undef
  169:25  error  'logout' is not defined             no-undef
  188:13  error  'logout' is not defined             no-undef
2024-05-02 11:21:50 +01:00
Sam Atkins 2f6fcdb878 chore: Clarify usage of window fields in UIWindowDownloadProgress.js
/puter/src/UI/UIWindowDownloadProgress.js
  74:9  error  'operation_cancelled' is not defined  no-undef
2024-05-02 11:21:50 +01:00
Sam Atkins 3de32c2acc chore: Clarify usage of window fields in UIWindowColorPicker.js
/puter/src/UI/UIWindowColorPicker.js
  26:12  error  'isString' is not defined  no-undef
2024-05-02 11:21:50 +01:00
Sam Atkins ff28d2919b chore: Clarify usage of window fields in UIWindowChangeUsername.js
/puter/src/UI/UIWindowChangeUsername.js
   97:18  error  'api_origin' is not defined  no-undef
  101:44  error  'auth_token' is not defined  no-undef
2024-05-02 11:21:50 +01:00
Sam Atkins e3fb25cf45 chore: Clarify usage of window fields in UIWindowChangePassword.js
/puter/src/UI/UIWindowChangePassword.js
  107:31  error  'check_password_strength' is not defined  no-undef
  117:18  error  'api_origin' is not defined               no-undef
  121:44  error  'auth_token' is not defined               no-undef
2024-05-02 11:21:50 +01:00
Sam Atkins d39fd8659e chore: Clarify usage of window fields in UIWindow.js
And also add some missing imports.

/puter/src/UI/UIWindow.js
    33:20   error  'global_element_id' is not defined                            no-undef
    34:5    error  'last_window_zindex' is not defined                           no-undef
    48:5    error  'window_stack' is not defined                                 no-undef
    69:52   error  'uuidv4' is not defined                                       no-undef
    90:9    error  'is_embedded' is not defined                                  no-undef
   174:52   error  'last_window_zindex' is not defined                           no-undef
   174:94   error  'last_window_zindex' is not defined                           no-undef
   244:77   error  'is_embedded' is not defined                                  no-undef
   289:57   error  'navbar_path' is not defined                                  no-undef
   436:25   error  'launch_app' is not defined                                   no-undef
   456:9    error  'window_nav_history' is not defined                           no-undef
   457:9    error  'window_nav_history_current_position' is not defined          no-undef
   524:9    error  'animate_window_opening' is not defined                       no-undef
   599:17   error  'validate_fsentry_name' is not defined                        no-undef
   790:9    error  'navbar_path_droppable' is not defined                        no-undef
   791:9    error  'sidebar_item_droppable' is not defined                       no-undef
   801:33   error  'window_nav_history' is not defined                           no-undef
   801:63   error  'window_nav_history_current_position' is not defined          no-undef
   804:46   error  'root_dirname' is not defined                                 no-undef
   812:17   error  'window_nav_history_current_position' is not defined          no-undef
   812:68   error  'window_nav_history_current_position' is not defined          no-undef
   813:34   error  'window_nav_history' is not defined                           no-undef
   813:64   error  'window_nav_history_current_position' is not defined          no-undef
   815:17   error  'update_window_path' is not defined                           no-undef
   825:29   error  'window_nav_history_current_position' is not defined          no-undef
   826:38   error  'window_nav_history' is not defined                           no-undef
   834:25   error  'window_nav_history_current_position' is not defined          no-undef
   835:42   error  'window_nav_history' is not defined                           no-undef
   835:72   error  'window_nav_history_current_position' is not defined          no-undef
   840:59   error  'root_dirname' is not defined                                 no-undef
   847:29   error  'update_window_path' is not defined                           no-undef
   869:33   error  'window_nav_history' is not defined                           no-undef
   869:63   error  'window_nav_history_current_position' is not defined          no-undef
   872:46   error  'root_dirname' is not defined                                 no-undef
   880:17   error  'window_nav_history_current_position' is not defined          no-undef
   882:37   error  'window_nav_history' is not defined                           no-undef
   882:67   error  'window_nav_history_current_position' is not defined          no-undef
   885:21   error  'update_window_path' is not defined                           no-undef
   896:29   error  'window_nav_history_current_position' is not defined          no-undef
   896:86   error  'window_nav_history' is not defined                           no-undef
   897:38   error  'window_nav_history' is not defined                           no-undef
   905:25   error  'window_nav_history_current_position' is not defined          no-undef
   906:42   error  'window_nav_history' is not defined                           no-undef
   906:72   error  'window_nav_history_current_position' is not defined          no-undef
   911:59   error  'root_dirname' is not defined                                 no-undef
   918:29   error  'update_window_path' is not defined                           no-undef
   941:50   error  'root_dirname' is not defined                                 no-undef
   950:17   error  'window_nav_history' is not defined                           no-undef
   950:46   error  'window_nav_history' is not defined                           no-undef
   950:82   error  'window_nav_history_current_position' is not defined          no-undef
   951:17   error  'window_nav_history' is not defined                           no-undef
   952:17   error  'window_nav_history_current_position' is not defined          no-undef
   954:17   error  'update_window_path' is not defined                           no-undef
   968:25   error  'update_window_layout' is not defined                         no-undef
   983:25   error  'update_window_layout' is not defined                         no-undef
   986:25   error  'update_window_layout' is not defined                         no-undef
   997:13   error  'is_auth' is not defined                                      no-undef
  1023:13   error  'update_explorer_footer_selected_items_count' is not defined  no-undef
  1106:21   error  'active_element' is not defined                               no-undef
  1117:13   error  'update_explorer_footer_selected_items_count' is not defined  no-undef
  1143:18   error  'mouseover_window' is not defined                             no-undef
  1205:82   error  'mouseX' is not defined                                       no-undef
  1205:107  error  'mouseY' is not defined                                       no-undef
  1219:83   error  'mouseover_window' is not defined                             no-undef
  1244:31   error  'mouseover_window' is not defined                             no-undef
  1246:17   error  'copy_items' is not defined                                   no-undef
  1246:45   error  'mouseover_window' is not defined                             no-undef
  1252:21   error  'create_shortcut' is not defined                              no-undef
  1255:27   error  'mouseover_window' is not defined                             no-undef
  1264:17   error  'move_items' is not defined                                   no-undef
  1264:45   error  'mouseover_window' is not defined                             no-undef
  1286:13   error  'scale_window' is not defined                                 no-undef
  1302:13   error  'scale_window' is not defined                                 no-undef
  1359:21   error  'upload_items' is not defined                                 no-undef
  1413:47   error  'window_width_threshold_for_sidebar' is not defined           no-undef
  1414:49   error  'window_width_threshold_for_sidebar' is not defined           no-undef
  1420:53   error  'window_width_threshold_for_sidebar' is not defined           no-undef
  1435:17   error  'last_window_zindex' is not defined                           no-undef
  1460:29   error  'current_active_snap_zone' is not defined                     no-undef
  1469:50   error  'current_active_snap_zone' is not defined                     no-undef
  1473:43   error  'desktop_height' is not defined                               no-undef
  1474:40   error  'toolbar_height' is not defined                               no-undef
  1476:44   error  'last_window_zindex' is not defined                           no-undef
  1480:55   error  'current_active_snap_zone' is not defined                     no-undef
  1484:43   error  'desktop_height' is not defined                               no-undef
  1485:40   error  'toolbar_height' is not defined                               no-undef
  1487:44   error  'last_window_zindex' is not defined                           no-undef
  1491:55   error  'current_active_snap_zone' is not defined                     no-undef
  1495:43   error  'desktop_height' is not defined                               no-undef
  1496:40   error  'toolbar_height' is not defined                               no-undef
  1497:41   error  'desktop_width' is not defined                                no-undef
  1498:44   error  'last_window_zindex' is not defined                           no-undef
  1502:55   error  'current_active_snap_zone' is not defined                     no-undef
  1506:43   error  'desktop_height' is not defined                               no-undef
  1507:40   error  'toolbar_height' is not defined                               no-undef
  1510:44   error  'last_window_zindex' is not defined                           no-undef
  1514:55   error  'current_active_snap_zone' is not defined                     no-undef
  1517:42   error  'desktop_width' is not defined                                no-undef
  1518:43   error  'desktop_height' is not defined                               no-undef
  1519:40   error  'toolbar_height' is not defined                               no-undef
  1521:44   error  'last_window_zindex' is not defined                           no-undef
  1525:55   error  'current_active_snap_zone' is not defined                     no-undef
  1528:40   error  'toolbar_height' is not defined                               no-undef
  1528:57   error  'desktop_height' is not defined                               no-undef
  1531:43   error  'desktop_height' is not defined                               no-undef
  1532:44   error  'last_window_zindex' is not defined                           no-undef
  1536:55   error  'current_active_snap_zone' is not defined                     no-undef
  1539:40   error  'toolbar_height' is not defined                               no-undef
  1539:57   error  'desktop_height' is not defined                               no-undef
  1540:41   error  'desktop_width' is not defined                                no-undef
  1542:43   error  'desktop_height' is not defined                               no-undef
  1543:44   error  'last_window_zindex' is not defined                           no-undef
  1559:52   error  'current_active_snap_zone' is not defined                     no-undef
  1590:28   error  'current_active_snap_zone' is not defined                     no-undef
  1592:40   error  'toolbar_height' is not defined                               no-undef
  1595:43   error  'desktop_height' is not defined                               no-undef
  1599:33   error  'current_active_snap_zone' is not defined                     no-undef
  1601:40   error  'toolbar_height' is not defined                               no-undef
  1604:43   error  'desktop_height' is not defined                               no-undef
  1608:33   error  'current_active_snap_zone' is not defined                     no-undef
  1610:40   error  'toolbar_height' is not defined                               no-undef
  1613:43   error  'desktop_height' is not defined                               no-undef
  1617:33   error  'current_active_snap_zone' is not defined                     no-undef
  1619:40   error  'toolbar_height' is not defined                               no-undef
  1619:57   error  'desktop_height' is not defined                               no-undef
  1622:43   error  'desktop_height' is not defined                               no-undef
  1626:33   error  'current_active_snap_zone' is not defined                     no-undef
  1628:40   error  'toolbar_height' is not defined                               no-undef
  1628:57   error  'desktop_height' is not defined                               no-undef
  1629:41   error  'desktop_width' is not defined                                no-undef
  1631:43   error  'desktop_height' is not defined                               no-undef
  1635:33   error  'current_active_snap_zone' is not defined                     no-undef
  1637:40   error  'toolbar_height' is not defined                               no-undef
  1640:43   error  'desktop_height' is not defined                               no-undef
  1644:33   error  'current_active_snap_zone' is not defined                     no-undef
  1645:29   error  'scale_window' is not defined                                 no-undef
  1656:51   error  'window_width_threshold_for_sidebar' is not defined           no-undef
  1657:53   error  'window_width_threshold_for_sidebar' is not defined           no-undef
  1663:57   error  'window_width_threshold_for_sidebar' is not defined           no-undef
  1674:71   error  'taskbar_height' is not defined                               no-undef
  1676:51   error  'taskbar_height' is not defined                               no-undef
  1703:35   error  'window_width_threshold_for_sidebar' is not defined           no-undef
  1718:36   error  'window_width_threshold_for_sidebar' is not defined           no-undef
  1719:49   error  'window_width_threshold_for_sidebar' is not defined           no-undef
  1725:42   error  'window_width_threshold_for_sidebar' is not defined           no-undef
  1733:50   error  'toolbar_height' is not defined                               no-undef
  1734:38   error  'toolbar_height' is not defined                               no-undef
  1736:32   error  'toolbar_height' is not defined                               no-undef
  1773:13   error  'setItem' is not defined                                      no-undef
  1820:21   error  'scale_window' is not defined                                 no-undef
  1867:51   error  'trash_path' is not defined                                   no-undef
  1881:41   error  'sort_items' is not defined                                   no-undef
  1882:41   error  'set_sort_by' is not defined                                  no-undef
  1889:41   error  'sort_items' is not defined                                   no-undef
  1890:41   error  'set_sort_by' is not defined                                  no-undef
  1897:41   error  'sort_items' is not defined                                   no-undef
  1898:41   error  'set_sort_by' is not defined                                  no-undef
  1905:41   error  'sort_items' is not defined                                   no-undef
  1906:41   error  'set_sort_by' is not defined                                  no-undef
  1918:41   error  'sort_items' is not defined                                   no-undef
  1919:41   error  'set_sort_by' is not defined                                  no-undef
  1927:41   error  'sort_items' is not defined                                   no-undef
  1928:41   error  'set_sort_by' is not defined                                  no-undef
  1973:40   error  'clipboard' is not defined                                    no-undef
  1975:36   error  'clipboard_op' is not defined                                 no-undef
  1976:37   error  'copy_clipboard_items' is not defined                         no-undef
  1977:41   error  'clipboard_op' is not defined                                 no-undef
  1978:37   error  'move_clipboard_items' is not defined                         no-undef
  1986:39   error  'actions_history' is not defined                              no-undef
  1988:33   error  'undo_last_action' is not defined                             no-undef
  1998:33   error  'init_upload_using_dialog' is not defined                     no-undef
  2014:48   error  'UIWindowSaveAccount' is not defined                          no-undef
  2023:85   error  'UIWindowEmailConfirmationRequired' is not defined            no-undef
  2036:33   error  'launch_app' is not defined                                   no-undef
  2059:44   error  'mouseX' is not defined                                       no-undef
  2063:43   error  'mouseY' is not defined                                       no-undef
  2102:68   error  'trash_path' is not defined                                   no-undef
  2103:37   error  'delete_item' is not defined                                  no-undef
  2110:67   error  'trash_path' is not defined                                   no-undef
  2110:128  error  'trash_path' is not defined                                   no-undef
  2146:21   error  'upload_items' is not defined                                 no-undef
  2163:13   error  'enter_fullpage_mode' is not defined                          no-undef
  2173:8    error  'active_element' is not defined                               no-undef
  2174:9    error  'active_element' is not defined                               no-undef
  2195:25   error  'item_icon' is not defined                                    no-undef
  2210:9    error  'window_nav_history' is not defined                           no-undef
  2210:45   error  'window_nav_history' is not defined                           no-undef
  2210:88   error  'window_nav_history_current_position' is not defined          no-undef
  2211:9    error  'window_nav_history' is not defined                           no-undef
  2212:9    error  'window_nav_history_current_position' is not defined          no-undef
  2214:9    error  'update_window_path' is not defined                           no-undef
  2257:37   error  'item_icon' is not defined                                    no-undef
  2364:9    error  'update_window_path' is not defined                           no-undef
  2380:38   error  'root_dirname' is not defined                                 no-undef
  2389:9    error  'window_nav_history' is not defined                           no-undef
  2389:45   error  'window_nav_history' is not defined                           no-undef
  2389:88   error  'window_nav_history_current_position' is not defined          no-undef
  2390:9    error  'window_nav_history' is not defined                           no-undef
  2391:9    error  'window_nav_history_current_position' is not defined          no-undef
  2391:62   error  'window_nav_history' is not defined                           no-undef
  2392:9    error  'update_window_path' is not defined                           no-undef
  2436:59   error  'root_dirname' is not defined                                 no-undef
  2453:19   error  'clipboard' is not defined                                    no-undef
  2455:16   error  'clipboard_op' is not defined                                 no-undef
  2456:17   error  'copy_clipboard_items' is not defined                         no-undef
  2457:21   error  'clipboard_op' is not defined                                 no-undef
  2458:17   error  'move_clipboard_items' is not defined                         no-undef
  2484:18   error  'mouseover_window' is not defined                             no-undef
  2503:21   error  'create_shortcut' is not defined                              no-undef
  2515:17   error  'move_items' is not defined                                   no-undef
  2525:18   error  'mouseover_window' is not defined                             no-undef
  2605:12   error  'window_nav_history' is not defined                           no-undef
  2605:42   error  'window_nav_history' is not defined                           no-undef
  2605:84   error  'window_nav_history_current_position' is not defined          no-undef
  2612:12   error  'window_nav_history_current_position' is not defined          no-undef
  2626:55   error  'navbar_path' is not defined                                  no-undef
  2687:17   error  'update_window_layout' is not defined                         no-undef
  2690:21   error  'update_details_layout_sort_visuals' is not defined           no-undef
  2698:13   error  'update_window_path' is not defined                           no-undef
  2707:54   error  'root_dirname' is not defined                                 no-undef
  2712:9    error  'navbar_path_droppable' is not defined                        no-undef
  2715:5    error  'update_explorer_footer_selected_items_count' is not defined  no-undef
  2727:18   error  'mouseover_window' is not defined                             no-undef
  2746:21   error  'create_shortcut' is not defined                              no-undef
  2758:17   error  'move_items' is not defined                                   no-undef
  2768:18   error  'mouseover_window' is not defined                             no-undef
  2807:36   error  'sendWindowWillCloseMsg' is not defined                       no-undef
  2819:23   error  'window_stack' is not defined                                 no-undef
  2829:17   error  'remove_taskbar_item' is not defined                          no-undef
  2836:17   error  'exit_fullpage_mode' is not defined                           no-undef
  2853:31   error  'window_stack' is not defined                                 no-undef
  2854:73   error  'window_stack' is not defined                                 no-undef
  2854:86   error  'window_stack' is not defined                                 no-undef
  2857:47   error  'window_stack' is not defined                                 no-undef
  2857:60   error  'window_stack' is not defined                                 no-undef
  2916:22   error  'window_stack' is not defined                                 no-undef
  2924:13   error  'active_item_container' is not defined                        no-undef
  2949:20   error  'toolbar_height' is not defined                               no-undef
  3007:14   error  'api_origin' is not defined                                   no-undef
  3017:40   error  'auth_token' is not defined                                   no-undef
  3021:17   error  'logout' is not defined                                       no-undef
  3083:43   error  'last_window_zindex' is not defined                           no-undef
  3123:38   error  'last_window_zindex' is not defined                           no-undef
  3127:98   error  'last_window_zindex' is not defined                           no-undef
  3131:100  error  'last_window_zindex' is not defined                           no-undef
  3147:81   error  'mouseX' is not defined                                       no-undef
  3147:106  error  'mouseY' is not defined                                       no-undef
  3151:9    error  'active_item_container' is not defined                        no-undef
  3153:34   error  'active_item_container' is not defined                        no-undef
  3155:9    error  'window_stack' is not defined                                 no-undef
  3157:11   error  'active_item_container' is not defined                        no-undef
  3252:5    error  'sort_items' is not defined                                   no-undef
  3253:5    error  'set_sort_by' is not defined                                  no-undef
  3258:14   error  'api_origin' is not defined                                   no-undef
  3267:40   error  'auth_token' is not defined                                   no-undef
  3271:17   error  'logout' is not defined                                       no-undef
  3280:21   error  'update_details_layout_sort_visuals' is not defined           no-undef
2024-05-02 11:21:50 +01:00
Sam Atkins 126b00b35c chore: Clarify usage of window fields in UITaskbarItem.js
/puter/src/UI/UITaskbarItem.js
   31:24  error  'global_element_id' is not defined    no-undef
  124:21  error  'launch_app' is not defined           no-undef
  143:21  error  'empty_trash' is not defined          no-undef
  158:25  error  'remove_taskbar_item' is not defined  no-undef
  160:21  error  'update_taskbar' is not defined       no-undef
  174:21  error  'update_taskbar' is not defined       no-undef
  250:73  error  'mouseover_window' is not defined     no-undef
  254:33  error  'path' is not defined                 no-undef
  297:21  error  'launch_app' is not defined           no-undef
  328:89  error  'mouseover_window' is not defined     no-undef
2024-05-02 11:21:50 +01:00
Sam Atkins 94291c4968 chore: Clarify usage of window fields in UITaskbar.js
/puter/src/UI/UITaskbar.js
   24:5    error  'global_element_id' is not defined      no-undef
   31:14   error  'api_origin' is not defined             no-undef
   36:40   error  'auth_token' is not defined             no-undef
   44:33   error  'global_element_id' is not defined      no-undef
   77:17   error  'launch_apps' is not defined            no-undef
   77:33   error  'launch_apps' is not defined            no-undef
   77:55   error  'launch_apps' is not defined            no-undef
   79:17   error  'launch_apps' is not defined            no-undef
   80:26   error  'api_origin' is not defined             no-undef
   85:52   error  'auth_token' is not defined             no-undef
   99:16   error  'launch_apps' is not defined            no-undef
  105:88   error  'launch_apps' is not defined            no-undef
  106:38   error  'launch_apps' is not defined            no-undef
  119:16   error  'launch_apps' is not defined            no-undef
  121:107  error  'launch_apps' is not defined            no-undef
  125:45   error  'launch_apps' is not defined            no-undef
  126:38   error  'launch_apps' is not defined            no-undef
  179:17   error  'launch_app' is not defined             no-undef
  201:25   error  'launch_app' is not defined             no-undef
  215:39   error  'trash_path' is not defined             no-undef
  228:68   error  'trash_path' is not defined             no-undef
  230:17   error  'launch_app' is not defined             no-undef
  236:13   error  'move_items' is not defined             no-undef
  236:31   error  'trash_path' is not defined             no-undef
  240:5    error  'make_taskbar_sortable' is not defined  no-undef
  262:22   error  Empty block statement                   no-empty
  284:29   error  'launch_app' is not defined             no-undef
  297:17   error  'update_taskbar' is not defined         no-undef
  301:17   error  'update_taskbar' is not defined         no-undef
2024-05-02 11:21:50 +01:00
Sam Atkins a5821815bf chore: Clarify usage of window fields in UIPrompt.js
/puter/src/UI/UIPrompt.js
  26:12  error  'isString' is not defined  no-undef
2024-05-02 11:21:50 +01:00
Sam Atkins c5612beff9 chore: Clarify usage of window fields in UIPopover.js
/puter/src/UI/UIPopover.js
  28:5   error  'global_element_id' is not defined  no-undef
  33:30  error  'global_element_id' is not defined  no-undef
  40:59  error  'global_element_id' is not defined  no-undef
  76:59  error  'taskbar_height' is not defined     no-undef
2024-05-02 11:21:50 +01:00
Sam Atkins eecaf759ea chore: Clarify usage of window fields in UINotification.js
The click handler also makes use of the `options` parameter from
UINotification(), which isn't available there, so I've commented that
out. This needs more work.

/puter/src/UI/UINotification.js
  21:5   error  'global_element_id' is not defined  no-undef
  26:39  error  'global_element_id' is not defined  no-undef
  34:73  error  'global_element_id' is not defined  no-undef
  47:14  error  'toolbar_height' is not defined     no-undef
  55:12  error  'options' is not defined            no-undef
  55:36  error  'options' is not defined            no-undef
  56:13  error  'options' is not defined            no-undef
2024-05-02 11:21:50 +01:00
Sam Atkins 620a1a1334 chore: Clarify usage of window fields in UIItem.js
/puter/src/UI/UIItem.js
    42:21   error  'global_element_id' is not defined                            no-undef
    62:23   error  'determine_website_url' is not defined                        no-undef
   100:58   error  'timeago' is not defined                                      no-undef
   104:42   error  'byte_format' is not defined                                  no-undef
   161:151  error  'truncate_filename' is not defined                            no-undef
   161:183  error  'TRUNCATE_LENGTH' is not defined                              no-undef
   171:5    error  'show_or_hide_empty_folder_message' is not defined            no-undef
   178:64   error  'trash_path' is not defined                                   no-undef
   186:9    error  'update_explorer_footer_item_count' is not defined            no-undef
   190:10   error  'is_auto_arrange_enabled' is not defined                      no-undef
   217:21   error  'upload_items' is not defined                                 no-undef
   336:16   error  'mouseover_window' is not defined                             no-undef
   337:39   error  'mouseover_window' is not defined                             no-undef
   338:23   error  'mouseover_window' is not defined                             no-undef
   341:24   error  'mouseX' is not defined                                       no-undef
   341:46   error  'mouseX' is not defined                                       no-undef
   341:69   error  'mouseY' is not defined                                       no-undef
   341:90   error  'mouseY' is not defined                                       no-undef
   342:88   error  'mouseX' is not defined                                       no-undef
   342:113  error  'mouseY' is not defined                                       no-undef
   350:18   error  'is_auto_arrange_enabled' is not defined                      no-undef
   350:78   error  'trash_path' is not defined                                   no-undef
   352:17   error  'mouseover_window' is not defined                             no-undef
   358:17   error  'desktop_item_positions' is not defined                       no-undef
   359:17   error  'save_desktop_item_positions' is not defined                  no-undef
   383:73   error  'mouseover_window' is not defined                             no-undef
   427:21   error  'launch_app' is not defined                                   no-undef
   448:25   error  'copy_items' is not defined                                   no-undef
   450:25   error  'copy_items' is not defined                                   no-undef
   455:25   error  'create_shortcut' is not defined                              no-undef
   468:32   error  'desktop_item_positions' is not defined                       no-undef
   469:25   error  'save_desktop_item_positions' is not defined                  no-undef
   471:21   error  'move_items' is not defined                                   no-undef
   483:89   error  'mouseover_window' is not defined                             no-undef
   525:13   error  'open_item' is not defined                                    no-undef
   540:13   error  'open_item' is not defined                                    no-undef
   579:9    error  'update_explorer_footer_selected_items_count' is not defined  no-undef
   596:13   error  'update_explorer_footer_selected_items_count' is not defined  no-undef
   651:34   error  'truncate_filename' is not defined                            no-undef
   651:66   error  'TRUNCATE_LENGTH' is not defined                              no-undef
   661:9    error  'rename_file' is not defined                                  no-undef
   678:13   error  'last_enter_pressed_to_rename_ts' is not defined              no-undef
   679:13   error  'update_explorer_footer_selected_items_count' is not defined  no-undef
   718:25   error  'activate_item_name_editor' is not defined                    no-undef
   763:78   error  'trash_path' is not defined                                   no-undef
   775:29   error  'move_items' is not defined                                   no-undef
   796:25   error  'zipItems' is not defined                                     no-undef
   810:25   error  'zipItems' is not defined                                     no-undef
   875:39   error  'delete_item' is not defined                                  no-undef
   877:63   error  'trash_path' is not defined                                   no-undef
   885:67   error  'trash_path' is not defined                                   no-undef
   885:116  error  'trash_path' is not defined                                   no-undef
   886:69   error  'trash_path' is not defined                                   no-undef
   906:29   error  'create_shortcut' is not defined                              no-undef
   925:25   error  'move_items' is not defined                                   no-undef
   925:53   error  'trash_path' is not defined                                   no-undef
   936:63   error  'trash_path' is not defined                                   no-undef
   936:122  error  'trash_path' is not defined                                   no-undef
   945:25   error  'open_item' is not defined                                    no-undef
   962:49   error  'suggest_apps_for_fsentry' is not defined                     no-undef
   984:37   error  'user_preferences' is not defined                             no-undef
   987:43   error  'user_preferences' is not defined                             no-undef
   989:42   error  'user_preferences' is not defined                             no-undef
  1007:41   error  'user_preferences' is not defined                             no-undef
  1008:72   error  'user_preferences' is not defined                             no-undef
  1011:33   error  'launch_app' is not defined                                   no-undef
  1047:29   error  'open_item' is not defined                                    no-undef
  1093:25   error  'launch_app' is not defined                                   no-undef
  1114:25   error  'empty_trash' is not defined                                  no-undef
  1127:29   error  'zipItems' is not defined                                     no-undef
  1129:29   error  'trigger_download' is not defined                             no-undef
  1140:25   error  'zipItems' is not defined                                     no-undef
  1151:41   error  'JSZip' is not defined                                        no-undef
  1180:25   error  'move_items' is not defined                                   no-undef
  1219:31   error  'clipboard' is not defined                                    no-undef
  1221:28   error  'clipboard_op' is not defined                                 no-undef
  1222:29   error  'copy_clipboard_items' is not defined                         no-undef
  1223:33   error  'clipboard_op' is not defined                                 no-undef
  1224:29   error  'move_clipboard_items' is not defined                         no-undef
  1247:25   error  'create_shortcut' is not defined                              no-undef
  1265:25   error  'move_items' is not defined                                   no-undef
  1265:47   error  'trash_path' is not defined                                   no-undef
  1290:35   error  'delete_item' is not defined                                  no-undef
  1292:63   error  'trash_path' is not defined                                   no-undef
  1299:67   error  'trash_path' is not defined                                   no-undef
  1299:128  error  'trash_path' is not defined                                   no-undef
  1300:57   error  'trash_path' is not defined                                   no-undef
  1313:25   error  'activate_item_name_editor' is not defined                    no-undef
  1373:9    error  'sort_items' is not defined                                   no-undef
  1376:9    error  'activate_item_name_editor' is not defined                    no-undef
  1433:31   error  'copy_to_clipboard' is not defined                            no-undef
  1517:9    error  'show_or_hide_empty_folder_message' is not defined            no-undef
2024-05-02 11:21:50 +01:00
Sam Atkins 9fc983f54a chore: Clarify usage of window fields in UIDesktop.js
/puter/src/UI/UIDesktop.js
    44:24   error  'gui_origin' is not defined                                   no-undef
    46:25   error  'auth_token' is not defined                                   no-undef
    86:5    error  'socket' is not defined                                       no-undef
    95:5    error  'socket' is not defined                                       no-undef
   104:5    error  'socket' is not defined                                       no-undef
   105:43   error  'trash_path' is not defined                                   no-undef
   106:45   error  'trash_path' is not defined                                   no-undef
   109:49   error  'trash_path' is not defined                                   no-undef
   112:5    error  'socket' is not defined                                       no-undef
   118:9    error  'launch_apps' is not defined                                  no-undef
   121:9    error  'launch_apps' is not defined                                  no-undef
   121:39   error  'launch_apps' is not defined                                  no-undef
   124:9    error  'launch_apps' is not defined                                  no-undef
   124:30   error  'launch_apps' is not defined                                  no-undef
   127:5    error  'socket' is not defined                                       no-undef
   146:5    error  'socket' is not defined                                       no-undef
   153:85   error  'truncate_filename' is not defined                            no-undef
   153:114  error  'TRUNCATE_LENGTH' is not defined                              no-undef
   156:77   error  'item_icon' is not defined                                    no-undef
   192:13   error  'update_window_path' is not defined                           no-undef
   199:13   error  'sort_items' is not defined                                   no-undef
   203:5    error  'socket' is not defined                                       no-undef
   206:9    error  'sendItemChangeEventToWatchingApps' is not defined            no-undef
   220:25   error  'fsentry.path' is assigned to itself                          no-self-assign
   233:17   error  'update_explorer_footer_item_count' is not defined            no-undef
   234:17   error  'update_explorer_footer_selected_items_count' is not defined  no-undef
   239:26   error  'trash_path' is not defined                                   no-undef
   249:17   error  'update_window_path' is not defined                           no-undef
   253:26   error  'trash_path' is not defined                                   no-undef
   280:25   error  'item_icon' is not defined                                    no-undef
   281:34   error  'trash_path' is not defined                                   no-undef
   287:39   error  'trash_path' is not defined                                   no-undef
   308:37   error  'item_icon' is not defined                                    no-undef
   319:17   error  'sort_items' is not defined                                   no-undef
   324:13   error  'sort_items' is not defined                                   no-undef
   328:5    error  'socket' is not defined                                       no-undef
   333:9    error  'refresh_user_data' is not defined                            no-undef
   336:5    error  'socket' is not defined                                       no-undef
   341:9    error  'refresh_user_data' is not defined                            no-undef
   344:5    error  'socket' is not defined                                       no-undef
   346:9    error  'sendItemChangeEventToWatchingApps' is not defined            no-undef
   360:85   error  'truncate_filename' is not defined                            no-undef
   360:114  error  'TRUNCATE_LENGTH' is not defined                              no-undef
   363:77   error  'item_icon' is not defined                                    no-undef
   398:13   error  'update_window_path' is not defined                           no-undef
   405:13   error  'sort_items' is not defined                                   no-undef
   409:5    error  'socket' is not defined                                       no-undef
   415:9    error  'sendItemChangeEventToWatchingApps' is not defined            no-undef
   440:81   error  'item_icon' is not defined                                    no-undef
   445:17   error  'sort_items' is not defined                                   no-undef
   455:29   error  'item_icon' is not defined                                    no-undef
   463:17   error  Duplicate key 'associated_app_name'                           no-dupe-keys
   470:17   error  'sort_items' is not defined                                   no-undef
   491:42   error  'desktop_path' is not defined                                 no-undef
   496:5    error  'getItem' is not defined                                      no-undef
   508:8    error  'url_query_params' is not defined                             no-undef
   525:9    error  'update_user_preferences' is not defined                      no-undef
   560:17   error  'upload_items' is not defined                                 no-undef
   560:52   error  'desktop_path' is not defined                                 no-undef
   577:16   error  'mouseover_window' is not defined                             no-undef
   585:69   error  'desktop_path' is not defined                                 no-undef
   613:17   error  'copy_items' is not defined                                   no-undef
   613:43   error  'desktop_path' is not defined                                 no-undef
   617:17   error  'move_items' is not defined                                   no-undef
   617:43   error  'desktop_path' is not defined                                 no-undef
   649:39   error  'is_auto_arrange_enabled' is not defined                      no-undef
   651:37   error  'is_auto_arrange_enabled' is not defined                      no-undef
   651:64   error  'is_auto_arrange_enabled' is not defined                      no-undef
   652:37   error  'store_auto_arrange_preference' is not defined                no-undef
   652:67   error  'is_auto_arrange_enabled' is not defined                      no-undef
   653:40   error  'is_auto_arrange_enabled' is not defined                      no-undef
   654:41   error  'sort_items' is not defined                                   no-undef
   655:41   error  'set_sort_by' is not defined                                  no-undef
   656:41   error  'clear_desktop_item_positions' is not defined                 no-undef
   658:41   error  'set_desktop_item_positions' is not defined                   no-undef
   668:44   error  'is_auto_arrange_enabled' is not defined                      no-undef
   671:37   error  'sort_items' is not defined                                   no-undef
   672:37   error  'set_sort_by' is not defined                                  no-undef
   677:44   error  'is_auto_arrange_enabled' is not defined                      no-undef
   680:37   error  'sort_items' is not defined                                   no-undef
   681:37   error  'set_sort_by' is not defined                                  no-undef
   686:44   error  'is_auto_arrange_enabled' is not defined                      no-undef
   689:37   error  'sort_items' is not defined                                   no-undef
   690:37   error  'set_sort_by' is not defined                                  no-undef
   695:44   error  'is_auto_arrange_enabled' is not defined                      no-undef
   698:37   error  'sort_items' is not defined                                   no-undef
   699:37   error  'set_sort_by' is not defined                                  no-undef
   708:44   error  'is_auto_arrange_enabled' is not defined                      no-undef
   712:37   error  'sort_items' is not defined                                   no-undef
   713:37   error  'set_sort_by' is not defined                                  no-undef
   718:44   error  'is_auto_arrange_enabled' is not defined                      no-undef
   722:37   error  'sort_items' is not defined                                   no-undef
   723:37   error  'set_sort_by' is not defined                                  no-undef
   757:43   error  'desktop_path' is not defined                                 no-undef
   767:35   error  'clipboard' is not defined                                    no-undef
   769:32   error  'clipboard_op' is not defined                                 no-undef
   770:33   error  'copy_clipboard_items' is not defined                         no-undef
   770:54   error  'desktop_path' is not defined                                 no-undef
   771:37   error  'clipboard_op' is not defined                                 no-undef
   772:33   error  'move_clipboard_items' is not defined                         no-undef
   780:35   error  'actions_history' is not defined                              no-undef
   782:29   error  'undo_last_action' is not defined                             no-undef
   791:29   error  'init_upload_using_dialog' is not defined                     no-undef
   818:9    error  'is_embedded' is not defined                                  no-undef
   911:12   error  'user' is not defined                                         no-undef
   922:13   error  'is_embedded' is not defined                                  no-undef
   940:8    error  'url_query_params' is not defined                             no-undef
   941:28   error  'url_query_params' is not defined                             no-undef
   943:35   error  'home_path' is not defined                                    no-undef
   944:16   error  'url_query_params' is not defined                             no-undef
   945:34   error  'url_query_params' is not defined                             no-undef
   950:29   error  'item_icon' is not defined                                    no-undef
   966:13   error  'launch_app' is not defined                                   no-undef
   967:23   error  'app_launched_from_url' is not defined                        no-undef
   970:25   error  'app_query_params' is not defined                             no-undef
  1017:40   error  'taskbar_height' is not defined                               no-undef
  1023:40   error  'user' is not defined                                         no-undef
  1024:9    error  'getItem' is not defined                                      no-undef
  1031:21   error  'setItem' is not defined                                      no-undef
  1125:47   error  'user' is not defined                                         no-undef
  1128:48   error  'user' is not defined                                         no-undef
  1131:25   error  'update_auth_data' is not defined                             no-undef
  1170:37   error  'listSupportedLanguages' is not defined                       no-undef
  1249:29   error  'logout' is not defined                                       no-undef
  1253:25   error  'logout' is not defined                                       no-undef
  1261:9    error  'is_fullscreen' is not defined                                no-undef
  1308:5    error  'launch_app' is not defined                                   no-undef
  1381:9    error  'launch_apps' is not defined                                  no-undef
  1460:14   error  'api_origin' is not defined                                   no-undef
  1468:40   error  'auth_token' is not defined                                   no-undef
  1488:14   error  'toolbar_height' is not defined                               no-undef
  1502:9    error  'reset_window_size_and_position' is not defined               no-undef
  1513:5    error  'refresh_desktop_background' is not defined                   no-undef
  1520:26   error  'window_border_radius' is not defined                         no-undef
2024-05-02 11:21:50 +01:00
Sam Atkins dd7361441d chore: Clarify usage of window fields in UIContextMenu.js
/puter/src/UI/UIContextMenu.js
   23:21  error  'global_element_id' is not defined      no-undef
  117:57  error  'taskbar_height' is not defined         no-undef
  118:52  error  'taskbar_height' is not defined         no-undef
  260:17  error  'make_taskbar_sortable' is not defined  no-undef
2024-05-02 11:21:50 +01:00
Sam Atkins 63347843cb chore: Clarify usage of window fields in UIAlert.js
/puter/src/UI/UIAlert.js
  26:12  error  'isString' is not defined  no-undef
2024-05-02 11:21:50 +01:00
Sam Atkins c2ef0a9578 chore: Clarify usage of window fields in Settings app
Solves these eslint issues:

/puter/src/UI/Settings/UITabAccount.js
  34:13   error  'user' is not defined  no-undef
  47:99   error  'user' is not defined  no-undef
  55:12   error  'user' is not defined  no-undef
  59:105  error  'user' is not defined  no-undef

/puter/src/UI/Settings/UITabLanguage.js
  35:37  error  'listSupportedLanguages' is not defined  no-undef

/puter/src/UI/Settings/UITabUsage.js
   45:18  error  'api_origin' is not defined   no-undef
   50:46  error  'auth_token' is not defined   no-undef
   54:21  error  'logout' is not defined       no-undef
   96:18  error  'api_origin' is not defined   no-undef
  101:46  error  'auth_token' is not defined   no-undef
  105:21  error  'logout' is not defined       no-undef
  116:51  error  'byte_format' is not defined  no-undef
  123:41  error  'byte_format' is not defined  no-undef
  124:45  error  'byte_format' is not defined  no-undef

/puter/src/UI/Settings/UIWindowChangeEmail.js
   96:18  error  'api_origin' is not defined  no-undef
  100:44  error  'auth_token' is not defined  no-undef

/puter/src/UI/Settings/UIWindowFinalizeUserDeletion.js
   29:12  error  'user' is not defined        no-undef
   97:16  error  'user' is not defined        no-undef
  115:22  error  'api_origin' is not defined  no-undef
  120:50  error  'auth_token' is not defined  no-undef
  127:25  error  'logout' is not defined      no-undef
  139:25  error  'logout' is not defined      no-undef

/puter/src/UI/Settings/UIWindowSettings.js
  48:162  error  'icons' is not defined  no-undef
  86:13   error  Duplicate key 'height'  no-dupe-keys
2024-05-02 11:21:50 +01:00
Sam Atkins d17e0b80b3 chore: Add missing import for node:console
Solves these eslint issues:

/puter/run-selfhosted.js
   49:9  error  'console' is not defined  no-undef
   64:5  error  'console' is not defined  no-undef
  127:5  error  'console' is not defined  no-undef
2024-05-02 11:21:50 +01:00
Sam Atkins 8d4a1e0ed3 fix: Add missing TextEncoder to PTT
Solves this eslint issue:

/puter/packages/terminal/src/pty/PTT.js
  35:29  error  'encoder' is not defined  no-undef
2024-05-02 11:21:50 +01:00
Sam Atkins 280479c0c6 chore: Clarify usage of window fields in IPC.js
Resolves these eslint errors:

/puter/src/IPC.js
    53:69  error  'appCallbackFunctions' is not defined                no-undef
    55:9   error  'appCallbackFunctions' is not defined                no-undef
    57:16  error  'appCallbackFunctions' is not defined                no-undef
    81:33  error  'window_for_app_instance' is not defined             no-undef
    84:27  error  'iframe_for_app_instance' is not defined             no-undef
   105:48  error  Empty block statement                                no-empty
   180:18  error  'api_origin' is not defined                          no-undef
   190:44  error  'auth_token' is not defined                          no-undef
   194:21  error  'logout' is not defined                              no-undef
   207:18  error  'api_origin' is not defined                          no-undef
   216:44  error  'auth_token' is not defined                          no-undef
   220:21  error  'logout' is not defined                              no-undef
   239:18  error  'api_origin' is not defined                          no-undef
   248:44  error  'auth_token' is not defined                          no-undef
   252:21  error  'logout' is not defined                              no-undef
   268:13  error  'is_auth' is not defined                             no-undef
   309:13  error  'is_auth' is not defined                             no-undef
   348:27  error  'window_for_app_instance' is not defined             no-undef
   360:27  error  'window_for_app_instance' is not defined             no-undef
   576:35  error  'uuidv4' is not defined                              no-undef
   582:9   error  'launch_app' is not defined                          no-undef
   597:37  error  'appdata_path' is not defined                        no-undef
   629:12  error  'appdata_signatures' is not defined                  no-undef
   633:23  error  'appdata_signatures' is not defined                  no-undef
   638:30  error  'appdata_path' is not defined                        no-undef
   647:25  error  'appdata_signatures' is not defined                  no-undef
   664:29  error  'appdata_signatures' is not defined                  no-undef
   682:13  error  'is_auth' is not defined                             no-undef
   717:13  error  'is_auth' is not defined                             no-undef
   745:13  error  'is_auth' is not defined                             no-undef
   773:13  error  'is_auth' is not defined                             no-undef
   783:22  error  'api_origin' is not defined                          no-undef
   793:48  error  'auth_token' is not defined                          no-undef
   797:25  error  'logout' is not defined                              no-undef
   825:13  error  'is_auth' is not defined                             no-undef
   857:36  error  'operation_id' is not defined                        no-undef
   872:41  error  'auth_token' is not defined                          no-undef
   873:41  error  'api_origin' is not defined                          no-undef
   939:45  error  'item_icon' is not defined                           no-undef
   951:33  error  'sort_items' is not defined                          no-undef
   954:29  error  'show_save_account_notice_if_needed' is not defined  no-undef
   998:38  error  'busy_indicator_hide_delay' is not defined           no-undef
  1004:33  error  'busy_indicator_hide_delay' is not defined           no-undef
  1018:37  error  'pictures_path' is not defined                       no-undef
  1020:37  error  'desktop_path' is not defined                        no-undef
  1022:37  error  'documents_path' is not defined                      no-undef
  1024:37  error  'videos_path' is not defined                         no-undef
  1026:37  error  'audio_path' is not defined                          no-undef
  1028:37  error  'appdata_path' is not defined                        no-undef
  1032:13  error  'is_auth' is not defined                             no-undef
  1044:28  error  'operation_id' is not defined                        no-undef
  1059:33  error  'auth_token' is not defined                          no-undef
  1060:33  error  'api_origin' is not defined                          no-undef
  1145:31  error  'iframe_for_app_instance' is not defined             no-undef
  1163:31  error  'window_for_app_instance' is not defined             no-undef
  1178:36  error  'get_apps' is not defined                            no-undef
  1199:11  error  'window_for_app_instance' is not defined             no-undef
2024-05-02 11:21:50 +01:00
Sam Atkins ca65ed1258 chore: Use this to refer to itemWatchCallbackFunctions field
Solves these eslint issues:

/puter/packages/puter-js/src/modules/UI.js
  418:20  error  'itemWatchCallbackFunctions' is not defined  no-undef
  418:74  error  'itemWatchCallbackFunctions' is not defined  no-undef
  419:21  error  'itemWatchCallbackFunctions' is not defined  no-undef
2024-05-02 11:21:50 +01:00
Sam Atkins 33785b3786 chore: Add missing imports for node:process 2024-05-02 11:21:50 +01:00
Sam Atkins 96e9c154bd chore: Fix a couple of regex related eslint issues
/puter/packages/phoenix/src/puter-shell/providers/ScriptCommandProvider.js
  27:38  error  Unnecessary escape character: \/  no-useless-escape

/puter/packages/phoenix/src/util/wrap-text.js
  24:33  error  Unexpected control character(s) in regular expression: \x1b  no-control-regex
2024-05-02 11:21:50 +01:00
Sam Atkins c8a20cadbf fix: Correct grep output when asking for line numbers
A couple of issues here:
- We didn't pass the line number to do_grep_line() so `i` was undefined
- Operator precedence messed with the ternary so when line numbers were
  requested, the line wouldn't be output.

Found thanks to this now-solved eslint issue:

/puter/packages/phoenix/src/puter-shell/coreutils/grep.js
  100:60  error  'i' is not defined  no-undef
2024-05-02 11:21:50 +01:00
Sam Atkins 71f8afab9a chore: Adjust comment for eslint
This was confusing its fallthrough detection:

/puter/packages/phoenix/src/puter-shell/coreutils/date.js
  132:21  error  Expected a 'break' statement before 'case'  no-fallthrough
2024-05-02 11:21:50 +01:00
Sam Atkins 6ad8f5e06a fix: Parse octal echo escapes
Found by this eslint issue:

/puter/packages/phoenix/src/puter-shell/coreutils/coreutil_lib/echo_escapes.js
  107:59  error  'hexchars' is not defined  no-undef
2024-05-02 11:21:50 +01:00
Sam Atkins 50d75cd2f9 refactor: Make loop condition non-constant
Resolves this eslint issue:

/puter/packages/phoenix/src/ansi-shell/readline/readline.js
  154:33  error  Unexpected constant condition  no-constant-condition
2024-05-02 11:21:50 +01:00
Sam Atkins 6d895dff42 chore: Remove empty block statement
Resolves this eslint issue:

/puter/packages/phoenix/src/ansi-shell/parsing/PuterShellParser.js
  25:9  error  Empty block statement  no-empty
2024-05-02 11:21:50 +01:00
Sam Atkins d4c2b492ef fix: Correct inverted instanceof check in SignalReader.read()
Also make tmp_value non-const because it gets modified later.

Solves these eslint issues:

/puter/packages/phoenix/src/ansi-shell/ioutil/SignalReader.js
  45:14  error  Unexpected negating the left operand of 'instanceof' operator  no-unsafe-negation
  46:13  error  'tmp_value' is constant                                        no-const-assign
2024-05-02 11:21:50 +01:00
Sam Atkins 64c886bfeb chore: Clarify setter to not return a value
Solves this eslint issue:

/puter/packages/phoenix/src/ansi-shell/ANSIShell.js
  86:23  error  Setter cannot return a value  no-setter-return
2024-05-02 11:21:50 +01:00
Sam Atkins 2094e05a2e chore: Comment out unreachable code in ExpectationService
The `return` looks temporary but I don't know this code well enough.

Solves this eslint issue:

/puter/packages/backend/src/services/runtime-analysis/ExpectationService.js
  94:9  error  Unreachable code  no-unreachable
2024-05-02 11:21:50 +01:00
Sam Atkins 0df0de6507 chore: Define def() and defv() using const
Fixes these eslint issues:

/puter/packages/backend/src/services/auth/TokenService.js
   3:1   error  'def' is not defined   no-undef
  18:1   error  'defv' is not defined  no-undef
  61:11  error  'def' is not defined   no-undef
  69:21  error  'defv' is not defined  no-undef
2024-05-02 11:21:50 +01:00
Sam Atkins 01ab6b88ea chore: Remove unused uses of uuid_user in save_account.js
The variable doesn't exist, and we never use it after this. Seems like a
copy-paste error.

Solves these eslint errors:

/puter/packages/backend/src/routers/save_account.js
  90:9   error  'uuid_user' is not defined  no-undef
  91:9   error  'uuid_user' is not defined  no-undef
  91:21  error  'uuid_user' is not defined  no-undef
2024-05-02 11:21:50 +01:00
Sam Atkins 9b3dd6b753 chore: Fix eslint issues in backend util
/puter/packages/backend/src/util/stdioutil.js
  26:24  error  Unexpected control character(s) in regular expression: \x1b  no-control-regex

/puter/packages/backend/src/util/streamutil.js
  368:1  error  'string_to_stream' is not defined  no-undef
  463:5  error  'string_to_stream' is not defined  no-undef

/puter/packages/backend/src/util/strutil.js
  42:1  error  'format_as_usd' is not defined  no-undef
  56:5  error  'format_as_usd' is not defined  no-undef
2024-05-02 11:21:50 +01:00
Sam Atkins 60523dc7a7 chore: Fix some eslint issues in services
/puter/packages/backend/src/services/ContextInitService.js
  57:18  error  'async_factory' is not defined  no-undef

/puter/packages/backend/src/services/StorageService.js
  22:5  error  Expected to call 'super()'  constructor-super

/puter/packages/backend/src/services/WebServerService.js
  258:35  error  'services' is not defined  no-undef

/puter/packages/backend/src/services/auth/AuthService.js
  52:13  error  Unreachable code  no-unreachable

/puter/packages/backend/src/services/drivers/implementations/BaseImplementation.js
   64:25  error  'services' is not defined  no-undef
   75:39  error  'services' is not defined  no-undef
  117:39  error  'services' is not defined  no-undef
  123:42  error  'services' is not defined  no-undef
  149:42  error  'services' is not defined  no-undef
  168:38  error  'services' is not defined  no-undef

/puter/packages/backend/src/services/drivers/implementations/PuterDriverProxy.js
  43:5  error  Expected to call 'super()'              constructor-super
  44:9  error  'this' is not allowed before 'super()'  no-this-before-super

/puter/packages/backend/src/services/drivers/meta/Construct.js
  125:9  error  Unreachable code  no-unreachable

/puter/packages/backend/src/services/runtime-analysis/PagerService.js
  49:41  error  'util' is not defined  no-undef
2024-05-02 11:21:50 +01:00
Sam Atkins ca3f9a823d chore: Fix some eslint issues in routers
/puter/packages/backend/src/routers/open_item.js
  48:10  error  Unexpected negating the left operand of 'instanceof' operator  no-unsafe-negation

/puter/packages/backend/src/routers/save_account.js
  106:34  error  'get_user' is not defined   no-undef

/puter/packages/backend/src/routers/sign.js
  37:10  error  Unexpected negating the left operand of 'instanceof' operator  no-unsafe-negation
2024-05-02 11:21:50 +01:00
Sam Atkins 0c0846eef9 chore: Fix some backend router eslint issues
/puter/packages/backend/src/routers/auth/list-permissions.js
  36:15  error  'APIError' is not defined  no-undef

/puter/packages/backend/src/routers/auth/list-sessions.js
  17:15  error  'APIError' is not defined  no-undef

/puter/packages/backend/src/routers/auth/revoke-user-app.js
  34:15  error  'APIError' is not defined  no-undef
  43:15  error  'APIError' is not defined  no-undef

/puter/packages/backend/src/routers/delete-site.js
  43:11  error  Unexpected empty object pattern  no-empty-pattern

/puter/packages/backend/src/routers/drivers/usage.js
  146:11  error  'k' is not defined  no-undef
  147:21  error  'k' is not defined  no-undef
  147:52  error  'k' is not defined  no-undef

/puter/packages/backend/src/routers/drivers/xd.js
  68:5  error  'window' is not defined  no-undef
  69:21  error  Parsing error: The keyword 'interface' is reserved

/puter/packages/backend/src/routers/filesystem_api/batch/all.js
   51:21  error  'get_app' is not defined       no-undef
  224:13  error  Unexpected constant condition  no-constant-condition

/puter/packages/backend/src/routers/filesystem_api/copy.js
   70:10  error  Unexpected constant condition  no-constant-condition
  106:13  error  Duplicate key 'new_name'       no-dupe-keys

/puter/packages/backend/src/routers/filesystem_api/read.js
  80:5  error  Unreachable code  no-unreachable

/puter/packages/backend/src/routers/filesystem_api/token-read.js
   53:9  error  Unreachable code  no-unreachable
   58:9  error  Unreachable code  no-unreachable
  104:5  error  Unreachable code  no-unreachable

/puter/packages/backend/src/routers/hosting/puter-site.js
  65:21  error  Unexpected constant nullishness on the left-hand side of a `??` expression  no-constant-binary-expression
2024-05-02 11:21:50 +01:00
Sam Atkins b4af28a91b chore: Miscellaneous eslint fixes
/puter/packages/backend/src/om/entitystorage/ValidationES.js
  89:25  error  Do not assign to the exception parameter  no-ex-assign

/puter/packages/backend/src/om/proptypes/__all__.js
  166:17  warning  Unexpected 'debugger' statement  no-debugger

/puter/packages/backend/src/routers/_default.js
  405:31  error  'err' is not defined  no-undef
2024-05-02 11:21:50 +01:00
Sam Atkins 4879ee93bf chore: Fix eslint errors in backend/src/helpers.js
/puter/packages/backend/src/helpers.js
   682:9   error  'sharing_users' is not defined     no-undef
   689:12  error  'sharing_users' is not defined     no-undef
   690:28  error  'sharing_users' is not defined     no-undef
   695:28  error  'sharing_users' is not defined     no-undef
   720:9   error  'shared_fsentries' is not defined  no-undef
   733:12  error  'shared_fsentries' is not defined  no-undef
   734:28  error  'shared_fsentries' is not defined  no-undef
   735:17  error  'shared_fsentries' is not defined  no-undef
   735:58  error  'shared_fsentries' is not defined  no-undef
   736:31  error  'shared_fsentries' is not defined  no-undef
   900:57  error  'e' is not defined                 no-undef
  1849:18  error  Empty block statement              no-empty
2024-05-02 11:21:50 +01:00
Sam Atkins 8ab1cd0ca8 chore: Remove unused 'connective' source files 2024-05-02 11:21:50 +01:00
Sam Atkins 11f3e29604 chore: Disable eslint checks on puter-js tests
These currently work in a way that's different from what eslint expects,
so disable it. At some point it would be good if it could check them
(and if the tests could run on CI) but right now they just make a lot of
noise.
2024-05-02 11:21:50 +01:00
Sam Atkins 8cf6379de3 chore: Correct eslint errors in backend filesystem
Removes or disables the following eslint errors/warnings:

/puter/packages/backend/src/api/filesystem/FlagParam.js
  33:19  error  'APIError' is not defined  no-undef
  47:19  error  'APIError' is not defined  no-undef
  58:15  error  'APIError' is not defined  no-undef

/puter/packages/backend/src/api/filesystem/StringParam.js
  32:19  error  'APIError' is not defined  no-undef
  39:13  error  'APIError' is not defined  no-undef
  46:19  error  'APIError' is not defined  no-undef

/puter/packages/backend/src/filesystem/FilesystemService.js
  141:17  warning  Unexpected 'debugger' statement  no-debugger
  366:21  error    'services' is not defined        no-undef

/puter/packages/backend/src/filesystem/batch/BatchExecutor.js
  121:21  error  Do not assign to the exception parameter  no-ex-assign

/puter/packages/backend/src/filesystem/hl_operations/hl_data_read.js
  44:19  error  'APIError' is not defined     no-undef
  47:22  error  'chkperm' is not defined      no-undef
  48:19  error  'APIError' is not defined     no-undef
  51:29  error  'LLRead' is not defined       no-undef
  54:13  error  'version_id' is not defined   no-undef
  88:35  error  'PassThrough' is not defined  no-undef

/puter/packages/backend/src/filesystem/hl_operations/hl_mkdir.js
  68:49  error  'fs' is not defined  no-undef

/puter/packages/backend/src/filesystem/hl_operations/hl_move.js
  102:33  error  'get_user' is not defined  no-undef
  104:35  error  'get_user' is not defined  no-undef
  110:33  error  'df' is not defined        no-undef

/puter/packages/backend/src/filesystem/hl_operations/hl_read.js
  54:13  error  'stream' is constant  no-const-assign

/puter/packages/backend/src/filesystem/hl_operations/hl_stat.js
  40:37  error  'APIError' is not defined  no-undef

/puter/packages/backend/src/filesystem/lib/PuterPath.js
  67:5  error  Expected to return a value in getter 'hasRelativePortion'  getter-return

/puter/packages/backend/src/filesystem/ll_operations/ll_copy_idea.js
   53:21  error  'UploadProgressTracker' is not defined   no-undef
   73:17  error  'PuterS3StorageStrategy' is not defined  no-undef
  137:22  error  'LLFilesystemOperation' is not defined   no-undef

/puter/packages/backend/src/filesystem/ll_operations/ll_read.js
  102:65  error  'offset' is not defined  no-undef
  102:73  error  'offset' is not defined  no-undef
  102:80  error  'length' is not defined  no-undef

/puter/packages/backend/src/filesystem/ll_operations/ll_rmnode.js
  43:23  error  'APIError' is not defined  no-undef

/puter/packages/backend/src/filesystem/storage/SystemFSEntryService.js
  101:26  error  '_path' is not defined  no-undef

/puter/packages/backend/src/filesystem/validation.js
  27:29  error  Unexpected control character(s) in regular expression: \x00, \x1f  no-control-regex
  28:29  error  Unexpected control character(s) in regular expression: \x00, \x1f  no-control-regex
  28:31  error  Unnecessary escape character: \/                                   no-useless-escape
2024-05-02 11:21:50 +01:00
Sam Atkins 4a426ce045 chore: Remove duplicate translation keys 2024-05-02 11:21:50 +01:00
Sam Atkins 25b35769c5 chore: Set-up eslint
eslint is a static analysis tool that tries to identify bugs and
mistakes in the code. We have quite a variety of code in this repo so
the config is a little complicated, but I've tried to make it clear.
It's found a *lot* of issues (over 1700), and while many of which will
not be actual problems, (it doesn't like us using window properties
without `window.`,) but some definitely are.
2024-05-02 11:21:50 +01:00
Nariman Jelveh 4b0c474537 Merge pull request #363 from AtkinsSJ/document-selfhost-limitations
docs: Explain self-host differences
2024-05-01 11:09:37 -07:00
Sam Atkins a74b8e32fa docs: Explain self-host differences 2024-04-30 16:29:57 +01:00
Sam Atkins 251368e749 docs: Link to sections in README 2024-04-30 16:29:47 +01:00
Nariman Jelveh 0b1f963f0b Add fun HN badges! 2024-04-30 00:01:36 -07:00
Nariman Jelveh 4ea54823b0 Merge pull request #360 from Bashamega/bashamega-patch
Fixes the scroll bar
2024-04-29 22:20:33 -07:00
Bashamega c6ffa6e9e1 fix 2024-04-30 06:48:11 +03:00
KernelDeimos 8e6ee9ea79 Fix oversight in token compression 2024-04-29 22:48:10 -04:00
KernelDeimos e7e7363fa7 Drop useless header 2024-04-29 22:34:19 -04:00
KernelDeimos 5a76bad28d fix: reduce token lengths 2024-04-29 21:46:02 -04:00
KernelDeimos c1e4eeec32 Add TokenService and test utility 2024-04-29 21:11:31 -04:00
KernelDeimos d2de46edfb fix: increase QR code size 2024-04-29 19:48:01 -04:00
KernelDeimos 04432df554 feat: improve password recovery experience 2024-04-29 19:26:29 -04:00
KernelDeimos c44028f413 refactor: normalize email calls 2024-04-29 17:34:24 -04:00
Nariman Jelveh 8cad610a54 more sanitization, just in case 2024-04-29 14:09:54 -07:00
Nariman Jelveh f807a28e95 bugfix 2024-04-29 12:05:41 -07:00
KernelDeimos 4c1d5a4b6d fix: fix error handling for outdated node versions 2024-04-29 02:42:04 -04:00
Nariman Jelveh ecfbc44a20 safely escape settings strings 2024-04-28 16:02:54 -07:00
Nariman Jelveh 63c81d6fff Update UITabAccount.js 2024-04-27 19:29:44 -07:00
Nariman Jelveh 42d85abfc2 Update WebServerService.js 2024-04-27 19:10:10 -07:00
Nariman Jelveh fd4e2f59dc Update WebServerService.js 2024-04-27 19:03:48 -07:00
Nariman Jelveh 053728a03f Validate the Host header before responding to requests 2024-04-27 18:52:01 -07:00
Nariman Jelveh 92f6c8003b Merge pull request #352 from enweazudaniel/main
Language: Add Igbo translations
2024-04-27 14:49:28 -07:00
Nariman Jelveh 826afd7653 change en to ig for object name 2024-04-27 14:38:18 -07:00
enweazudaniel 0df9519f76 Language: Add Igbo 2024-04-27 12:06:29 +01:00
enweazudaniel d5d0f67797 Language: Add (Igbo) ig.js 2024-04-27 12:03:18 +01:00
Nariman Jelveh 219cc94fbf Merge branch 'main' of https://github.com/HeyPuter/puter into main 2024-04-26 19:13:34 -07:00
Nariman Jelveh bfa6419070 Update helpers.js 2024-04-26 19:13:22 -07:00
KernelDeimos d7d6ff0cca Rate limit updates 2024-04-26 21:02:01 -04:00
KernelDeimos 79d6f64451 Notify old email when email change is initiated 2024-04-26 21:02:01 -04:00
Nariman Jelveh fd59a6c994 Merge branch 'main' of https://github.com/HeyPuter/puter into main 2024-04-26 15:36:22 -07:00
Nariman Jelveh cb4776cc0e do not append question mark to app URL if there is no query params to append 2024-04-26 15:36:15 -07:00
Eric Dubé 2ee00ca8e6 Revert "fix(security): Prevent email enumeration" (#351) 2024-04-26 18:22:14 -04:00
Nariman Jelveh a3ec7bb5ad Fix the issue with context submenu not closing parent menu when clicked 2024-04-25 23:14:39 -07:00
Nariman Jelveh faa72fd97c Update UIWindow.js 2024-04-25 23:10:03 -07:00
Nariman Jelveh 378b87459a Add robust hostname comparison for when declaring an environment as GUI 2024-04-25 17:51:20 -07:00
KernelDeimos 30f17ade3a fix: use primary read in signup 2024-04-25 19:46:39 -04:00
KernelDeimos ecec8bf75d Use pread for signup page 2024-04-25 19:44:06 -04:00
KernelDeimos 736ebb6f28 Improve server health service 2024-04-25 19:39:18 -04:00
Nariman Jelveh 928dd90f61 Merge pull request #346 from youngsiiimba/main
fix(security): Prevent email enumeration
2024-04-25 14:59:56 -07:00
KernelDeimos eb166a67a9 fix(security): Fix session revocation 2024-04-25 16:19:46 -04:00
Nariman Jelveh 51a6d1ea1d Allow the <p> tag in UIAlert body 2024-04-25 13:19:03 -07:00
Nariman Jelveh 3cce0e88df Revert "Allow the <p> tag in UIAlert body"
This reverts commit e2dcc813ec.
2024-04-25 13:18:37 -07:00
Nariman Jelveh e2dcc813ec Allow the <p> tag in UIAlert body 2024-04-25 13:18:28 -07:00
Nariman Jelveh a572a0a640 Merge pull request #341 from Xiayucheng1212/pass_locale
Pass locale to the iframe url whenever accessing an app
2024-04-25 13:14:16 -07:00
Nariman Jelveh c4b2d9861f Clean up some of the unnecessary console warnings 2024-04-25 13:11:11 -07:00
Simba Chawanda ed70314686 fix(security): Prevent email enumeration 2024-04-25 09:27:37 +02:00
Nariman Jelveh f5f35f2c37 Phase out openItem in IPC
also fix the issue with directories being opened with notepad after setting notepad as default app for files without extensions.
2024-04-24 23:12:57 -07:00
KernelDeimos ccf1afc93c feat(security): add ip rate limiting 2024-04-24 22:35:40 -04:00
KernelDeimos 7800ef6102 fix(security): skip cache when checking old passwd 2024-04-24 22:28:27 -04:00
Nariman Jelveh 25eea41f60 Keep track of app_instance_ids 2024-04-24 17:57:30 -07:00
Nariman Jelveh c21c16026b Update ko.js 2024-04-24 14:43:07 -07:00
KernelDeimos 74e9270d58 Fix 2024-04-24 16:16:31 -04:00
KernelDeimos b2e72adba9 Add ratelimit for /confirm-email 2024-04-24 16:12:09 -04:00
KernelDeimos 1eac147918 Add ratelimit for /contactUs 2024-04-24 16:09:04 -04:00
スーチ・ファトマワティ 3f6f4bb4c0 fix(security): update follow-redirects
When using axios, its dependency follow-redirects only clears authorization header during cross-domain redirect, but allows the proxy-authentication header which contains credentials too.

## Steps To Reproduce & PoC
```js
const axios = require('axios');

axios.get('http://127.0.0.1:10081/', {
 headers: {
 'AuThorization': 'Rear Test',
 'ProXy-AuthoriZation': 'Rear Test',
 'coOkie': 't=1'
 }
})
 .then((response) => {
 console.log(response);
 })
```
When I meet the cross-domain redirect, the sensitive headers like authorization and cookie are cleared, but proxy-authentication header is kept.

```diff
- removeMatchingHeaders(/^(?:authorization|cookie)$/i, this._options.headers);
+ removeMatchingHeaders(/^(?:authorization|proxy-authorization|cookie)$/i, this._options.headers);
```
CWE-200
`CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N`
CVE-2024-28849
2024-04-24 15:23:47 -04:00
Sam Atkins a8d1d3b87a docs: Add help text to dcall utility (#335) 2024-04-24 15:21:31 -04:00
Nariman Jelveh fb3dfc5672 Merge branch 'main' of https://github.com/HeyPuter/puter into main 2024-04-24 12:06:16 -07:00
Nariman Jelveh cdd0231a76 translation fix 2024-04-24 12:06:05 -07:00
Eric Dubé e9e43c059a Merge pull request #342 from brhahlen/docker-ci-improvements
Update Docker CI
2024-04-24 15:04:29 -04:00
Nariman Jelveh 548e975cac remove unused imports, sanitization, and validation of input 2024-04-24 10:05:53 -07:00
Sam Atkins cf0eee1fa3 feat: Add command names to phoenix tab-completion
Gives CommandProviders a `complete(query, {ctx})` method where they can provide completed command names, and then make use of this in CommandCompleter.

Supported CommandProvider sources:
- Shell built-ins (was supported previously)
- PATH executables (when running under Node)
- Puter app names (when running in Puter)

Script filenames are not yet supported.
2024-04-24 15:08:54 +01:00
Sam Atkins dc5b010d09 feat: Allow querying puter-apps driver by partial app names 2024-04-24 15:08:54 +01:00
Sam Atkins a854a0dc0a feat: Implement 'Like' predicate in entity storage
This acts like the SQL 'LIKE' keyword, allowing partial string matches.
2024-04-24 15:08:54 +01:00
Sam Atkins d733119456 fix: Make PathCommandProvider reject queries with path separators
`../bin/foo` should only find `foo` relative to the current working
directory, not to directories in PATH.

Also switch to using the Node path library since PathCommandProvider is
Node-only, and this means getting the correct path separator and
delimiter values on Windows.
2024-04-24 11:45:21 +01:00
Sam Atkins 670673ab8d Rename FooCompleter js files to match FooCommandProvider file names 2024-04-24 11:19:25 +01:00
Ben Hählen 028b37b9d4 Update Docker CI 2024-04-24 11:29:44 +02:00
Xiayucheng1212 916e1bb95c Add local to url 2024-04-24 16:40:42 +08:00
Nariman Jelveh c9e8207e4b Clean up the console warninf message 2024-04-23 23:53:15 -07:00
Nariman Jelveh aef6df048c allow the <strong> tag in UIAlert 2024-04-23 23:06:04 -07:00
Nariman Jelveh f8b2b18185 Update en.js 2024-04-23 22:49:16 -07:00
Nariman Jelveh ce411ed728 Perform more advanced input and string sanitization and validation for performance and security 2024-04-23 22:46:33 -07:00
Nariman Jelveh 9859a32e15 Deprecate and remove UIWindowConfirmDownload 2024-04-23 16:35:28 -07:00
Nariman Jelveh 3be7af8fb8 Merge branch 'main' of https://github.com/HeyPuter/puter into main 2024-04-23 16:26:07 -07:00
Nariman Jelveh 5538649125 Update UIAlert.js 2024-04-23 16:25:57 -07:00
Eric Dubé 97ee951b1f Merge pull request #339 from HeyPuter/eric/rate-limits
Add ip rate limiting to some endpoints
2024-04-23 19:24:17 -04:00
KernelDeimos 44aac16991 Add ip rate limiting 2024-04-23 19:13:37 -04:00
Nariman Jelveh ab5fee1562 deprecate UIWindowGetCopyLink as it's not supported by the backend 2024-04-23 15:43:55 -07:00
KernelDeimos 65a73b5b45 Rename workspace modules to avoid confusion 2024-04-23 04:06:15 -04:00
KernelDeimos 74e213a534 fix(security): always use application/octet-stream 2024-04-22 23:54:03 -04:00
KernelDeimos f9d561d40b docs: document purpose of scary-looking token 2024-04-22 23:48:45 -04:00
Nariman Jelveh 5066128c72 Merge pull request #329 from Eric-Lighthall/desktop-bg-revert
feat: add option to change desktop background to default
2024-04-22 20:26:39 -07:00
Eric Dubé a2de5e3da2 Merge pull request #328 from HeyPuter/release-please--branches--main--components--puter.com
chore(main): release 2.2.0
2024-04-22 22:05:35 -04:00
github-actions[bot] 458f2eae4c chore(main): release 2.2.0 2024-04-23 02:03:34 +00:00
KernelDeimos c166560ff4 feat: add /healthcheck endpoint 2024-04-22 22:02:40 -04:00
Eric Lighthall 03f05f316f feat: add option to change desktop background to default
users can now select 'default' as their desktop background
2024-04-22 18:26:15 -07:00
Eric DubéandNariman Jelveh 331d9e7542 feat: allow apps to add a menubar via puter.js
* Begin work on menubar and dropdowns

* Improve menubar

* Fix pointer event behavior

* Fix labels

* Fix active button

* Eliminate flicker

* Update _default.js

---------

Co-authored-by: Nariman Jelveh <[email protected]>
2024-04-22 20:38:16 -04:00
Eric Dubé ec31007c4b Update main.yml 2024-04-22 19:23:03 -04:00
Eric Dubé e615c7ee7f Update main.yml 2024-04-22 19:15:59 -04:00
Eric Dubé 35d4d4f755 Update main.yml 2024-04-22 19:14:21 -04:00
Eric Dubé 195468c4e1 Update main.yml 2024-04-22 19:11:51 -04:00
Eric Dubé 15f274e662 Create main.yml 2024-04-22 19:06:59 -04:00
lsileoni f1dedf5a74 Proper order for moving the compressed file into the static directory 2024-04-11 21:39:07 +03:00
lsileoni 2ebda29f02 Don't bind manager to window for now 2024-04-11 21:38:36 +03:00
lsileoni fa841582a9 Added temporary package.json, so node doens't refer to the repo root package.json 2024-04-11 20:54:21 +03:00
lsileoni 2b28388fa7 Changes to module imports for parity between the browser and node, fixed browser and node examples 2024-04-11 20:53:48 +03:00
lsileoni a6b7ec5c66 Clean up index.html usage example 2024-04-11 20:52:47 +03:00
lsileoni 902a242f6b Rebuilding logic and zstd compression for v86starter 2024-04-11 19:15:58 +03:00
lsileoni d6a327ea86 Changed vm build target directory to /tmp because of package.json issue 2024-04-11 15:51:50 +03:00
lsileoni 21ef0598f9 Also ignore wasm blobs 2024-04-11 15:49:46 +03:00
lsileoni 2405ee90e9 Ignore generated .bin files 2024-04-11 15:48:31 +03:00
lsileoni 4815eb10a9 Don't bind to all interfaces by default in web server 2024-04-11 12:41:17 +03:00
lsileoni d13efbbe23 Changed vm dir to make_container in starter script 2024-04-11 12:25:21 +03:00
Luis 9b1fbea7e1 Merge branch 'HeyPuter:main' into main 2024-04-11 12:23:16 +03:00
lsileoni 4054e822ed Barebones x86emu skeleton 2024-04-02 18:25:21 +03:00
2136 changed files with 279638 additions and 180273 deletions

No files matched your search

+36
View File
@@ -1,4 +1,40 @@
.dockerignore
Dockerfile
docker-compose.yml
# Dev / build artifacts (recreated inside the build stage)
node_modules
dist
src/gui/dist
src/puter-js/dist
*.tsbuildinfo
# Local runtime data
volatile
config.json
config.dev.json
/puter
# OS / editor
.DS_Store
.vscode
.idea
# Git / CI
.git
.github
# Logs
*.log
npm-debug.log*
.npm
# Tests / coverage
coverage
.nyc_output
# Secrets
.env
.env.*
creds*
*.pem
+18 -1
View File
@@ -1 +1,18 @@
PORT=4000
# Copy this file to `.env`, fill in the secrets, and `docker compose -f
# docker-compose.full.yml up -d`. None of the defaults below are safe for
# anything beyond a local laptop test.
# ── Public-facing ports (nginx) ---------------------------------------
HTTP_PORT=80
# HTTPS_PORT=443 # uncomment after you enable TLS in nginx/nginx.conf
# ── MariaDB ------------------------------------------------------------
MARIADB_ROOT_PASSWORD=replace-with-strong-password
MARIADB_DATABASE=puter
MARIADB_USER=puter
MARIADB_PASSWORD=replace-with-strong-password
# ── S3 (RustFS) --------------------------------------------------------
S3_ACCESS_KEY=puter
S3_SECRET_KEY=replace-with-strong-secret
S3_BUCKET=puter-local
+1
View File
@@ -0,0 +1 @@
github: ['HeyPuter']
-25
View File
@@ -1,25 +0,0 @@
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: ''
assignees: ''
---
**Issue Description**
**Steps to Reproduce**
**Expected & Actual Behavior**
**Addition Information or Screenshots (if applicable)**
**Deployment**
- [ ] Production (puter.com)
- [ ] Development (`npm run start`)
- [ ] Docker (via `docker run`)
- [ ] Docker (via `docker-compose`)
**Puter version (if accessible)**
> Click the profile button on the top-right, then "Settings". The version number will be printed at the bottom
-10
View File
@@ -1,10 +0,0 @@
---
name: Driver Request
about: Request a driver on Puter
title: ''
labels: ''
assignees: ''
---
> Drivers are services that apps on Puter can use. For example, drivers support many of the features in the [Puter SDK](https://docs.puter.com/). If you're not sure if what you're suggesting is a driver, you should use the "Feature Request" template instead.
-10
View File
@@ -1,10 +0,0 @@
---
name: Feature request
about: Suggest an idea for Puter
title: ''
labels: idea
assignees: ''
---
@@ -1,10 +0,0 @@
---
name: Idea for Improvement
about: An enhancement for an existing feature on Puter
title: ''
labels: enhancement
assignees: ''
---
@@ -0,0 +1,49 @@
name: AI Provider Integration Tests
# Hits real provider APIs with cheap models, so this workflow is
# manually triggered only. Each provider's test reads its credential
# from PUTER_TEST_AI_<PROVIDER>_API_KEY and skips itself silently if
# the secret is missing.
on:
workflow_dispatch:
permissions:
contents: read
jobs:
ai-test:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: '24'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Run AI provider integration tests
# Vitest treats positional args as filename substring filters.
# The pattern matches every `*.integration.test.ts` file and
# nothing else — the regular backend test suite stays out.
run: npm run test:backend -- integration.test
env:
CI: 'true'
PUTER_TEST_AI_CLAUDE_API_KEY: ${{ secrets.PUTER_TEST_AI_CLAUDE_API_KEY }}
PUTER_TEST_AI_OPENAI_API_KEY: ${{ secrets.PUTER_TEST_AI_OPENAI_API_KEY }}
PUTER_TEST_AI_GEMINI_API_KEY: ${{ secrets.PUTER_TEST_AI_GEMINI_API_KEY }}
PUTER_TEST_AI_GROQ_API_KEY: ${{ secrets.PUTER_TEST_AI_GROQ_API_KEY }}
PUTER_TEST_AI_MISTRAL_API_KEY: ${{ secrets.PUTER_TEST_AI_MISTRAL_API_KEY }}
PUTER_TEST_AI_DEEPSEEK_API_KEY: ${{ secrets.PUTER_TEST_AI_DEEPSEEK_API_KEY }}
PUTER_TEST_AI_XAI_API_KEY: ${{ secrets.PUTER_TEST_AI_XAI_API_KEY }}
PUTER_TEST_AI_OPENROUTER_API_KEY: ${{ secrets.PUTER_TEST_AI_OPENROUTER_API_KEY }}
PUTER_TEST_AI_TOGETHER_API_KEY: ${{ secrets.PUTER_TEST_AI_TOGETHER_API_KEY }}
PUTER_TEST_AI_MOONSHOT_API_KEY: ${{ secrets.PUTER_TEST_AI_MOONSHOT_API_KEY }}
PUTER_TEST_AI_ZAI_API_KEY: ${{ secrets.PUTER_TEST_AI_ZAI_API_KEY }}
PUTER_TEST_AI_ELEVENLABS_API_KEY: ${{ secrets.PUTER_TEST_AI_ELEVENLABS_API_KEY }}
+77
View File
@@ -0,0 +1,77 @@
name: Backend Tests
on:
pull_request:
types: [opened, synchronize, reopened]
permissions:
contents: read
pull-requests: write
jobs:
test:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
include:
- ref: ${{ github.base_ref }}
artifact: base
- ref: ${{ github.head_ref }}
artifact: pr
steps:
- name: Checkout ${{ matrix.ref }}
uses: actions/checkout@v4
with:
ref: ${{ matrix.ref }}
repository: ${{ github.event.pull_request.head.repo.full_name }}
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: '24'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Run backend tests with coverage
run: npm run test:backend -- --coverage
env:
CI: 'true'
- name: Upload coverage artifact
if: always()
uses: actions/upload-artifact@v4
with:
name: backend-coverage-${{ matrix.artifact }}
path: src/backend/coverage/
retention-days: 14
report-coverage:
needs: test
if: always()
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Download PR coverage
uses: actions/download-artifact@v4
with:
name: backend-coverage-pr
path: src/backend/coverage
- name: Download base coverage
uses: actions/download-artifact@v4
with:
name: backend-coverage-base
path: coverage-base
- name: Report coverage on PR
uses: davelosert/vitest-coverage-report-action@v2
with:
json-summary-path: src/backend/coverage/coverage-summary.json
json-final-path: src/backend/coverage/coverage-final.json
json-summary-compare-path: coverage-base/coverage-summary.json
-31
View File
@@ -1,31 +0,0 @@
# This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-nodejs
name: Node.js CI
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [16.x, 18.x, 20.x, 21.x]
# See supported Node.js release schedule at https://nodejs.org/en/about/releases/
steps:
- uses: actions/checkout@v4
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
cache: 'npm'
- run: npm ci
- run: npm run build --if-present
- run: npm test
-28
View File
@@ -1,28 +0,0 @@
# This workflow runs the tools/check-translations.js script to make sure that the translation data is valid.
name: Check Translations
env:
NODE_VERSION: 21.x
# See supported Node.js release schedule at https://nodejs.org/en/about/releases/
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Use Node.js ${{ env.NODE_VERSION }}
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: 'npm'
cache-dependency-path: ./package-lock.json
- run: npm ci
- run: npm run check-translations
+88 -73
View File
@@ -1,86 +1,101 @@
#
name: Docker Image CI
# Configures this workflow to run every time a change is pushed to the
# branch called `main`.
# Two ways in:
# - push of a calver tag (YY.MM or YY.MM.p) → publishes <version>, latest, main
# - workflow_dispatch → publishes latest + main from whichever ref the user
# picks in the Actions UI. Used to fast-forward :latest/:main when the
# branch has moved ahead of the most recent release tag.
on:
push:
branches: ['release']
push:
tags:
- '[0-9][0-9].[0-9][0-9]'
- '[0-9][0-9].[0-9][0-9].[0-9]*'
workflow_dispatch:
inputs:
push_latest:
description: 'Push :latest tag'
type: boolean
default: true
push_main:
description: 'Push :main tag'
type: boolean
default: true
# Defines two custom environment variables for the workflow. These are used
# for the Container registry domain, and a name for the Docker image that
# this workflow builds.
env:
REGISTRY: ghcr.io
IMAGE_NAME: ${{ github.repository }}
REGISTRY: ghcr.io
IMAGE_NAME: ${{ github.repository }}
# There is a single job in this workflow. It's configured to run on the
# latest available version of Ubuntu.
jobs:
build-and-push-image:
runs-on: ubuntu-latest
build-and-push-image:
runs-on: ubuntu-latest
# Sets the permissions granted to the `GITHUB_TOKEN` for the actions
# in this job.
permissions:
contents: read
packages: write
permissions:
contents: read
packages: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
steps:
- name: Validate calver tag
if: github.event_name == 'push'
env:
REF_NAME: ${{ github.ref_name }}
run: |
if ! [[ "$REF_NAME" =~ ^[0-9]{2}\.[0-9]{2}(\.[0-9]+)?$ ]]; then
echo "Tag '$REF_NAME' does not match YY.MM or YY.MM.p calver format."
exit 1
fi
# Uses the `docker/login-action` action to log in to the Container
# registry using the account and password that will publish the packages.
# Once published, the packages are scoped to the account defined here.
- name: Log in to GitHub Package Container registry
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Log in to GitHub Package Container registry
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
# This step uses [docker/metadata-action](https://github.com/docker/metadata-action#about)
# to extract tags and labels that will be applied to the specified image.
# The `id` "meta" allows the output of this step to be referenced in
# a subsequent step. The `images` value provides the base name for the
# tags and labels.
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
tags: |
type=schedule
type=ref,event=branch
type=ref,event=pr
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
type=semver,pattern={{major}},enable=${{ !startsWith(github.ref, 'refs/tags/v0.') }}
type=sha
type=raw,value=latest,enable=${{ github.ref == format('refs/heads/{0}', github.event.repository.default_branch) }}
- name: Log in to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
# This step uses the `docker/build-push-action` action to build the
# image, based on your repository's `Dockerfile`. If the build succeeds,
# it pushes the image to GitHub Packages.
# It uses the `context` parameter to define the build's context as the
# set of files located in the specified path. For more information, see
# "[Usage](https://github.com/docker/build-push-action#usage)" in the
# README of the `docker/build-push-action` repository.
# It uses the `tags` and `labels` parameters to tag and label the image
# with the output from the "meta" step.
- name: Build and push Docker image
uses: docker/build-push-action@v5
with:
platforms: linux/amd64,linux/arm64
context: .
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@v5
with:
images: |
${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
heyputer/puter
# type=ref,event=tag only emits on tag pushes, so manual runs skip
# the calver tag and just publish whichever of latest / main the
# dispatch inputs asked for. On a tag push, both default to true.
tags: |
type=ref,event=tag
type=raw,value=latest,enable=${{ github.event_name == 'push' || inputs.push_latest }}
type=raw,value=main,enable=${{ github.event_name == 'push' || inputs.push_main }}
- name: Build and push Docker image
uses: docker/build-push-action@v5
with:
platforms: linux/amd64,linux/arm64
context: .
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max
- name: Sync README to Docker Hub
uses: peter-evans/dockerhub-description@v4
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
repository: heyputer/puter
readme-filepath: ./README.md
+40
View File
@@ -0,0 +1,40 @@
name: Maintain Release Merge PR
on:
push:
branches:
- main
jobs:
update-release-pr:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup Git
run: |
git config user.name github-actions
git config user.email [email protected]
- name: Check for existing PR
id: find-pr
uses: juliangruber/find-pull-request-action@v1
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
branch: release
- uses: actions/checkout@v4
if: steps.find-pr.outputs.number == ''
with:
ref: release
- name: Reset release branch
if: steps.find-pr.outputs.number == ''
run: |
git fetch origin main:main
git reset --hard main
- name: Create/Update PR
if: steps.find-pr.outputs.number == ''
uses: peter-evans/create-pull-request@v6
with:
token: ${{ secrets.GITHUB_TOKEN }}
commit-message: Update release branch
title: Merge Release Auto-PR
body: Merging this PR will invoke release actions
branch: auto-update/release
+18
View File
@@ -0,0 +1,18 @@
name: Notify HeyPuter
on:
push:
branches:
- main
jobs:
notify:
runs-on: ubuntu-latest
steps:
- name: Trigger heyputer build
run: |
curl -X POST \
-H "Authorization: token ${{ secrets.HEYPUTER_DISPATCH_TOKEN }}" \
-H "Accept: application/vnd.github.v3+json" \
https://api.github.com/repos/HeyPuter/heyputer/dispatches \
-d '{"event_type":"puter-main-updated","client_payload":{"puter_ref":"main"}}'
+72
View File
@@ -0,0 +1,72 @@
name: Tag Alias
# Retags an existing image in GHCR under a custom name, without rebuilding.
# Uses `docker buildx imagetools create` so the multi-arch manifest is preserved.
# Re-running with the same name updates the alias to point at a different source tag.
on:
workflow_dispatch:
inputs:
name:
description: "Alias name (e.g., potato)"
required: true
source_tag:
description: "Source tag to alias from"
required: false
default: "latest"
env:
REGISTRY: ghcr.io
IMAGE_NAME: ${{ github.repository }}
jobs:
alias:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- name: Validate alias name
env:
NAME: ${{ inputs.name }}
run: |
if ! [[ "$NAME" =~ ^[A-Za-z0-9_][A-Za-z0-9_.-]{0,127}$ ]]; then
echo "Invalid alias name '$NAME' (allowed: [A-Za-z0-9_.-], must start with [A-Za-z0-9_], max 128 chars)."
exit 1
fi
if [[ "$NAME" == "latest" || "$NAME" == "main" ]]; then
echo "Alias name '$NAME' is reserved by the build workflow."
exit 1
fi
if [[ "$NAME" =~ ^[0-9]{2}\.[0-9]{2}(\.[0-9]+)?$ ]]; then
echo "Alias name '$NAME' looks like a calver tag — pick a non-version name."
exit 1
fi
- name: Log in to GitHub Package Container registry
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Create alias tag
env:
IMAGE: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
NAME: ${{ inputs.name }}
SOURCE_TAG: ${{ inputs.source_tag }}
run: |
SRC="${IMAGE}:${SOURCE_TAG}"
DST="${IMAGE}:${NAME}"
echo "Aliasing $DST -> $SRC"
docker buildx imagetools create -t "$DST" "$SRC"
{
echo "### 🏷️ Tag Alias"
echo ""
echo "- Source: \`$SRC\`"
echo "- Alias: \`$DST\`"
} >> "$GITHUB_STEP_SUMMARY"
+61 -1
View File
@@ -1,12 +1,72 @@
# Misc
.DS_Store
# Dependencies
node_modules/
*.zip
*.tgz
license.config.json
license-header.txt
# Build Outputs
dist/
.vscode/
# VS Code IDE
.vscode/**/*
!.vscode/extensions.json
!.vscode/launch.json
!.vscode/tasks.json
# Local env files
.env
!.env.example
# Per-developer / deployment config override. `config.default.json` ships in
# the repo and is the authoritative source; `config.json` (if present) wins
# at runtime for the local machine only.
config.json
# this is for jetbrain IDEs
.idea/
/puter
# Local Netlify folder
.netlify
src/emulator/release/
# ======================================================================
# vscode
# ======================================================================
# vscode configuration
.vscode/
# JS language server, ref: https://code.visualstudio.com/docs/languages/jsconfig
jsconfig.json
# ======================================================================
# playwright test (currently only test the file-system)
# ======================================================================
tests/client-config.yaml
# ======================================================================
# python
# ======================================================================
__pycache__/
# ======================================================================
# other
# ======================================================================
# AI STUFF
AGENTS.md
.roo
# source maps
*.map
coverage/
*.log
undefined
servers.json
config.*.json
File renamed without changes.
+15
View File
@@ -0,0 +1,15 @@
#!/usr/bin/env sh
files=$(git diff --cached --name-only --diff-filter=ACMR | \
grep -E '^(src/backend|extensions)/.*\.(js|mjs|cjs|ts)$' || true)
if [ -z "$files" ]; then
exit 0
fi
echo "$files" | xargs npx eslint --fix --no-warn-ignored
status=$?
echo "$files" | xargs git add
exit $status
+1
View File
@@ -0,0 +1 @@
engine-strict=true
+4
View File
@@ -0,0 +1,4 @@
node_modules
dist
build
**/*.dbmig.js
+4
View File
@@ -0,0 +1,4 @@
{
"tabWidth": 4,
"singleQuote": true
}
+99
View File
@@ -0,0 +1,99 @@
# AGENTS.md
Guidance for AI coding agents working in this repository. Read this before making changes. FOLLOW GUIDANCE AS CLOSELY AS POSSIBLE. If you think the guidance is wrong, raise an issue or flag a maintainer — don't just do what you think is right. This is the source of truth for how we write code, tests, and docs in this repo.
## Documentation Index
Use these as the source of truth before exploring further:
- [README.md](README.md) — project overview and quickstart.
- [doc/architecture.md](doc/architecture.md) — backend layered stack (controllers → drivers → services → stores → clients), `PuterServer` wiring, `Context` (ALS), and extensions.
- [doc/self-hosting.md](doc/self-hosting.md) — running Puter outside hosted infra.
- [CONTRIBUTING.md](CONTRIBUTING.md) — testing, security, AI-assisted code, PR conventions, Boy Scout Rule.
- [SECURITY.md](SECURITY.md) — how to report vulnerabilities (do not file them publicly).
- [BUG-BOUNTY.md](BUG-BOUNTY.md) — bounty program scope.
- [TRADEMARK.md](TRADEMARK.md) — trademark usage.
---
## Backend
The backend is organized as a layered stack inspired by Controller–Service–Repository with dependency injection. Every layer only depends on the layers beneath it, and `PuterServer` ([src/backend/server.ts](src/backend/server.ts)) wires the whole thing together.
### Layers (top → bottom)
| Layer | Lives in | Responsibility |
| --------------- | ---------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Controllers** | [src/backend/controllers/](src/backend/controllers/) | Route handlers. Parse + validate input, apply per-route gates (auth, subdomain, rate limit, body parsers via `RouteOptions`), call services, format responses. |
| **Drivers** | [src/backend/drivers/](src/backend/drivers/) | Optional. RPC-style handlers exposed over `/drivers/*`. Thin shells that validate RPC inputs and call into services/stores. |
| **Services** | [src/backend/services/](src/backend/services/) | Business logic. Assume the caller is already authenticated/authorized — services do not run auth gates themselves. |
| **Stores** | [src/backend/stores/](src/backend/stores/) | Persistence. Wraps clients with the domain shape services consume (rows, entities, KV namespaces). |
| **Clients** | [src/backend/clients/](src/backend/clients/) | Adapters for external/internal services (sql, redis, s3, dynamo, email, event bus). Knows protocols, not domain concepts. |
| **Config** | `config.*.json` → `IConfig` | Flat, typed config object every layer receives at construction. |
Each layer receives the layers beneath it through its constructor. Dependencies are explicit and traceable from `PuterServer`.
### Cross-layer rules
- **Don't reach across layers.** Controllers do not poke clients directly; services do not register routes. If you want to, the abstraction is wrong — fix the abstraction.
- **Don't call sideways within a layer for code reuse.** If two services need the same logic, lift it into a util/helper. Services should not depend on other services for shared code.
- **Prefer explicit arguments over `Context` (ALS).** Reach for [Context](src/backend/core/context.ts) only when the value is genuinely request-scoped and would otherwise thread through many layers. Today it's used sparingly — mostly for `actor` and `req`.
### Extensions
Extensions live in [extensions/](extensions/) and parallel the layered stack. They are for **non-crucial parts of the system** — things Puter still works without if removed. If a feature is load-bearing for clients, it belongs in core, not in an extension (see [whoami](extensions/whoami.ts) as the cautionary example).
The `extension` global ([src/backend/extensions.ts](src/backend/extensions.ts)) exposes:
- `extension.registerClient/Store/Service/Driver/Controller(name, Class)` for first-class additions.
- `extension.on(event, handler)` and `extension.get/post/put/delete/patch/use(path, opts?, handler)` for the lightweight common case. `opts` is the same `RouteOptions` controllers use.
- `extension.import('client' | 'store' | 'service' | 'controller' | 'driver')` returns a lazy proxy to instantiated objects. `extension.config` exposes live config.
### Language & file conventions
- **Modules:** We transpile and build as needed — write ES modules, not CommonJS.
- **TypeScript preferred for new files.** Existing JS is fine; convert opportunistically when you're already touching a file.
- **Reuse types before inventing them.** Search for an existing type first; extend it if close. Only define a new type when nothing fits.
- **Make new types findable.** Co-locate them with the layer/module that owns them, export from the obvious entry point, and use a descriptive `PascalCase` name. Don't hide types in random files where future readers won't grep them.
- **Naming:** `camelCase` for variables/functions, `PascalCase` for classes and for files containing a class (`AuthService.ts`, `KVStoreDriver.ts`).
### Comments
Keep comments light. Prefer self-documenting code — clear names, small functions, obvious flow. Add a comment **only** when:
- The _why_ is non-obvious (a hidden constraint, a workaround, a subtle invariant).
- A non-trivial usage detail would otherwise trip the next reader.
Don't restate what the code already says. Don't write comments that reference the current task or PR — those rot.
**No ticket references in code or test comments.** Don't write `PUT-1234`, `AUTH-3`, `GUI-2`, `// fix for FOO-99`, `// per ROLLOUT-1`, or section headers like `// -- PUT-1020: ... --`. The ticket exists in git history and the issue tracker; the code should describe the *why* in domain terms ("logout cascade transparently invalidates...") not project-management terms ("the cascade from AUTH-3..."). Same rule for test-block names and section dividers — describe what's being tested, not which ticket asked for it.
**Use plain ASCII `-` in comment section dividers, not box-drawing characters.** Write `// -- Section name --`, not `// ── Section name ──`. The `─` (U+2500) character renders inconsistently in some editors and diff tools and adds nothing over `-`.
### Tests
When adding new behavior (function, endpoint, driver method, branch of logic), add a test for it.
- Use Vitest for unit and integration tests. Test files go next to the code they test, named `*.test.ts` or `*.test.js`.
- **Mock data, not methods.** Stub the inputs (fixtures, fake rows, sample payloads) rather than mocking the function under test or the layer beneath it. Over-mocking produces tests that pass while production breaks. If you must mock, mock at a real boundary (a client/external service), not within the same layer you're testing.
- Prefer test server over mocking deps. We have existing test utilities for running full test server to boot deps based on config. (see [src/backend/testUtil.ts](src/backend/testUtil.ts)).
- **Hit a real database / real client where reasonable.** Integration shapes catch the things unit tests with mocks miss.
- **Regression tests for bug fixes.** A test that fails before your fix and passes after is the cheapest insurance against the bug coming back.
- If something is genuinely hard to test (UI animation, third-party glue), skip it but say so in the PR.
### Security & privacy
Before opening a PR, scan the diff for:
- Logs, error messages, or responses leaking internal paths, secrets, tokens, env vars, or other users' data.
- Debug routes, test credentials, commented-out auth checks.
- Endpoints returning more than the caller actually needs.
When in doubt, return less. Auth-, permission-, or data-export-related changes deserve an explicit callout in the PR description.
### Working rules of thumb
- **Run it, don't just compile it.** "It type-checks" is not "it works." Exercise the code path end-to-end at least once.
- **Read the neighbors before writing.** Match the shape of similar things already in the tree. If you genuinely think the existing pattern is wrong, raise it — don't quietly diverge.
- **Boy Scout Rule, proportional to the change.** Fix the obvious typo, dead import, or missing typehint in files you're already touching. Don't ride a refactor along with a bug fix — that just makes review harder.
- **Understand what you commit.** AI assistance is fine; shipping code you couldn't defend in review is not.
+66
View File
@@ -0,0 +1,66 @@
# Puter Bug Bounty Program
We at **Puter** are committed to maintaining a secure experience for our users and community. We greatly value the contributions of security researchers and welcome responsible disclosure of security issues.
## Scope
The following are in scope for this program:
* **The Puter open-source project** (available at [github.com/HeyPuter/puter](https://github.com/HeyPuter/puter))
* **`puter.com`**
* **`api.puter.com`**
Out-of-scope:
* Third-party services, applications, or libraries not maintained by Puter.
* Social engineering attacks (e.g., phishing against staff).
* Denial of Service (DoS), spam, or volumetric attacks.
* Physical security issues.
## Rules of Engagement
To participate, you must:
1. **Report responsibly**: Provide detailed steps to reproduce the issue, including proof-of-concept code or screenshots where applicable.
2. **Do no harm**: Do not exfiltrate, modify, or delete data. Only access your own account or test data.
3. **Respect availability**: Do not perform denial-of-service attacks or automated scans that degrade service.
4. **Follow disclosure policy**: Do not publicly disclose vulnerabilities until we have confirmed and patched the issue.
5. **Act in good faith**: Make every effort to avoid privacy violations, destruction of data, and interruption or degradation of services.
Reports that do not meet these guidelines may not be eligible for a reward.
## Reporting Process
To report a vulnerability, email us at: **[[email protected]](mailto:[email protected])**.
Include:
* A description of the vulnerability
* Steps to reproduce
* Potential impact
* Suggested remediation (if available)
We aim to acknowledge receipt within **72 hours** and provide a resolution timeline.
## Reward Structure
We offer monetary rewards based on the severity of the vulnerability, as determined by our internal assessment (using CVSS as a guide).
* **Critical: \$1,000 – \$2,000**
* **High: \$500 – \$1,000**
* **Medium: \$200 – \$500**
* **Low: \$50 – \$100**
Non-security issues, suggestions, and best practices feedback are always welcome, but may not qualify for a reward.
If multiple researchers report the same issue, the bounty will be awarded to the first eligible report we receive.
## Payments Disclaimer
All reward amounts are **guidelines only**. Final decisions about eligibility, severity classification, and payout amount are made at the sole discretion of the Puter security team. We reserve the right to determine whether a report qualifies for a bounty, and whether any payment will be issued at all. Submitting a report does not guarantee compensation.
### Payment Method Requirement
At this time, **payments will only be made via PayPal**. To be eligible to receive a bounty, researchers must have a valid PayPal account capable of receiving payments. We are unable to process payments through other services or methods at this time.
## Legal Safe Harbor
If you make a good-faith effort to comply with this policy, we will consider your research to be authorized. If you inadvertently access data outside your own account, stop immediately and include details in your report so we can investigate and remediate.
-9
View File
@@ -1,9 +0,0 @@
# Changelog
## [2.1.1](https://github.com/HeyPuter/puter/compare/v2.1.0...v2.1.1) (2024-04-22)
### Bug Fixes
* test release-please action [#3](https://github.com/HeyPuter/puter/issues/3) ([8fb0a66](https://github.com/HeyPuter/puter/commit/8fb0a66ef21921990e564e5f61c0e80e7f929dc7))
* test release-please action [#4](https://github.com/HeyPuter/puter/issues/4) ([f392de7](https://github.com/HeyPuter/puter/commit/f392de722a5232b622ed91b656a31cdc443c2e84))
+27 -78
View File
@@ -1,101 +1,50 @@
# Contributing to Puter
# Contributing to Puter Backend
Welcome to Puter, the open-source distributed internet operating system. We're excited to have you contribute to our project, whether you're reporting bugs, suggesting new features, or contributing code. This guide will help you get started with contributing to Puter in different ways.
Thanks for contributing. These rules aren't strictly enforced — but following them makes every PR easier. If anything's unclear, ping a core maintainer or open the PR and ask.
<br>
New to the backend? Start with [doc/architecture.md](doc/architecture.md).
# Report bugs
---
Before reporting a bug, please check our [the issues on our GitHub repository](https://github.com/HeyPuter/puter/issues) to see if the bug has already been reported. If it has, you can add a comment to the existing issue with any additional information you have.
## 1. Test it. Run it.
If you find a new bug in Puter, please [open an issue on our GitHub repository](https://github.com/HeyPuter/puter/issues/new). We'll do our best to address the issue as soon as possible. When reporting a bug, please include as much information as possible, including:
Run the affected code path end-to-end before opening a PR. "It builds" is not "it works."
- A clear and descriptive title
- A description of the issue
- Steps to reproduce the bug
- Expected behavior
- Actual behavior
- Screenshots, if applicable
- Your host operating system and browser
- Your Puter version, location, ...
Add tests for new behavior, endpoints, or bug fixes. If something's genuinely hard to test, say so in the PR.
Please open a separate issue for each bug you find.
## 2. Follow existing patterns
Maintainers will apply the appropriate labels to your issue.
Match the shape of similar code already in the repo. [doc/architecture.md](doc/architecture.md) is the source of truth for layers, wiring, and naming. If you think a pattern is wrong, raise it — don't quietly diverge.
<br>
## 3. Don't expose system or user information
# Suggest new features
Scan your diff for stray logs, debug routes, internal paths, secrets, tokens, or user data in errors/responses. When in doubt, return less. Flag any auth, permission, or data-export changes in the PR description.
If you have an idea for a new feature in Puter, please open a new discussion thread on our [GitHub repository](https://github.com/HeyPuter/puter/discussions) to discuss your idea with the community. We'll do our best to respond to your suggestion as soon as possible.
For private security reports, see [SECURITY.md](SECURITY.md).
When suggesting a new feature, please include as much information as possible, including:
## 4. AI-assisted code is fine — understood code is required
- A clear and descriptive title
- A description of the feature
- The problem the feature will solve
- Any relevant screenshots or mockups
- Any relevant links or resources
Don't commit code you couldn't have written, debugged, or defended yourself. Read the diff, run it, and be ready to explain it in review.
<br>
## 5. Update docs for API changes
# Contribute code
If you change puter-js APIs (drivers or endpoints used by puter-js), update [developer docs](src/docs/). puter-js itself may also need updating.
If you'd like to contribute code to Puter, you need to fork the project and submit a pull request. If this is your first time contributing to an open-source project, we recommend reading this short guide by GitHub on [how to contribute to a project](https://docs.github.com/en/get-started/exploring-projects-on-github/contributing-to-a-project).
## 6. Boy Scout Rule — leave it 1% better
We'll review your pull request and work with you to get your changes merged into the project.
![Boy Scout Rule](https://imgs.search.brave.com/DMmIWl5-NuZVtrR9kXBb06AKF8kturkgSW9UMb2-6m4/rs:fit:860:0:0:0/g:ce/aHR0cHM6Ly9sYXdz/b2Zzb2Z0d2FyZWVu/Z2luZWVyaW5nLmNv/bS9pbWFnZXMvbGF3/cy9ib3ktc2NvdXQt/cnVsZS5wbmc)
## Your first code contribution
Fix the typo, the dead import, the missing test, the bit you had to read twice. Keep cleanup proportional to the change — no refactors riding along on bug fixes.
We maintain a list of issues that are good for first-time contributors. You can find these issues by searching for the [`good first issue`](https://github.com/HeyPuter/puter/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) label in our [GitHub repository](https://github.com/HeyPuter/puter). These issues are designed to be relatively easy to fix, and we're happy to help you get started. Pick an issue that interests you, and leave a comment on the issue to let us know you're working on it.
---
<br>
## Opening a PR
## Documentation for Contributors
- One thing per PR where possible.
- Describe **what** and **why**; the diff shows how.
- Mention how you tested user-visible changes.
- Drafts welcome.
See [doc/contributors/index.md](./doc/contributors/index.md) for more information.
---
<br>
## Commit Messages
Use the imperative, as is the convention in the Linux kernel:
- correct: `Improve performance of readdir`
- incorrect: `Improved readdir`
- incorrect: `Improving readdir`
We have the following exceptions to this rule:
- If the commit message is in _past tense_, it's a shorthand for the following:
- `Apply changes that would be applied after one had <past tense message>`
- If the commit message is in _present tense_, it's shorthand for the following:
- `Apply changes that would be applied after <present-tense message>`
For example, the following are correct:
- `Improved readdir`
- interpret this as: `Apply changes that would be applied after one had improved readdir`
- `Improving readdir`
- interpret this as: `Apply changes that would be applied after improving readdir`
<br>
## Code Review
Once you've submitted your pull request, the project maintainers will review your changes. We may suggest some changes or improvements. This is a normal part of the process, and your contributions are greatly appreciated!
<br>
## Contribution License Agreement (CLA)
Like many open source projects, we require contributors to sign a Contribution License Agreement (CLA) before we can accept your code. When you open a pull request for the first time, a bot will automatically add a comment with a link to the CLA. You can sign the CLA electronically by following the link and filling out the form.
<br>
# Getting Help
If you have any questions about Puter, please feel free to reach out to us through the following channels:
- [Discord](https://discord.com/invite/PQcx7Teh8u)
- [Reddit](https://www.reddit.com/r/Puter/)
- [Twitter](https://twitter.com/HeyPuter)
- [Email](mailto:[email protected])
Questions? Message a core maintainer. Welcome aboard.
+69 -45
View File
@@ -1,64 +1,88 @@
# /!\ NOTICE /!\
# syntax=docker/dockerfile:1.7
#
# OSS Puter image — multi-arch (linux/amd64, linux/arm64).
#
# Build & push:
# docker buildx build --platform linux/amd64,linux/arm64 \
# -t ghcr.io/heyputer/puter:latest --push .
#
# Local single-arch build:
# docker build -t puter .
#
# Self-hosters inject configuration by mounting a config.json at
# /etc/puter/config.json. It is deep-merged over the bundled
# config.default.json, so partial overrides work. Absent file = defaults.
# Many of the developers DO NOT USE the Dockerfile or image.
# While we do test new changes to Docker configuration, it's
# possible that future changes to the repo might break it.
# When changing this file, please try to make it as resiliant
# to such changes as possible; developers shouldn't need to
# worry about Docker unless the build/run process changes.
# ---- Build stage ----
FROM node:24-slim AS build
# Build stage
FROM node:21-alpine AS build
WORKDIR /opt/puter
# Install build dependencies
RUN apk add --no-cache git python3 make g++ \
&& ln -sf /usr/bin/python3 /usr/bin/python
# Build toolchain needed for native deps (bcrypt, sharp, better-sqlite3, …).
RUN apt-get update && \
apt-get install -y --no-install-recommends python3 make g++ git && \
rm -rf /var/lib/apt/lists/*
# Set up working directory
WORKDIR /app
ENV HUSKY=0
ENV npm_config_fund=false
ENV npm_config_audit=false
# Copy package.json and package-lock.json
COPY package*.json ./
# ---- Dependency layer ---------------------------------------------------
# Copy ONLY package manifests + lockfile first so the npm-install layer
# stays cached when only source files change.
COPY package.json package-lock.json ./
COPY src/backend/package.json src/backend/
COPY src/gui/package.json src/gui/
COPY src/puter-js/package.json src/puter-js/package-lock.json src/puter-js/
COPY src/worker/package.json src/worker/
COPY src/docs/package.json src/docs/
# Copy the source files
# extensionSetup.mjs runs as the postinstall hook during npm ci. (No-ops
# unless any packages/puter/extensions/* gain a package.json.)
COPY tools/extensionSetup.mjs tools/extensionSetup.mjs
RUN --mount=type=cache,target=/root/.npm \
npm ci
# ---- Source layer -------------------------------------------------------
COPY . .
# Install node modules
RUN npm cache clean --force \
&& npm ci
# Compile backend TS, then build GUI + puter-js webpack bundles in
# parallel. The GUI/puter-js bundles are how /dist/bundle.min.{js,css}
# and /sdk/puter.js fall back to local assets when the kernel-config
# CDN keys are unset.
RUN npm run build:ts
RUN set -e; \
(cd src/gui && node ./build.js) & gui_pid=$!; \
(cd src/puter-js && npm run build) & pjs_pid=$!; \
wait $gui_pid; \
wait $pjs_pid
# Run the build command if necessary
RUN npm run build
# ---- Runtime stage (slim — no build tools) ----
FROM node:24-slim
# Production stage
FROM node:21-alpine
WORKDIR /opt/puter
# Set labels
LABEL repo="https://github.com/HeyPuter/puter"
LABEL license="AGPL-3.0,https://github.com/HeyPuter/puter/blob/master/LICENSE.txt"
LABEL version="1.2.46-beta-1"
# git: runtime version probe. wget: HEALTHCHECK.
RUN apt-get update && \
apt-get install -y --no-install-recommends git wget && \
rm -rf /var/lib/apt/lists/*
# Install git (required by Puter to check version)
RUN apk add --no-cache git
COPY --from=build --chown=node:node /opt/puter .
# Set up working directory
RUN mkdir -p /opt/puter/app
WORKDIR /opt/puter/app
RUN mkdir -p /etc/puter /var/puter && \
chown -R node:node /etc/puter /var/puter
# Copy built artifacts and necessary files from the build stage
COPY --from=build /app/dist ./dist
COPY --from=build /app/node_modules ./node_modules
COPY . .
# Set permissions
RUN chown -R node:node /opt/puter/app
USER node
# Self-hosters mount their override at this exact path. The v2 loader
# deep-merges it over config.default.json (see backend/index.ts).
ENV PUTER_CONFIG_PATH=/etc/puter/config.json
ENV NODE_OPTIONS=--enable-source-maps
EXPOSE 4100
HEALTHCHECK --interval=30s --timeout=3s \
USER node
HEALTHCHECK --interval=30s --timeout=3s --start-period=30s --retries=3 \
CMD wget --no-verbose --tries=1 --spider http://puter.localhost:4100/test || exit 1
ENV NO_VAR_RUNTUME=1
CMD ["npm", "start"]
CMD ["node", "-r", "./dist/src/backend/telemetry.js", "./dist/src/backend/index.js"]
+75 -121
View File
@@ -1,41 +1,46 @@
<h3 align="center"><img width="80" alt="Puter.com, The Personal Cloud Computer: All your files, apps, and games in one place accessible from anywhere at any time." src="https://assets.puter.site/puter-logo.png"></h3>
<h3 align="center">The Internet OS! Free, Open-Source, and Self-Hostable.</h3>
<h3 align="center">The Open-Source Internet Computer!</h3>
<p align="center">
<a href="https://puter.com/"><strong>« LIVE DEMO »</strong></a>
<a href="https://puter.com/?ref=github.com"><strong>« LIVE DEMO »</strong></a>
<br />
<br />
<a href="https://puter.com">Puter.com</a>
<a href="https://puter.com/?ref=github.com">Puter.com</a>
·
<a href="https://docs.puter.com" target="_blank">SDK</a>
<a href="https://apps.puter.com/">App Store</a>
·
<a href="https://developer.puter.com" target="_blank">Developers</a>
·
<a href="https://discord.com/invite/PQcx7Teh8u">Discord</a>
·
<a href="https://reddit.com/r/puter">Reddit</a>
·
<a href="https://twitter.com/HeyPuter">X (Twitter)</a>
·
<a href="https://hackerone.com/puter_h1b">Bug Bounty</a>
<a href="https://twitter.com/HeyPuter">X</a>
</p>
<h3 align="center"><img width="700" style="border-radius:5px;" alt="screenshot" src="https://assets.puter.site/puter.com-screenshot-2.webp"></h3>
<h3 align="center"><img width="800" style="border-radius:5px;" alt="screenshot" src="https://assets.puter.site/puter.com-screenshot.webp"></h3>
<br/>
## Puter
Puter is an advanced, open-source internet operating system designed to be feature-rich, exceptionally fast, and highly extensible. It can be used to build remote desktop environments or serve as an interface for cloud storage services, remote servers, web hosting platforms, and more.
Puter is an advanced, open-source, self-hostable internet computer designed to be feature-rich, fast, and highly extensible.
### For Users
Puter's goal is to provide you with every app and feature you need to work, create, and play under one roof. From a simple [Notepad](https://online-notepad.com) and [Voice Recorder](https://voice-recorder.com) to [Spreadsheet](https://apps.puter.com/app/spreadsheet) and [Camera](https://online-camera.com), Puter wants to be the all-in-one solution for your digital life.
### For Developers
Puter provides everything you need to build and publish web apps and games. From [AI](https://developer.puter.com/ai/) to [Cloud Storage](https://developer.puter.com/object-storage/) and [Database](https://developer.puter.com/key-value-database/) to [Serverless Workers](https://developer.puter.com/serverless-workers/), Puter has you covered. Puter also helps you get users! Once you build your app, you can publish it on our [App Store](https://apps.puter.com/) to reach and monetize users.
<br/>
## Getting Started
After reading this section, please proceed to **Self-Hosting** and **Configuration** below.
Read these instructions carefully or you may see errors due to
an invalid setup.
### Local Development
### 💻 Local Development
```bash
git clone https://github.com/HeyPuter/puter
@@ -43,140 +48,89 @@ cd puter
npm install
npm start
```
**→** This should launch Puter at http://puter.localhost:4100
This will launch Puter at http://localhost:4000 (or the next available port).
<br/>
### Using Docker
### 🚀 Self-Hosting
**note:** it is **not** necessary to run this within a clone of this repository. For contributors, it is recommended to use the [Local Development](#local-development) instructions.
#### Linux/macOS
```bash
mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
curl -fsSL https://puter.com/selfhost | sh
```
### Using Docker Compose
#### Windows
**note:** it is **not** necessary to run this within a clone of this repository. For contributors, it is recommended to use the [Local Development](#local-development) instructions.
```bash
mkdir -p puter/config puter/data
sudo chown -R 1000:1000 puter
wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
docker compose up
```powershell
irm https://puter.com/selfhost?os=windows | iex
```
<br/>
See [Configuration](#configuration) for next steps.
**→** For more details, see [Self-Hosting Puter](./doc/self-hosting.md).
<br/>
## ⚠️ Self-Hosting ⚠️
The self-hosted version of Puter is currently in alpha stage and should not be used in production yet. It is under active development and may contain bugs, other issues. Please exercise caution and use it for testing and evaluation purposes only.
### ☁️ Puter.com
Puter is available as a hosted service at [**puter.com**](https://puter.com).
<br/>
## Configuration
## Support
Running the server will generate a configuration file in one of these locations:
- `config/config.json` when [Using Docker](#using-docker)
- `volatile/config/config.json` in [Local Development](#local-development)
- `/etc/puter/config.json` on a server (or within a Docker container)
Connect with the maintainers and community through these channels:
### Domain Name
- Bug report or feature request? Please [open an issue](https://github.com/HeyPuter/puter/issues/new/choose).
- Discord: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
- X (Twitter): [x.com/HeyPuter](https://x.com/HeyPuter)
- Reddit: [reddit.com/r/puter/](https://www.reddit.com/r/puter/)
- Mastodon: [mastodon.social/@puter](https://mastodon.social/@puter)
- Security issues or abuse reports? [[email protected]](mailto:[email protected])
- Email maintainers at [[email protected]](mailto:[email protected])
To access Puter on your device, you can simply go to the address printed in
the server console (usually `puter.localhost:4100`).
To access Puter from another device, a domain name must be configured, as well as
an `api` subdomain. For example, `example.local` might be the domain name pointing
to the IP address of the server running puter, and `api.example.com` must point to
this address as well. This domain must be specified in the configuration file
(usually `volatile/config/config.json`) as well.
See [domain configuration](./doc/self-hosters/domains.md) for more information.
### Configure the Port
- You can specify a custom port by setting `http_port` to a desired value
- If you're using a reverse-proxy such as nginx or cloudflare, you should
also set `pub_port` to the public (external) port (usually `443`)
- If you have HTTPS enabled on your reverse-proxy, ensure that
`protocol` in config.json is set accordingly
### Default User
By default, Puter will create a user called `default_user`.
This user will have a randomly generated password, which will be printed
in the development console.
A warning will persist in the dev console until this user's
password is changed. Please login to this user and change the password as
your first step.
We are always happy to help you with any questions you may have. Don't hesitate to ask!
<br/>
## License
## License
This repository is licensed under AGPL-3.0; However, our SDK (puter.js) is also available under Apache 2.0, as indicated by the license file in that section (packages/puter-js) of this repository.
This repository, including all its contents, sub-projects, modules, and components, is licensed under [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt) unless explicitly stated otherwise. Third-party libraries included in this repository may be subject to their own licenses.
<br/>
## FAQ
## Translations
### ❓ What's the use case for Puter?
Puter can be used as:
- An alternative to Dropbox, Google Drive, OneDrive, etc. with a fresh interface and powerful features.
- Remote desktop environment for servers and workstations.
- A platform for building and hosting websites, web apps, and games.
- A friendly, open-source project and community to learn about web development, cloud computing, distributed systems, and much more!
<br/>
### ❓ Why isn't Puter built with React, Angular, Vue, etc.?
For performance reasons, Puter is built with vanilla JavaScript and jQuery. Additionally, we'd like to avoid complex abstractions and to remain in control of the entire stack, as much as possible.
Also partly inspired by some of our favorite projects that are not built with frameworks: [VSCode](https://github.com/microsoft/vscode), [Photopea](https://www.photopea.com/), and [OnlyOffice](https://www.onlyoffice.com/).
<br/>
### ❓ Why jQuery?
Puter interacts directly with the DOM and jQuery provides an elegant yet powerful API to manipulate the DOM, handle events, and much more. It's also fast, mature, and battle-tested.
<br/>
## #DoesItRunPuter
- [Minecraft](https://twitter.com/HeyPuter/status/1771957571496092036) | [video](https://www.youtube.com/watch?v=GIowZUXkg5g)
- [Samsung Watch](https://twitter.com/CharmunkDev/status/1781501714543030554)
- [PlayStation 4](https://twitter.com/HeyPuter/status/1767978053014270059)
- [Skyworth TV](https://twitter.com/ericalexdube/status/1767983049277411564)
- [A Fridge!](https://twitter.com/HeyPuter/status/1778890003797745842)
- [Oculus Quest 2](https://twitter.com/HeyPuter/status/1768664081756754012)
- [Tesla Model 3](https://twitter.com/EricLighthall/status/1781479732997214501)
- [Tesla Model S](https://twitter.com/HeyPuter/status/1767971178864587057)
- [Tesla Model Y](https://twitter.com/HeyPuter/status/1772858333751636310)
- [Nintendo Switch](https://twitter.com/HeyPuter/status/1780645795240538518)
- [Steam Deck](https://twitter.com/everythingSung/status/1782162352403828793)
<br/>
## Credits
The default wallpaper is created by [Milad Fakurian](https://unsplash.com/photos/blue-orange-and-yellow-wallpaper-E8Ufcyxz514) and published on [Unsplash](https://unsplash.com/).
Icons by [Papirus](https://github.com/PapirusDevelopmentTeam/papirus-icon-theme) under GPL-3.0 license.
Icons by [Iconoir](https://iconoir.com/) under MIT license.
Icons by [Elementary Icons](https://github.com/elementary/icons) under GPL-3.0 license.
Icons by [Tabler Icons](https://tabler.io/) under MIT license.
Icons by [bootstrap-icons](https://icons.getbootstrap.com/) under MIT license.
- [Arabic / العربية](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ar.md)
- [Armenian / Հայերեն](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.hy.md)
- [Bengali / বাংলা](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.bn.md)
- [Chinese / 中文](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.zh.md)
- [Danish / Dansk](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.da.md)
- [English](https://github.com/HeyPuter/puter/blob/main/README.md)
- [Farsi / فارسی](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.fa.md)
- [Finnish / Suomi](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.fi.md)
- [French / Français](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.fr.md)
- [German / Deutsch](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.de.md)
- [Hebrew/ עברית](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.he.md)
- [Hindi / हिंदी](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.hi.md)
- [Hungarian / Magyar](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.hu.md)
- [Indonesian / Bahasa Indonesia](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.id.md)
- [Italian / Italiano](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.it.md)
- [Japanese / 日本語](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.jp.md)
- [Korean / 한국어](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ko.md)
- [Malay / Bahasa Malaysia](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.my.md)
- [Malayalam / മലയാളം](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ml.md)
- [Polish / Polski](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.pl.md)
- [Portuguese / Português](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.pt.md)
- [Punjabi / ਪੰਜਾਬੀ](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.pa.md)
- [Romanian / Română](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ro.md)
- [Russian / Русский](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ru.md)
- [Spanish / Español](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.es.md)
- [Swedish / Svenska](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.sv.md)
- [Tamil / தமிழ்](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ta.md)
- [Telugu / తెలుగు](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.te.md)
- [Thai / ไทย](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.th.md)
- [Turkish / Türkçe](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.tr.md)
- [Ukrainian / Українська](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ua.md)
- [Urdu / اردو](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ur.md)
- [Vietnamese / Tiếng Việt](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.vi.md)
+3 -1
View File
@@ -3,5 +3,7 @@ We would like to thank the following security researchers for their responsible
# 2024
- Tim Suess: [GitHub](https://github.com/blackfortresslabs) | [Email]([email protected]) | [Website](blackfortresslabs.com)
- Ritesh Sahu [GitHub](https://github.com/riteshs4hu/) | [X](https://x.com/riteshs4hu) | [Website](https://medium.com/@riteshs4hu)
- Tim Suess: [GitHub](https://github.com/blackfortresslabs) | [Email]([email protected]) | [Website](https://www.blackfortresslabs.com)
- xyzeva: [Github](https://github.com/xyzeva) | [Email](mailto:[email protected]) | [Website](https://kibty.town/)
- Yusuf Kelany: [GitHub](https://github.com/YusufYaser) | [X](https://x.com/RealYusufYaser) | [Website](https://yusufyaser.xyz)
+2 -2
View File
@@ -14,7 +14,8 @@ If you believe you've found a security issue in software that is maintained in t
To submit a vulnerability report, please contact us at security@puter.com. Your submission will be reviewed and validated by a member of our team.
**⚠ Please do not report security vulnerabilities through public GitHub issues, discussions, or pull requests. ⚠**
> [!WARNING]
> Please do not report security vulnerabilities through public GitHub issues, discussions, or pull requests.
<br>
@@ -37,4 +38,3 @@ Please submit a report to us before engaging in conduct that may be inconsistent
* Please provide detailed reports with reproducible steps and a clearly defined impact.
* Include the version number of the vulnerable package in your report
* Social engineering (e.g. phishing, vishing, smishing) is prohibited.
+214
View File
@@ -0,0 +1,214 @@
# Trademark Guidelines
Version 1.0 dated January 1, 2025
<img src="https://puter.com/images/logo.png" alt="Puter Technologies Inc. Logo" width="150"/>
<br>
This trademark policy was prepared to help you understand how to use the Puter trademarks, service marks and logos with Puter Technologies Inc.'s Puter software.
While some of our software is available under a free and open source software license, that copyright license does not include a license to use our trademark, and this Policy is intended to explain how to use our marks consistent with background law and community expectation.
This Policy covers:
1. Our **word** trademarks and service marks: Puter Technologies Inc., Puter, Puter.com
2. Our **logos**: The Puter Technologies Inc. logo at the top of this policy
This policy encompasses all trademarks and service marks, whether they are registered or not.
<br>
<br>
## 1. GENERAL GUIDELINES
Whenever you use one of our marks, you must always do so in a way that does not mislead anyone about what they are getting and from whom. For example, you cannot say you are providing the Puter software when you're providing a modified version of it, because recipients may not understand the differences between your modified versions and our own.
You also cannot use our logo on your website in a way that suggests that your website is an official website or that we endorse your website.
You can, though, say you like the Puter software, that you participate in the Puter community, that you are providing an unmodified version of the Puter software.
You may not use or register our marks, or variations of them as part of your own trademark, service mark, domain name, company name, trade name, product name or service name.
Trademark law does not allow your use of names or trademarks that are too similar to ours. You therefore may not use an obvious variation of any of our marks or any phonetic equivalent, foreign language equivalent, takeoff, or abbreviation for a similar or compatible product or service. We would consider the following too similar to one of our Marks:
- MyPuter
- PuterFooBar
<br>
<br>
## 2. ACCEPTABLE USES
<br>
### Distribution of Unmodified Software
When you redistribute an unmodified copy of Puter software, you must retain all trademarks, logos, and notices we have placed on the software to identify its origin. This includes:
* Binary distributions exactly as we provide them
* Source code distributions exactly as we provide them
* Documentation and other materials directly from our official repositories
<br>
### Distribution of Modified Software
If you distribute a modified version of Puter software, you:
* Must remove all Puter logos from the modified software
* May use our word marks (but not logos) to accurately describe the software's origin
* Must clearly indicate that the software has been modified
* Must include a notice stating: "This software is a modified version of Puter software and is not endorsed by Puter Technologies Inc."
Example of acceptable description: "This software is derived from Puter software and includes modifications for [describe your changes]."
<br>
### Compatibility Statements
You may use our word marks (but not logos) to accurately describe your software's compatibility with Puter software under these conditions:
* Your statements about compatibility must be accurate and not misleading
* You must include the following notice: "Puter is a trademark of Puter Technologies Inc. This [product/service] is not affiliated with or endorsed by Puter Technologies Inc."
* You may not suggest that Puter Technologies Inc. has certified or approved your software
<br>
### Products Built for Puter
You may describe your product as working with or being built for Puter if:
* Your product is fully compatible with the documented Puter APIs
* Your product name follows this format: "[Your Product Name] for Puter"
* You include this notice in all materials: "Puter is a trademark of Puter Technologies Inc. [Your Product Name] is not affiliated with or endorsed by Puter Technologies Inc."
* Your branding and marketing materials do not create confusion about the source of your product
<br>
### Open Source Projects
For open source projects that interact with or extend Puter software:
* You may use "puter" as part of your project name only if:
* The name is in the format "[descriptor]-puter" (e.g., "auth-puter", "backup-puter")
* The project's README clearly states it's not officially associated with Puter
* The project maintains compatibility with current Puter APIs
* You must not use our logos without explicit permission
* You must include appropriate trademark attribution notices
<br>
### Community Activities
You may use our word marks (but not logos) for non-commercial community activities:
* User groups and meetups focused on Puter software
* Educational content about Puter software
* Blog posts, videos, articles, or tutorials about Puter software
Conditions for community use:
* Activities must be non-commercial
* Any fees charged must only cover actual costs
* You must include appropriate trademark attribution
* You must not suggest official endorsement without explicit permission
<br>
### Merchandise and Promotional Items
You may not create merchandise or promotional items bearing our marks without explicit written permission from Puter Technologies Inc.
<br>
### Academic and Research Use
You may use our word marks (but not logos) in:
* Academic papers
* Research publications
* Technical documentation
* Educational materials
Include appropriate citations and trademark attributions in such uses.
<br>
### Online Content and Social Media
When using our marks in online content:
* You may use our word marks in hashtags, handles, or usernames if:
* The content is clearly about Puter software
* You don't imply official status
* You include appropriate trademark attribution
* You must not register social media accounts that could be confused with official Puter accounts
<br>
### APIs and Development
When developing with Puter APIs:
* You may use our word marks to accurately describe your integration
* You must not use our marks in a way that suggests your API or service is endorse by
Puter or provided by Puter
* You must include appropriate trademark attribution
All uses described above must also comply with the General Guidelines section of this policy and maintain the integrity of our marks as described in the How to Display Our Marks section.
<br>
### No Domain Names
You must not register any domain that includes our word marks or any variant or combination of them.
<br>
<br>
## 3. HOW TO DISPLAY OUR MARKS
When you have the right to use our mark, here is how to display it.
<br>
### Trademark marking and legends
The first or most prominent mention of a mark on a webpage, document, or documentation should be accompanied by a symbol indicating whether the mark is a registered trademark ("®") or an unregistered trademark ("™"). If you don't know which applies, contact us.
Place the following notice at the foot of the page where you have used the mark: "Puter is trademark of Puter Technologies Inc."
<br>
### Use of trademarks in text
**Always use trademarks in their exact form with the correct spelling, neither abbreviated, hyphenated, or combined with any other word or words.**
Unacceptable: Puter-DB
**Don't pluralize a trademark.**
Unacceptable: I have seventeen Puters running in my lab.
**Always use a trademark as an adjective modifying a noun.**
Unacceptable: This is a Puter.
Acceptable: This is a Puter software application.
<br>
### Use of Logos
You may not change any logo except to scale it. This means you may not add decorative elements, change the colors, change the proportions, distort it, add elements, or combine it with other logos.
However, when the context requires the use of black-and-white graphics and the logo is color, you may reproduce the logo in a manner that produces a black-and-white image.
<br>
<br>
## This Document
These guidelines are based on the Model Trademark Guidelines, available at http://www.modeltrademarkguidelines.org., used under a Creative Commons Attribution 3.0 Unported license: https://creativecommons.org/licenses/by/3.0/deed.en_US.
-3
View File
@@ -1,3 +0,0 @@
import { build } from "./utils.js"
build();
+45
View File
@@ -0,0 +1,45 @@
{
"config_name": "oss-default",
"env": "dev",
"port": 4100,
"protocol": "http",
"domain": "puter.localhost",
"cookie_name": "puter_auth_token",
"jwt_secret": "dev-jwt-secret-change-me",
"jwt_secret_v2": "dev-jwt-secret-v2-change-me",
"allow_v1_tokens": true,
"url_signature_secret": "dev-url-signature-secret-change-me",
"allow_all_host_values": true,
"allow_no_host_header": true,
"no_devwatch": false,
"enable_public_folders": true,
"is_storage_limited": false,
"min_pass_length": 6,
"static_hosting_domain": "site.puter.localhost",
"static_hosting_domain_alt": "host.puter.localhost",
"private_app_hosting_domain": "app.puter.localhost",
"private_app_hosting_domain_alt": "dev.puter.localhost",
"captcha": { "enabled": false },
"default_user_group": "78b1b1dd-c959-44d2-b02c-8735671f9997",
"default_temp_group": "b7220104-7905-4985-b996-649fdcdb3c8f",
"storage_capacity": 104857600,
"strict_email_verification_required": false,
"gui_assets_root": "./src/gui",
"puterjs_root": "./src/puter-js/dist",
"builtin_apps": {
"dev-center": "./src/dev-center"
},
"extensions": [
"./extensions"
],
"database": {
"engine": "sqlite",
"path": "volatile/runtime/puter-database.sqlite"
},
"s3": {
"localConfig": {
"dataDir": "volatile/runtime/fauxqs-data",
"s3StorageDir": "volatile/runtime/fauxqs-s3-data"
}
}
}
+356
View File
@@ -0,0 +1,356 @@
{
// Comprehensive template — every key the OSS backend or shipped (non-prod)
// extensions read. Copy to `config.json` and trim what you don't need;
// unset keys fall back to documented defaults. See
// `src/backend/types.ts` for the per-field source of truth.
//
// Each setting lives at exactly one canonical key — there are no fallback
// aliases. Values shown are illustrative, not production secrets.
//
// Keys consumed only by closed-source / hosted-prod extensions (clickhouse,
// cacheUpdateHandler, pages, prodMeteringAndBilling, …) are intentionally
// omitted.
// ── Environment / identity ──────────────────────────────────────────
"config_name": "template",
// `dev` opens a browser on boot, skips blocked-email checks, and runs the
// dev-time webpack watcher; `prod` serves pre-built bundles.
"env": "dev",
"version": "0.0.0",
// Stable identity for this server node — used by pager alerts and
// graceful-shutdown coordination.
"serverId": "node-1",
// ── Networking / URLs ───────────────────────────────────────────────
// Port Puter listens on internally.
"port": 4100,
// Externally-visible port (set this when behind a reverse proxy on 80/443).
"pub_port": 4100,
"protocol": "http",
"domain": "puter.localhost",
// Fully-qualified externally-visible URL. Computed from protocol/domain/
// pub_port if unset.
"origin": "http://puter.localhost:4100",
// Public base URL for the API subdomain (used to build signed URLs and
// surfaced to the client by the `installedApps` and `whoami` extensions).
"api_base_url": "http://api.puter.localhost:4100",
// Subdomains Puter routes on. Wildcard DNS (`*.<domain>`) must point at
// this server for site/app hosting to work.
"static_hosting_domain": "site.puter.localhost",
"static_hosting_domain_alt": "host.puter.localhost",
"private_app_hosting_domain": "app.puter.localhost",
"private_app_hosting_domain_alt": "dev.puter.localhost",
// Host-header / domain handling. Defaults below are the dev-friendly
// settings; tighten for any public install.
"allow_all_host_values": true,
"allow_no_host_header": true,
"allow_nipio_domains": false,
"custom_domains_enabled": false,
"enable_ip_validation": false,
// Express `trust proxy` setting — set to the number of reverse-proxy
// hops in front of the server (1 = nginx/Cloudflare, 2 = CF→ALB→app),
// or to a CIDR / IP / list. `false` (safe default) makes `req.ip` the
// direct socket peer. NEVER set to `true` in prod — it trusts every hop
// and makes X-Forwarded-For forgeable.
"trust_proxy": false,
"no_browser_launch": false,
// ── Dev watcher (devWatcher extension) ──────────────────────────────
// Rebuilds GUI + puter.js on file changes when running from source.
// Ignored when `env: "prod"` unless `devwatch.enabled: true`.
"no_devwatch": false,
"devwatch": {
// Delay after watcher startup before boot continues. Lets webpack
// emit its first build so the homepage doesn't 404 on bundle.min.js.
"ready_delay_ms": 5000
},
// ── Auth / session ──────────────────────────────────────────────────
// ALWAYS replace these for any public install — `openssl rand -hex 64`.
// `jwt_secret` is legacy verify-only; new tokens sign with `jwt_secret_v2`.
"jwt_secret": "change-me",
"jwt_secret_v2": "change-me",
// Set false to retire v1 tokens entirely (ROLLOUT-1).
"allow_v1_tokens": true,
"url_signature_secret": "change-me",
"cookie_name": "puter_auth_token",
"min_pass_length": 6,
"allow_system_login": false,
"strict_email_verification_required": false,
"captcha": {
"enabled": false,
"difficulty": "medium"
},
"oidc": {
"providers": {
// Google uses OIDC discovery — only ids are required.
"google": {
"client_id": "",
"client_secret": "",
"scopes": "openid email profile"
},
// Custom OIDC providers must also supply the three endpoints.
"custom-oidc": {
"client_id": "",
"client_secret": "",
"authorization_endpoint": "",
"token_endpoint": "",
"userinfo_endpoint": "",
"scopes": "openid email profile"
}
}
},
// ── Groups / provisioning ───────────────────────────────────────────
// UIDs of the persistent groups new users are auto-enrolled in.
"default_user_group": "78b1b1dd-c959-44d2-b02c-8735671f9997",
"default_temp_group": "b7220104-7905-4985-b996-649fdcdb3c8f",
// When true, ACL grants read/list on `/<user>/Public` to any actor.
"enable_public_folders": true,
// ── Storage / S3 ────────────────────────────────────────────────────
"s3": {
// Local fauxqs (in-process S3-compatible) — used in dev and the
// bundled-defaults Docker mode. Files land under `dataDir`.
"localConfig": {
"inMemory": false,
"host": "127.0.0.1",
"port": 4566,
"dataDir": "volatile/runtime/fauxqs-data",
"s3StorageDir": "volatile/runtime/fauxqs-s3-data"
},
// For real / external S3, replace `localConfig` above with `s3Config`.
"_remote_example": {
"s3Config": {
"useCredentialChain": false,
"endpoint": "https://s3.example.com",
// Endpoint used in presigned URLs handed to the browser. Set
// this when the server-side endpoint isn't reachable from the
// browser (e.g. docker-internal `http://s3:9000`).
"publicEndpoint": "",
"accessKeyId": "",
"secretAccessKey": "",
"region": "us-west-2",
// Set true for RustFS / MinIO / fauxqs (path-style URLs).
// Real AWS S3 wants virtual-hosted — leave unset / false.
"forcePathStyle": false
}
}
},
"s3_bucket": "puter-local",
"s3_region": "us-west-2",
"region": "us-west-2",
// Default per-user storage cap (bytes). 100 MB.
"storage_capacity": 104857600,
"is_storage_limited": false,
"available_device_storage": 0,
// ── Thumbnails (thumbnails extension) ───────────────────────────────
// Optional dedicated S3-compatible bucket for generated thumbnails.
// When unset (or `endpoint` empty), the extension falls back to the
// main S3 client / bucket above.
"thumbnailStore": {
"name": "puter-local",
"endpoint": "",
"credentials": {
"accessKeyId": "",
"secretAccessKey": ""
}
},
// ── Database ────────────────────────────────────────────────────────
"database": {
// `sqlite` for single-node / dev; `mysql` for self-host with MariaDB.
"engine": "sqlite",
// sqlite — file path on disk
"path": "volatile/runtime/puter-database.sqlite",
"targetVersion": 0,
// mysql — connection details
"host": "",
"port": 3306,
"user": "",
"password": "",
"database": "",
// Optional read-replica pool. Reads route here when populated.
"replica": {
"host": "",
"port": 3306,
"user": "",
"password": "",
"database": ""
}
// mysql self-host bootstrap: set `migrationPaths` to apply the bundled
// schema on first boot. Idempotent — safe to leave on.
// "migrationPaths": ["./src/backend/clients/database/migrations/mysql"]
},
// ── DynamoDB (KV store) ─────────────────────────────────────────────
"dynamo": {
// Local emulator (dynamodb-local) endpoint. Drop this field for real
// AWS DynamoDB.
"endpoint": "http://localhost:8000",
// Set true when pointing at a local emulator so Puter creates the KV
// table on boot. NEVER set against real AWS — provision via IaC.
// "bootstrapTables": true,
"path": "",
// Credentials. NOTE: snake_case here, unlike `s3.s3Config` below.
// For dynamodb-local, any non-empty values work.
"aws": {
"access_key": "",
"secret_key": "",
"region": "us-west-2"
}
},
// ── Redis / Valkey (cache + cross-node rate limit) ──────────────────
"redis": {
// True → in-process redis-mock (dev / single-node).
"useMock": true,
// Cluster nodes for ioredis. For a single Valkey/Redis container,
// run it in cluster mode (one node, all slots).
"startupNodes": [
{
"host": "127.0.0.1",
"port": 7000
}
]
// Defaults to true (matches prod ElastiCache). Set false for plain-TCP
// self-host Valkey/Redis.
// "tls": false
},
// ── Email (transactional) ───────────────────────────────────────────
// Nodemailer transport — used for password resets, email confirmation, etc.
"email": {
"from": "\"Puter\" <[email protected]>",
"host": "smtp.example.com",
"port": 587,
"secure": false,
"service": "",
"auth": {
"user": "",
"pass": ""
}
},
// ── Rate limiting ───────────────────────────────────────────────────
// `memory` for single-node, `redis` for multi-node (default), `kv` for
// dynamo-backed counters.
"rate_limit": {
"backend": "redis"
},
// ── AI / integration providers ──────────────────────────────────────
// All AI drivers (chat, image, video, TTS, OCR, STT) read from here.
// Provider id == driver-side identifier. Leave empty / omit to disable.
"providers": {
// ─ Chat / completion ─
"claude": { "apiKey": "" },
"openai-completion": { "apiKey": "" },
"gemini": { "apiKey": "" },
"groq": { "apiKey": "" },
"deepseek": { "apiKey": "" },
"mistral": { "apiKey": "" },
"xai": { "apiKey": "" },
"moonshot": { "apiKey": "" },
"openrouter": {
"apiKey": "",
"apiBaseUrl": "https://openrouter.ai/api/v1"
},
"together-ai": { "apiKey": "" },
// Local Ollama. `enabled: false` skips the auto-probe at startup
// (otherwise Puter logs ECONNREFUSED on every boot when no Ollama
// is running).
"ollama": {
"enabled": false,
"apiBaseUrl": "http://localhost:11434"
},
// ─ Image generation ─
"openai-image-generation": { "apiKey": "" },
"gemini-image-generation": { "apiKey": "" },
"together-image-generation": { "apiKey": "" },
"cloudflare-image-generation": {
"apiToken": "",
"accountId": "",
"apiBaseUrl": "https://api.cloudflare.com/client/v4"
},
"xai-image-generation": { "apiKey": "" },
// ─ Video generation ─
"openai-video-generation": { "apiKey": "" },
"together-video-generation": { "apiKey": "" },
"gemini-video-generation": { "apiKey": "" },
// ─ Speech / OCR ─
"openai": { "apiKey": "" },
"elevenlabs": {
"apiKey": "",
"apiBaseUrl": "https://api.elevenlabs.io",
"defaultVoiceId": "",
"speechToSpeechModelId": ""
},
"aws-polly": {
"access_key": "",
"secret_key": "",
"region": "us-west-2"
},
"aws-textract": {
"access_key": "",
"secret_key": "",
"region": "us-west-2"
},
"mistral-ocr": { "apiKey": "" }
},
// ── GUI / static mounts ─────────────────────────────────────────────
"gui_assets_root": "./src/gui",
"gui_profile": "development",
"builtin_apps": {
"dev-center": "./src/dev-center"
},
// Force the bundled GUI even in dev — set true when running from a
// pre-built tree without webpack-dev-server.
"use_bundled_gui": false,
"gui_bundle": "/dist/bundle.min.js",
"gui_css": "/dist/bundle.min.css",
"gui_puterjs_bundle": "https://js.puter.com/v2/",
"gui_params": {
"title": "Puter",
"short_description": "Your personal cloud computer",
"social_media_image": ""
},
// Optional roots for native app bundles and custom puter.js builds.
"native_apps_root": "",
"client_libs_root": "",
"puterjs_root": "./src/puter-js/dist",
// ── Feature flags (whoami extension) ────────────────────────────────
// Flat `{ flag_name: boolean }` bag. Server-only by default — flags are
// only surfaced to the client if their key is on the allowlist in
// `extensions/whoami.ts` (CLIENT_VISIBLE_FEATURE_FLAGS).
"feature_flags": {
"example_flag": false
},
// ── Misc / safety ───────────────────────────────────────────────────
// TLDs / domains rejected at signup (prod only).
"blockedEmailDomains": [],
"support_email": "[email protected]",
// Worker / subdomain names users can't claim.
"reserved_words": [],
"max_subdomains_per_user": 10,
"server_health": {
"db_liveness_latency_fail_ms": 1500,
"stale_health_loop_fail_ms": 0
},
// ── Extensions ──────────────────────────────────────────────────────
// Directories scanned for extension entrypoints (`*.ts` / subdirs).
"extensions": [
"./extensions"
],
// ── Metering ────────────────────────────────────────────────────────
// When true, all metering checks pass — no per-actor limits enforced.
"unlimitedMetering": false
}
-58
View File
@@ -1,58 +0,0 @@
import express from "express";
import { generateDevHtml, build } from "./utils.js";
import { argv } from 'node:process';
import chalk from 'chalk';
import dotenv from 'dotenv';
dotenv.config();
const app = express();
let port = process.env.PORT ?? 4000; // Starting port
const maxAttempts = 10; // Maximum number of ports to try
const env = argv[2] ?? "dev";
const startServer = (attempt, useAnyFreePort = false) => {
if (attempt > maxAttempts) {
useAnyFreePort = true; // Use any port that is free
}
const server = app.listen(useAnyFreePort ? 0 : port, () => {
console.log("\n-----------------------------------------------------------\n");
console.log(`Puter is now live at: `, chalk.underline.blue(`http://localhost:${server.address().port}`));
console.log("\n-----------------------------------------------------------\n");
}).on('error', (err) => {
if (err.code === 'EADDRINUSE') { // Check if the error is because the port is already in use
console.error(chalk.red(`ERROR: Port ${port} is already in use. Trying next port...`));
port++; // Increment the port number
startServer(attempt + 1); // Try the next port
}
});
};
// Start the server with the first attempt
startServer(1);
// build the GUI
build();
app.get(["/", "/app/*", "/action/*"], (req, res) => {
res.send(generateDevHtml({
env: env,
api_origin: "https://api.puter.com",
title: "Puter",
max_item_name_length: 150,
require_email_verification_to_publish_website: false,
short_description: `Puter is a privacy-first personal cloud that houses all your files, apps, and games in one private and secure place, accessible from anywhere at any time.`,
}));
})
app.use(express.static('./'));
if(env === "prod"){
// make sure to serve the ./dist/ folder maps to the root of the website
app.use(express.static('./dist/'));
}
if(env === "dev"){
app.use(express.static('./src/'));
}
export { app };
+104
View File
@@ -0,0 +1,104 @@
# Backend Architecture
Loosely inspired by the Controller–Service–Repository pattern with dependency injection. The backend is organized as a stack of layers where each layer only depends on the layers beneath it, and `PuterServer` ([src/backend/server.ts](../src/backend/server.ts)) instantiates each layer in order and hands the instances down to the next.
## Layers
```mermaid
block-beta
columns 1
REQ["HTTP request"]
CTRL["Controllers — route handlers, gates, I/O shaping"]
DRV["Drivers (optional) — RPC handlers on /drivers/*"]
SVC["Services — business logic, no auth"]
STR["Stores — persistence / domain shapes"]
CLI["Clients — sql, redis, s3, dynamo, email, …"]
CFG["Config — IConfig"]
REQ --> CTRL
CTRL --> DRV
DRV --> SVC
SVC --> STR
STR --> CLI
CLI --> CFG
style REQ fill:#0ea5e9,stroke:#0369a1,color:#fff
style CTRL fill:#1d4ed8,stroke:#1e3a8a,color:#fff
style DRV fill:#2563eb,stroke:#1e40af,color:#fff
style SVC fill:#4f46e5,stroke:#3730a3,color:#fff
style STR fill:#7c3aed,stroke:#5b21b6,color:#fff
style CLI fill:#9333ea,stroke:#6b21a8,color:#fff
style CFG fill:#334155,stroke:#1e293b,color:#fff
```
Each layer only depends on the layers beneath it, and every dependency is injected through the constructor by `PuterServer`. Extensions sit alongside this stack and can register into any layer — see [Extensions](#extensions) below.
| Layer | Lives in | Responsibility |
| --- | --- | --- |
| **Controllers** | [src/backend/controllers/](../src/backend/controllers/) | Route handlers. Parse + validate input, apply per-route gates (auth, subdomain, rate limit, body parsers — see `RouteOptions`), call into services, format responses. |
| **Drivers** | [src/backend/drivers/](../src/backend/drivers/) | Optional. RPC-style handlers exposed over the `/drivers/*` surface (`puter-kvstore`, `puter-chat-completion`, …). A driver is a thin shell that validates RPC inputs and calls into services/stores; controllers can hold a typed reference to drivers when they need the same logic over HTTP. |
| **Services** | [src/backend/services/](../src/backend/services/) | Business logic. Assume the caller is already authenticated/authorized — services do not run auth gates themselves. |
| **Stores** | [src/backend/stores/](../src/backend/stores/) | Persistence and storage logic. Wraps clients with the domain shape services consume (rows, entities, KV namespaces). |
| **Clients** | [src/backend/clients/](../src/backend/clients/) | Adapters for external/internal services (sql, redis, s3, dynamodb, email, event bus, …). Knows protocols, not domain concepts. |
| **Config** | `config.*.json` → `IConfig` | The flat, typed config object every layer receives at construction. |
Each layer receives the layers beneath it through its constructor, so dependencies are explicit and traceable from `PuterServer`. A controller does not reach into a client directly; if it needs one, the right move is usually a service.
## Entry point: `PuterServer`
`PuterServer` is the bootstrap. It:
1. Loads any configured extension directories (`config.extensions`) so extensions can register before instantiation begins.
2. Instantiates each layer in order — clients → stores → services → drivers → controllers — merging in anything extensions have registered for that layer.
3. Wires global middleware, mounts controller routes through `PuterRouter` (which translates `RouteOptions` into the gate/parser middleware chain), and mounts extension routes through the same materializer.
4. Fires `onServerStart` hooks across every layer once HTTP is listening, and `onServerPrepareShutdown` / `onServerShutdown` on the way down.
## Context (ALS)
We use [`Context`](../src/backend/core/context.ts) — backed by `AsyncLocalStorage` — to carry per-request state without threading it through every function signature. It is used **sparingly**, mostly for `actor` and `req`. The request-context middleware opens a scope per request after the auth probe runs; anything inside a request handler can call `Context.get('actor')` / `Context.get('req')` instead of plumbing it as an argument.
Prefer explicit arguments. Reach for `Context` only when the value is truly request-scoped and would otherwise need to thread through many layers.
## Extensions
Extensions live alongside core ([packages/puter/extensions/](../extensions/)) and parallel the layered stack. They are meant for **non-crucial parts of the system** — things Puter still works without if removed.
- **Good extensions**: [thumbnails](../extensions/thumbnails.ts), [serverInfo](../extensions/serverInfo.ts), [devWatcher](../extensions/devWatcher.ts) — opt-in features cleanly bolted on.
- **Should probably be core**: [metering](../extensions/metering.ts), [appTelemetry](../extensions/appTelemetry.ts) — clients now expect these to be present, so the "extension" framing is misleading.
- **Shouldn't have been an extension**: [whoami](../extensions/whoami.ts) — it's load-bearing for every authenticated client. Keep this one in mind as a cautionary example when deciding whether something belongs in an extension.
### Extension API
The `extension` global ([src/backend/extensions.ts](../src/backend/extensions.ts)) exposes:
- **Layer registration** for first-class additions:
- `extension.registerClient(name, ClientClass)`
- `extension.registerStore(name, StoreClass)`
- `extension.registerService(name, ServiceClass)`
- `extension.registerDriver(name, DriverClass)`
- `extension.registerController(name, ControllerClass)`
- **Lightweight wrappers** for the common case where a full class isn't worth it:
- `extension.on(event, handler)` — subscribe to event-bus events.
- `extension.get(path, opts?, handler)` / `.post` / `.put` / `.delete` / `.patch` / `.head` / `.options` / `.all` / `.use` — register routes. The `opts` shape is the same `RouteOptions` controllers use, so `subdomain`, `requireAuth`, `adminOnly`, body parsers, etc. all work identically.
- **Cross-layer access**: `extension.import('client' | 'store' | 'service' | 'controller' | 'driver')` returns a lazy proxy to instantiated objects, and `extension.config` exposes the live config.
```ts
import { extension } from '@heyputer/backend/src/extensions';
const services = extension.import('service');
extension.get('/healthcheck/deep', { subdomain: 'api', adminOnly: true }, async (_req, res) => {
res.json({ ok: await services.health.runDeepCheck() });
});
extension.on('user.signup', (_key, data) => {
console.log('new user', data.user.username);
});
```
## Conventions
- **TypeScript preferred** in new code where feasible. Existing JS is fine; convert opportunistically when you're already touching a file.
- **`camelCase`** for variable/function names; **`PascalCase`** for classes and for files that contain a class (`AuthService.ts`, `KVStoreDriver.ts`).
- **Deduplicate**. If two services need the same logic, lift it into a util/helper rather than calling sideways across the same layer — services should not depend on other services for code reuse.
- **Don't reach across layers.** Controllers do not poke clients directly; services do not register routes. If you find yourself wanting to, that's usually a signal the abstraction is wrong.
-25
View File
@@ -1,25 +0,0 @@
# Contributing to Puter
## Essential / General Knowledge
### Repository Dichotomy
- Puter's GUI is at the root; `/src` is the GUI
- Puter's backend is a workspace npm package;
it resides in `packages/backend(/src)`
The above may seem counter-intuitive; backend and frontend are siblings, right?
Consider this: by a different intuition, the backend is at a "deeper" level
of function; this directory structure better adheres to soon-to-be contributors
sifting around through the files to discover "what's what".
The directory `volatile` exists _for your convenience_ to simplify running
Puter for development. When Puter is run
run with the backend with this repository as its working directory, it
will use `volatile/config` and `volatile/runtime` instead of
`/etc/puter` and `/var/puter`.
## See Next
- [Backend Documentation](../../packages/backend/doc/contributors/index.md)
<!-- - [Frontend Documentation](./frontend.md) -->
+129
View File
@@ -0,0 +1,129 @@
<h3 align="center"><img width="80" alt="Puter.com، الحاسوب السحابي الشخصي: جميع ملفاتك وتطبيقاتك وألعابك في مكان واحد يمكن الوصول إليه من أي مكان في أي وقت." src="https://assets.puter.site/puter-logo.png"></h3>
<h3 align="center">نظام تشغيل الإنترنت! مجاني ومفتوح المصدر وقابل للاستضافة الذاتية.</h3>
<p align="center">
<img alt="GitHub repo size" src="https://img.shields.io/github/repo-size/HeyPuter/puter"> <img alt="GitHub Release" src="https://img.shields.io/github/v/release/HeyPuter/puter?label=latest%20version"> <img alt="GitHub License" src="https://img.shields.io/github/license/HeyPuter/puter">
</p>
<p align="center">
<a href="https://puter.com/"><strong>« عرض توضيحي مباشر »</strong></a>
<br />
<br />
<a href="https://puter.com">Puter.com</a>
·
<a href="https://docs.puter.com" target="_blank">مجموعة أدوات التطوير</a>
·
<a href="https://discord.com/invite/PQcx7Teh8u">ديسكورد</a>
·
<a href="https://reddit.com/r/puter">ريديت</a>
·
<a href="https://twitter.com/HeyPuter">إكس (تويتر)</a>
</p>
<h3 align="center"><img width="800" style="border-radius:5px;" alt="لقطة شاشة" src="https://assets.puter.site/puter.com-screenshot-3.webp"></h3>
<br/>
## بيوتر
<div dir="rtl">
<p>بيوتر هو نظام تشغيل إنترنت متقدم ومفتوح المصدر، مصمم ليكون غنيًا بالميزات وسريعًا بشكل استثنائي وقابلًا للتوسع بدرجة كبيرة. يمكن استخدام بيوتر كـ:</p>
<ul>
<li>سحابة شخصية تعطي الأولوية للخصوصية لحفظ جميع ملفاتك وتطبيقاتك وألعابك في مكان آمن واحد، يمكن الوصول إليه من أي مكان وفي أي وقت.</li>
<li>منصة لبناء ونشر المواقع الإلكترونية وتطبيقات الويب والألعاب</li>
<li>بديل لـ Dropbox وGoogle Drive وOneDrive وغيرها، مع واجهة جديدة وميزات قوية.</li>
<li>بيئة سطح مكتب عن بُعد للخوادم ومحطات العمل.</li>
<li>مشروع ومجتمع ودود ومفتوح المصدر للتعلم عن تطوير الويب والحوسبة السحابية والأنظمة الموزعة والكثير غير ذلك!</li>
</ul>
</div>
<br/>
## البدء
### 💻 التطوير المحلي
```bash
git clone https://github.com/HeyPuter/puter
cd puter
npm install
npm start
```
سيؤدي هذا إلى تشغيل Puter على http://puter.localhost:4100 (أو المنفذ التالي المتاح).
<br/>
### 🐳 دوكر
```bash
mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
```
<br/>
### 🐙 دوكر كومبوز
#### لينكس/ماك
```bash
mkdir -p puter/config puter/data
sudo chown -R 1000:1000 puter
wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
docker compose up
```
<br/>
#### ويندوز
```powershell
mkdir -p puter
cd puter
New-Item -Path "puter\config" -ItemType Directory -Force
New-Item -Path "puter\data" -ItemType Directory -Force
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
docker compose up
```
<br/>
### ☁️ موقع Puter.com
متاح Puter كخدمة مستضافة على[**puter.com**](https://puter.com)الموقع
<br/>
## متطلبات النظام
- **Operating Systems:** لينكس، ماك، ويندوز
- **RAM** ٢ جيجابايت كحد أدنى (يوصى بـ ٤ جيجابايت)
- **Disk Space:** ١ جيجابايت مساحة حرة
- **Node.js:** الإصدار ١٦+ (يوصى بالإصدار ٢٢+)
- **npm:** أحدث إصدار مستقر
<br/>
## الدعم
تواصل مع المشرفين والمجتمع من خلال هذه القنوات:
- تقرير عن خطأ أو طلب ميزة؟ الرجاء [فتح مشكلة](https://github.com/HeyPuter/puter/issues/new/choose)
- دسكورد: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
- إكس (تويتر): [x.com/HeyPuter](https://x.com/HeyPuter)
- ريديت: [/reddit.com/r/puter](https://www.reddit.com/r/puter/)
- ماستودون: [mastodon.social/@puter](https://mastodon.social/@puter)
- مشاكل أمنية؟ [[email protected]](mailto:[email protected])
- البريد الإلكتروني للمشرفين [[email protected]](mailto:[email protected])
نحن دائمًا سعداء لمساعدتك في أي أسئلة قد تكون لديك. لا تتردد في السؤال!
<br/>
## الترخيص
هذا المستودع، بما في ذلك جميع محتوياته ومشاريعه الفرعية ووحداته ومكوناته، مرخص تحت [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt) ما لم ينص على خلاف ذلك صراحةً. قد تخضع المكتبات الخارجية المدرجة في هذا المستودع لتراخيصها الخاصة.
<br/>
+124
View File
@@ -0,0 +1,124 @@
<h3 align="center"><img width="80" alt="Puter.com, ব্যক্তিগত ক্লাউড কম্পিউটার: আপনার সমস্ত ফাইল, অ্যাপস, এবং গেম এক জায়গায়, যেকোনো সময়, যেকোনো স্থান থেকে অ্যাক্সেসযোগ্য।" src="https://assets.puter.site/puter-logo.png"></h3>
<h3 align="center">ইন্টারনেট ওএস! ফ্রি, ওপেন-সোর্স, এবং সেল্ফ-হোস্টেবল।</h3>
<p align="center">
<img alt="GitHub রেপোর আকার " src="https://img.shields.io/github/repo-size/HeyPuter/puter"> <img alt="GitHub রিলিজ" src="https://img.shields.io/github/v/release/HeyPuter/puter?label=latest%20version"> <img alt="GitHub লাইসেন্স" src="https://img.shields.io/github/license/HeyPuter/puter">
</p>
<p align="center">
<a href="https://puter.com/"><strong>« লাইভ ডেমো »</strong></a>
<br />
<br />
<a href="https://puter.com">Puter.com</a>
·
<a href="https://docs.puter.com" target="_blank">এসডিকে</a>
·
<a href="https://discord.com/invite/PQcx7Teh8u">ডিসকর্ড</a>
·
<a href="https://reddit.com/r/puter">রেডিট</a>
·
<a href="https://twitter.com/HeyPuter">X (টুইটার)</a>
</p>
<h3 align="center"><img width="800" style="border-radius:5px;" alt="স্ক্রিনশট" src="https://assets.puter.site/puter.com-screenshot-3.webp"></h3>
<br/>
## Puter
Puter একটি উন্নত, ওপেন-সোর্স ইন্টারনেট অপারেটিং সিস্টেম যা বৈশিষ্ট্যপূর্ণ, অত্যন্ত দ্রুত এবং উচ্চ মাত্রায় সম্প্রসারণযোগ্য। Puter ব্যবহার করা যেতে পারে:
- একটি প্রাইভেসি-প্রথম পার্সোনাল ক্লাউড হিসাবে যা আপনার সমস্ত ফাইল, অ্যাপস এবং গেমসকে এক জায়গায় নিরাপদে রাখে, যেকোনো সময় যেকোনো স্থান থেকে অ্যাক্সেসযোগ্য।
- ওয়েবসাইট, ওয়েব অ্যাপ এবং গেম তৈরি ও প্রকাশ করার একটি প্ল্যাটফর্ম হিসাবে।
- ড্রপবক্স, গুগল ড্রাইভ, ওয়ানড্রাইভ ইত্যাদির বিকল্প হিসাবে একটি নতুন ইন্টারফেস এবং শক্তিশালী বৈশিষ্ট্য সহ।
- সার্ভার এবং ওয়ার্কস্টেশনের জন্য একটি রিমোট ডেস্কটপ এনভায়রনমেন্ট হিসাবে।
- ওয়েব ডেভেলপমেন্ট, ক্লাউড কম্পিউটিং, ডিস্ট্রিবিউটেড সিস্টেম এবং আরও অনেক কিছু শিখতে একটি বন্ধুত্বপূর্ণ, ওপেন-সোর্স প্রকল্প এবং কমিউনিটি হিসাবে!
<br/>
## শুরু করার জন্য
## 💻 লোকাল ডেভেলপমেন্ট
```bash
Copy code
git clone https://github.com/HeyPuter/puter
cd puter
npm install
npm start
```
এটি Puter কে http://puter.localhost:4100 (অথবা পরবর্তী উপলব্ধ পোর্টে) চালু করবে।
<br/>
## 🐳 ডকার
```bash
Copy code
mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
```
<br/>
## 🐙 ডকার কম্পোজ
## লিনাক্স/ম্যাকওএস
```bash
Copy code
mkdir -p puter/config puter/data
sudo chown -R 1000:1000 puter
wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
docker compose up
```
<br/>
## উইন্ডোজ
```powershell
Copy code
mkdir -p puter
cd puter
New-Item -Path "puter\config" -ItemType Directory -Force
New-Item -Path "puter\data" -ItemType Directory -Force
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
docker compose up
```
<br/>
## ☁️ Puter.com
Puter [**puter.com**](https://puter.com) এ হোস্টেড সার্ভিস হিসেবে উপলব্ধ।
<br/>
## সিস্টেম রিকোয়ারমেন্টস
- **অপারেটিং সিস্টেম:** লিনাক্স, ম্যাকওএস, উইন্ডোজ
- **র‍্যাম:** ২জিবি ন্যূনতম (৪জিবি প্রস্তাবিত)
- **ডিস্ক স্পেস:** ১জিবি ফ্রি স্পেস
- **Node.js:** সংস্করণ ১৬+ (সংস্করণ ২২+ প্রস্তাবিত)
- **npm:** সর্বশেষ স্থিতিশীল সংস্করণ
<br/>
## সাপোর্ট
মেইনটেইনার এবং কমিউনিটির সাথে এই চ্যানেলগুলির মাধ্যমে সংযোগ করুন:
- বাগ রিপোর্ট বা ফিচার রিকোয়েস্ট? অনুগ্রহ করে একটি ইস্যু খুলুন।
- ডিসকর্ড: discord.com/invite/PQcx7Teh8u
- X (টুইটার): x.com/HeyPuter
- রেডিট: reddit.com/r/puter/
- মাস্টডন: mastodon.social/@puter
- সিকিউরিটি ইস্যু? security@puter.com
- মেইনটেইনারদের ইমেইল করুন hi@puter.com এ
আপনার যেকোনো প্রশ্নের জন্য আমরা সবসময় সাহায্য করতে প্রস্তুত। জিজ্ঞাসা করতে দ্বিধা করবেন না!
<br/>
## লাইসেন্স
এই রিপোজিটরি, এর সমস্ত বিষয়বস্তু, সাব-প্রকল্প, মডিউল, এবং কম্পোনেন্ট সহ [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt) লাইসেন্সের অধীনে লাইসেন্সকৃত, যদি অন্যথায় স্পষ্টভাবে উল্লেখ না করা হয়। এই রিপোজিটরিতে অন্তর্ভুক্ত তৃতীয় পক্ষের লাইব্রেরিগুলি তাদের নিজস্ব লাইসেন্সের অধীনে হতে পারে।
<br/>
+127
View File
@@ -0,0 +1,127 @@
<h3 align="center"><img width="80" alt="Puter.com, Den Personlige Cloudcomputer: Alle dine filer, apps og spil på ét sted tilgængelige fra hvor som helst til enhver tid." src="https://assets.puter.site/puter-logo.png"></h3>
<h3 align="center">Internet OS'et! Gratis, Open-Source og kan selvhostes.</h3>
<p align="center">
<img alt="GitHub repo størrelse" src="https://img.shields.io/github/repo-size/HeyPuter/puter"> <img alt="GitHub Udgivelse" src="https://img.shields.io/github/v/release/HeyPuter/puter?label=latest%20version"> <img alt="GitHub Licens" src="https://img.shields.io/github/license/HeyPuter/puter">
</p>
<p align="center">
<a href="https://puter.com/"><strong>« LIVE DEMO »</strong></a>
<br />
<br />
<a href="https://puter.com">Puter.com</a>
·
<a href="https://docs.puter.com" target="_blank">SDK</a>
·
<a href="https://discord.com/invite/PQcx7Teh8u">Discord</a>
·
<a href="https://reddit.com/r/puter">Reddit</a>
·
<a href="https://twitter.com/HeyPuter">X (Twitter)</a>
</p>
<h3 align="center"><img width="800" style="border-radius:5px;" alt="skærmbillede" src="https://assets.puter.site/puter.com-screenshot-3.webp"></h3>
<br/>
## Puter
Puter er et avanceret, open-source internetoperativsystem designet til at være funktionsrigt, exceptionelt hurtigt og meget udvideligt. Puter kan bruges som:
- En privatlivsfokuseret personlig sky til at opbevare alle dine filer, apps og spil på ét sikkert sted, tilgængeligt hvor som helst og når som helst.
- En platform til at bygge og publicere hjemmesider, webapplikationer og spil.
- Et alternativ til Dropbox, Google Drive, OneDrive osv. med et friskt interface og kraftfulde funktioner.
- Et fjernskrivebordsmiljø for servere og arbejdsstationer.
- Et venligt, open-source projekt og fællesskab til at lære om webudvikling, cloud computing, distribuerede systemer og meget mere!
<br/>
## Kom godt i gang
### 💻 Lokal Udvikling
```bash
git clone https://github.com/HeyPuter/puter
cd puter
npm install
npm start
```
Dette vil starte Puter på http://puter.localhost:4100 (eller den næste tilgængelige port).
<br/>
### 🐳 Docker
```bash
mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
```
<br/>
### 🐙 Docker Compose
#### Linux/macOS
```bash
mkdir -p puter/config puter/data
sudo chown -R 1000:1000 puter
wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
docker compose up
```
<br/>
#### Windows
```powershell
mkdir -p puter
cd puter
New-Item -Path "puter\config" -ItemType Directory -Force
New-Item -Path "puter\data" -ItemType Directory -Force
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
docker compose up
```
<br/>
### ☁️ Puter.com
Puter er tilgængelig som en hosted tjeneste på [**puter.com**](https://puter.com).
<br/>
## Systemkrav
- **Operativsystemer:** Linux, macOS, Windows
- **RAM:** 2GB minimum (4GB anbefales)
- **Diskplads:** 1GB fri plads
- **Node.js:** Version 16+ (Version 22+ anbefales)
- **npm:** Seneste stabile version
<br/>
## Support
Kom i kontakt med vedligeholderne og fællesskabet gennem disse kanaler:
- Bugrapport eller funktionønske? Åbn [venligst en sag](https://github.com/HeyPuter/puter/issues/new/choose).
- Discord: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
- X (Twitter): [x.com/HeyPuter](https://x.com/HeyPuter)
- Reddit: [reddit.com/r/puter/](https://www.reddit.com/r/puter/)
- Mastodon: [mastodon.social/@puter](https://mastodon.social/@puter)
- Sikkerhedsspørgsmål? [[email protected]](mailto:[email protected])
- Send email til vedligeholdere på [[email protected]](mailto:[email protected])
Vi er altid glade for at hjælpe dig med eventuelle spørgsmål, du måtte have. Tøv ikke med at spørge!
<br/>
## Licens
Dette repository, inklusive alt dets indhold, underprojekter, moduler og komponenter, er licenseret under [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt), medmindre andet er udtrykkeligt angivet. Tredjepartsbiblioteker inkluderet i dette repository kan være underlagt deres egne licenser.
<br/>
+127
View File
@@ -0,0 +1,127 @@
<h3 align="center"><img width="80" alt="Puter.com, Der persönliche Cloud-Computer: Alle Ihre Dateien, Apps und Spiele an einem Ort, jederzeit und überall zugänglich." src="https://assets.puter.site/puter-logo.png"></h3>
<h3 align="center">Das Internet-Betriebssystem! Kostenlos, Open-Source und selbst hostbar.</h3>
<p align="center">
<img alt="GitHub Repo-Größe" src="https://img.shields.io/github/repo-size/HeyPuter/puter"> <img alt="GitHub Veröffentlichung" src="https://img.shields.io/github/v/release/HeyPuter/puter?label=neueste%20Version"> <img alt="GitHub Lizenz" src="https://img.shields.io/github/license/HeyPuter/puter">
</p>
<p align="center">
<a href="https://puter.com/"><strong>« LIVE DEMO »</strong></a>
<br />
<br />
<a href="https://puter.com">Puter.com</a>
·
<a href="https://docs.puter.com" target="_blank">SDK</a>
·
<a href="https://discord.com/invite/PQcx7Teh8u">Discord</a>
·
<a href="https://reddit.com/r/puter">Reddit</a>
·
<a href="https://twitter.com/HeyPuter">X (Twitter)</a>
</p>
<h3 align="center"><img width="800" style="border-radius:5px;" alt="Bildschirmfoto" src="https://assets.puter.site/puter.com-screenshot-3.webp"></h3>
<br/>
## Puter
Puter ist ein fortschrittliches, Open-Source-Internet-Betriebssystem, das funktionsreich, außergewöhnlich schnell und hochgradig erweiterbar konzipiert wurde. Puter kann verwendet werden als:
- Eine datenschutzfreundliche persönliche Cloud, um alle Ihre Dateien, Apps und Spiele an einem sicheren Ort aufzubewahren, jederzeit und überall zugänglich.
- Eine Plattform zum Erstellen und Veröffentlichen von Websites, Webanwendungen und Spielen.
- Eine Alternative zu Dropbox, Google Drive, OneDrive usw. mit einer frischen Benutzeroberfläche und leistungsstarken Funktionen.
- Eine Remote-Desktop-Umgebung für Server und Workstations.
- Ein freundliches, Open-Source-Projekt und eine Community, um mehr über Webentwicklung, Cloud Computing, verteilte Systeme und vieles mehr zu lernen!
<br/>
## Erste Schritte
### 💻 Lokale Entwicklung
```bash
git clone https://github.com/HeyPuter/puter
cd puter
npm install
npm start
```
Dies startet Puter unter http://puter.localhost:4100 (oder dem nächsten verfügbaren Port).
<br/>
### 🐳 Docker
```bash
mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
```
<br/>
### 🐙 Docker Compose
#### Linux/macOS
```bash
mkdir -p puter/config puter/data
sudo chown -R 1000:1000 puter
wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
docker compose up
```
<br/>
#### Windows
```powershell
mkdir -p puter
cd puter
New-Item -Path "puter\config" -ItemType Directory -Force
New-Item -Path "puter\data" -ItemType Directory -Force
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
docker compose up
```
<br/>
### ☁️ Puter.com
Puter ist als gehosteter Dienst unter [**puter.com**](https://puter.com) verfügbar.
<br/>
## Systemanforderungen
- **Betriebssysteme:** Linux, macOS, Windows
- **RAM:** Mindestens 2GB (4GB empfohlen)
- **Festplattenspeicher:** 1GB freier Speicherplatz
- **Node.js:** Version 16+ (Version 22+ empfohlen)
- **npm:** Neueste stabile Version
<br/>
## Unterstützung
Verbinden Sie sich mit den Maintainern und der Community über diese Kanäle:
- Fehlerbericht oder Funktionsanfrage? Bitte [öffnen Sie ein Issue](https://github.com/HeyPuter/puter/issues/new/choose).
- Discord: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
- X (Twitter): [x.com/HeyPuter](https://x.com/HeyPuter)
- Reddit: [reddit.com/r/puter/](https://www.reddit.com/r/puter/)
- Mastodon: [mastodon.social/@puter](https://mastodon.social/@puter)
- Sicherheitsprobleme? [[email protected]](mailto:[email protected])
- E-Mail an die Maintainer: [[email protected]](mailto:[email protected])
Wir helfen Ihnen gerne bei allen Fragen, die Sie haben könnten. Zögern Sie nicht zu fragen!
<br/>
## Lizenz
Dieses Repository, einschließlich aller Inhalte, Unterprojekte, Module und Komponenten, ist unter [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt) lizenziert, sofern nicht ausdrücklich anders angegeben. In diesem Repository enthaltene Bibliotheken von Drittanbietern können ihren eigenen Lizenzen unterliegen.
<br/>
+127
View File
@@ -0,0 +1,127 @@
<h3 align="center"><img width="80" alt="Puter.com, The Personal Cloud Computer: All your files, apps, and games in one place accessible from anywhere at any time." src="https://assets.puter.site/puter-logo.png"></h3>
<h3 align="center">The Internet OS! Free, Open-Source, and Self-Hostable.</h3>
<p align="center">
<img alt="GitHub repo size" src="https://img.shields.io/github/repo-size/HeyPuter/puter"> <img alt="GitHub Release" src="https://img.shields.io/github/v/release/HeyPuter/puter?label=latest%20version"> <img alt="GitHub License" src="https://img.shields.io/github/license/HeyPuter/puter">
</p>
<p align="center">
<a href="https://puter.com/"><strong>« LIVE DEMO »</strong></a>
<br />
<br />
<a href="https://puter.com">Puter.com</a>
·
<a href="https://docs.puter.com" target="_blank">SDK</a>
·
<a href="https://discord.com/invite/PQcx7Teh8u">Discord</a>
·
<a href="https://reddit.com/r/puter">Reddit</a>
·
<a href="https://twitter.com/HeyPuter">X (Twitter)</a>
</p>
<h3 align="center"><img width="800" style="border-radius:5px;" alt="screenshot" src="https://assets.puter.site/puter.com-screenshot-3.webp"></h3>
<br/>
## Puter
Puter is an advanced, open-source internet operating system designed to be feature-rich, exceptionally fast, and highly extensible. Puter can be used as:
- A privacy-first personal cloud to keep all your files, apps, and games in one secure place, accessible from anywhere at any time.
- A platform for building and publishing websites, web apps, and games.
- An alternative to Dropbox, Google Drive, OneDrive, etc. with a fresh interface and powerful features.
- A remote desktop environment for servers and workstations.
- A friendly, open-source project and community to learn about web development, cloud computing, distributed systems, and much more!
<br/>
## Getting Started
### 💻 Local Development
```bash
git clone https://github.com/HeyPuter/puter
cd puter
npm install
npm start
```
This will launch Puter at http://puter.localhost:4100 (or the next available port).
<br/>
### 🐳 Docker
```bash
mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
```
<br/>
### 🐙 Docker Compose
#### Linux/macOS
```bash
mkdir -p puter/config puter/data
sudo chown -R 1000:1000 puter
wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
docker compose up
```
<br/>
#### Windows
```powershell
mkdir -p puter
cd puter
New-Item -Path "puter\config" -ItemType Directory -Force
New-Item -Path "puter\data" -ItemType Directory -Force
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
docker compose up
```
<br/>
### ☁️ Puter.com
Puter is available as a hosted service at [**puter.com**](https://puter.com).
<br/>
## System Requirements
- **Operating Systems:** Linux, macOS, Windows
- **RAM:** 2GB minimum (4GB recommended)
- **Disk Space:** 1GB free space
- **Node.js:** Version 16+ (Version 22+ recommended)
- **npm:** Latest stable version
<br/>
## Support
Connect with the maintainers and community through these channels:
- Bug report or feature request? Please [open an issue](https://github.com/HeyPuter/puter/issues/new/choose).
- Discord: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
- X (Twitter): [x.com/HeyPuter](https://x.com/HeyPuter)
- Reddit: [reddit.com/r/puter/](https://www.reddit.com/r/puter/)
- Mastodon: [mastodon.social/@puter](https://mastodon.social/@puter)
- Security issues? [[email protected]](mailto:[email protected])
- Email maintainers at [[email protected]](mailto:[email protected])
We are always happy to help you with any questions you may have. Don't hesitate to ask!
<br/>
## License
This repository, including all its contents, sub-projects, modules, and components, is licensed under [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt) unless explicitly stated otherwise. Third-party libraries included in this repository may be subject to their own licenses.
<br/>
+171
View File
@@ -0,0 +1,171 @@
<h3 align="center"><img width="80" alt="Puter.com, El Computador Personal en Nube: Todos tus archivos, apps y juegos en un solo lugar accesible desde cualquier lugar en cualquier momento" src="https://assets.puter.site/puter-logo.png"></h3>
<h3 align="center">El Sistema Operativo de Internet! Gratis, de Código abierto, y Autohospedable.</h3>
<p align="center">
<a href="https://puter.com/"><strong>« DEMO EN VIVO »</strong></a>
<br />
<br />
<a href="https://puter.com">Puter.com</a>
·
<a href="https://apps.puter.com/">App Store</a>
·
<a href="https://developer.puter.com" target="_blank">Developers</a>
·
<a href="https://github.com/heyputer/puter-cli" target="_blank">CLI</a>
·
<a href="https://discord.com/invite/PQcx7Teh8u">Discord</a>
·
<a href="https://reddit.com/r/puter">Reddit</a>
·
<a href="https://x.com/HeyPuter">X (Twitter)</a>
</p>
<h3 align="center"><img width="800" style="border-radius:5px;" alt="screenshot" src="https://assets.puter.site/puter.com-screenshot-3.webp"></h3>
<br/>
## Puter
Puter es un sistema operativo en internet avanzado y de código abierto, diseñado para ser rico en funcionalidades, excepcionalmente rápido y altamente extensible. Puter puede ser usado como:
- Una nube personal privada para almacenar todos tus archivos, aplicaciones y juegos en un lugar seguro, accesible y desde cualquier lugar en cualquier momento.
- Una plataforma para construir y publicar páginas web, aplicativos sobre la web y juegos.
- Una alternativa a Dropbox, Google Drive, OneDrive, etc. con una interfaz fresca y llena de funcionalidades.
- Un entorno de escritorio remoto para servidores y estaciones de trabajo.
- Un proyecto y comunidad abiertas y amigables para aprender sobre desarrollo web, computación en la nube, sistemas distribuidos y mucho más!
<br/>
## Primeros Pasos
### 💻 Desarrollo Local
```bash
git clone https://github.com/HeyPuter/puter
cd puter
npm install
npm start
```
✨ Esto ejecutará Puter en http://puter.localhost:4100 (o el siguiente puerto disponible).
Si esto no funciona, consulta [First Run Issues](./doc/self-hosters/first-run-issues.md) para obtener pasos de solución de problemas.
<br/>
### 🐳 Docker
```bash
mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
```
✨ Esto ejecutará Puter en http://puter.localhost:4100 (o el siguiente puerto disponible).
<br/>
### 🐙 Docker Compose
#### Linux/macOS
```bash
mkdir -p puter/config puter/data
sudo chown -R 1000:1000 puter
wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
docker compose up
```
✨ Esto ejecutará Puter en http://puter.localhost:4100 (o el siguiente puerto disponible).
<br/>
#### Windows
```powershell
mkdir -p puter
cd puter
New-Item -Path "puter\config" -ItemType Directory -Force
New-Item -Path "puter\data" -ItemType Directory -Force
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
docker compose up
```
✨ Esto ejecutará Puter en http://puter.localhost:4100 (o el siguiente puerto disponible).
<br/>
### 🚀 Auto-Hospedaje
Para guías detalladas sobre cómo auto-hospedar Puter, incluyendo opciones de configuración y mejores prácticas, consulta nuestra [Documentación de Auto-Hospedaje](https://github.com/HeyPuter/puter/blob/main/doc/self-hosters/instructions.md).
### ☁️ Puter.com
Puter está disponible como servicio alojado en [**puter.com**](https://puter.com).
<br/>
## Requerimientos del sistema
- **Sistemas operativos:** Linux, macOS, Windows
- **RAM:** 2GB mínimo (4GB recomendados)
- **Almacenamiento:** 1GB de espacio libre
- **Node.js:** Versión 16+ (Versión 23+ recomendada)
- **npm:** Última version estable
<br/>
## Soporte
Conéctate con los mantenedores y la comunidad a través de estos canales:
- Reporte de bug o solicitud de funcionalidad? Por favor [abrir un issue](https://github.com/HeyPuter/puter/issues/new/choose).
- Discord: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
- X (Twitter): [x.com/HeyPuter](https://x.com/HeyPuter)
- Reddit: [reddit.com/r/puter/](https://www.reddit.com/r/puter/)
- Mastodon: [mastodon.social/@puter](https://mastodon.social/@puter)
- Problemas de seguridad? [[email protected]](mailto:[email protected])
- Envia un email a los mantenedores en [[email protected]](mailto:[email protected])
Estamos siempre felices de ayudar con cualquier pregunta que puedas tener. No dudes en preguntar!
<br/>
## Licencia
Este repositorio, incluyendo todo su contenido, sub-proyectos, modulos y componentes, esta licenciado bajo [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt) a menos que se indique explícitamente lo contrario. Librerías de terceros incluidos en este repositorio pueden estar sujetas a sus propias licencias.
<br/>
## Traducciones
- [Arabic / العربية](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ar.md)
- [Armenian / Հայերեն](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.hy.md)
- [Bengali / বাংলা](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.bn.md)
- [Chinese / 中文](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.zh.md)
- [Danish / Dansk](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.da.md)
- [English](https://github.com/HeyPuter/puter/blob/main/README.md)
- [Farsi / فارسی](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.fa.md)
- [Finnish / Suomi](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.fi.md)
- [French / Français](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.fr.md)
- [German/ Deutsch](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.de.md)
- [Hebrew/ עברית](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.he.md)
- [Hindi / हिंदी](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.hi.md)
- [Hungarian / Magyar](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.hu.md)
- [Indonesian / Bahasa Indonesia](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.id.md)
- [Italian / Italiano](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.it.md)
- [Japanese / 日本語](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.jp.md)
- [Korean / 한국어](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ko.md)
- [Malayalam / മലയാളം](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ml.md)
- [Polish / Polski](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.pl.md)
- [Portuguese / Português](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.pt.md)
- [Romanian / Română](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ro.md)
- [Russian / Русский](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ru.md)
- [Spanish / Español](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.es.md)
- [Swedish / Svenska](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.sv.md)
- [Tamil / தமிழ்](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ta.md)
- [Telugu / తెలుగు](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.te.md)
- [Thai / ไทย](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.th.md)
- [Turkish / Türkçe](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.tr.md)
- [Ukrainian / Українська](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ua.md)
- [Urdu / اردو](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ur.md)
- [Vietnamese / Tiếng Việt](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.vi.md)
+133
View File
@@ -0,0 +1,133 @@
<h3 align="center"><img width="80" alt="Puter.com، رایانش ابری شخصی: همه فایل‌ها، برنامه‌ها و بازی‌های شما در یک مکان قابل دسترسی از هر جا و در هر زمان." src="https://assets.puter.site/puter-logo.png"></h3>
<h3 align="center">سیستم‌عامل اینترنت! رایگان، متن‌باز، و قابل میزبانی شخصی.</h3>
<p align="center">
<img alt="GitHub repo size" src="https://img.shields.io/github/repo-size/HeyPuter/puter"> <img alt="GitHub Release" src="https://img.shields.io/github/v/release/HeyPuter/puter?label=latest%20version"> <img alt="GitHub License" src="https://img.shields.io/github/license/HeyPuter/puter">
</p>
<p align="center">
<a href="https://puter.com/"><strong>« نسخه نمایشی زنده »</strong></a>
<br />
<br />
<a href="https://puter.com">Puter.com</a>
·
<a href="https://docs.puter.com" target="_blank">مستندات توسعه‌دهندگان</a>
·
<a href="https://discord.com/invite/PQcx7Teh8u">دیسکورد</a>
·
<a href="https://reddit.com/r/puter">ردیت</a>
·
<a href="https://twitter.com/HeyPuter">ایکس (توییتر)</a>
</p>
<h3 align="center"><img width="800" style="border-radius:5px;" alt="عکس صفحه" src="https://assets.puter.site/puter.com-screenshot-3.webp"></h3>
<br/>
## پیوتر
<div dir="rtl">
<p>پیوتر یک سیستم عامل تحت وب پیشرفته‌ی متن‌باز است که به منظور ایجاد ویژگی‌های متنوع، سرعت بسیار بالا، و مقیاس‌پذیری طراحی شده است. از پیوتر می‌توان به‌عنوان:</p>
<ul>
<li>یک فضای ابری شخصی که بر حریم خصوصی تمرکز دارد و تمام فایل‌ها، برنامه‌ها، و بازی‌های شما را در یک مکان امن ذخیره می‌کند، قابل دسترسی از هر جا و در هر زمان.</li>
<li>پلتفرمی برای ساخت و انتشار وب‌سایت‌ها، اپلیکیشن‌های وب، و بازی‌ها.</li>
<li>جایگزینی برای Dropbox، Google Drive، OneDrive، و سایر موارد، با یک رابط کاربری مدرن و قابلیت‌های قدرتمند.</li>
<li>یک محیط دسکتاپ از راه دور برای سرورها و ایستگاه‌های کاری.</li>
<li> یک پروژه و جامعه‌ی متن‌باز دوستانه برای یادگیری توسعه وب، رایانش ابری، سیستم‌های توزیع‌شده، و موارد دیگر نام برد!</li>
</ul>
</div>
<br/>
## نحوه‌ی استفاده
### 💻 توسعه‌ی محلی
```bash
git clone https://github.com/HeyPuter/puter
cd puter
npm install
npm start
```
این کار پیوتر را در http://puter.localhost:4100 (یا پورت در دسترس بعدی) اجرا می‌کند.
<br/>
### 🐳 داکر
```bash
mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
```
<br/>
### 🐙 داکر کامپوز
#### لینوکس/مک
```bash
mkdir -p puter/config puter/data
sudo chown -R 1000:1000 puter
wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
docker compose up
```
<br/>
#### ویندوز
```powershell
mkdir -p puter
cd puter
New-Item -Path "puter\config" -ItemType Directory -Force
New-Item -Path "puter\data" -ItemType Directory -Force
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
docker compose up
```
<br/>
### ☁️ وبگاه Puter.com
پیوتر به‌عنوان یک سرویس میزبانی‌شده در وبگاه [**puter.com**](https://puter.com) موجود است.
## پیش‌نیازهای سیستم
- **سیستم‌عامل‌ها:** لینوکس، مک، ویندوز
- **RAM** حداقل ۲ گیگابایت (پیشنهاد: ۴ گیگابایت)
- **فضای دیسک:** ۱ گیگابایت فضای خالی
- **Node.js:** نسخه ۱۶+ (پیشنهاد: نسخه ۲۲+)
- **npm:** آخرین نسخه پایدار
<br/>
## پشتیبانی
با مدیران و انجمن از طریق این کانال‌ها در تماس باشید:
- گزارش اشکال یا درخواست ویژگی؟ لطفاً [Isuue باز کنید](https://github.com/HeyPuter/puter/issues/new/choose)
- دیسکورد: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
- ایکس (توییتر): [x.com/HeyPuter](https://x.com/HeyPuter)
- ردیت: [/reddit.com/r/puter](https://www.reddit.com/r/puter/)
- ماستودون: [mastodon.social/@puter](https://mastodon.social/@puter)
- مشکلات امنیتی؟ [[email protected]](mailto:[email protected])
- ایمیل مدیران: [[email protected]](mailto:[email protected])
ما همیشه از پاسخگویی به سوالات شما خرسند هستیم. در سوال پرسیدن درنگ نکنید!
## گواهی
این مخزن، شامل تمام محتویات، پروژه‌های فرعی، ماژول‌ها و اجزای آن، تحت مجوز [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt) است مگر آنکه خلاف آن به‌طور صریح ذکر شده باشد. کتابخانه‌های خارجی ممکن است گواهی‌های جداگانه داشته باشند.
<br/>
+126
View File
@@ -0,0 +1,126 @@
<h3 align="center"><img width="80" alt="Puter.com, The Personal Cloud Computer: All your files, apps, and games in one place accessible from anywhere at any time." src="https://assets.puter.site/puter-logo.png"></h3>
<h3 align="center">Internetin käyttöjärjestelmä! Ilmainen, avoimen lähdekoodin ja itse isännöitävä.</h3>
<p align="center">
<img alt="GitHub repo size" src="https://img.shields.io/github/repo-size/HeyPuter/puter"> <img alt="GitHub Release" src="https://img.shields.io/github/v/release/HeyPuter/puter?label=viimeisin%20versio"> <img alt="GitHub License" src="https://img.shields.io/github/license/HeyPuter/puter">
</p>
<p align="center">
<a href="https://puter.com/"><strong>« LIVE DEMO »</strong></a>
<br />
<br />
<a href="https://puter.com">Puter.com</a>
·
<a href="https://docs.puter.com" target="_blank">SDK</a>
·
<a href="https://discord.com/invite/PQcx7Teh8u">Discord</a>
·
<a href="https://reddit.com/r/puter">Reddit</a>
·
<a href="https://twitter.com/HeyPuter">X (Twitter)</a>
</p>
<h3 align="center"><img width="800" style="border-radius:5px;" alt="näyttökuva" src="https://assets.puter.site/puter.com-screenshot-3.webp"></h3>
<br/>
## Puter
Puter on kehittynyt, avoimen lähdekoodin internetin käyttöjärjestelmä, joka on suunniteltu olemaan ominaisuuksiltaan rikas, poikkeuksellisen nopea ja erittäin laajennettava. Puteria voidaan käyttää:
- Yksityisyyttä kunnioittavana henkilökohtaisena pilvenä, johon voit tallentaa kaikki tiedostosi, sovelluksesi ja pelisi turvallisesti yhdessä paikassa, josta ne ovat saatavilla missä tahansa ja milloin tahansa.
- Alustana verkkosivustojen, web-sovellusten ja pelien rakentamiseen ja julkaisemiseen.
- Vaihtoehtona Dropboxille, Google Drivelle, OneDrivelle jne. tuoreella käyttöliittymällä ja tehokkailla ominaisuuksilla.
- Etätyöpöytäympäristönä palvelimille ja työasemille.
- Ystävällisenä, avoimen lähdekoodin projektina ja yhteisönä, jossa voit oppia verkkokehityksestä, pilvipalveluista, hajautetuista järjestelmistä ja paljon muusta!
<br/>
## Aloittaminen
### 💻 Paikallinen kehitys
```bash
git clone https://github.com/HeyPuter/puter
cd puter
npm install
npm start
```
Tämä käynnistää Puterin osoitteessa http://puter.localhost:4100 (tai seuraavassa vapaassa portissa).
<br/>
### 🐳 Docker
```bash
mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
```
<br/>
### 🐙 Docker Compose
#### Linux/macOS
```bash
mkdir -p puter/config puter/data
sudo chown -R 1000:1000 puter
wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
docker compose up
```
<br/>
#### Windows
```powershell
mkdir -p puter
cd puter
New-Item -Path "puter\config" -ItemType Directory -Force
New-Item -Path "puter\data" -ItemType Directory -Force
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
docker compose up
```
<br/>
### ☁️ Puter.com
Puter on saatavilla isännöitynä palveluna osoitteessa [**puter.com**](https://puter.com).
<br/>
## Järjestelmävaatimukset
- **Käyttöjärjestelmät:** Linux, macOS, Windows
- **RAM:** Vähintään 2GB (Suositeltu 4GB)
- **Levytila:** 1GB vapaata tilaa
- **Node.js:** Versio 16+ (Suositeltu versio 22+)
- **npm:** Uusin vakaa versio
<br/>
## Tuki
Ota yhteyttä ylläpitäjiin ja yhteisöön näiden kanavien kautta:
- Onko sinulla virheraportti tai ominaisuuspyyntö? Ole hyvä ja [avaa uusi issue](https://github.com/HeyPuter/puter/issues/new/choose).
- Discord: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
- X (Twitter): [x.com/HeyPuter](https://x.com/HeyPuter)
- Reddit: [reddit.com/r/puter/](https://www.reddit.com/r/puter/)
- Mastodon: [mastodon.social/@puter](https://mastodon.social/@puter)
- Turvallisuusongelmat? [[email protected]](mailto:[email protected])
- Ota yhteyttä ylläpitäjiin sähköpostitse osoitteessa [[email protected]](mailto:[email protected])
Olemme aina valmiita auttamaan sinua kaikissa kysymyksissäsi. Älä epäröi kysyä!
<br/>
## Lisenssi
Tämä repository, mukaan lukien kaikki sen sisältö, aliprojektit, moduulit ja komponentit, on lisensoitu [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt)-lisenssillä, ellei toisin mainita. Tämän repositoryn mukana tulevat kolmannen osapuolen kirjastot voivat olla omien lisenssiensä alaisia.
<br/>
+125
View File
@@ -0,0 +1,125 @@
<h3 align="center"><img width="80" alt="Puter.com, L'ordinateur cloud personnel : Tous vos fichiers, applications et jeux en un seul endroit accessible de partout à tout moment." src="https://assets.puter.site/puter-logo.png"></h3>
<h3 align="center">L'OS Internet ! Gratuit, open-source et auto-hébergeable.</h3>
<p align="center">
<img alt="Taille du dépôt GitHub" src="https://img.shields.io/github/repo-size/HeyPuter/puter"> <img alt="Version GitHub" src="https://img.shields.io/github/v/release/HeyPuter/puter?label=derni%C3%A8re%20version"> <img alt="Licence GitHub" src="https://img.shields.io/github/license/HeyPuter/puter">
</p>
<p align="center">
<a href="https://puter.com/"><strong>« DÉMO EN DIRECT »</strong></a>
<br />
<br />
<a href="https://puter.com">Puter.com</a>
·
<a href="https://docs.puter.com" target="_blank">SDK</a>
·
<a href="https://discord.com/invite/PQcx7Teh8u">Discord</a>
·
<a href="https://reddit.com/r/puter">Reddit</a>
·
<a href="https://twitter.com/HeyPuter">X (Twitter)</a>
</p>
<h3 align="center"><img width="800" style="border-radius:5px;" alt="capture d'écran" src="https://assets.puter.site/puter.com-screenshot-3.webp"></h3>
<br/>
## Puter
Puter est un système d'exploitation internet avancé, open-source, conçu pour être riche en fonctionnalités, extrêmement rapide et hautement extensible. Puter peut être utilisé comme :
- Un cloud personnel axé sur la confidentialité pour garder tous vos fichiers, applications et jeux en un seul endroit sécurisé, accessible de partout à tout moment.
- Une plateforme pour créer et publier des sites web, des applications web et des jeux.
- Une alternative à Dropbox, Google Drive, OneDrive, etc. avec une interface renouvelée et des fonctionnalités puissantes.
- Un environnement de bureau à distance pour serveurs et stations de travail.
- Un projet et une communauté open-source accueillants pour apprendre le développement web, l'informatique en nuage, les systèmes distribués, et bien plus encore !
<br/>
## Démarrage
### 💻 Développement Local
```bash
git clone https://github.com/HeyPuter/puter
cd puter
npm install
npm start
```
Cela lancera Puter à http://puter.localhost:4100 (ou au port disponible suivant).
<br/>
### 🐳 Docker
```bash
mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
```
<br/>
### 🐙 Docker Compose
#### Linux/macOS
```bash
mkdir -p puter/config puter/data
sudo chown -R 1000:1000 puter
wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
docker compose up
```
<br/>
#### Windows
```powershell
mkdir -p puter
cd puter
New-Item -Path "puter\config" -ItemType Directory -Force
New-Item -Path "puter\data" -ItemType Directory -Force
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
docker compose up
```
<br/>
### ☁️ Puter.com
Puter est disponible en tant que service hébergé sur [**puter.com**](https://puter.com).
<br/>
## Configuration système requise
- **Systèmes d'exploitation:** Linux, macOS, Windows
- **RAM:** Minimum 2 Go (4 Go recommandés)
- **Espace disque:** 1 Go d'espace libre
- **Node.js:** Version 16+ (Version 22+ recommandée)
- **npm:** Dernière version stable
<br/>
## Support
Connectez-vous avec les mainteneurs et la communauté via ces canaux :
- Un bug ou une demande de fonctionnalité ? Veuillez [ouvrir une issue](https://github.com/HeyPuter/puter/issues/new/choose).
- Discord: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
- X (Twitter): [x.com/HeyPuter](https://x.com/HeyPuter)
- Reddit: [reddit.com/r/puter/](https://www.reddit.com/r/puter/)
- Mastodon: [mastodon.social/@puter](https://mastodon.social/@puter)
- Problèmes de sécurité ? [[email protected]](mailto:[email protected])
- Email des mainteneurs à [[email protected]](mailto:[email protected])
Nous sommes toujours heureux de vous aider avec toutes les questions que vous pourriez avoir. N'hésitez pas à nous demander !
<br/>
## License
Ce dépôt, y compris tout son contenu, sous-projets, modules et composants, est licencié sous [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt) sauf indication contraire explicite. Les bibliothèques tierces incluses dans ce dépôt peuvent être soumises à leurs propres licences.
<br/>
+130
View File
@@ -0,0 +1,130 @@
<h3 align="center"><img width="80" alt="Puter.com,
הענן הפרטי: כל הקבצים, האפליקציות והמשחקים שלך במקום אחד נגיש מכל מקום ובכל זמן." src="https://assets.puter.site/puter-logo.png"></h3>
<h3 align="center" dir="rtl">מערכת ההפעלה של האינטרנט! חינמית, קוד פתוח וניתנת לאחסון עצמאי.</h3>
<p align="center">
<img alt="GitHub גודל ספרית" src="https://img.shields.io/github/repo-size/HeyPuter/puter"> <img alt="GitHub גרסא" src="https://img.shields.io/github/v/release/HeyPuter/puter?label=latest%20version"> <img alt="GitHub רישיון" src="https://img.shields.io/github/license/HeyPuter/puter">
</p>
<p align="center">
<a href="https://puter.com/"><strong>« הדגמה לייב »</strong></a>
<br />
<br />
<a href="https://puter.com">Puter.com</a>
·
<a href="https://docs.puter.com" target="_blank">SDK</a>
·
<a href="https://discord.com/invite/PQcx7Teh8u">Discord</a>
·
<a href="https://reddit.com/r/puter">Reddit</a>
·
<a href="https://twitter.com/HeyPuter">X (Twitter)</a>
</p>
<h3 align="center"><img width="800" style="border-radius:5px;" alt="צילום מסך" src="https://assets.puter.site/puter.com-screenshot-3.webp"></h3>
<br/>
## Puter
<div dir="rtl">
<p div="rtl">
מערכת ההפעלה Puter הינה ספרית קוד פתוח, מתקדמת, עשירה בתכנים, מהירה במיוחד וניתנת להרחבה.
אפשר להישתמש ב Puter כ:</p>
<ul>
<li>ענן אישי עם פרטיות מקסימלית, לשמירת הקבצים, האפליקציות והמשחקים שלך במקום מאובטח אחד, נגיש מכל מקום ובכל זמן.</li>
<li>פלטפורמה לבניית ופרסום אתרים, אפליקציות ומשחקים.</li>
<li>אלטרנטיבה ל-Dropbox, Google Drive, OneDrive וכו' עם ממשק מרענן ותכנים חזקים.</li>
<li>סביבה לעבודה מרחוק לשרתים ותחנות עבודה.</li>
<li>פרוייקט ידידותי, קוד פתוח וקהילה ללמידה על פיתוח אינטרנט, פיתוח בענן, מערכות מבוזרות ועוד הרבה!</li>
<ul>
</div>
<br/>
## בוא נתחיל
### 💻 פיתוח מקומי (Localhost)
```bash
git clone https://github.com/HeyPuter/puter
cd puter
npm install
npm start
```
פקודה זו תפעיל את Puter בכתובת http://puter.localhost:4100 (או בפורט הפנוי הבא).
<br/>
### 🐳 Docker
```bash
mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
```
<br/>
### 🐙 Docker Compose
#### Linux/macOS
```bash
mkdir -p puter/config puter/data
sudo chown -R 1000:1000 puter
wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
docker compose up
```
<br/>
#### Windows
```powershell
mkdir -p puter
cd puter
New-Item -Path "puter\config" -ItemType Directory -Force
New-Item -Path "puter\data" -ItemType Directory -Force
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
docker compose up
```
<br/>
### ☁️ Puter.com
מערכת ההפעלה Puter זמינה כשירות אחסון ב- [**puter.com**](https://puter.com).
<br/>
## דרישות מערכת
- **מערכות הפעלה:** Linux, macOS, Windows
- **RAM:** לפחות 2GB, מומלץ 4GB
- **מקום פנוי בדיסק:** 1GB
- **Node.js:** גרסה 16+ (מומלץ גרסה 22+)
- **npm:** הגרסה היציבה האחרונה
<br/>
## תמיכה
צור קשר עם המפתחים והקהילה דרך הערוצים הבאים:
- דיווח על באג או בקשה לתוכן? אנא [פתח פניה](https://github.com/HeyPuter/puter/issues/new/choose).
- Discord: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
- X (Twitter): [x.com/HeyPuter](https://x.com/HeyPuter)
- Reddit: [reddit.com/r/puter](https://www.reddit.com/r/puter.)
- Mastodon: [mastodon.social/@puter](https://mastodon.social/@puter)
- בעיות אבטחה? [[email protected]](mailto:[email protected])
- שלח אימייל למפתחים ב [[email protected]](mailto:[email protected])
אנחנו תמיד שמחים לעזור עם כל שאלה שיש. אל תהסס לשאול!
<br/>
## רישיון
ספריה זו, כולל כל התכנים שלה, תתי הפרויקטים, המודולים והרכיבים שלה, מורשית תחת [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt) אלא אם נאמר אחרת במפורש. לספריות צד שלישי הכלולות בספרייה זו עשויות להיות רישיונות משלהן.
<br/>
+182
View File
@@ -0,0 +1,182 @@
<h3 align="center"><img width="80" alt="Puter.com, The Personal Cloud Computer: आपकी सारी फाइलें, ऐप्स, और गेम एक ही जगह, जिसे कहीं से भी कभी भी एक्सेस किया जा सकता है।" src="https://assets.puter.site/puter-logo.png"></h3>
<h3 align="center">इंटरनेट ओएस! फ्री, ओपन-सोर्स, और सेल्फ-होस्टेबल।</h3>
<p align="center">
<a href="https://puter.com/?ref=github.com"><strong>« लाइव डेमो »</strong></a>
<br />
<br />
<a href="https://puter.com/?ref=github.com">Puter.com</a>
·
<a href="https://apps.puter.com/">ऐप स्टोर</a>
·
<a href="https://developer.puter.com" target="_blank">डेवलपर्स</a>
·
<a href="https://github.com/heyputer/puter-cli" target="_blank">CLI</a>
·
<a href="https://discord.com/invite/PQcx7Teh8u">Discord</a>
·
<a href="https://reddit.com/r/puter">Reddit</a>
·
<a href="https://twitter.com/HeyPuter">X</a>
</p>
<h3 align="center"><img width="800" style="border-radius:5px;" alt="screenshot" src="https://assets.puter.site/puter.com-screenshot-3.webp"></h3>
<br/>
## Puter क्या है?
Puter एक एडवांस्ड, ओपन-सोर्स इंटरनेट ऑपरेटिंग सिस्टम है जिसे फीचर-रिच, तेज़ और एक्सटेंडेबल बनाने के लिए डिज़ाइन किया गया है। Puter का उपयोग आप निम्नलिखित चीजों के लिए कर सकते हैं:
- एक प्राइवेसी-फर्स्ट पर्सनल क्लाउड, जो आपकी सभी फाइलों, ऐप्स और गेम्स को एक सेफ जगह पर रखता है, जिसे आप कहीं से भी कभी भी एक्सेस कर सकते हैं।
- वेबसाइट्स, वेब ऐप्स और गेम्स बनाने और पब्लिश करने का एक प्लेटफ़ॉर्म।
- Dropbox, Google Drive, OneDrive आदि का एक शानदार और पावरफुल इंटरफ़ेस वाला विकल्प।
- सर्वर और वर्कस्टेशन के लिए एक रिमोट डेस्कटॉप एनवायरनमेंट।
- एक फ्रेंडली ओपन-सोर्स प्रोजेक्ट और कम्युनिटी, जहां आप वेब डेवलपमेंट, क्लाउड कंप्यूटिंग, डिस्ट्रीब्यूटेड सिस्टम्स और बहुत कुछ सीख सकते हैं।
<br/>
## शुरुआत कैसे करें?
### 💻 लोकल डेवलपमेंट
```bash
git clone https://github.com/HeyPuter/puter
cd puter
npm install
npm start
```
✨ यह Puter को
<font color="red"> http://puter.localhost:4100 </font> (या अगले उपलब्ध पोर्ट) पर लॉन्च करेगा।
अगर यह काम नहीं करता, तो [First Run Issues](./doc/self-hosters/first-run-issues.md) देखें।
<br/>
### 🐳 Docker
```bash
mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
```
✨ यह Puter को
<font color="red"> http://puter.localhost:4100</font> (या अगले उपलब्ध पोर्ट) पर लॉन्च करेगा।
<br/>
### 🐙 Docker Compose
#### Linux/macOS
```bash
mkdir -p puter/config puter/data
sudo chown -R 1000:1000 puter
wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
docker compose up
```
✨ यह <font color="red"> http://puter.localhost:4100 </font>
(या अगले उपलब्ध पोर्ट) पर उपलब्ध होगा।
<br/>
#### Windows
```powershell
mkdir -p puter
cd puter
New-Item -Path "puter\config" -ItemType Directory -Force
New-Item -Path "puter\data" -ItemType Directory -Force
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
docker compose up
```
✨ यह Puter को
<font color="red"> http://puter.localhost:4100 (or the next available port). </font> (या अगले उपलब्ध पोर्ट) पर लॉन्च करेगा।
<br/>
### 🚀 सेल्फ-होस्टिंग
सेल्फ-होस्टिंग के लिए विस्तृत गाइड, कॉन्फ़िगरेशन ऑप्शन्स और बेस्ट प्रैक्टिसेज जानने के लिए हमारी [Self-Hosting Documentation](https://github.com/HeyPuter/puter/blob/main/doc/self-hosters/instructions.md) देखें।
<br/>
### ☁️ Puter.com
Puter [**puter.com**](https://puter.com) पर एक होस्टेड सर्विस के रूप में भी उपलब्ध है।
<br/>
## सिस्टम आवश्यकताएँ
* **ऑपरेटिंग सिस्टम्स:** Linux, macOS, Windows
* **RAM:** कम से कम 2GB (4GB रिकमेंडेड)
* **डिस्क स्पेस:** 1GB फ्री स्पेस
* **Node.js:** वर्जन 16+ (वर्जन 23+ रिकमेंडेड)
* **npm:** लेटेस्ट स्टेबल वर्जन
<br/>
## सपोर्ट
नीचे दिए गए माध्यमों से आप मेंटेनर्स और कम्युनिटी से जुड़ सकते हैं:
* बग रिपोर्ट या फीचर रिक्वेस्ट? [यहाँ issue खोलें](https://github.com/HeyPuter/puter/issues/new/choose)।
* Discord: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
* X (Twitter): [x.com/HeyPuter](https://x.com/HeyPuter)
* Reddit: [reddit.com/r/puter/](https://www.reddit.com/r/puter/)
* Mastodon: [mastodon.social/@puter](https://mastodon.social/@puter)
* सिक्योरिटी इशूज़? [[email protected]](mailto:[email protected])
* ईमेल करें: [[email protected]](mailto:[email protected])
आपके किसी भी सवाल में मदद करने के लिए हम हमेशा तैयार हैं!
<br/>
## लाइसेंस
यह रिपॉज़िटरी और इसके सभी कंटेंट्स [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt) लाइसेंस के अंतर्गत आते हैं जब तक कि कुछ और स्पष्ट रूप से ना लिखा हो। इसमें शामिल थर्ड-पार्टी लाइब्रेरीज़ अपने-अपने लाइसेंस के अधीन हो सकती हैं।
<br/>
## अनुवाद
Puter के डॉक्यूमेंटेशन कई भाषाओं में उपलब्ध हैं, जिनमें शामिल हैं:
- [Arabic / العربية](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ar.md)
- [Armenian / Հայերեն](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.hy.md)
- [Bengali / বাংলা](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.bn.md)
- [Chinese / 中文](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.zh.md)
- [Danish / Dansk](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.da.md)
- [English](https://github.com/HeyPuter/puter/blob/main/README.md)
- [Farsi / فارسی](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.fa.md)
- [Finnish / Suomi](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.fi.md)
- [French / Français](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.fr.md)
- [German/ Deutsch](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.de.md)
- [Hebrew/ עברית](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.he.md)
- [Hindi / हिंदी](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.hi.md)
- [Hungarian / Magyar](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.hu.md)
- [Indonesian / Bahasa Indonesia](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.id.md)
- [Italian / Italiano](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.it.md)
- [Japanese / 日本語](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.jp.md)
- [Korean / 한국어](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ko.md)
- [Malayalam / മലയാളം](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ml.md)
- [Polish / Polski](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.pl.md)
- [Portuguese / Português](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.pt.md)
- [Romanian / Română](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ro.md)
- [Russian / Русский](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ru.md)
- [Spanish / Español](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.es.md)
- [Swedish / Svenska](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.sv.md)
- [Tamil / தமிழ்](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ta.md)
- [Telugu / తెలుగు](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.te.md)
- [Thai / ไทย](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.th.md)
- [Turkish / Türkçe](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.tr.md)
- [Ukrainian / Українська](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ua.md)
- [Urdu / اردو](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ur.md)
- [Vietnamese / Tiếng Việt](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.vi.md)
+128
View File
@@ -0,0 +1,128 @@
<h3 align="center"><img width="80" alt="Puter.com, A személyi felhő számítógép: Minden fájl, alkalmazás és játék egy helyen elérhető bárhonnan, bármikor." src="https://assets.puter.site/puter-logo.png"></h3>
<h3 align="center">Az internetes oprendszer! Ingyenes, nyílt-forráskódú, saját szerveren futtatható.</h3>
<p align="center">
<img alt="GitHub repo size" src="https://img.shields.io/github/repo-size/HeyPuter/puter"> <img alt="GitHub Release" src="https://img.shields.io/github/v/release/HeyPuter/puter?label=latest%20version"> <img alt="GitHub License" src="https://img.shields.io/github/license/HeyPuter/puter">
</p>
<p align="center">
<a href="https://puter.com/"><strong>« ÉLŐ DEMO »</strong></a>
<br />
<br />
<a href="https://puter.com">Puter.com</a>
·
<a href="https://docs.puter.com" target="_blank">SDK</a>
·
<a href="https://discord.com/invite/PQcx7Teh8u">Discord</a>
·
<a href="https://reddit.com/r/puter">Reddit</a>
·
<a href="https://twitter.com/HeyPuter">X (Twitter)</a>
</p>
<h3 align="center"><img width="800" style="border-radius:5px;" alt="screenshot" src="https://assets.puter.site/puter.com-screenshot-3.webp"></h3>
<br/>
## Puter
A Puter egy fejlett, nyílt forráskódú internetes operációs rendszer, amelyet úgy terveztek, hogy funkciókban gazdag, kivételesen gyors és nagymértékben bővíthető legyen. A Puter a következőképpen használható:
- Egy adatvédelmet előtérbe helyező személyes felhő, amely minden fájlt, alkalmazást és játékot egy biztonságos helyen tart. Bárhonnan és bármikor elérhető.
- Egy platform weboldalak, web-appok, és játékok készítéséhez/közzétételéhez.
- A Dropbox, Google Drive, OneDrive (stb.) alternatívája megújult felülettel és hatékony funkciókkal.
- Egy távoli desktop-környezet szervereknek és workstation-öknek.
- Egy barátságos, nyílt forráskódú projekt és közösség, amely a webfejlesztéssel, a felhőalapú számítástechnikával, elosztott rendszerekkel és sok más érdekes témával foglalkozik!
<br/>
## Első lépések
### 💻 Helyi (lokális) fejlesztés
```bash
git clone https://github.com/HeyPuter/puter
cd puter
npm install
npm start
```
Ezzel a http://puter.localhost:4100 -on futtatjuk Putert. (vagy a legközelebbi elérhető porton).
<br/>
### 🐳 Docker
```bash
mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
```
<br/>
### 🐙 Docker Compose
#### Linux/macOS
```bash
mkdir -p puter/config puter/data
sudo chown -R 1000:1000 puter
wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
docker compose up
```
<br/>
#### Windows
```powershell
mkdir -p puter
cd puter
New-Item -Path "puter\config" -ItemType Directory -Force
New-Item -Path "puter\data" -ItemType Directory -Force
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
docker compose up
```
<br/>
### ☁️ Puter.com
A Puter elérhető hostolt szolgáltatásként a [**puter.com**](https://puter.com) címen.
<br/>
## Rendszerkövetelmények
- **Operációs rendszerek:** Linux, macOS, Windows
- **RAM:** 2GB minimum (4GB ajánlott)
- **Tárhely:** 1GB szabad tárhely
- **Node.js:** 16+ (22+ verzió ajánlott)
- **npm:** legújabb stabil verzió
<br/>
## Támogatás
Lépj kapcsolatba a fejlesztőkkel és a közösséggel az alábbi platformokon:
- Észrevételeid/javaslataid vannak? Az [alábbi linken](https://github.com/HeyPuter/puter/issues/new/choose) megoszthatod velünk.
- Discord: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
- X (Twitter): [x.com/HeyPuter](https://x.com/HeyPuter)
- Reddit: [reddit.com/r/puter/](https://www.reddit.com/r/puter/)
- Mastodon: [mastodon.social/@puter](https://mastodon.social/@puter)
- Biztonsági hibák? [[email protected]](mailto:[email protected])
- A fejlesztőket a [[email protected]](mailto:[email protected]) email címen érheted el.
Mindig örömmel segítünk bármilyen felmerülő kérdésben. Bátran kérdezz tőlünk!
<br/>
## License
Ez a repo, beleértve annak minden tartalmát, alprojektjeit, moduljait és komponenseit, az [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt) licenc alatt áll, hacsak másképp nem rendelkeznek róla. A repoban szereplő harmadik fél által fejlesztett könyvtárak saját licencfeltételek alá eshetnek.
<br/>
+127
View File
@@ -0,0 +1,127 @@
<h3 align="center"><img width="80" alt="Puter.com, The Personal Cloud Computer: All your files, apps, and games in one place accessible from anywhere at any time." src="https://assets.puter.site/puter-logo.png"></h3>
<h3 align="center">Ինտերնետ ՕՀ! Անվճար, բաց կոդով և ինքնահոսթ հնարավորությամբ։</h3>
<p align="center">
<img alt="GitHub repo size" src="https://img.shields.io/github/repo-size/HeyPuter/puter"> <img alt="GitHub Release" src="https://img.shields.io/github/v/release/HeyPuter/puter?label=latest%20version"> <img alt="GitHub License" src="https://img.shields.io/github/license/HeyPuter/puter">
</p>
<p align="center">
<a href="https://puter.com/"><strong>« Օնլայն դեմո »</strong></a>
<br />
<br />
<a href="https://puter.com">Puter.com</a>
·
<a href="https://docs.puter.com" target="_blank">SDK</a>
·
<a href="https://discord.com/invite/PQcx7Teh8u">Discord</a>
·
<a href="https://reddit.com/r/puter">Reddit</a>
·
<a href="https://twitter.com/HeyPuter">X (Twitter)</a>
</p>
<h3 align="center"><img width="800" style="border-radius:5px;" alt="screenshot" src="https://assets.puter.site/puter.com-screenshot-3.webp"></h3>
<br/>
## Puter
Puter-ը առաջադեմ, բաց կոդով ինտերնետային օպերացիոն համակարգ է, որը նախագծված է լինել ֆունկցիոնալ հարուստ, բացառիկ արագ և բարձր ընդլայնելի։ Puter-ը կարող է օգտագործվել հետևյալ կերպ․
- Անձնական ամպային համակարգ՝ առաջնային գաղտնիությամբ, որը թույլ է տալիս պահել ձեր բոլոր ֆայլերը, հավելվածները և խաղերը մեկ անվտանգ վայրում, որը հասանելի է ցանկացած վայրից և ցանկացած ժամանակ։
- Պլատֆորմ կայքերի, վեբ հավելվածների և խաղերի ստեղծման և հրապարակման համար։
- Dropbox, Google Drive, OneDrive և այլ ծառայությունների այլընտրանք՝ նոր ինտերֆեյսով և հզոր գործառույթներով։
- Հեռավոր աշխատասեղանի միջավայր սերվերների և աշխատանքային կայանների համար։
- Պարզ, բաց կոդով նախագիծ և համայնք՝ վեբ ծրագրավորման, ամպային հաշվարկների, բաշխված համակարգերի և այլ թեմաների մասին սովորելու համար։
<br/>
## Սկսել
### 💻 Լոկալ ծրագրավորում
```bash
git clone https://github.com/HeyPuter/puter
cd puter
npm install
npm start
```
Սա կգործակի Puter-ը հետևյալ հասցեով՝ http://puter.localhost:4100 (կամ հաջորդ հասանելի պորտով)։
<br/>
### 🐳 Docker
```bash
mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
```
<br/>
### 🐙 Docker Compose
#### Linux/macOS
```bash
mkdir -p puter/config puter/data
sudo chown -R 1000:1000 puter
wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
docker compose up
```
<br/>
#### Windows
```powershell
mkdir -p puter
cd puter
New-Item -Path "puter\config" -ItemType Directory -Force
New-Item -Path "puter\data" -ItemType Directory -Force
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
docker compose up
```
<br/>
### ☁️ Puter.com
Puter-ը հասանելի է որպես հյուրընկալվող ծառայություն [**puter.com**](https://puter.com).
<br/>
## System Requirements
- **Օպերացիոն համակարգ:** Linux, macOS, Windows
- **Օպերատիվ հիշողություն:** 2GB նվազագույնը (4GB խորհուրդ է տրվում)
- **Համակարգչի հիշողություն:** 1GB ազատ տարածություն
- **Node.js:** Տարբերակ 16+ (Տարբերակ 22+ խորհուրդ է տրվում)
- **npm:** Վերջին կայուն տարբերակը
<br/>
## Աջակցություն
Կապվեք համակարգողների և համայնքի հետ այս կայքերի միջոցով՝
- Սխալների կամ գործառույթի հարցում՝ (https://github.com/HeyPuter/puter/issues/new/choose).
- Discord: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
- X (Twitter): [x.com/HeyPuter](https://x.com/HeyPuter)
- Reddit: [reddit.com/r/puter/](https://www.reddit.com/r/puter/)
- Mastodon: [mastodon.social/@puter](https://mastodon.social/@puter)
- Անվտանգության խնդիրներ՝ [[email protected]](mailto:[email protected])
- Email maintainers at [[email protected]](mailto:[email protected])
Մենք միշտ ուրախ ենք օգնել ձեզ ցանկացած հարցում։ Մի կաշկանդվեք հարցնել։
<br/>
## Լիցենզիա
Այս պահոցարանը, ներառյալ բոլոր իր բովանդակությունը, ենթա-պրոյեկտները, մոդուլները և բաղադրիչները, լիցենզավորվում են [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt) լիցենզիայի տակ, եթե այլ կերպ հստակ նշված չէ։ Այս պահոցարանում ներառված երրորդ կողմի գրադարանները կարող են ենթարկվել իրենց սեփական լիցենզիաներին։
<br/>
+127
View File
@@ -0,0 +1,127 @@
<h3 align="center"><img width="80" alt="Puter.com, Komputer Cloud Pribadi: Semua file, aplikasi, dan permainan Anda berada di satu tempat yang dapat diakses dari mana saja kapan saja." src="https://assets.puter.site/puter-logo.png"></h3>
<h3 align="center">Sistem Operasi Internet! Gratis, Sumber Terbuka, dan Dapat Dihosting Sendiri.</h3>
<p align="center">
<img alt="GitHub repo size" src="https://img.shields.io/github/repo-size/HeyPuter/puter"> <img alt="GitHub Release" src="https://img.shields.io/github/v/release/HeyPuter/puter?label=latest%20version"> <img alt="GitHub License" src="https://img.shields.io/github/license/HeyPuter/puter">
</p>
<p align="center">
<a href="https://puter.com/"><strong>« LIVE DEMO »</strong></a>
<br />
<br />
<a href="https://puter.com">Puter.com</a>
·
<a href="https://docs.puter.com" target="_blank">SDK</a>
·
<a href="https://discord.com/invite/PQcx7Teh8u">Discord</a>
·
<a href="https://reddit.com/r/puter">Reddit</a>
·
<a href="https://twitter.com/HeyPuter">X (Twitter)</a>
</p>
<h3 align="center"><img width="800" style="border-radius:5px;" alt="screenshot" src="https://assets.puter.site/puter.com-screenshot-3.webp"></h3>
<br/>
## Puter
Puter adalah sistem operasi internet canggih, open-source, yang dirancang untuk menjadi kaya fitur, sangat cepat, dan sangat dapat diperluas. Puter dapat digunakan sebagai:
- Cloud pribadi yang mengutamakan privasi untuk menyimpan semua file, aplikasi, dan permainan Anda di satu tempat yang aman, yang dapat diakses dari mana saja kapan saja.
- Platform untuk membangun dan mempublikasikan situs web, aplikasi web, dan permainan.
- Alternatif untuk Dropbox, Google Drive, OneDrive, dll. Dengan antarmuka baru dan fitur-fitur canggih.
- Lingkungan desktop jarak jauh untuk server dan workstation.
- Proyek dan komunitas open-source yang ramah untuk belajar tentang pengembangan web, komputasi gemawan (cloud), sistem terdistribusi, dan banyak lagi!
<br/>
## Memulai
### 💻 Pengembangan Lokal
```bash
git clone https://github.com/HeyPuter/puter
cd puter
npm install
npm start
```
Ini akan menjalankan Puter di http://puter.localhost:4100 (atau di port berikutnya yang tersedia)
<br/>
### 🐳 Docker
```bash
mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
```
<br/>
### 🐙 Docker Compose
#### Linux/macOS
```bash
mkdir -p puter/config puter/data
sudo chown -R 1000:1000 puter
wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
docker compose up
```
<br/>
#### Windows
```powershell
mkdir -p puter
cd puter
New-Item -Path "puter\config" -ItemType Directory -Force
New-Item -Path "puter\data" -ItemType Directory -Force
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
docker compose up
```
<br/>
### ☁️ Puter.com
Puter tersedia sebagai layanan yang telah dihosting di [**puter.com**](https://puter.com).
<br/>
## Persyaratan Sistem
- **Sistem Operasi:** Linux, macOS, Windows
- **RAM:** 2GB minimal (rekomendasi 4GB)
- **Penyimpanan:** 1GB ruang tersedia
- **Node.js:** Version 16+ (rekomendasi versi 22+)
- **npm:** Versi stabil termutakhir
<br/>
## Dukuangan
Terhubung dengan maintainer dan komunitas melalui saluran-saluran berikut:
- Laporan bug atau permintaan fitur? Silakan [buat issue](https://github.com/HeyPuter/puter/issues/new/choose).
- Discord: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
- X (Twitter): [x.com/HeyPuter](https://x.com/HeyPuter)
- Reddit: [reddit.com/r/puter/](https://www.reddit.com/r/puter/)
- Mastodon: [mastodon.social/@puter](https://mastodon.social/@puter)
- Isu keamanan? [[email protected]](mailto:[email protected])
- Email pengelola di [[email protected]](mailto:[email protected])
Kami selalu senang membantu Anda dengan pertanyaan apa pun yang Anda miliki. Jangan ragu untuk bertanya!
<br/>
## Lisensi
Repositori ini, termasuk semua isinya, sub-proyek, modul, dan komponen, dilisensikan di bawah [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt) kecuali dinyatakan sebaliknya secara eksplisit. Perpustakaan pihak ketiga yang termasuk dalam repositori ini mungkin tunduk pada lisensinya sendiri.
<br/>
+128
View File
@@ -0,0 +1,128 @@
<h3 align="center"><img width="80" alt="Puter.com, The Personal Cloud Computer: All your files, apps, and games in one place accessible from anywhere at any time." src="https://assets.puter.site/puter-logo.png"></h3>
<h3 align="center">Il sistema operativo di Internet! Gratuito, Open-Source e Auto-Hostabile.</h3>
<p align="center">
<img alt="GitHub repo size" src="https://img.shields.io/github/repo-size/HeyPuter/puter"> <img alt="GitHub Release" src="https://img.shields.io/github/v/release/HeyPuter/puter?label=latest%20version"> <img alt="GitHub License" src="https://img.shields.io/github/license/HeyPuter/puter">
</p>
<p align="center">
<a href="https://puter.com/"><strong>« LIVE DEMO »</strong></a>
<br />
<br />
<a href="https://puter.com">Puter.com</a>
·
<a href="https://docs.puter.com" target="_blank">SDK</a>
·
<a href="https://discord.com/invite/PQcx7Teh8u">Discord</a>
·
<a href="https://reddit.com/r/puter">Reddit</a>
·
<a href="https://twitter.com/HeyPuter">X (Twitter)</a>
</p>
<h3 align="center"><img width="800" style="border-radius:5px;" alt="screenshot" src="https://assets.puter.site/puter.com-screenshot-3.webp"></h3>
<br/>
## Puter
Puter è un sistema operativo di Internet avanzato e open-source, progettato per essere ricco di funzionalità, eccezionalmente veloce e altamente estensibile. Puter può essere utilizzato come:
- Un cloud personale che tiene conto della privacy per conservare tutti i file, le app e i giochi in un luogo sicuro, accessibile da qualsiasi luogo e in qualsiasi momento.
- Una piattaforma per creare e pubblicare siti web, app e giochi.
- Un'alternativa a Dropbox, Google Drive, OneDrive, ecc. con un'interfaccia nuova e funzioni potenti.
- Un ambiente desktop remoto per server e workstation.
- Un progetto e una comunità open-source amichevole per imparare lo sviluppo web, il cloud computing, i sistemi distribuiti e molto altro ancora!
<br/>
## Getting Started
### 💻 Local Development
```bash
git clone https://github.com/HeyPuter/puter
cd puter
npm install
npm start
```
In questo modo Puter verrà avviato all'indirizzo http://puter.localhost:4100 (o alla prossima porta disponibile).
<br/>
### 🐳 Docker
```bash
mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
```
<br/>
### 🐙 Docker Compose
#### Linux/macOS
```bash
mkdir -p puter/config puter/data
sudo chown -R 1000:1000 puter
wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
docker compose up
```
<br/>
#### Windows
```powershell
mkdir -p puter
cd puter
New-Item -Path "puter\config" -ItemType Directory -Force
New-Item -Path "puter\data" -ItemType Directory -Force
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
docker compose up
```
<br/>
### ☁️ Puter.com
Puter è disponibile come servizio in hosting su [**puter.com**](https://puter.com).
<br/>
## Requisiti di Sistema
- **Sistema Operativo:** Linux, macOS, Windows
- **RAM:** 2GB minimi (4GB raccomandati)
- **Spazio su Disco:** 1GB liberi
- **Node.js:** Versione 16+ (Versione 22+ raccomandati)
- **npm:** Ultima versione stabile
<br/>
## Supporto
Collegatevi con i maintainers e la comunità attraverso questi canali:
- Segnalazione di bug o richiesta di funzionalità? Perfavore [aprire una issue](https://github.com/HeyPuter/puter/issues/new/choose).
- Discord: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
- X (Twitter): [x.com/HeyPuter](https://x.com/HeyPuter)
- Reddit: [reddit.com/r/puter/](https://www.reddit.com/r/puter/)
- Mastodon: [mastodon.social/@puter](https://mastodon.social/@puter)
- Problemi di sicurezza? [[email protected]](mailto:[email protected])
- Email maintainers a [[email protected]](mailto:[email protected])
Siamo sempre felici di aiutarvi con qualsiasi domanda. Non esitate a chiedere!
<br/>
## Licenza
Questo repository, compresi tutti i suoi contenuti, sottoprogetti, moduli e componenti, è concesso in licenza [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt), a meno che non sia esplicitamente indicato diversamente. Le librerie di terze parti incluse in questo repository possono essere soggette alle loro licenze.
<br/>
+123
View File
@@ -0,0 +1,123 @@
<h3 align="center"><img width="80" alt="Puter.com, あなたのファイル、アプリ、ゲームをどこからでもアクセス可能にするパーソナルクラウドコンピュータ" src="https://assets.puter.site/puter-logo.png"></h3>
<h3 align="center">インターネットOS!無料、オープンソース、セルフホスト可能。</h3>
<p align="center">
<img alt="GitHub リポジトリサイズ" src="https://img.shields.io/github/repo-size/HeyPuter/puter"> <img alt="GitHub リリース" src="https://img.shields.io/github/v/release/HeyPuter/puter?label=%E6%9C%80%E6%96%B0%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3"> <img alt="GitHub ライセンス" src="https://img.shields.io/github/license/HeyPuter/puter">
</p>
<p align="center">
<a href="https://puter.com/"><strong>« ライブデモ »</strong></a>
<br />
<br />
<a href="https://puter.com">Puter.com</a>
·
<a href="https://docs.puter.com" target="_blank">SDK</a>
·
<a href="https://discord.com/invite/PQcx7Teh8u">Discord</a>
·
<a href="https://reddit.com/r/puter">Reddit</a>
·
<a href="https://twitter.com/HeyPuter">X (Twitter)</a>
</p>
<h3 align="center"><img width="800" style="border-radius:5px;" alt="スクリーンショット" src="https://assets.puter.site/puter.com-screenshot-3.webp"></h3>
<br/>
## Puter
Puterは、機能豊富で非常に高速、そして高い拡張性を持つ、先進的なオープンソースのインターネットオペレーティングシステムです。Puterは以下の用途に利用できます:
- プライバシーを最優先するパーソナルクラウドとして、あなたのファイル、アプリ、ゲームを一か所で安全に管理し、どこからでもアクセス可能に。
- ウェブサイト、ウェブアプリ、ゲームの作成と公開のためのプラットフォーム。
- Dropbox、Google Drive、OneDriveなどの代替として、新しいインターフェースと強力な機能を提供。
- サーバーやワークステーションのためのリモートデスクトップ環境。
- ウェブ開発、クラウドコンピューティング、分散システムなどを学ぶための、フレンドリーでオープンなコミュニティとプロジェクト。
<br/>
## はじめに
### 💻 ローカル開発
```bash
git clone https://github.com/HeyPuter/puter
cd puter
npm install
npm start
```
これでPuterが http://puter.localhost:4100 (または次に利用可能なポート)で起動します。
<br/>
### 🐳 Docker
```bash
mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
```
<br/>
### 🐙 Docker Compose
#### Linux/macOS
```bash
mkdir -p puter/config puter/data
sudo chown -R 1000:1000 puter
wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
docker compose up
```
<br/>
#### Windows
```powershell
mkdir -p puter
cd puter
New-Item -Path "puter\config" -ItemType Directory -Force
New-Item -Path "puter\data" -ItemType Directory -Force
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
docker compose up
```
<br/>
### ☁️ Puter.com
Puterは[**puter.com**](https://puter.com)でホストサービスとして利用可能です。
<br/>
## システム要件
- **オペレーティングシステム:** Linux, macOS, Windows
- **RAM:** 最小2GB(推奨4GB)
- **ディスクスペース:** 1GBの空き容量
- **Node.js:** バージョン16以上(推奨バージョン22以上)
- **npm:** 最新の安定バージョン
<br/>
## サポート
メンテナーやコミュニティと以下のチャンネルを通じてつながりましょう:
- バグ報告や機能リクエストがありますか? [issueを開く](https://github.com/HeyPuter/puter/issues/new/choose) してください。
- Discord: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
- X (Twitter): [x.com/HeyPuter](https://x.com/HeyPuter)
- Reddit: [reddit.com/r/puter/](https://www.reddit.com/r/puter/)
- Mastodon: [mastodon.social/@puter](https://mastodon.social/@puter)
- セキュリティの問題? [[email protected]](mailto:[email protected])
- メンテナーへのメールは [[email protected]](mailto:[email protected]) まで
質問があれば、いつでもお気軽にお問い合わせください!
<br/>
## ライセンス
このリポジトリ、ならびにそのすべてのコンテンツ、サブプロジェクト、モジュール、コンポーネントは、[AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt)の下でライセンスされています。明示的に異なるライセンスが示されている場合を除きます。このリポジトリに含まれるサードパーティのライブラリは、それぞれのライセンスが適用される場合があります。
<br/>
+127
View File
@@ -0,0 +1,127 @@
<h3 align="center"><img width="80" alt="Puter.com, The Personal Cloud Computer: All your files, apps, and games in one place accessible from anywhere at any time." src="https://assets.puter.site/puter-logo.png"></h3>
<h3 align="center">Puter: 인터넷 OS! 무료이고 오픈소스이며 자체 호스팅이 가능합니다.</h3>
<p align="center">
<img alt="GitHub repo size" src="https://img.shields.io/github/repo-size/HeyPuter/puter"> <img alt="GitHub Release" src="https://img.shields.io/github/v/release/HeyPuter/puter?label=latest%20version"> <img alt="GitHub License" src="https://img.shields.io/github/license/HeyPuter/puter">
</p>
<p align="center">
<a href="https://puter.com/"><strong>« 시연 영상 »</strong></a>
<br />
<br />
<a href="https://puter.com">Puter.com</a>
·
<a href="https://docs.puter.com" target="_blank">SDK</a>
·
<a href="https://discord.com/invite/PQcx7Teh8u">Discord</a>
·
<a href="https://reddit.com/r/puter">Reddit</a>
·
<a href="https://twitter.com/HeyPuter">X (Twitter)</a>
</p>
<h3 align="center"><img width="800" style="border-radius:5px;" alt="screenshot" src="https://assets.puter.site/puter.com-screenshot-3.webp"></h3>
<br/>
## Puter
Puter는 오픈소스 인터넷 운영 체제로, 매우 빠르고 확장성이 뛰어나며 새로운 인터페이스와 다양한 기능을 갖추고 있습니다. Puter는 다음과 같이 사용될 수 있습니다:
- 모든 파일, 앱, 게임을 한 곳에 안전하게 보관하고 언제 어디서나 접근할 수 있는 프라이버시 중심의 개인 클라우드로 사용할 수 있습니다.
- 웹사이트, 웹 앱, 게임을 구축하고 배포하는 플랫폼으로 활용할 수 있습니다.
- Dropbox, Google Drive, OneDrive 등의 대안으로 사용할 수 있으며 보다 발전된 기능과 인터페이스를 제공합니다.
- 서버와 워크스테이션을 위한 원격 데스크톱 환경으로 활용할 수 있습니다.
- 웹 개발, 클라우드 컴퓨팅, 분산 시스템 등에 대해 배울 수 있는 친근한 오픈소스 프로젝트이자 커뮤니티입니다!
<br/>
## 시작하기
### 💻 로컬 환경 개발
```bash
git clone https://github.com/HeyPuter/puter
cd puter
npm install
npm start
```
위처럼 실행할 시 Puter는 http://puter.localhost:4100 (또는 사용 가능한 다음 포트)에서 실행됩니다.
<br/>
### 🐳 Docker
```bash
mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
```
<br/>
### 🐙 Docker Compose
#### Linux/macOS
```bash
mkdir -p puter/config puter/data
sudo chown -R 1000:1000 puter
wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
docker compose up
```
<br/>
#### Windows
```powershell
mkdir -p puter
cd puter
New-Item -Path "puter\config" -ItemType Directory -Force
New-Item -Path "puter\data" -ItemType Directory -Force
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
docker compose up
```
<br/>
### ☁️ Puter.com
Puter는 [**puter.com**](https://puter.com)에서 호스팅 서비스로 이용할 수 있습니다.
<br/>
## 시스템 요구사항
- **Operating Systems:** Linux, macOS, Windows
- **RAM:** 2GB minimum (4GB recommended)
- **Disk Space:** 1GB free space
- **Node.js:** Version 16+ (Version 22+ recommended)
- **npm:** Latest stable version
<br/>
## 지원
다음 채널을 통해 관리자 및 커뮤니티와 소통하세요:
- 버그 신고나 기능 요청이 있으신가요? [이슈를 열어주세요.](https://github.com/HeyPuter/puter/issues/new/choose).
- Discord: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
- X (Twitter): [x.com/HeyPuter](https://x.com/HeyPuter)
- Reddit: [reddit.com/r/puter/](https://www.reddit.com/r/puter/)
- Mastodon: [mastodon.social/@puter](https://mastodon.social/@puter)
- 보안 관련 문제는 [[email protected]](mailto:[email protected]) 으로 연락주세요.
- 관리자에게 이메일 보내기: [[email protected]](mailto:[email protected])
어떤 질문이든 기꺼이 도와드리겠습니다. 언제든 물어보세요!
<br/>
## 라이선스
이 저장소는 모든 내용, 하위 프로젝트, 모듈 및 구성 요소를 포함하여 명시적으로 달리 명시되지 않는 한 [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt) 라이선스 하에 제공됩니다. 이 저장소에 포함된 제3자 라이브러리는 해당 라이브러리의 고유 라이선스를 따를 수 있습니다.
<br/>
+128
View File
@@ -0,0 +1,128 @@
<h3 align="center"><img width="80" alt="Puter.com, The Personal Cloud Computer: All your files, apps, and games in one place accessible from anywhere at any time." src="https://assets.puter.site/puter-logo.png"></h3>
<h3 align="center">ഇന്റർനെറ്റ് ഓപ്പറേറ്റിംഗ് സിസ്റ്റം!<br> സൗജന്യവും, ഓപ്പൺ സോഴ്സും സ്വയം ഹോസ്റ്റ് ചെയ്യാൻ പറ്റുന്നതും</h3>
<p align="center">
<img alt="GitHub repo size" src="https://img.shields.io/github/repo-size/HeyPuter/puter"> <img alt="GitHub Release" src="https://img.shields.io/github/v/release/HeyPuter/puter?label=latest%20version"> <img alt="GitHub License" src="https://img.shields.io/github/license/HeyPuter/puter">
</p>
<p align="center">
<a href="https://puter.com/"><strong>« ലൈവ് ഡെമോ »</strong></a>
<br />
<br />
<a href="https://puter.com">Puter.com</a>
·
<a href="https://docs.puter.com" target="_blank">SDK</a>
·
<a href="https://discord.com/invite/PQcx7Teh8u">Discord</a>
·
<a href="https://reddit.com/r/puter">Reddit</a>
·
<a href="https://twitter.com/HeyPuter">X (Twitter)</a>
</p>
<h3 align="center"><img width="800" style="border-radius:5px;" alt="screenshot" src="https://assets.puter.site/puter.com-screenshot-3.webp"></h3>
<br/>
## പ്യൂട്ടർ (Puter)
ഫീച്ചറുകളാൽ സമ്പുഷ്ടവും അസാധാരണമാംവിധം വേഗതയേറിയതും,വളരെ വിപുലീകരിക്കാവുന്നതുമായ ഒരു നൂതന, ഓപ്പൺ സോഴ്‌സ് ഇന്റർനെറ്റ് ഓപ്പറേറ്റിംഗ് സിസ്റ്റമാണ് പ്യൂട്ടർ. പ്യൂട്ടർ ഇനിപ്പറയുന്ന രീതിയിൽ ഉപയോഗിക്കാം:
- നിങ്ങളുടെ എല്ലാ ഫയലുകളും ആപ്പുകളും ഗെയിമുകളും ഒരു സുരക്ഷിത സ്ഥലത്ത് സൂക്ഷിക്കുന്നതിനുള്ള, സ്വകാര്യതയ്ക്ക് മുൻഗണന കൊടുക്കുന്ന ആദ്യത്തെ വ്യക്തിഗത ക്ലൗഡ്, എവിടെ നിന്നും എപ്പോൾ വേണമെങ്കിലും ആക്‌സസ് ചെയ്യാൻ കഴിയും.
- വെബ്‌സൈറ്റുകൾ, വെബ് ആപ്പുകൾ, ഗെയിമുകൾ എന്നിവ നിർമ്മിക്കുന്നതിനും പ്രസിദ്ധീകരിക്കുന്നതിനുമുള്ള ഒരു പ്ലാറ്റ്ഫോം.
- പുതിയ ഇന്റർഫേസും, ശക്തമായ ഫീച്ചറുകളും അടങ്ങിയ, ഡ്രോപ്പ്‌ബോക്‌സ്, ഗൂഗിൾ ഡ്രൈവ്, വൺഡ്രൈവ് മുതലായവയ്‌ക്കുള്ള ബദൽ.
- സെർവറുകൾക്കും വർക്ക്സ്റ്റേഷനുകൾക്കും, ഒരു വിദൂര ഡെസ്ക്ടോപ്പ് പരിസ്ഥിതി.
- വെബ് ഡെവലപ്മെന്റ്, ക്ലൗഡ് കംപ്യൂട്ടിംഗ്, ഡിസ്ട്രിബ്യൂട്ടഡ് സിസ്റ്റങ്ങൾ എന്നിവയെ കുറിച്ചും, അതിലേറെ കാര്യങ്ങളെ കുറിച്ചും അറിയാനുള്ള സൗഹൃദപരവും ഓപ്പൺ സോഴ്സുമായ പ്രോജക്റ്റും കമ്മ്യൂണിറ്റിയും!
<br/>
## തുടങ്ങാനായി
### 💻 ലോക്കൽ ഡെവലപ്മെന്റ്
```bash
git clone https://github.com/HeyPuter/puter
cd puter
npm install
npm start
```
ഇത് http://puter.localhost:4100 (അല്ലെങ്കിൽ അടുത്ത ലഭ്യമായ പോർട്ടിൽ) എന്നതിൽ Puter സമാരംഭിക്കും
<br/>
### 🐳 Docker
```bash
mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
```
<br/>
### 🐙 Docker Compose
#### Linux/macOS
```bash
mkdir -p puter/config puter/data
sudo chown -R 1000:1000 puter
wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
docker compose up
```
<br/>
#### Windows
```powershell
mkdir -p puter
cd puter
New-Item -Path "puter\config" -ItemType Directory -Force
New-Item -Path "puter\data" -ItemType Directory -Force
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
docker compose up
```
<br/>
### ☁️ Puter.com
പ്യൂട്ടർ [**puter.com**](https://puter.com) എന്നതിൽ ഹോസ്റ്റ് ചെയ്‌ത സേവനമായി ലഭ്യമാണ്.
<br/>
## സിസ്റ്റത്തിന്റെ ആവശ്യകതകൾ
- **ഓപ്പറേറ്റിംഗ് സിസ്റ്റങ്ങൾ:** ലിനക്സ്, മാക്ക് ഒഎസ്, വിൻഡോസ്
- **RAM:** 2GB കുറഞ്ഞത് (4GB ശുപാർശ ചെയ്യുന്നു)
- **ഡിസ്ക് സ്പേസ്:** 1GB ഒഴിഞ്ഞ ഇടം
- **Node.js:** Version 16+ (Version 22+ ശുപാർശ ചെയ്യുന്നു)
- **npm:** ഏറ്റവും പുതിയ സ്ഥിരതയുള്ള പതിപ്പ്
<br/>
## പിന്തുണ
ഈ ചാനലുകളിലൂടെ പരിപാലിക്കുന്നവരുമായും കമ്മ്യൂണിറ്റിയുമായും ബന്ധപ്പെടുക:
- ബഗ്ഗ് റിപ്പോർട്ടോ, ഫീച്ചർ റിക്ക്വസ്റ്റോ ഉണ്ടോ? ദയവുചെയ്ത് [ഒരു ഇഷ്യൂ തുടങ്ങുക](https://github.com/HeyPuter/puter/issues/new/choose).
- ഡിസ്കോർഡ്: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
- എക്സ് (ട്വിറ്റർ): [x.com/HeyPuter](https://x.com/HeyPuter)
- റെഡ്ഡിറ്റ്: [reddit.com/r/puter/](https://www.reddit.com/r/puter/)
- മാസ്റ്റഡൺ: [mastodon.social/@puter](https://mastodon.social/@puter)
- സുരക്ഷാ പ്രശ്നങ്ങളുണ്ടോ? [[email protected]](mailto:[email protected])
- ഇമെയിൽ മെയിന്റൈനർമാർ: [[email protected]](mailto:[email protected])
നിങ്ങൾക്ക് ഉണ്ടായേക്കാവുന്ന ഏത് ചോദ്യങ്ങളിലും നിങ്ങളെ സഹായിക്കുന്നതിൽ ഞങ്ങൾക്ക് എപ്പോഴും സന്തോഷമുണ്ട്. ചോദിക്കാൻ മടിക്കേണ്ട!
<br/>
## ലൈസൻസ്
ഈ ശേഖരം, അതിന്റെ എല്ലാ ഉള്ളടക്കങ്ങളും, ഉപപദ്ധതികളും, മൊഡ്യൂളുകളും, ഘടകങ്ങളും ഉൾപ്പെടെ, [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt) എന്നതിന് കീഴിൽ ലൈസൻസുള്ളതാണ്. ഈ ശേഖരത്തിൽ ഉൾപ്പെടുത്തിയിരിക്കുന്ന മൂന്നാം കക്ഷി ലൈബ്രറികൾ അവരുടെ സ്വന്തം ലൈസൻസുകൾക്ക് വിധേയമായിരിക്കാം.
<br/>
+127
View File
@@ -0,0 +1,127 @@
<h3 align="center"><img width="80" alt="Puter.com, The Personal Cloud Computer: Semua fail, apl, dan permainan anda di satu tempat yang boleh diakses dari mana sahaja pada bila-bila masa." src="https://assets.puter.site/puter-logo.png"></h3>
<h3 align="center">Sistem Operasi Internet! Percuma, Sumber Terbuka, dan Boleh Dihoskan Sendiri.</h3>
<p align="center">
<img alt="Saiz repo GitHub" src="https://img.shields.io/github/repo-size/HeyPuter/puter"> <img alt="Terbitan GitHub" src="https://img.shields.io/github/v/release/HeyPuter/puter?label=latest%20version"> <img alt="Lesen GitHub" src="https://img.shields.io/github/license/HeyPuter/puter">
</p>
<p align="center">
<a href="https://puter.com/"><strong>« DEMO SECARA LANGSUNG »</strong></a>
<br />
<br />
<a href="https://puter.com">Puter.com</a>
·
<a href="https://docs.puter.com" target="_blank">SDK</a>
·
<a href="https://discord.com/invite/PQcx7Teh8u">Discord</a>
·
<a href="https://reddit.com/r/puter">Reddit</a>
·
<a href="https://twitter.com/HeyPuter">X (Twitter)</a>
</p>
<h3 align="center"><img width="800" style="border-radius:5px;" alt="screenshot" src="https://assets.puter.site/puter.com-screenshot-3.webp"></h3>
<br/>
## Puter
Puter ialah sistem operasi internet sumber terbuka yang maju dan direka untuk kaya dengan ciri kefungsian, kepantasan luar biasa dan kebolehluasan yang tinggi. Puter boleh digunakan sebagai:
- Storan awan peribadi yang mendahulukan privasi untuk menyimpan semua fail, aplikasi dan permainan anda di satu tempat yang selamat dan boleh diakses dari mana sahaja pada bila-bila masa.
- Platform untuk membina dan menerbitkan laman web, aplikasi web dan permainan.
- Alternatif kepada Dropbox, Google Drive, OneDrive, dan lain-lain dengan antara muka yang baharu dan ciri kefungsian berkuasa tinggi.
- Persekitaran desktop awan untuk server dan stesen kerja.
- Projek dan komuniti sumber terbuka yang mesra untuk mempelajari pembangunan laman web, pengkomputeran awan, sistem teragih, dan banyak lagi!
<br/>
## Mulakan
### 💻 Pembangunan Lokal
```bash
git clone https://github.com/HeyPuter/puter
cd puter
npm install
npm start
```
Ini akan melancarkan Puter di http://puter.localhost:4100 (atau port seterusnya yang tersedia).
<br/>
### 🐳 Docker
```bash
mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
```
<br/>
### 🐙 Docker Compose
#### Linux/macOS
```bash
mkdir -p puter/config puter/data
sudo chown -R 1000:1000 puter
wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
docker compose up
```
<br/>
### Windows
```powershell
mkdir -p puter
cd puter
New-Item -Path "puter\config" -ItemType Directory -Force
New-Item -Path "puter\data" -ItemType Directory -Force
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
docker compose up
```
<br/>
### ☁️ Puter.com
Puter tersedia sebagai perkhidmatan terhos di [**puter.com**](https://puter.com).
<br/>
## Keperluan Sistem
- **Sistem Operasi:** Linux, macOS, Windows
- **RAM:** Minimum 2GB (sebaiknya 4GB)
- **Ruang Storan:** 1GB ruang kosong
- **Node.js:** Versi 16+ (sebaiknya Versi 22+)
- **npm:** Versi stabil yang terkini
<br/>
## Sokongan
Berhubung dengan penyelenggara dan komuniti melalui saluran berikut:
- Laporan pepijat atau permintaan ciri? Sila [buka isu baharu](https://github.com/HeyPuter/puter/issues/new/choose).
- Discord: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
- X (Twitter): [x.com/HeyPuter](https://x.com/HeyPuter)
- Reddit: [reddit.com/r/puter/](https://www.reddit.com/r/puter/)
- Mastodon: [mastodon.social/@puter](https://mastodon.social/@puter)
- Isu keselamatan? [[email protected]](mailto:[email protected])
- Emel penyelenggara melalui [[email protected]](mailto:[email protected])
Kami sentiasa gembira untuk membantu anda dengan apa-apa soalan. Jangan takut untuk bertanya!
<br/>
## Lesen
Repositori ini, termasuklah kandungannya, subprojek, modul dan komponen, dilesenkan di bawah [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt) melainkan dinyatakan sebaliknya. *Library* pihak ketiga yang terkandung dalam repositori ini tertakluk kepada lesen mereka sendiri.
<!-- The word `Library` is kept as is to avoid confusion since the direct translation `Perpustakaan/Pustaka` is never used in the tech context and doesn't convey the same meaning among Malay community if used in this situation -->
<br/>
+127
View File
@@ -0,0 +1,127 @@
<h3 align="center"><img width="80" alt="Puter.com, De Persoonlijke Cloud Computer: Al je bestanden, apps en games op één plek, overal en altijd toegankelijk." src="https://assets.puter.site/puter-logo.png"></h3>
<h3 align="center">Het Internet OS! Gratis, Open-Source en Zelf te Hosten.</h3>
<p align="center">
<img alt="GitHub repo grootte" src="https://img.shields.io/github/repo-size/HeyPuter/puter"> <img alt="GitHub Release" src="https://img.shields.io/github/v/release/HeyPuter/puter?label=laatste%20versie"> <img alt="GitHub Licentie" src="https://img.shields.io/github/license/HeyPuter/puter">
</p>
<p align="center">
<a href="https://puter.com/"><strong>« LIVE DEMO »</strong></a>
<br />
<br />
<a href="https://puter.com">Puter.com</a>
·
<a href="https://docs.puter.com" target="_blank">SDK</a>
·
<a href="https://discord.com/invite/PQcx7Teh8u">Discord</a>
·
<a href="https://reddit.com/r/puter">Reddit</a>
·
<a href="https://twitter.com/HeyPuter">X (Twitter)</a>
</p>
<h3 align="center"><img width="800" style="border-radius:5px;" alt="screenshot" src="https://assets.puter.site/puter.com-screenshot-3.webp"></h3>
<br/>
## Puter
Puter is een geavanceerd, open-source internetbesturingssysteem ontworpen om functierijk, uitzonderlijk snel en zeer uitbreidbaar te zijn. Puter kan worden gebruikt als:
- Een privacy-gerichte persoonlijke cloud om al je bestanden, apps en games op één veilige plek te bewaren, overal en altijd toegankelijk.
- Een platform voor het bouwen en publiceren van websites, web-apps en games.
- Een alternatief voor Dropbox, Google Drive, OneDrive, etc. met een frisse interface en krachtige functies.
- Een externe desktopomgeving voor servers en werkstations.
- Een vriendelijk, open-source project en gemeenschap om te leren over webontwikkeling, cloud computing, gedistribueerde systemen en veel meer!
<br/>
## Aan de slag
### 💻 Lokale Ontwikkeling
```bash
git clone https://github.com/HeyPuter/puter
cd puter
npm install
npm start
```
Dit zal Puter starten op http://puter.localhost:4100 (of de eerstvolgende beschikbare poort).
<br/>
### 🐳 Docker
```bash
mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
```
<br/>
### 🐙 Docker Compose
#### Linux/macOS
```bash
mkdir -p puter/config puter/data
sudo chown -R 1000:1000 puter
wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
docker compose up
```
<br/>
#### Windows
```powershell
mkdir -p puter
cd puter
New-Item -Path "puter\config" -ItemType Directory -Force
New-Item -Path "puter\data" -ItemType Directory -Force
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
docker compose up
```
<br/>
### ☁️ Puter.com
Puter is beschikbaar als een gehoste service op [**puter.com**](https://puter.com).
<br/>
## Systeemvereisten
- **Besturingssystemen:** Linux, macOS, Windows
- **RAM:** 2GB minimum (4GB aanbevolen)
- **Schijfruimte:** 1GB vrije ruimte
- **Node.js:** Versie 16+ (Versie 22+ aanbevolen)
- **npm:** Laatste stabiele versie
<br/>
## Ondersteuning
Verbind met de onderhouders en de gemeenschap via deze kanalen:
- Bug rapport of functieverzoek? [Open een issue](https://github.com/HeyPuter/puter/issues/new/choose).
- Discord: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
- X (Twitter): [x.com/HeyPuter](https://x.com/HeyPuter)
- Reddit: [reddit.com/r/puter/](https://www.reddit.com/r/puter/)
- Mastodon: [mastodon.social/@puter](https://mastodon.social/@puter)
- Beveiligingsproblemen? [[email protected]](mailto:[email protected])
- E-mail onderhouders op [[email protected]](mailto:[email protected])
We helpen je graag met al je vragen. Aarzel niet om te vragen!
<br/>
## Licentie
Deze repository, inclusief alle inhoud, subprojecten, modules en componenten, is gelicentieerd onder [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt) tenzij expliciet anders vermeld. Bibliotheken van derden die in deze repository zijn opgenomen, kunnen onderworpen zijn aan hun eigen licenties.
<br/>
+148
View File
@@ -0,0 +1,148 @@
<h3 align="center"><img width="80" alt="Puter.com, The Personal Cloud Computer: All your files, apps, and games in one place accessible from anywhere at any time." src="https://assets.puter.site/puter-logo.png"></h3>
<h3 align="center">ଇଣ୍ଟରନେଟ OS! ନିଶୁଳ୍କ, ଖୋଲା-ମୂଳ (Open-Source), ଏବଂ ସ୍ୱୟଂ-ହୋଷ୍ଟ କରିପାରିବା।</h3>
<p align="center">
<a href="https://puter.com/?ref=github.com"><strong>« LIVE ଡେମୋ »</strong></a>
<br />
<br />
<a href="https://puter.com/?ref=github.com">Puter.com</a>
·
<a href="https://apps.puter.com/">App Store</a>
·
<a href="https://developer.puter.com" target="_blank">Developers</a>
·
<a href="https://github.com/heyputer/puter-cli" target="_blank">CLI</a>
·
<a href="https://discord.com/invite/PQcx7Teh8u">Discord</a>
·
<a href="https://reddit.com/r/puter">Reddit</a>
·
<a href="https://twitter.com/HeyPuter">X</a>
</p>
<h3 align="center"><img width="800" style="border-radius:5px;" alt="screenshot" src="https://assets.puter.site/puter.com-screenshot-3.webp"></h3>
<br/>
## Puter
Puter ହେଉଛି ଗୋଟିଏ ଉନ୍ନତ, ଖୋଲା-ମୂଳ ଇଣ୍ଟରନେଟ ଅପରେଟିଂ ସିଷ୍ଟମ, ଯାହାକି ବିଶେଷତାସମୃଦ୍ଧ, ଶୀଘ୍ର ଏବଂ ଏକ୍ସଟେନ୍ସିବଲ ଭାବେ ଡିଜାଇନ୍ କରାଯାଇଛି। Puter କୁ ନିମ୍ନ ପ୍ରକାରେ ବ୍ୟବହାର କରିପାରିବେ:
- ଗୋଟିଏ ପ୍ରାଇଭେସି-ପ୍ରଥମ (privacy-first) ପର୍ସନାଲ କ୍ଲାଉଡ୍ ଭାବେ — ଯେଉଁଠାରେ ଆପଣଙ୍କ ସମସ୍ତ ଫାଇଲ୍, ଆପ୍ସ ଏବଂ ଗେମ୍ସ ଗୋଟିଏ ସୁରକ୍ଷିତ ସ୍ଥାନରେ ରହିବ, ଯାହାକୁ କେଉଁଠୁ ସମୟରେ ଆକ୍ସେସ୍ କରିପାରିବେ।
- ୱେବସାଇଟ୍, ୱେବ ଆପ୍ସ, ଏବଂ ଗେମ୍ ତିଆରି ଏବଂ ପ୍ରକାଶ ପାଇଁ ଗୋଟିଏ ପ୍ଲାଟଫର୍ମ।
- Dropbox, Google Drive, OneDrive ଇତ୍ୟାଦିଙ୍କ ବିକଳ୍ପ ଭାବେ — ଏକ ସୁନ୍ଦର ଇଣ୍ଟରଫେସ୍ ଏବଂ ଶକ୍ତିଶାଳୀ ବୈଶିଷ୍ଟ ସହିତ।
- ସର୍ଭର ଏବଂ ଓର୍କସ୍ଟେସନ୍ ପାଇଁ ଗୋଟିଏ ରିମୋଟ୍ ଡେସ୍କଟପ୍ ଇନ୍ଭାୟରମେଣ୍ଟ।
- ୱେବ୍ ଡିଭେଲପମେଣ୍ଟ, କ୍ଲାଉଡ୍ କମ୍ପ୍ୟୁଟିଙ୍ଗ, ବିତରିତ ସିଷ୍ଟମ (distributed systems) ଇତ୍ୟାଦି ଶିଖିବା ପାଇଁ ଗୋଟିଏ ସହଜ-ମନୋଭାବୀ ଖୋଲା-ମୂଳ ସମୁଦାୟ।
<br/>
## ପ୍ରାରମ୍ଭ (Getting Started)
### 💻 Local Development
```bash
git clone https://github.com/HeyPuter/puter
cd puter
npm install
npm start
```
**→** ଏହା Puter କୁ ଲଞ୍ଚ କରିବ:
<font color="red"> http://puter.localhost:4100 (ଅଥବା ଅନ୍ୟ ଉପଲବ୍ଧ ପୋର୍ଟ୍) </font>
ଯଦି ଏହା କାମ କରୁନାହିଁ, ତେବେ [First Run Issues](./doc/self-hosters/first-run-issues.md) କୁ ଦେଖନ୍ତୁ।
<br/>
### 🐳 Docker
```bash
mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
```
**→** ଏହା Puter କୁ ଲଞ୍ଚ କରିବ:
<font color="red"> http://puter.localhost:4100 (ଅଥବା ଅନ୍ୟ ଉପଲବ୍ଧ ପୋର୍ଟ୍) </font>
<br/>
### 🐙 Docker Compose
#### Linux/macOS
```bash
mkdir -p puter/config puter/data
sudo chown -R 1000:1000 puter
wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
docker compose up
```
**→** ଏହା ଉପଲବ୍ଧ ହେବ:
<font color="red"> http://puter.localhost:4100 (ଅଥବା ଅନ୍ୟ ଉପଲବ୍ଧ ପୋର୍ଟ୍) </font>
<br/>
#### Windows
```powershell
mkdir -p puter
cd puter
New-Item -Path "puter\config" -ItemType Directory -Force
New-Item -Path "puter\data" -ItemType Directory -Force
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
docker compose up
```
**→** ଏହା Puter କୁ ଲଞ୍ଚ କରିବ:
<font color="red"> http://puter.localhost:4100 (ଅଥବା ଅନ୍ୟ ଉପଲବ୍ଧ ପୋର୍ଟ୍) </font>
<br/>
### 🚀 Self-Hosting
Self-Hosting ପାଇଁ ବିସ୍ତୃତ ଗାଇଡ୍, କନଫିଗୁରେସନ୍ ଅପ୍ସନ୍ ଏବଂ ବେଷ୍ଟ-ପ୍ରାକ୍ଟିସ୍ ପାଇଁ ଏଠାରେ ଯାଆନ୍ତୁ:
[Self-Hosting Documentation](https://github.com/HeyPuter/puter/blob/main/doc/self-hosters/instructions.md)
<br/>
### ☁️ Puter.com
Puter ହୋଷ୍ଟେଡ୍ ସର୍ଭିସ୍ ଭାବେ ଉପଲବ୍ଧ ଅଛି: [**puter.com**](https://puter.com)
<br/>
## ସିଷ୍ଟମ ଆବଶ୍ୟକତା (System Requirements)
- **Operating Systems:** Linux, macOS, Windows
- **RAM:** ଅନ୍ୟୁନ 2GB (ପରାମର୍ଶ 4GB)
- **Disk Space:** 1GB ଖାଲି ସ୍ଥାନ
- **Node.js:** ସଂସ୍କରଣ 20.19.5+ (ପରାମର୍ଶ 23+)
- **npm:** ନବୀନତମ ସ୍ଥିର ସଂସ୍କରଣ
<br/>
## ସହଯୋଗ (Support)
ମେଣ୍ଟେନର୍ ଏବଂ ସମୁଦାୟ ସହିତ ଯୋଡ଼ିବା ପାଇଁ:
- Bug report କିମ୍ବା ନୂଆ feature ବାବଦରେ? [open an issue](https://github.com/HeyPuter/puter/issues/new/choose)
- Discord: https://discord.com/invite/PQcx7Teh8u
- X (Twitter): https://x.com/HeyPuter
- Reddit: https://www.reddit.com/r/puter/
- Mastodon: https://mastodon.social/@puter
- Security issues? [[email protected]](mailto:[email protected])
- Maintain­er Email: [[email protected]](mailto:[email protected])
ଆମେ ସମସ୍ତେ ସହାୟତା ପାଇଁ ସଦା ପ୍ରସ୍ତୁତ।
<br/>
## ଲାଇସେନ୍ସ (License)
ଏହି ରିପୋଜିଟୋରୀ, ସମସ୍ତ ସବ୍-ପ୍ରୋଜେକ୍ଟ, ମୋଡ୍ୟୁଲ୍ ଏବଂ କମ୍ପୋନେଣ୍ଟ ସହିତ **AGPL-3.0** ଲାଇସେନ୍ସ ଅଧୀନରେ ରହିଛି।
ତୃତୀୟ ପକ୍ଷ ଲାଇବ୍ରେରି ନିଜସ୍ୱ ଲାଇସେନ୍ସ ଅଧୀନରେ ଥାଇପାରେ।
<br/>
## ଅନ୍ୟ README ଲିଙ୍କ୍ (Links to Other READMEs)
### Backend
- [PuterAI Module](./src/backend/doc/modules/puterai/README.md)
- [Metering Service](./src/backend/src/services/MeteringService/README.md)
- [Extensions Development Guide](./extensions/README.md)
+182
View File
@@ -0,0 +1,182 @@
<h3 align="center"><img width="80" alt="Puter.com, The Personal Cloud Computer: All your files, apps, and games in one place accessible from anywhere at any time." src="https://assets.puter.site/puter-logo.png"></h3>
<h3 align="center">ਇੰਟਰਨੇਟ ਓਐਸ! ਮੁਫ਼ਤ, ਖੁੱਲ੍ਹੇ ਸਰੋਤ ਵਾਲਾ, ਅਤੇ ਆਪ ਸਵੈ-ਹੋਸਟ ਕਰ ਸਕਦੇ ਹੋ।</h3>
<p align="center">
<a href="https://puter.com/?ref=github.com"><strong>« LIVE DEMO »</strong></a>
<br />
<br />
<a href="https://puter.com/?ref=github.com">Puter.com</a>
·
<a href="https://apps.puter.com/">ਐਪ ਸਟੋਰ</a>
·
<a href="https://developer.puter.com" target="_blank">ਡਿਵੈਲਪਰ</a>
·
<a href="https://github.com/heyputer/puter-cli" target="_blank">CLI</a>
·
<a href="https://discord.com/invite/PQcx7Teh8u">Discord</a>
·
<a href="https://reddit.com/r/puter">Reddit</a>
·
<a href="https://twitter.com/HeyPuter">X</a>
</p>
<h3 align="center"><img width="800" style="border-radius:5px;" alt="screenshot" src="https://assets.puter.site/puter.com-screenshot-3.webp"></h3>
<br/>
## Puter
Puter ਇੱਕ ਵਿਕਸਤ, ਖੁੱਲ੍ਹਾ-ਸਰੋਤ ਇੰਟਰਨੇਟ ਓਪਰੇਟਿੰਗ ਸਿਸਟਮ ਹੈ ਜੋ ਫੀਚਰ-ਭਰਪੂਰ, ਬਹੁਤ ਤੇਜ਼, ਅਤੇ ਵਧੀਆ ਤਰੀਕੇ ਨਾਲ ਵਧਾਏ ਜਾਣ ਵਾਲਾ ਬਣਾਇਆ ਗਿਆ ਹੈ। Puter ਇਸ ਤਰ੍ਹਾਂ ਵਰਤਿਆ ਜਾ ਸਕਦਾ ਹੈ:
- ਇੱਕ ਪਰਾਈਵੇਸੀ-ਪਹਿਲਾਂ ਨਿੱਜੀ ਕਲਾਊਡ ਵਜੋਂ ਜਿੱਥੇ ਤੁਹਾਡੀਆਂ ਸਾਰੀਆਂ ਫਾਈਲਾਂ, ਐਪਸ, ਅਤੇ ਗੇਮਜ਼ ਇੱਕ ਸੁਰੱਖਿਅਤ ਜਗ੍ਹਾ 'ਤੇ, ਕਿਸੇ ਵੀ ਸਮੇਂ-ਕਿਤੇ ਵੀ ਤੋਂ ਪਹੁੰਚਯੋਗ।
- ਵੈਬਸਾਈਟਾਂ, ਵੈਬ ਐਪਸ, ਅਤੇ ਗੇਮ ਬਣਾਉਣ ਅਤੇ ਪ੍ਰਕਾਸ਼ਿਤ ਕਰਨ ਲਈ ਇੱਕ ਪਲੇਟਫਾਰਮ।
- Dropbox, Google Drive, OneDrive ਆਦਿ ਦਾ ਇੱਕ ਆਧੁਨਿਕ ਵਿਕਲਪ, ਨਵੀਂ ਇੰਟਰਫੇਸ ਅਤੇ ਸ਼ਕਤੀਸ਼ਾਲੀ ਫੀਚਰਾਂ ਨਾਲ।
- ਸਰਵਰਾਂ ਅਤੇ ਵਰਕਸਟੇਸ਼ਨਾਂ ਲਈ ਰਿਮੋਟ ਡੈਸਕਟਾਪ Environment।
- ਵੈਬ ਡਿਵੈਲਪਮੈਂਟ, ਕਲਾਊਡ ਕੰਪਿਊਟਿੰਗ, ਡਿਸਟ੍ਰੀਬਿਊਟਡ ਸਿਸਟਮ ਅਤੇ ਹੋਰ ਬਹੁਤ ਕੁਝ ਸਿੱਖਣ ਲਈ ਇੱਕ ਮਿੱਤਰਤਾਪੂ, ਖੁੱਲ੍ਹੇ-ਸਰੋਤ ਵਾਲਾ ਪ੍ਰੋਜੈਕਟ ਅਤੇ ਸਮੂਹ!
<br/>
## Getting Started
### 💻 Local Development
```bash
git clone https://github.com/HeyPuter/puter
cd puter
npm install
npm start
```
**→** ਇਹ Puter ਨੂੰ ਇਸ ਪਤੇ 'ਤੇ ਚਲਾਉਣਾ ਚਾਹੀਦਾ ਹੈ
<font color="red"> http://puter.localhost:4100 (ਜਾਂ ਅਗਲਾ ਉਪਲਬਧ ਪੋਰਟ). </font>
ਜੇ ਇਹ ਕੰਮ ਨਹੀਂ ਕਰਦਾ, ਤਾੰ [First Run Issues](./doc/self-hosters/first-run-issues.md) ਵੇਖੋ
ਟ੍ਰਬਲਸ਼ੂਟਿੰਗ ਲਈ।
<br/>
### 🐳 Docker
```bash
mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
```
**→** ਇਹ Puter ਨੂੰ ਇਸ ਪਤੇ 'ਤੇ ਚਲਾਉਣਾ ਚਾਹੀਦਾ ਹੈ
<font color="red"> http://puter.localhost:4100 (ਜਾਂ ਅਗਲਾ ਉਪਲਬਧ ਪੋਰਟ). </font>
<br/>
### 🐙 Docker Compose
#### Linux/macOS
```bash
mkdir -p puter/config puter/data
sudo chown -R 1000:1000 puter
wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
docker compose up
```
**→** ਇਹ ਇਸ ਪਤੇ 'ਤੇ ਉਪਲਬਧ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ
<font color="red"> http://puter.localhost:4100 (ਜਾਂ ਅਗਲਾ ਉਪਲਬਧ ਪੋਰਟ). </font>
<br/>
#### Windows
```powershell
mkdir -p puter
cd puter
New-Item -Path "puter\config" -ItemType Directory -Force
New-Item -Path "puter\data" -ItemType Directory -Force
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
docker compose up
```
**→** ਇਹ Puter ਨੂੰ ਇਸ ਪਤੇ 'ਤੇ ਚਲਾਉਣਾ ਚਾਹੀਦਾ ਹੈ
<font color="red"> http://puter.localhost:4100 (ਜਾਂ ਅਗਲਾ ਉਪਲਬਧ ਪੋਰਟ). </font>
<br/>
### 🚀 Self-Hosting
Puter ਨੂੰ ਖੁਦ ਹੋਸਟ ਕਰਨ ਲਈ, ਕਨਫਿਗੁਰੇਸ਼ਨ ਵਿਕਲਪ ਅਤੇ ਬਿਹਤਰੀਨ ਕਾਇਦੇ, ਸਾਰੇ ਵਿਸਥਾਰ ਲਈ ਸਾਡੇ [Self-Hosting Documentation](https://github.com/HeyPuter/puter/blob/main/doc/self-hosters/instructions.md) ਵੇਖੋ।
<br/>
### ☁️ Puter.com
Puter [**puter.com**](https://puter.com) 'ਤੇ ਇੱਕ ਹੋਸਟ ਕੀਤੀ ਸੇਵਾ ਵਜੋਂ ਉਪਲਬਧ ਹੈ।
<br/>
## System Requirements
- **Operating Systems:** Linux, macOS, Windows
- **RAM:** ਘੱਟੋ-ਘੱਟ 2GB (4GB ਸਿਫ਼ਾਰਸ਼ੀ)
- **Disk Space:** 1GB ਖਾਲੀ ਜਗ੍ਹਾ
- **Node.js:** Version 24+
- **npm:** ਨਵੀਨਤਮ ਸਥਿਰ ਵਰਜਨ
<br/>
## Support
ਮੈਂਟੇਨਰਾਂ ਅਤੇ ਕਮਿਊਨਿਟੀ ਨਾਲ ਇੱਥੇ ਸੰਪਰਕ ਕਰੋ:
- ਬੱਗ ਜਾਂ ਫੀਚਰ ਰਿਕਵੇਸਟ? ਕਿਰਪਾ ਕਰਕੇ [issue ਖੋਲ੍ਹੋ](https://github.com/HeyPuter/puter/issues/new/choose)।
- Discord: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
- X (Twitter): [x.com/HeyPuter](https://x.com/HeyPuter)
- Reddit: [reddit.com/r/puter/](https://www.reddit.com/r/puter/)
- Mastodon: [mastodon.social/@puter](https://mastodon.social/@puter)
- ਸੁਰੱਖਿਆ ਮਸਲੇ? [[email protected]](mailto:[email protected])
- ਮੇਂਟੇਨਰਾਂ ਨੂੰ ਈਮੇਲ ਕਰੋ [[email protected]](mailto:[email protected])
ਅਸੀਂ ਹਮੇਸ਼ਾ ਤੁਹਾਡੀਆਂ ਕਿਸੇ ਵੀ ਪ੍ਰਸ਼ਨਾਂ ਵਿੱਚ ਮਦਦ ਕਰਨ ਲਈ ਤਿਆਰ ਹਾਂ। ਬੇਝਿਝਕ ਪੁੱਛੋ!
<br/>
## License
ਇਹ ਰਿਪੋਜ਼ਟਰੀ, ਆਪਣੇ ਸਾਰੇ ਸਮੱਗਰੀ, ਸਬ-ਪ੍ਰੋਜੈਕਟ, ਮੋਡੀਊਲ, ਅਤੇ ਕੰਪੋਨੈਂਟ ਸਮੇਤ, [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt) ਅਧੀਨ ਲਾਇਸੈਂਸਡ ਹੈ ਜੇ ਤਕ ਹੋਰ ਸਪਸ਼ਟ ਤੌਰ 'ਤੇ ਨਹੀਂ ਕਿਹਾ ਗਿਆ। ਤੀਜੀ ਪੱਖ ਦੀਆਂ ਲਾਇਬ੍ਰੇਰੀਆਂ ਆਪਣੇ ਲਾਇਸੈਂਸਾਂ ਅਨੁਸਾਰ ਹੋ ਸਕਦੀਆਂ ਹਨ।
<br/>
## Translations
- [Arabic / العربية](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ar.md)
- [Armenian / Հայերեն](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.hy.md)
- [Bengali / বাংলা](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.bn.md)
- [Chinese / 中文](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.zh.md)
- [Danish / Dansk](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.da.md)
- [English](https://github.com/HeyPuter/puter/blob/main/README.md)
- [Farsi / فارسی](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.fa.md)
- [Finnish / Suomi](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.fi.md)
- [French / Français](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.fr.md)
- [German / Deutsch](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.de.md)
- [Hebrew/ עברית](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.he.md)
- [Hindi / हिंदी](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.hi.md)
- [Hungarian / Magyar](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.hu.md)
- [Indonesian / Bahasa Indonesia](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.id.md)
- [Italian / Italiano](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.it.md)
- [Japanese / 日本語](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.jp.md)
- [Korean / 한국어](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ko.md)
- [Malay / Bahasa Malaysia](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.my.md)
- [Malayalam / മലയാളം](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ml.md)
- [Punjabi / ਪੰਜਾਬੀ](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.pa.md)
- [Polish / Polski](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.pl.md)
- [Portuguese / Português](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.pt.md)
- [Romanian / Română](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ro.md)
- [Russian / Русский](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ru.md)
- [Spanish / Español](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.es.md)
- [Swedish / Svenska](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.sv.md)
- [Tamil / தமிழ்](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ta.md)
- [Telugu / తెలుగు](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.te.md)
- [Thai / ไทย](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.th.md)
- [Turkish / Türkçe](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.tr.md)
- [Ukrainian / Українська](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ua.md)
- [Urdu / اردو](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ur.md)
- [Vietnamese / Tiếng Việt](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.vi.md)
## Links to Other READMEs
### Backend
- [PuterAI Module](./src/backend/doc/modules/puterai/README.md)
- [Metering Service](./src/backend/src/services/MeteringService/README.md)
- [Extensions Development Guide](./extensions/README.md)
+119
View File
@@ -0,0 +1,119 @@
<h3 align="center"><img width="80" alt="Puter.com, Osobisty Komputer Chmurowy: Wszystkie twoje pliki, aplikacje i gry w jednym miejscu, dostępne z dowolnego miejsca o dowolnej porze." src="https://assets.puter.site/puter-logo.png"></h3>
<h3 align="center"> System Operacyjny Internet! Darmowy, Open-Source i Możliwy do Samodzielnego Hostowania.</h3>
<p align="center">
<img alt="Rozmiar repozytorium GitHub" src="https://img.shields.io/github/repo-size/HeyPuter/puter"> <img alt="Wydanie GitHub" src="https://img.shields.io/github/v/release/HeyPuter/puter?label=latest%20version"> <img alt="Licencja GitHub" src="https://img.shields.io/github/license/HeyPuter/puter">
</p>
<p align="center">
<a href="https://puter.com/"><strong>« DEMO NA ŻYWO »</strong></a>
<br />
<br />
<a href="https://puter.com">Puter.com</a>
·
<a href="https://docs.puter.com" target="_blank">SDK</a>
·
<a href="https://discord.com/invite/PQcx7Teh8u">Discord</a>
·
<a href="https://reddit.com/r/puter">Reddit</a>
·
<a href="https://twitter.com/HeyPuter">X (Twitter)</a>
</p>
<h3 align="center"><img width="800" style="border-radius:5px;" alt="zrzut ekranu" src="https://assets.puter.site/puter.com-screenshot-3.webp"></h3>
<br/>
## Puter
Puter to zaawansowany, open-source'owy internetowy system operacyjny, zaprojektowany tak, aby był bogaty w funkcje, wyjątkowo szybki i wysoce rozszerzalny. Puter może być używany jako:
- Prywatna chmura osobista do przechowywania wszystkich plików, aplikacji i gier w jednym bezpiecznym miejscu, dostępnym z dowolnego miejsca o dowolnej porze.
- Platforma do budowania i publikowania stron internetowych, aplikacji webowych i gier.
- Alternatywa dla Dropbox, Google Drive, OneDrive itp. ze świeżym interfejsem i potężnymi funkcjami.
- Zdalne środowisko pulpitu dla serwerów i stacji roboczych.
- Przyjazny, open-source'owy projekt i społeczność do nauki o tworzeniu stron internetowych, chmurze obliczeniowej, systemach rozproszonych i wielu innych!
<br/>
## Rozpoczęcie pracy
## 💻 Lokalne środowisko developerskie
```bash
git clone https://github.com/HeyPuter/puter
cd puter
npm install
npm start
```
To uruchomi Puter na http://puter.localhost:4100 (lub na następnym dostępnym porcie).
<br/>
## 🐳 Docker
```bash
Copy code
mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
```
<br/>
## 🐙 Docker Compose
## Linux/macOS
```bash
Copy code
mkdir -p puter/config puter/data
sudo chown -R 1000:1000 puter
wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
docker compose up
```
<br/>
## Windows
```powershell
mkdir -p puter
cd puter
New-Item -Path "puter\config" -ItemType Directory -Force
New-Item -Path "puter\data" -ItemType Directory -Force
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
docker compose up
```
<br/>
## ☁️ Puter.com
Puter jest dostępny jako usługa hostowana na [**puter.com**](https://puter.com).
<br/>
## Wymagania systemowe
- **Systemy operacyjne:** Linux, macOS, Windows
- **RAM:** Minimum 2GB (zalecane 4GB)
- **Przestrzeń dyskowa:** 1GB wolnego miejsca
- **Node.js:** Wersja 16+ (zalecana wersja 22+)
- **npm:** Najnowsza stabilna wersja
<br/>
## Wsparcie
Skontaktuj się z opiekunami i społecznością przez te kanały:
- Raport o błędzie lub prośba o funkcję? Proszę otworzyć zgłoszenie.
- Discord: discord.com/invite/PQcx7Teh8u
- X (Twitter): x.com/HeyPuter
- Reddit: reddit.com/r/puter/
- Mastodon: mastodon.social/@puter
- Problemy z bezpieczeństwem? security@puter.com
- Email do opiekunów: hi@puter.com
Zawsze chętnie pomożemy Ci z wszelkimi pytaniami, jakie możesz mieć. Nie wahaj się pytać!
<br/>
## Licencja
To repozytorium, w tym cała jego zawartość, podprojekty, moduły i komponenty, jest licencjonowane na podstawie [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt), chyba że wyraźnie zaznaczono inaczej. Biblioteki stron trzecich zawarte w tym repozytorium mogą podlegać własnym licencjom.
<br/>
+173
View File
@@ -0,0 +1,173 @@
<h3 align="center"><img width="80" alt="Puter.com, O Computador Pessoal em Nuvem: Todos os seus arquivos, aplicativos e jogos em um único lugar, acessíveis de qualquer lugar e a qualquer hora." src="https://assets.puter.site/puter-logo.png"></h3>
<h3 align="center">O Sistema Operacional da Internet! Gratuito, de Código Aberto e Auto-Hospedável.</h3>
<p align="center">
<a href="https://puter.com/"><strong>« DEMONSTRAÇÃO AO VIVO »</strong></a>
<br />
<br />
<a href="https://puter.com">Puter.com</a>
·
<a href="https://apps.puter.com/">App Store</a>
·
<a href="https://developer.puter.com" target="_blank">Developers</a>
·
<a href="https://github.com/heyputer/puter-cli" target="_blank">CLI</a>
·
<a href="https://discord.com/invite/PQcx7Teh8u">Discord</a>
·
<a href="https://reddit.com/r/puter">Reddit</a>
·
<a href="https://x.com/HeyPuter">X (Twitter)</a>
</p>
<h3 align="center"><img width="800" style="border-radius:5px;" alt="screenshot" src="https://assets.puter.site/puter.com-screenshot-3.webp"></h3>
<br/>
## Puter
Puter é um sistema operacional de internet avançado e de código aberto, projetado para ser rico em recursos, excepcionalmente rápido e altamente extensível. Puter pode ser usado como:
- Um serviço de nuvem pessoal com foco na privacidade para manter todos os seus arquivos, aplicativos e jogos em um local seguro, acessível de qualquer lugar e a qualquer hora.
- Uma plataforma para construir e publicar websites, aplicativos web e jogos.
- Uma alternativa ao Dropbox, Google Drive, OneDrive, etc., com uma interface renovada e recursos poderosos.
- Um ambiente de desktop remoto para servidores e estações de trabalho.
- Um projeto e comunidade de código aberto e amigável para aprender sobre desenvolvimento web, computação em nuvem, sistemas distribuídos e muito mais!
<br/>
## Iniciando o Projeto
### 💻 Desenvolvimento Local
```
git clone https://github.com/HeyPuter/puter
cd puter
npm install
npm start
```
✨ Isso iniciará o Puter em http://puter.localhost:4100 (ou na próxima porta disponível).
Se isso não funcionar, consulte [First Run Issues](./doc/self-hosters/first-run-issues.md) para solucionar os problemas.
<br/>
### 🐳 Docker
```bash
mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
```
✨ Isso iniciará o Puter em http://puter.localhost:4100 (ou na próxima porta disponível).
<br/>
### 🐙 Docker Compose
#### Linux/macOS
```bash
mkdir -p puter/config puter/data
sudo chown -R 1000:1000 puter
wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
docker compose up
```
✨ Isso iniciará o Puter em http://puter.localhost:4100 (ou na próxima porta disponível).
<br/>
#### Windows
```powershell
mkdir -p puter
cd puter
New-Item -Path "puter\config" -ItemType Directory -Force
New-Item -Path "puter\data" -ItemType Directory -Force
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
docker compose up
```
✨ Isso iniciará o Puter em http://puter.localhost:4100 (ou na próxima porta disponível).
<br/>
### 🚀 Auto-Hospedagem
Para guia detalhados sobre como auto-hospedar o Puter, incluindo opções de configuração e melhores práticas, consulte nossa [Documentação de Auto-Hospedagem](https://github.com/HeyPuter/puter/blob/main/doc/self-hosters/instructions.md).
### ☁️ Puter.com
O Puter está disponível como um serviço hospedado em [**puter.com**](https://puter.com).
<br/>
## Requerimentos do sistema
- **Sistema operacional:** Linux, macOS, Windows
- **RAM:** 2GB mínimo (4GB recomendado)
- **Espaço de disco:** 1GB de espaço disponível
- **Node.js:** Versão 16+ (Versão 23+ recomendada)
- **npm:** Última versão estável
<br/>
## Suporte
Conecte-se com os mantenedores e a comunidade através destes canais:
- Relato de bug ou solicitação de recurso? Por favor, [abra um tópico](https://github.com/HeyPuter/puter/issues/new/choose).
- Discord: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
- X (Twitter): [x.com/HeyPuter](https://x.com/HeyPuter)
- Reddit: [reddit.com/r/puter/](https://www.reddit.com/r/puter/)
- Mastodon: [mastodon.social/@puter](https://mastodon.social/@puter)
- Problemas de segurança? [[email protected]](mailto:[email protected])
- Envie um email para os mantenedores em [[email protected]](mailto:[email protected])
Estamos sempre felizes em ajudá-lo com quaisquer perguntas que você possa ter. Não hesite em perguntar!
<br/>
## Licença
Este repositório, incluindo todos os seus conteúdos, subprojetos, módulos e componentes, está licenciado sob [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt) a menos que explicitamente indicado de outra forma. Bibliotecas de terceiros incluídas neste repositório podem estar sujeitas às suas próprias licenças.
<br/>
## Traduções
- [Arabic / العربية](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ar.md)
- [Armenian / Հայերեն](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.hy.md)
- [Bengali / বাংলা](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.bn.md)
- [Chinese / 中文](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.zh.md)
- [Danish / Dansk](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.da.md)
- [English](https://github.com/HeyPuter/puter/blob/main/README.md)
- [Farsi / فارسی](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.fa.md)
- [Finnish / Suomi](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.fi.md)
- [French / Français](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.fr.md)
- [German/ Deutsch](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.de.md)
- [Hebrew/ עברית](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.he.md)
- [Hindi / हिंदी](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.hi.md)
- [Hungarian / Magyar](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.hu.md)
- [Indonesian / Bahasa Indonesia](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.id.md)
- [Italian / Italiano](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.it.md)
- [Japanese / 日本語](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.jp.md)
- [Korean / 한국어](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ko.md)
- [Malayalam / മലയാളം](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ml.md)
- [Polish / Polski](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.pl.md)
- [Portuguese / Português](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.pt.md)
- [Romanian / Română](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ro.md)
- [Russian / Русский](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ru.md)
- [Spanish / Español](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.es.md)
- [Swedish / Svenska](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.sv.md)
- [Tamil / தமிழ்](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ta.md)
- [Telugu / తెలుగు](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.te.md)
- [Thai / ไทย](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.th.md)
- [Turkish / Türkçe](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.tr.md)
- [Ukrainian / Українська](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ua.md)
- [Urdu / اردو](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ur.md)
- [Vietnamese / Tiếng Việt](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.vi.md)
+129
View File
@@ -0,0 +1,129 @@
<h3 align="center"><img width="80" alt="Puter.com, calculatorul personal în cloud: toate fișierele, aplicațiile și jocurile tale într-un singur loc, accesibile de oriunde și oricând." src="https://assets.puter.site/puter-logo.png"></h3>
<h3 align="center">Sistemul de operare al internetului! Gratuit, open-source și găzduibil autonom.</h3>
<p align="center">
<img alt="Dimensiunea repoului GitHub" src="https://img.shields.io/github/repo-size/HeyPuter/puter"> <img alt="Versiunea de pe GitHub" src="https://img.shields.io/github/v/release/HeyPuter/puter?label=ultima%20versiune"> <img alt="Licență GitHub" src="https://img.shields.io/github/license/HeyPuter/puter">
</p>
<p align="center">
<a href="https://puter.com/"><strong>« DEMO LIVE »</strong></a>
<br />
<br />
<a href="https://puter.com">Puter.com</a>
·
<a href="https://docs.puter.com" target="_blank">SDK</a>
·
<a href="https://discord.com/invite/PQcx7Teh8u">Discord</a>
·
<a href="https://www.youtube.com/@EricsPuterVideos">YouTube</a>
·
<a href="https://reddit.com/r/puter">Reddit</a>
·
<a href="https://twitter.com/HeyPuter">X (Twitter)</a>
·
<a href="https://hackerone.com/puter_h1b">Program de recompense pentru identificarea bugurilor</a>
</p>
<h3 align="center"><img width="800" style="border-radius:5px;" alt="captură de ecran" src="https://assets.puter.site/puter.com-screenshot-3.webp"></h3>
<br/>
## Puter
Puter este un sistem de operare pe internet, avansat, open-source, conceput să fie bogat în funcționalități, excepțional de rapid și foarte extensibil. Puter poate fi folosit ca:
* Un cloud personal cu accent pe confidențialitate, pentru a-ți păstra toate fișierele, aplicațiile și jocurile într-un singur loc securizat, accesibil de oriunde și oricând.
* O platformă pentru a construi și publica site-uri, aplicații web și jocuri.
* O alternativă la Dropbox, Google Drive, OneDrive etc., cu o interfață nouă și funcționalități puternice.
* Un mediu desktop la distanță pentru servere și stații de lucru.
* Un proiect și o comunitate, open-source și prietenoase, pentru a învăța despre dezvoltare web, cloud computing, sisteme distribuite și multe altele!
<br/>
## Fă primii pași
### 💻 Dezvoltare locală
```bash
git clone https://github.com/HeyPuter/puter
cd puter
npm install
npm start
```
Aceasta va porni Puter la [http://puter.localhost:4100](http://puter.localhost:4100) (sau pe următorul port disponibil).
<br/>
### 🐳 Docker
```bash
mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
```
<br/>
### 🐙 Docker Compose
#### Linux/macOS
```bash
mkdir -p puter/config puter/data
sudo chown -R 1000:1000 puter
wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
docker compose up
```
<br/>
#### Windows
```powershell
mkdir -p puter
cd puter
New-Item -Path "puter\config" -ItemType Directory -Force
New-Item -Path "puter\data" -ItemType Directory -Force
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
docker compose up
```
<br/>
### ☁️ Puter.com
Puter este disponibil ca serviciu găzduit la adresa [**puter.com**](https://puter.com).
<br/>
## Cerințe de sistem
* **Sisteme de operare:** Linux, macOS, Windows
* **RAM:** minimum 2GB (recomandat 4GB)
* **Spațiu pe disc:** 1GB spațiu liber
* **Node.js:** versiunea 16+ (versiunea 22+ recomandată)
* **npm:** ultima versiune stabilă
<br/>
## Suport
Ia legătura cu cei care asigură mentenanța proiectului și cu comunitatea prin aceste canale:
* Vrei să raportezi un bug sau să ceri o funcționalitate? Te rugăm să [deschizi o problemă](https://github.com/HeyPuter/puter/issues/new/choose).
* Discord: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
* X (Twitter): [x.com/HeyPuter](https://x.com/HeyPuter)
* Reddit: [reddit.com/r/puter/](https://www.reddit.com/r/puter/)
* Mastodon: [mastodon.social/@puter](https://mastodon.social/@puter)
* Probleme de securitate? [[email protected]](mailto:[email protected])
* Trimite un e-mail celor care asigură mentenanța proiectului la [[email protected]](mailto:[email protected])
Suntem întotdeauna bucuroși să te ajutăm cu orice întrebări ai. Nu ezita să ne pui întrebări!
<br/>
## Licență
Acest repository, inclusiv tot conținutul său, subproiectele, modulele și componentele, este licențiat sub [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt), cu excepția cazurilor în care se menționează explicit altfel. Bibliotecile terțe incluse în acest repository pot fi supuse propriilor lor licențe.
<br/>
+127
View File
@@ -0,0 +1,127 @@
<h3 align="center"><img width="80" alt="Puter.com, персональный облачный компьютер: все ваши файлы, приложения и игры в одном месте, доступные из любой точки мира в любое время." src="https://assets.puter.site/puter-logo.png"></h3>
<h3 align="center">Интернет ОС! Бесплатная, с открытым исходным кодом и возможностью самостоятельной установки.</h3>
<p align="center">
<img alt="Размер репозитория GitHub" src="https://img.shields.io/github/repo-size/HeyPuter/puter"> <img alt="Релиз GitHub" src="https://img.shields.io/github/v/release/HeyPuter/puter?label=latest%20version"> <img alt="Лицензия GitHub" src="https://img.shields.io/github/license/HeyPuter/puter">
</p>
<p align="center">
<a href="https://puter.com/"><strong>« ЖИВОЕ ДЕМО »</strong></a>
<br />
<br />
<a href="https://puter.com">Puter.com</a>
·
<a href="https://docs.puter.com" target="_blank">SDK</a>
·
<a href="https://discord.com/invite/PQcx7Teh8u">Discord</a>
·
<a href="https://reddit.com/r/puter">Reddit</a>
·
<a href="https://twitter.com/HeyPuter">X (Twitter)</a>
</p>
<h3 align="center"><img width="800" style="border-radius:5px;" alt="screenshot" src="https://assets.puter.site/puter.com-screenshot-3.webp"></h3>
<br/>
## Puter
Puter — это передовая операционная система с открытым исходным кодом, разработанная для обеспечения широкого функционала, исключительной скорости и высокой масштабируемости. Puter можно использовать как:
- Персональное облако с приоритетом конфиденциальности для хранения всех ваших файлов, приложений и игр в одном безопасном месте, доступном из любой точки мира в любое время.
- Платформа для создания и публикации веб-сайтов, веб-приложений и игр.
- Альтернатива Dropbox, Google Drive, OneDrive и т. д. с новым интерфейсом и мощными функциями.
- Удаленное рабочее окружение для серверов и рабочих станций.
- Дружественный проект с открытым исходным кодом и сообщество для изучения веб-разработки, облачных вычислений, распределенных систем и многого другого!
<br/>
## Начало работы
### 💻 Локальная разработка
```bash
git clone https://github.com/HeyPuter/puter
cd puter
npm install
npm start
```
Это запустит Puter по адресу http://puter.localhost:4100 (или на следующем доступном порту).
<br/>
### 🐳 Docker
```bash
mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
```
<br/>
### 🐙 Docker Compose
#### Linux/macOS
```bash
mkdir -p puter/config puter/data
sudo chown -R 1000:1000 puter
wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
docker compose up
```
<br/>
#### Windows
```powershell
mkdir -p puter
cd puter
New-Item -Path "puter\config" -ItemType Directory -Force
New-Item -Path "puter\data" -ItemType Directory -Force
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
docker compose up
```
<br/>
### ☁️ Puter.com
Puter доступен как облачный сервис на [**puter.com**](https://puter.com).
<br/>
## Системные требования
- **Операционные системы:** Linux, macOS, Windows
- **ОЗУ:** минимум 2 ГБ (рекомендуется 4 ГБ)
- **Место на диске:** 1 ГБ свободного места
- **Node.js:** Версия 16+ (рекомендуется версия 22+)
- **npm:** Последняя стабильная версия
<br/>
## Поддержка
Свяжитесь с разработчиками и сообществом этими способами:
- Отчет об ошибке или запрос функции? Пожалуйста, [откройте вопрос](https://github.com/HeyPuter/puter/issues/new/choose).
- Discord: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
- X (Twitter): [x.com/HeyPuter](https://x.com/HeyPuter)
- Reddit: [reddit.com/r/puter/](https://www.reddit.com/r/puter/)
- Mastodon: [mastodon.social/@puter](https://mastodon.social/@puter)
- Проблемы безопасности? [[email protected]](mailto:[email protected])
- Свяжитесь с разработчиками по адресу [[email protected]](mailto:[email protected])
Мы всегда рады помочь вам с любыми вопросами. Не стесняйтесь спрашивать!
<br/>
## Лицензия
Этот репозиторий, включая все его содержимое, подпроекты, модули и компоненты, лицензирован в соответствии с [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt), если явно не указано иное. Сторонние библиотеки, включенные в этот репозиторий, могут подпадать под действие их собственных лицензий.
<br/>
+125
View File
@@ -0,0 +1,125 @@
<h3 align="center"><img width="80" alt="Puter.com, Den personliga molndatorn: Alla dina filer, appar och spel på ett ställe tillgängliga var som helst när som helst." src="https://assets.puter.site/puter-logo.png"></h3>
<h3 align="center">Internet OS! Gratis, öppen källkod och självhostad.</h3>
<p align="center">
<img alt="GitHub repo storlek" src="https://img.shields.io/github/repo-size/HeyPuter/puter"> <img alt="GitHub Utgåva" src="https://img.shields.io/github/v/release/HeyPuter/puter?label=senaste%20versionen"> <img alt="GitHub Licens" src="https://img.shields.io/github/license/HeyPuter/puter">
</p>
<p align="center">
<a href="https://puter.com/"><strong>« LIVE DEMO »</strong></a>
<br />
<br />
<a href="https://puter.com">Puter.com</a>
·
<a href="https://docs.puter.com" target="_blank">SDK</a>
·
<a href="https://discord.com/invite/PQcx7Teh8u">Discord</a>
·
<a href="https://reddit.com/r/puter">Reddit</a>
·
<a href="https://twitter.com/HeyPuter">X (Twitter)</a>
</p>
<h3 align="center"><img width="800" style="border-radius:5px;" alt="skärmdump" src="https://assets.puter.site/puter.com-screenshot-3.webp"></h3>
<br/>
## Puter
Puter är ett avancerat, öppen källkod internetoperativsystem designat för att vara funktionsrikt, exceptionellt snabbt och mycket utbyggbart. Puter kan användas som:
- Ett integritetsfokuserat personligt moln för att hålla alla dina filer, appar och spel på ett säkert ställe, tillgängligt var som helst när som helst.
- En plattform för att bygga och publicera webbplatser, webbappar och spel.
- Ett alternativ till Dropbox, Google Drive, OneDrive, etc. med ett fräscht gränssnitt och kraftfulla funktioner.
- En fjärrskrivbordsmiljö för servrar och arbetsstationer.
- Ett vänligt, öppen källkod-projekt och gemenskap för att lära sig om webbutveckling, molndatorer, distribuerade system och mycket mer!
<br/>
## Komma igång
### 💻 Lokal Utveckling
```bash
git clone https://github.com/HeyPuter/puter
cd puter
npm install
npm start
```
Detta kommer att starta Puter på http://puter.localhost:4100 (eller nästa lediga port).
<br/>
### 🐳 Docker
```bash
mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
```
<br/>
### 🐙 Docker Compose
#### Linux/macOS
```bash
mkdir -p puter/config puter/data
sudo chown -R 1000:1000 puter
wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
docker compose up
```
<br/>
#### Windows
```powershell
mkdir -p puter
cd puter
New-Item -Path "puter\config" -ItemType Directory -Force
New-Item -Path "puter\data" -ItemType Directory -Force
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
docker compose up
```
<br/>
### ☁️ Puter.com
Puter är tillgängligt som en värdtjänst på [**puter.com**](https://puter.com).
<br/>
## Systemkrav
- **Operating Systems:** Linux, macOS, Windows
- **RAM:** 2GB minimum (4GB recommended)
- **Disk Space:** 1GB free space
- **Node.js:** Version 16+ (Version 22+ recommended)
- **npm:** Latest stable version
<br/>
## Support
Anslut med underhållarna och gemenskapen genom dessa kanaler:
- Buggrapport eller funktionsförfrågan? Vänligen [öppna ett ärende](https://github.com/HeyPuter/puter/issues/new/choose).
- Discord: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
- X (Twitter): [x.com/HeyPuter](https://x.com/HeyPuter)
- Reddit: [reddit.com/r/puter/](https://www.reddit.com/r/puter/)
- Mastodon: [mastodon.social/@puter](https://mastodon.social/@puter)
- Säkerhetsproblem? [[email protected]](mailto:[email protected])
- E-posta underhållarna på [[email protected]](mailto:[email protected])
Vi hjälper dig gärna med eventuella frågor du kan ha. Tveka inte att fråga!
<br/>
## Licens
Detta arkiv, inklusive allt dess innehåll, delprojekt, moduler och komponenter, är licensierat under [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt) om inte annat uttryckligen anges. Tredjepartsbibliotek som ingår i detta arkiv kan vara föremål för sina egna licenser.
<br/>
+123
View File
@@ -0,0 +1,123 @@
<h3 align="center"><img width="80" alt="Puter.com, The Personal Cloud Computer: உங்கள் கோப்புகள், ஆப்ஸ் மற்றும் கேம்கள் அனைத்தும் ஒரே இடத்தில் எங்கிருந்தும் எந்த நேரத்திலும் அணுகலாம்." src="https://assets.puter.site/puter-logo.png"></h3>
<h3 align="center">இன்டர்நெட் OS! இலவசம், ஓப்பன் சோர்ஸ் மற்றும் Self-Hostable</h3>
<p align="center">
<img alt="GitHub repo size" src="https://img.shields.io/github/repo-size/HeyPuter/puter"> <img alt="GitHub Release" src="https://img.shields.io/github/v/release/HeyPuter/puter?label=latest%20version"> <img alt="GitHub உரிமம்" src="https://img.shields.io/github/license/HeyPuter/puter" >
</p>
<p align="center">
<a href="https://puter.com/"><strong>« லைவ் டெமோ »</strong></a>
<br />
<br />
<a href="https://puter.com">Puter.com</a>
·
<a href="https://docs.puter.com" target="_blank">SDK</a>
·
<a href="https://discord.com/invite/PQcx7Teh8u">Discord</a>
·
<a href="https://reddit.com/r/puter">Reddit</a>
·
<a href="https://twitter.com/HeyPuter">X (Twitter)</a>
</p>
<h3 align="center"><img width="800" style="border-radius:5px;" alt="screenshot" src="https://assets.puter.site/puter.com-screenshot-3.webp"></h3>
<br/>
## புட்டர் (Putter)
புட்டர்(putter) என்பது ஒரு மேம்பட்ட, திறந்த மூல இலவசமாக இணைய இயக்க முறைமையாகும், இது அம்சம் நிறைந்ததாகவும், விதிவிலக்காக வேகமாகவும், அதிக விரிவாக்கக்கூடியதாகவும் வடிவமைக்கப்பட்டுள்ளது. புட்டரை இவ்வாறு பயன்படுத்தலாம்:
- உங்கள் கோப்புகள், பயன்பாடுகள் மற்றும் கேம்கள் அனைத்தையும் ஒரே பாதுகாப்பான இடத்தில் வைத்திருக்க, எந்த நேரத்திலும் எங்கிருந்தும் அணுகக்கூடிய தனியுரிமை-முதல் தனிப்பட்ட கிளவுட்.
- இணையதளங்கள், இணைய பயன்பாடுகள் மற்றும் கேம்களை உருவாக்கி வெளியிடுவதற்கான தளம் இதுவாகும்.
- புதிய இடைமுகம் மற்றும் சக்திவாய்ந்த அம்சங்களுடன் Dropbox, Google Drive, OneDrive போன்றவற்றுக்கு மாற்றீடாக உபயோகிக்க கூடியது.
- சர்வர்கள் மற்றும் பணிநிலையங்களுக்கான தொலைநிலை டெஸ்க்டாப்(desktop) சூழல்.
- வலை மேம்பாடு, கிளவுட் கம்ப்யூட்டிங், விநியோகிக்கப்பட்ட அமைப்புகள் மற்றும் பலவற்றைப் பற்றி அறிந்து ஒரு நட்பு ரீதியான, திறந்த மூல திட்டம் மற்றும் சமூக அறிவியலில் சார்ந்த ஒன்று.
<br/>
## தொடங்குதல்
### 💻 உள்ளூர் வளர்ச்சி
```bash
git clone https://github.com/HeyPuter/puter
cd puter
npm install
npm start
``` தொடக்கம்
```
இது புட்டரை <http://puter.localhost:4100> இல் தொடங்கும் (அல்லது அடுத்து கிடைக்கும் இடம்).
<br/>
### 🐳 Docker
```bash
mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
```
<br/>
### 🐙 டோக்கர் கம்போஸ்
#### Linux/macOS
```bash
mkdir -p puter/config puter/data
sudo chown -R 1000:1000 puter
wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
docker compose up
```
<br/>
#### Windows
```powershell
mkdir -p puter
cd puter
New-Item -Path "puter\config" -ItemType Directory -Force
New-Item -Path "puter\data" -ItemType Directory -Force
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
docker compose up
```
<br/>
### ☁️ Puter.com
புட்டர் ஹோஸ்ட் செய்யப்பட்ட சேவையாக [**puter.com**](https://puter.com) இல் கிடைக்கிறது.
<br/>
## கணினி தேவைகள்
- **இயக்க முறைமைகள்:** Linux, macOS, Windows
- **ரேம்:** குறைந்தபட்சம் 2 ஜிபி (4 ஜிபி பரிந்துரைக்கப்படுகிறது)
- **வட்டு இடம்:** 1GB இலவச இடம்
- **Node.js:** Version 16+ (Version 22+ recommended)
- **npm:** சமீபத்திய நிலையான பதிப்பு(Latest stable version)
<br/>
## ஆதரவு
இந்த சேனல்கள் மூலம் பராமரிப்பாளர்கள் மற்றும் சமூகத்துடன் சமூக இணைப்பாளர்:
- பிழை அறிக்கை அல்லது மாற்றுதல் கோரிக்கை? தயவுசெய்து [சிக்கலைத் திறக்கவும்](https://github.com/HeyPuter/puter/issues/new/choose).
- கருத்து வேறுபாடு: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
- X (Twitter): [x.com/HeyPuter](https://x.com/HeyPuter)
- Reddit: [reddit.com/r/puter/](https://www.reddit.com/r/puter/)
- Mastodon: [mastodon.social/@puter](https://mastodon.social/@puter)
- பாதுகாப்பு பிரச்சினைகள்? [[email protected]](mailto:[email protected])
- மின்னஞ்சல் பராமரிப்பாளர்களுக்கு [[email protected]](mailto:[email protected])
உங்களுக்கு ஏதேனும் கேள்விகள் இருந்தால் உங்களுக்கு உதவ நாங்கள் எப்போதும் மகிழ்ச்சியடைகிறோம். தயங்காமல் கேளுங்கள்!
<br/>
## உரிமம்
இந்தக் களஞ்சியமானது, அதன் அனைத்து உள்ளடக்கங்கள், துணைத் திட்டங்கள், தொகுதிகள் மற்றும் கூறுகள் உட்பட, வெளிப்படையாகக் கூறப்படாவிட்டால், [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt) இன் கீழ் உரிமம் பெற்றுள்ளது. . இந்தக் களஞ்சியத்தில் சேர்க்கப்பட்டுள்ள மூன்றாம் தரப்பு நூலகங்கள் அவற்றின் சொந்த உரிமங்களுக்கு உட்பட்டதாக இருக்கும்.
<br/>
+161
View File
@@ -0,0 +1,161 @@
<h3 align="center"><img width="80" alt="Puter.com, The Personal Cloud Computer: మీ అన్ని ఫైల్‌లు, యాప్‌లు మరియు గేమ్‌లను ఒకే స్థలంలో ఎక్కడి నుండైనా ఎప్పుడైనా యాక్సెస్ చేయవచ్చు." src="https://assets.puter.site/puter-logo.png"></h3>
<h3 align="center"> ఇంటర్నెట్ OS! ఉచిత, ఓపెన్ సోర్స్, and Self-Hostable.</h3>
<p align="center">
<img alt="GitHub repo size" src="https://img.shields.io/github/repo-size/HeyPuter/puter"> <img alt="GitHub Release" src="https://img.shields.io/github/v/release/HeyPuter/puter?label=latest%20version"> <img alt="GitHub License" src="https://img.shields.io/github/license/HeyPuter/puter">
</p>
<p align="center">
<a href="https://puter.com/"><strong>« ప్రత్యక్ష ప్రదర్శన »</strong></a>
<br />
<br />
<a href="https://puter.com">Puter.com</a>
·
<a href="https://docs.puter.com" target="_blank">SDK</a>
·
<a href="https://discord.com/invite/PQcx7Teh8u">Discord</a>
·
<a href="https://reddit.com/r/puter">Reddit</a>
·
<a href="https://twitter.com/HeyPuter">X (Twitter)</a>
</p>
<h3 align="center"><img width="800" style="border-radius:5px;" alt="screenshot" src="https://assets.puter.site/puter.com-screenshot-3.webp"></h3>
<br/>
## పుటర్ (Puter)
పుటర్ అనేది అధునాతన, ఓపెన్ సోర్స్ ఇంటర్నెట్ ఆపరేటింగ్ సిస్టమ్, ఇది ఫీచర్-రిచ్, అనూహ్యంగా వేగవంతమైన మరియు అత్యంత విస్తరించదగినదిగా రూపొందించబడింది. పుటర్‌ను ఇలా ఉపయోగించవచ్చు:
- మీ అన్ని ఫైల్‌లు, యాప్‌లు మరియు గేమ్‌లను ఒకే సురక్షిత స్థలంలో ఉంచడానికి గోప్యత-మొదటి వ్యక్తిగత క్లౌడ్, ఎప్పుడైనా ఎక్కడి నుండైనా యాక్సెస్ చేయవచ్చు.
- వెబ్‌సైట్‌లు, వెబ్ యాప్‌లు మరియు గేమ్‌లను రూపొందించడానికి మరియు ప్రచురించడానికి ఒక వేదిక.
- తాజా ఇంటర్‌ఫేస్ మరియు శక్తివంతమైన ఫీచర్‌లతో Dropbox, Google Drive, OneDrive మొదలైన వాటికి ప్రత్యామ్నాయం.
- సర్వర్లు మరియు వర్క్‌స్టేషన్‌ల కోసం రిమోట్ డెస్క్‌టాప్ వాతావరణం.
- వెబ్ డెవలప్‌మెంట్, క్లౌడ్ కంప్యూటింగ్, డిస్ట్రిబ్యూట్ సిస్టమ్‌లు మరియు మరిన్నింటి గురించి తెలుసుకోవడానికి స్నేహపూర్వక, ఓపెన్ సోర్స్ ప్రాజెక్ట్ మరియు కమ్యూనిటీ!
<br/>
## ప్రారంభించడం
### లోకల్ డెవలప్మెంట్
```bash
git clone https://github.com/HeyPuter/puter
cd puter
npm install
npm start
```
ఇది http://puter.localhost:4100 (లేదా తదుపరి అందుబాటులో ఉన్న పోర్ట్) వద్ద పుటర్‌ని ప్రారంభిస్తుంది.
ఇది పని చేయకపోతే, దీని కోసం [మొదటి రన్ సమస్యలు](./doc/first-run-issues.md) చూడండి
ట్రబుల్షూటింగ్ దశలు.
<br/>
### 🐳 డోకర్
```bash
mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
```
<br/>
### 🐙 డోకర్ Compose
#### లినక్స్/ macOS
```bash
mkdir -p puter/config puter/data
sudo chown -R 1000:1000 puter
wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
docker compose up
```
<br/>
#### విండోస్
```powershell
mkdir -p puter
cd puter
New-Item -Path "puter\config" -ItemType Directory -Force
New-Item -Path "puter\data" -ItemType Directory -Force
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
docker compose up
```
<br/>
### ☁️ Puter.com
పుటర్ [**puter.com**](https://puter.com)లో హోస్ట్ చేయబడి ఉంది.
<br/>
## System Requirements
- **ఆపరేటింగ్ సిస్టమ్స్:** లినక్స్, macOS, విండోస్
- **RAM:** 2GB కనీసం(4GB recommended)
- **Disk Space:** 1GB ఖాళీ
- **Node.js:** Version 16+ (Version 22+ recommended)
- **npm:** Latest stable version
<br/>
## Support
ఈ ఛానెల్‌ల ద్వారా నిర్వాహకులు మరియు సంఘంతో కనెక్ట్ అవ్వండి:
- బగ్ నివేదిక లేదా ఫీచర్ అభ్యర్థన? దయచేసి [open an issue](https://github.com/HeyPuter/puter/issues/new/choose).
- Discord: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
- X (Twitter): [x.com/HeyPuter](https://x.com/HeyPuter)
- Reddit: [reddit.com/r/puter/](https://www.reddit.com/r/puter/)
- Mastodon: [mastodon.social/@puter](https://mastodon.social/@puter)
- Security issues? [[email protected]](mailto:[email protected])
- Email maintainers at [[email protected]](mailto:[email protected])
మీకు ఏవైనా సందేహాలు ఉంటే మీకు సహాయం చేయడానికి మేము ఎల్లప్పుడూ సంతోషిస్తాము. అడగడానికి సంకోచించకండి!
<br/>
## లైసెన్సు
ఈ రిపోజిటరీ, దాని మొత్తం కంటెంట్‌లు, ఉప-ప్రాజెక్ట్‌లు, మాడ్యూల్స్ మరియు కాంపోనెంట్‌లతో సహా, [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt) కింద లైసెన్స్‌ని కలిగి ఉంటుంది. . ఈ రిపోజిటరీలో చేర్చబడిన థర్డ్-పార్టీ లైబ్రరీలు వాటి స్వంత లైసెన్స్‌లకు లోబడి ఉండవచ్చు.
<br/>
## అనువాదాలు
- [Arabic / العربية](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ar.md)
- [Armenian / Հայերեն](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.hy.md)
- [Bengali / বাংলা](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.bn.md)
- [Chinese / 中文](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.zh.md)
- [Danish / Dansk](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.da.md)
- [English](https://github.com/HeyPuter/puter/blob/main/README.md)
- [Farsi / فارسی](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.fa.md)
- [Finnish / Suomi](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.fi.md)
- [French / Français](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.fr.md)
- [German/ Deutsch](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.de.md)
- [Hebrew/ עברית](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.he.md)
- [Hindi / हिंदी](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.hi.md)
- [Hungarian / Magyar](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.hu.md)
- [Indonesian / Bahasa Indonesia](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.id.md)
- [Italian / Italiano](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.it.md)
- [Japanese / 日本語](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.jp.md)
- [Korean / 한국어](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ko.md)
- [Malayalam / മലയാളം](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ml.md)
- [Polish / Polski](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.pl.md)
- [Portuguese / Português](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.pt.md)
- [Romanian / Română](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ro.md)
- [Russian / Русский](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ru.md)
- [Spanish / Español](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.es.md)
- [Swedish / Svenska](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.sv.md)
- [Tamil / தமிழ்](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ta.md)
- [Telugu / తెలుగు](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.te.md)
- [Thai / ไทย](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.th.md)
- [Turkish / Türkçe](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.tr.md)
- [Ukrainian / Українська](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ua.md)
- [Urdu / اردو](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.ur.md)
- [Vietnamese / Tiếng Việt](https://github.com/HeyPuter/puter/blob/main/doc/i18n/README.vi.md)
+127
View File
@@ -0,0 +1,127 @@
<h3 align="center"><img width="80" alt="Puter.com, The Personal Cloud Computer: All your files, apps, and games in one place accessible from anywhere at any time." src="https://assets.puter.site/puter-logo.png"></h3>
<h3 align="center">ระบบปฏิบัติการอินเทอร์เน็ต ฟรี, โอเพ่นซอร์ส, และสามารถโฮสต์ได้ด้วยตนเอง</h3>
<p align="center">
<img alt="GitHub repo size" src="https://img.shields.io/github/repo-size/HeyPuter/puter"> <img alt="GitHub Release" src="https://img.shields.io/github/v/release/HeyPuter/puter?label=latest%20version"> <img alt="GitHub License" src="https://img.shields.io/github/license/HeyPuter/puter">
</p>
<p align="center">
<a href="https://puter.com/"><strong>« การสาธิตสด »</strong></a>
<br />
<br />
<a href="https://puter.com">Puter.com</a>
·
<a href="https://docs.puter.com" target="_blank">ชุดพัฒนาโปรแกรม</a>
·
<a href="https://discord.com/invite/PQcx7Teh8u">ดิสคอร์ด</a>
·
<a href="https://reddit.com/r/puter">เรดดิท</a>
·
<a href="https://twitter.com/HeyPuter">X (ทวิตเตอร์)</a>
</p>
<h3 align="center"><img width="800" style="border-radius:5px;" alt="screenshot" src="https://assets.puter.site/puter.com-screenshot-3.webp"></h3>
<br/>
## พิวเตอร์
พิวเตอร์ เป็นระบบปฏิบัติการอินเทอร์เน็ตขั้นสูงแบบโอเพ่นซอร์สที่ออกแบบมาให้มีฟีเจอร์ครบถ้วน ความเร็วสูง และมีความสามารถที่จะขยายได้สูง. พิวเตอร์ สามารถใช้ได้เป็น:
- คลาวด์ส่วนตัว เพื่อเก็บไฟล์, แอพพลิเคชัน, และเกมทั้งหมดของคุณในที่เดียวที่ปลอดภัยและสามารถเข้าถึงได้ทุกที่ทุกเวลา
- แพลตฟอร์มสำหรับการสร้างและเผยแพร่เว็บไซต์, เว็บแอปพลิเคชัน, และเกม
- ทางเลือกอีกหนึ่งทางที่สามารถใช้แทน Dropbox, Google Drive, OneDrive ฯลฯ โดยที่มีอินเทอร์เฟซใหม่และฟีเจอร์ที่ทรงพลัง
- สภาพแวดล้อมสำหรับเดสก์ท็อประยะไกลที่ใช้กับเซิร์ฟเวอร์และสถานีทำงาน
- โครงการโอเพ่นซอร์สและชุมชนที่เป็นมิตรที่คุณสามารถเรียนรู้เกี่ยวกับการพัฒนาเว็บ, คลาวด์คอมพิวติ้ง, ระบบกระจาย, และอีกมากมาย
<br/>
## การเริ่มต้นใช้งาน
### 💻 การพัฒนาภายในเครื่อง
```bash
git clone https://github.com/HeyPuter/puter
cd puter
npm install
npm start
```
พิวเตอร์ จะถูกเปิดใช้งานที่ http://puter.localhost:4100 (หรือพอร์ตถัดไปที่ว่าง).
<br/>
### 🐳 ด็อกเกอร์
```bash
mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
```
<br/>
### 🐙 ด็อกเกอร์ คอมโพส
#### ลินุกซ์/แมคโอเอส
```bash
mkdir -p puter/config puter/data
sudo chown -R 1000:1000 puter
wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
docker compose up
```
<br/>
#### วินโดวส์
```powershell
mkdir -p puter
cd puter
New-Item -Path "puter\config" -ItemType Directory -Force
New-Item -Path "puter\data" -ItemType Directory -Force
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
docker compose up
```
<br/>
### ☁️ Puter.com
สามารถใช้งาน พิวเตอร์ ได้ในรูปแบบบริการโฮสต์ที่ [**puter.com**](https://puter.com).
<br/>
## ข้อกำหนดของระบบ
- **ระบบปฏิบัติการ:** ลินุกซ์ แมคโอเอส วินโดวส์
- **แรม:** อย่างน้อย 2GB (แนะนำ 4GB)
- **พื้นที่เก็บข้อมูล:** พื้นที่ว่าง 1GB
- **Node.js:** เวอร์ชัน 16+ (แนะนำเวอร์ชัน 22+)
- **npm:** เวอร์ชันล่าสุดที่เสถียร
<br/>
## การช่วยเหลือ
ติดต่อกับผู้ดูแลระบบและชุมชนผ่านช่องทางเหล่านี้:
- พบข้อผิดพลาดหรือขอฟีเจอร์ใหม่? กรุณา [เปิดปัญหา](https://github.com/HeyPuter/puter/issues/new/choose).
- ดิสคอร์ด: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
- X (ทวิตเตอร์): [x.com/HeyPuter](https://x.com/HeyPuter)
- เรดดิท: [reddit.com/r/puter/](https://www.reddit.com/r/puter/)
- มาสตอดอน: [mastodon.social/@puter](https://mastodon.social/@puter)
- ปัญหาด้านความปลอดภัย [[email protected]](mailto:[email protected])
- ส่งอีเมลถึงผู้ดูแลระบบได้ที่ [[email protected]](mailto:[email protected])
เรายินดีเสมอที่จะช่วยเหลือคุณกับทุกทุกคำถามที่คุณมี อย่าลังเลที่จะถาม
<br/>
## ลิขสิทธิ์
ที่เก็บข้อมูลนี้ รวมถึงเนื้อหาทั้งหมด, โครงการย่อย, โมดูล, และส่วนประกอบต่างๆ ได้รับใบอนุญาตภายใต้ [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt) เว้นแต่จะมีการระบุไว้เป็นอย่างอื่นอย่างชัดเจน ไลบรารีจากบุคคลที่สามที่รวมอยู่ในที่เก็บข้อมูลนี้อาจอยู่ภายใต้ใบอนุญาตของตนเอง
<br/>
+127
View File
@@ -0,0 +1,127 @@
<h3 align="center"><img width="80" alt="Puter.com, Kişisel Bulut Bilgisayar: Tüm dosyalarınız, uygulamalarınız ve oyunlarınız her zaman her yerden erişilebilen tek bir yerde." src="https://assets.puter.site/puter-logo.png"></h3>
<h3 align="center">İnternet İşletim Sistemi! Ücretsiz, Açık Kaynaklı ve Kendi Kendine Barındırılabilir</h3>
<p align="center">
<img alt="GitHub Depo Boyutu" src="https://img.shields.io/github/repo-size/HeyPuter/puter"> <img alt="GitHub Yayınlamak" src="https://img.shields.io/github/v/release/HeyPuter/puter?label=latest%20version"> <img alt="GitHub Lisans" src="https://img.shields.io/github/license/HeyPuter/puter">
</p>
<p align="center">
<a href="https://puter.com/"><strong>« CANLI DEMO »</strong></a>
<br />
<br />
<a href="https://puter.com">Puter.com</a>
·
<a href="https://docs.puter.com" target="_blank">SDK</a>
·
<a href="https://discord.com/invite/PQcx7Teh8u">Discord</a>
·
<a href="https://reddit.com/r/puter">Reddit</a>
·
<a href="https://twitter.com/HeyPuter">X (Twitter)</a>
</p>
<h3 align="center"><img width="800" style="border-radius:5px;" alt="screenshot" src="https://assets.puter.site/puter.com-screenshot-3.webp"></h3>
<br/>
## Puter
Puter, zengin özelliklere sahip, son derece hızlı ve son derece genişletilebilir olacak şekilde tasarlanmış gelişmiş, açık kaynaklı bir internet işletim sistemidir. Puter şu şekilde kullanılabilir:
- Tüm dosyalarınızı, uygulamalarınızı ve oyunlarınızı tek bir güvenli yerde tutmak için gizlilik öncelikli bir kişisel bulut, her yerden her zaman erişilebilir.
- Web siteleri, web uygulamaları ve oyunlar oluşturmak ve yayınlamak için bir platform.
- Yeni bir arayüz ve güçlü özelliklerle Dropbox, Google Drive, OneDrive vb. uygulamalara bir alternatif.
- Sunucular ve iş istasyonları için bir uzak masaüstü ortamı.
- Web geliştirme, bulut bilişim, dağıtık sistemler ve çok daha fazlası hakkında bilgi edinmek için dost canlısı, açık kaynaklı bir proje ve topluluk!
<br/>
## Başlarken
### 💻 Yerel Geliştirme
```bash
git clone https://github.com/HeyPuter/puter
cd puter
npm install
npm start
```
Bu, Puter'ı http://puter.localhost:4100 adresinde (veya bir sonraki kullanılabilir portta) başlatacaktır.
<br/>
### 🐳 Docker
```bash
mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
```
<br/>
### 🐙 Docker Compose
#### Linux/macOS
```bash
mkdir -p puter/config puter/data
sudo chown -R 1000:1000 puter
wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
docker compose up
```
<br/>
#### Windows
```powershell
mkdir -p puter
cd puter
New-Item -Path "puter\config" -ItemType Directory -Force
New-Item -Path "puter\data" -ItemType Directory -Force
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
docker compose up
```
<br/>
### ☁️ Puter.com
Puter, [**puter.com**](https://puter.com) adresinde barındırılan bir hizmet olarak kullanılabilir.
<br/>
## Sistem Gereksinimleri
- **İşletim Sistemleri:** Linux, macOS, Windows
- **RAM:** 2GB Minimum (4GB önerilir)
- **Disk Alanı:** 1GB boş alan
- **Node.js:** Sürüm 16+ (Sürüm 22+ önerilir)
- **npm:** En son stabil sürüm
<br/>
## Destek
Bakımcılarla ve toplulukla şu kanallar aracılığıyla iletişim kurabilirsiniz:
- Hata raporu veya özellik isteği? Lütfen [yeni bir issue açın](https://github.com/HeyPuter/puter/issues/new/choose).
- Discord: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
- X (Twitter): [x.com/HeyPuter](https://x.com/HeyPuter)
- Reddit: [reddit.com/r/puter/](https://www.reddit.com/r/puter/)
- Mastodon: [mastodon.social/@puter](https://mastodon.social/@puter)
- Güvenlik sorunları? [[email protected]](mailto:[email protected])
- Bakımcılara şu adresten e-posta gönderin [[email protected]](mailto:[email protected])
Sorularınız varsa size her zaman yardımcı olmaktan mutluluk duyarız. Sormaktan çekinmeyin!
<br/>
## Lisans
Bu depo, tüm içeriği, alt projeleri, modülleri ve bileşenleri dahil olmak üzere, aksi açıkça belirtilmedikçe [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt) altında lisanslanmıştır. Bu depoda yer alan üçüncü taraf kütüphaneler kendi lisanslarına tabi olabilir.
<br/>
+125
View File
@@ -0,0 +1,125 @@
<h3 align="center"><img width="80" alt="Puter.com, The Personal Cloud Computer: Всі ваші файли, додатки та ігри в одному місці, доступні з будь-якого куточка світу в будь-який час." src="https://assets.puter.site/puter-logo.png"></h3>
<h3 align="center">Інтернет ОС! Безкоштовна, відкрита та self-hosted.</h3>
<p align="center">
<img alt="Розмір репозиторію на GitHub" src="https://img.shields.io/github/repo-size/HeyPuter/puter"> <img alt="Остання версія на GitHub" src="https://img.shields.io/github/v/release/HeyPuter/puter?label=latest%20version"> <img alt="Ліцензія GitHub" src="https://img.shields.io/github/license/HeyPuter/puter">
</p>
<p align="center">
<a href="https://puter.com/"><strong>« Онлайн ДЕМО »</strong></a>
<br />
<br />
<a href="https://puter.com">Puter.com</a>
·
<a href="https://docs.puter.com" target="_blank">SDK</a>
·
<a href="https://discord.com/invite/PQcx7Teh8u">Discord</a>
·
<a href="https://reddit.com/r/puter">Reddit</a>
·
<a href="https://twitter.com/HeyPuter">X (Twitter)</a>
</p>
<h3 align="center"><img width="800" style="border-radius:5px;" alt="скріншот" src="https://assets.puter.site/puter.com-screenshot-3.webp"></h3>
<br/>
## Puter
Puter — це просунута, інтернет-ОС, з відкритим кодом, створена для того, щоб бути багатофункціональною, надзвичайно швидкою та розширюваною. Puter може використовуватися як:
- Приватний хмарний сервіс для збереження всіх ваших файлів, додатків і ігор у безпечному місці, доступному в будь-який час з будь-якого місця.
- Платформа для створення та публікації вебсайтів, вебдодатків і ігор.
- Альтернатива Dropbox, Google Drive, OneDrive і тд, з свіженьким інтерфейсом та потужними функціями.
- Віддалене робоче середовище для серверів і робочих станцій.
- Дружній, відкритий проєкт та спільнота для вивчення веброзробки, хмарних обчислень, розподілених систем і багато іншого!
<br/>
## Початок роботи
### Локальна розробка
```bash
git clone https://github.com/HeyPuter/puter
cd puter
npm install
npm start
```
Це запустить Puter на http://puter.localhost:4100 (або на наступному доступному порті).
<br/>
### 🐳 Docker
```bash
mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
```
<br/>
### 🐙 Docker Compose
#### Linux/macOS
```bash
mkdir -p puter/config puter/data
sudo chown -R 1000:1000 puter
wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
docker compose up
```
<br/>
#### Windows
```powershell
mkdir -p puter
cd puter
New-Item -Path "puter\config" -ItemType Directory -Force
New-Item -Path "puter\data" -ItemType Directory -Force
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
docker compose up
```
<br/>
### ☁️ Puter.com
Puter доступний як hosted service на [**puter.com**](https://puter.com).
<br/>
## Системні вимоги
- **Операційні Системи:** Linux, macOS, Windows
- **RAM:** 2GB мінімум (4GB рекомендовано)
- **Місце на диску:** 1GB вільного місця
- **Node.js:** Version 16+ (Version 22+ рекомендовано)
- **npm:** остання "stable" версія
<br/>
## Підтримка
Зв'язатися з розробниками та спільнотою можна через такі канали:
- Повідомити про помилку, або запит щодо нової фічі? Будь ласка, [створіть issue](https://github.com/HeyPuter/puter/issues/new/choose).
- Discord: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
- X (Twitter): [x.com/HeyPuter](https://x.com/HeyPuter)
- Reddit: [reddit.com/r/puter/](https://www.reddit.com/r/puter/)
- Mastodon: [mastodon.social/@puter](https://mastodon.social/@puter)
- Питання щодо Security? [[email protected]](mailto:[email protected])
- Написати розробникам [[email protected]](mailto:[email protected])
Ми завжди готові допомогти Вам з будь-якими питаннями, що можуть виникнути. Не соромтеся ставити нам питання!
<br/>
## License
Цей репорзиторій, включаючи увесь його контент, дочірні проєкти, модулі, і компоненти, ліцензовано за [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt), якщо явно не вказано інше. Сторонні бібліотеки, включені в цей репозиторій, можуть підпадати під дію інших ліцензій.
<br/>
+121
View File
@@ -0,0 +1,121 @@
<h3 align="center"><img width="80" alt="Puter.com, ذاتی کلاؤڈ کمپیوٹر: آپ کی تمام فائلیں، ایپس، اور کھیل ایک جگہ پر، کہیں سے بھی اور کسی بھی وقت قابل رسائی۔" src="https://assets.puter.site/puter-logo.png"></h3>
<h3 align="center">انٹرنیٹ OS! مفت، اوپن سورس، اور خود میزبان.</h3>
<p align="center">
<img alt="GitHub repo size" src="https://img.shields.io/github/repo-size/HeyPuter/puter"> <img alt="GitHub Release" src="https://img.shields.io/github/v/release/HeyPuter/puter?label=latest%20version"> <img alt="GitHub License" src="https://img.shields.io/github/license/HeyPuter/puter">
</p>
<p align="center">
<a href="https://puter.com/"><strong>« لائیو ڈیمو »</strong></a>
<br />
<br />
<a href="https://puter.com">Puter.com</a>
·
<a href="https://docs.puter.com" target="_blank">SDK</a>
·
<a href="https://discord.com/invite/PQcx7Teh8u">ڈسکورڈ</a>
·
<a href="https://reddit.com/r/puter">ریڈڈٹ</a>
·
<a href="https://twitter.com/HeyPuter">ایکس (ٹوئٹر)</a>
</p>
<h3 align="center"><img width="800" style="border-radius:5px;" alt="اسکرین شاٹ" src="https://assets.puter.site/puter.com-screenshot-3.webp"></h3>
<br/>
## Puter
ایک جدید، اوپن سورس انٹرنیٹ آپریٹنگ سسٹم ہے جو کہ خصوصیات سے بھرپور، بہت تیز، اور انتہائی توسیع پذیر ہے۔ Puter
: کو استعمال کیا جا سکتا ہے Puter
- ایک پرائیویسی فرسٹ ذاتی کلاؤڈ کے طور پر تاکہ آپ کی تمام فائلیں، ایپس، اور کھیل ایک محفوظ جگہ پر رکھی جا سکیں، کہیں سے بھی اور کسی بھی وقت قابل رسائی ہوں۔
- ویب سائٹس، ویب ایپس، اور کھیل بنانے اور شائع کرنے کے لئے ایک پلیٹ فارم کے طور پر۔
- وغیرہ کا متبادل، نئے انٹرفیس اور طاقتور خصوصیات کے ساتھ۔ Dropbox، Google Drive، OneDrive
- سرورز اور ورک اسٹیشنز کے لیے ایک ریموٹ ڈیسک ٹاپ ماحول کے طور پر۔
- ویب ڈویلپمنٹ، کلاؤڈ کمپیوٹنگ، تقسیم شدہ نظاموں، اور بہت کچھ سیکھنے کے لیے ایک دوستانہ، اوپن سورس پروجیکٹ اور کمیونٹی!
<br/>
## شروع کرنے کا طریقہ
### 💻 مقامی ترقی
```bash
git clone https://github.com/HeyPuter/puter
cd puter
npm install
npm start
```
یہ Puter کو http://puter.localhost:4100 (یا اگلے دستیاب پورٹ) پر لانچ کرے گا۔
<br/>
🐳 Docker
```bash
mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
```
<br/>
🐙 Docker Compose
Linux/macOS
```bash
mkdir -p puter/config puter/data
sudo chown -R 1000:1000 puter
wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
docker compose up
```
<br/>
Windows
```powershell
mkdir -p puter
cd puter
New-Item -Path "puter\config" -ItemType Directory -Force
New-Item -Path "puter\data" -ItemType Directory -Force
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
docker compose up
```
<br/>
### ☁️ Puter.com
Puter کو [**puter.com**](https://puter.com) پر میزبان سروس کے طور پر دستیاب ہے۔
<br/>
## نظام کی ضروریات
- **آپریٹنگ سسٹمز:** لینکس، macOS، ونڈوز
- **RAM:** کم از کم 2GB (4GB تجویز کردہ)
- **ڈسک کی جگہ:** 1GB خالی جگہ
- **Node.js:** ورژن 16+ (ورژن 22+ تجویز کردہ)
- **npm:** تازہ ترین مستحکم ورژن
<br/>
## سپورٹ
منتظمین اور کمیونٹی سے جڑنے کے لیے یہ چینلز استعمال کریں:
- بگ رپورٹ یا فیچر درخواست؟ براہ کرم [ایک مسئلہ کھولیں](https://github.com/HeyPuter/puter/issues/new/choose).
- ڈسکورڈ: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
- ایکس (ٹوئٹر): [x.com/HeyPuter](https://x.com/HeyPuter)
- ریڈڈٹ: [reddit.com/r/puter/](https://www.reddit.com/r/puter/)
- ماسٹڈون: [mastodon.social/@puter](https://mastodon.social/@puter)
- سیکیورٹی کے مسائل؟ [[email protected]](mailto:[email protected])
- منتظمین کو ای میل کریں [[email protected]](mailto:[email protected])
ہم ہمیشہ آپ کی مدد کے لیے خوش ہیں۔ سوالات پوچھنے میں ہچکچاہٹ نہ کریں
!
<br/>
## لائسنس
اس ریپوزٹری، بشمول اس کے تمام مواد، ذیلی پروجیکٹس، ماڈیولز، اور کمپوننٹس، کو [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt) کے تحت لائسنس کیا گیا ہے جب تک کہ واضح طور پر کہیں اور نہ کہا گیا ہو۔ اس ریپوزٹری میں شامل تھرڈ پارٹی لائبریریاں اپنی لائسنس کے تابع ہو سکتی ہیں۔
<br/>
+125
View File
@@ -0,0 +1,125 @@
<h3 align="center"><img width="80" alt="Puter.com, Máy Tính Đám Mây Cá Nhân: Tất cả các tệp, ứng dụng, và trò chơi của bạn ở một nơi, có thể truy cập từ bất cứ đâu vào bất kỳ lúc nào." src="https://assets.puter.site/puter-logo.png"></h3>
<h3 align="center">Hệ điều hành Internet! Miễn phí, Mã nguồn mở và Có thể tự lưu trữ.</h3>
<p align="center">
<img alt="Kích thước repo GitHub" src="https://img.shields.io/github/repo-size/HeyPuter/puter"> <img alt="Phiên bản phát hành GitHub" src="https://img.shields.io/github/v/release/HeyPuter/puter?label=Phi%C3%AAn%20b%E1%BA%A3n%20ph%C3%A1t%20h%C3%A0nh%20GitHub"> <img alt="Giấy phép GitHub" src="https://img.shields.io/github/license/HeyPuter/puter">
</p>
<p align="center">
<a href="https://puter.com/"><strong>« DEMO TRỰC TIẾP »</strong></a>
<br />
<br />
<a href="https://puter.com">Puter.com</a>
·
<a href="https://docs.puter.com" target="_blank">SDK</a>
·
<a href="https://discord.com/invite/PQcx7Teh8u">Discord</a>
·
<a href="https://reddit.com/r/puter">Reddit</a>
·
<a href="https://twitter.com/HeyPuter">X (Twitter)</a>
</p>
<h3 align="center"><img width="800" style="border-radius:5px;" alt="chụp màn hình" src="https://assets.puter.site/puter.com-screenshot-3.webp"></h3>
<br/>
## Puter
Puter là một hệ điều hành internet tiên tiến, mã nguồn mở được thiết kế để có nhiều tính năng, tốc độ vượt trội và khả năng mở rộng cao. Puter có thể được sử dụng như:
- Một đám mây cá nhân ưu tiên quyền riêng tư để lưu trữ tất cả các tệp, ứng dụng và trò chơi của bạn ở một nơi an toàn, có thể truy cập từ bất cứ đâu, bất cứ lúc nào.
- Một nền tảng để xây dựng và xuất bản các trang web, ứng dụng web và trò chơi.
- Một sự thay thế cho Dropbox, Google Drive, OneDrive, v.v. với giao diện mới mẻ và nhiều tính năng mạnh mẽ.
- Một môi trường máy tính từ xa cho các máy chủ và máy trạm.
- Một dự án thân thiện, mã nguồn mở và cộng đồng để học hỏi về phát triển web, điện toán đám mây, hệ thống phân tán và nhiều hơn nữa!
<br/>
## Bắt Đầu
## 💻 Phát Triển Cục Bộ
```bash
Copy code
git clone https://github.com/HeyPuter/puter
cd puter
npm install
npm start
```
Điều này sẽ khởi chạy Puter tại http://puter.localhost:4100 (hoặc cổng kế tiếp có sẵn).
<br/>
### 🐳 Docker
```bash
Copy code
mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
```
<br/>
## 🐙 Docker Compose
## Linux/macOS
``` bash
Copy code
mkdir -p puter/config puter/data
sudo chown -R 1000:1000 puter
wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
docker compose up
```
<br/>
## Windows
```powershell
Copy code
mkdir -p puter
cd puter
New-Item -Path "puter\config" -ItemType Directory -Force
New-Item -Path "puter\data" -ItemType Directory -Force
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
docker compose up
```
<br/>
## ☁️ Puter.com
Puter có sẵn dưới dạng dịch vụ lưu trữ tại [**puter.com**](https://puter.com).
<br/>
## Yêu Cầu Hệ Thống
- **Hệ Điều Hành:** Linux, macOS, Windows
- **RAM:** Tối thiểu 2GB (Khuyến nghị 4GB)
- **Dung Lượng Ổ Cứng:** Còn trống 1GB
- **Node.js:** Phiên bản 16+ (Khuyến nghị phiên bản 22+)
- **npm:** Phiên bản ổn định mới nhất
<br/>
## Hỗ Trợ
Kết nối với các nhà bảo trì và cộng đồng thông qua các kênh sau:
- Báo cáo lỗi hoặc yêu cầu tính năng? Vui lòng mở một vấn đề.
- Discord: discord.com/invite/PQcx7Teh8u
- X (Twitter): x.com/HeyPuter
- Reddit: reddit.com/r/puter/
- Mastodon: mastodon.social/@puter
- Vấn đề bảo mật? security@puter.com
- Email các nhà bảo trì tại hi@puter.com
Chúng tôi luôn sẵn sàng giúp đỡ bạn với bất kỳ câu hỏi nào bạn có. Đừng ngần ngại hỏi!
<br/>
## Giấy Phép
Kho lưu trữ này, bao gồm tất cả nội dung, dự án con, mô-đun và thành phần của nó, được cấp phép theo [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt), trừ khi được tuyên bố rõ ràng khác. Các thư viện của bên thứ ba được bao gồm trong kho lưu trữ này có thể phải tuân theo các giấy phép riêng của chúng.
<br/>
+138
View File
@@ -0,0 +1,138 @@
<h3 align="center"><img width="80" alt="Puter.com,个人云计算机:所有文件、应用程序和游戏在一个地方,随时随地可访问。" src="https://assets.puter.site/puter-logo.png"></h3>
<h3 align="center">互联网操作系统!免费、开源且可自行托管。</h3>
<p align="center">
<img alt="GitHub repo size" src="https://img.shields.io/github/repo-size/HeyPuter/puter"> <img alt="GitHub Release" src="https://img.shields.io/github/v/release/HeyPuter/puter?label=latest%20version"> <img alt="GitHub License" src="https://img.shields.io/github/license/HeyPuter/puter">
</p>
<p align="center">
<a href="https://puter.com/"><strong>« 在线演示 »</strong></a>
<br />
<br />
<a href="https://puter.com">Puter.com</a>
·
<a href="https://docs.puter.com" target="_blank">SDK</a>
·
<a href="https://discord.com/invite/PQcx7Teh8u">Discord</a>
·
<a href="https://reddit.com/r/puter">Reddit</a>
·
<a href="https://twitter.com/HeyPuter">X (Twitter)</a>
</p>
<h3 align="center"><img width="800" style="border-radius:5px;" alt="screenshot" src="https://assets.puter.site/puter.com-screenshot-3.webp"></h3>
<br/>
## Puter
Puter 是一个先进的开源互联网操作系统,设计为功能丰富、速度极快且高度可扩展。Puter 可用作:
- 一个以隐私为优先的个人云,将所有文件、应用程序和游戏保存在一个安全的地方,随时随地可访问。
- 构建和发布网站、Web 应用程序和游戏的平台。
- Dropbox、Google Drive、OneDrive 等的替代品,具有全新的界面和强大的功能。
- 服务器和工作站的远程桌面环境。
- 一个友好的开源项目和社区,学习 Web 开发、云计算、分布式系统等更多内容!
<br/>
## 入门指南
### 💻 本地开发
```bash
git clone https://github.com/HeyPuter/puter
cd puter
npm install
npm start
```
这将会在 http://puter.localhost:4100(或下一个可用端口)启动 Puter。
<br/>
### 🐳 Docker
```bash
mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 1000:1000 puter && docker run --rm -p 4100:4100 -v `pwd`/puter/config:/etc/puter -v `pwd`/puter/data:/var/puter ghcr.io/heyputer/puter
```
<br/>
### 🐙 Docker Compose
#### Linux/macOS
```bash
mkdir -p puter/config puter/data
sudo chown -R 1000:1000 puter
wget https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml
docker compose up
```
<br/>
#### Windows
```powershell
mkdir -p puter
cd puter
New-Item -Path "puter\config" -ItemType Directory -Force
New-Item -Path "puter\data" -ItemType Directory -Force
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
docker compose up
```
<br/>
## 宝塔面板Docker一键部署(推荐)
1. 安装宝塔面板9.2.0及以上版本,前往 [宝塔面板](https://www.bt.cn/new/download.html?r=dk_puter) 官网,选择正式版的脚本下载安装
2. 安装后登录宝塔面板,在左侧菜单栏中点击 `Docker`,首次进入会提示安装`Docker`服务,点击立即安装,按提示完成安装
3. 安装完成后在应用商店中搜索`puter`,点击安装,配置域名等基本信息即可完成安装
### ☁️ Puter.com
Puter 可以作为托管服务使用,访问 [**puter.com**](https://puter.com)。
<br/>
## 系统要求
- **操作系统:** Linux, macOS, Windows
- **内存:** 最低 2GB(推荐 4GB)
- **磁盘空间:** 1GB 可用空间
- **Node.js:** 版本 16+(推荐 22+)
- **npm:** 最新稳定版本
<br/>
## 支持
通过以下渠道与维护者和社区联系:
- 有 Bug 报告或功能请求?请 [提交问题](https://github.com/HeyPuter/puter/issues/new/choose)。
- Discord: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
- X (Twitter): [x.com/HeyPuter](https://x.com/HeyPuter)
- Reddit: [reddit.com/r/puter/](https://www.reddit.com/r/puter/)
- Mastodon: [mastodon.social/@puter](https://mastodon.social/@puter)
- 安全问题?请联系 [[email protected]](mailto:[email protected])
- 电子邮件维护者 [[email protected]](mailto:[email protected])
我们随时乐意帮助您解答任何问题,欢迎随时联系!
<br/>
## 许可证
本仓库,包括其所有内容、子项目、模块和组件,除非另有明确说明,否则均遵循 [AGPL-3.0](https://github.com/HeyPuter/puter/blob/main/LICENSE.txt) 许可证。 本仓库中包含的第三方库可能受其各自的许可证约束。
<br/>
+1 -1
View File
@@ -1,4 +1,4 @@
Copyright (C) 2024 Puter Technologies Inc.
Copyright (C) 2024-present Puter Technologies Inc.
This file is part of Puter.
-137
View File
@@ -1,137 +0,0 @@
# Puter in Production
## Building
```bash
npm run build
```
## Usage
Will build Puter in the `dist` directory. Include the generated `./dist/gui.js` file in your HTML page and call `gui()` when the page is loaded:
```html
<script type="text/javascript" src="./dist/gui.js"></script>
<script type="text/javascript">
window.addEventListener('load', function() {
// Initialize the GUI. All options are optional!
gui({
// The origin of the app. This is the base URL of the GUI.
gui_origin: "https://puter.com",
// The origin of the API. This is the base URL of the API endpoints that the GUI will call for all its operations.
api_origin: "https://api.puter.com",
// The domain under which user websites are hosted.
hosting_domain: "puter.site",
// The maximum length of file/directory names.
max_item_name_length: 500,
// If GUI has to enforce email verification before allowing user to publish a website.
require_email_verification_to_publish_website: true,
})
});
</script>
```
## Full Production Example
Assuming the following directory structure in production:
```
.
├── dist/
│ ├── favicons/
│ ├── images/
│ ├── bundle.min.css
│ ├── bundle.min.js
│ ├── gui.js
│ └── ...
└── index.html
```
The `index.html` file below will load Puter and all the necessary meta tags, favicons, and branding assets:
```html
<!DOCTYPE html>
<html lang="en">
<head>
<title>Puter</title>
<meta name="author" content="Puter Technologies Inc.">
<meta name="description" content="Puter is a privacy-first personal cloud to keep all your files, apps, and games in one private and secure place, accessible from anywhere at any time.">
<meta name="facebook-domain-verification" content="e29w3hjbnnnypf4kzk2cewcdaxym1y" />
<link rel="canonical" href="https://puter.com">
<!-- Meta meta tags -->
<meta property="og:url" content="https://puter.com">
<meta property="og:type" content="website">
<meta property="og:title" content="Puter">
<meta property="og:description" content="Puter is a privacy-first personal cloud to keep all your files, apps, and games in one private and secure place, accessible from anywhere at any time.">
<meta property="og:image" content="./dist/images/screenshot.png">
<!-- Twitter meta tags -->
<meta name="twitter:card" content="summary_large_image">
<meta property="twitter:domain" content="puter.com">
<meta property="twitter:url" content="https://puter.com">
<meta name="twitter:title" content="Puter">
<meta name="twitter:description" content="Puter is a privacy-first personal cloud to keep all your files, apps, and games in one private and secure place, accessible from anywhere at any time.">
<meta name="twitter:image" content="./dist/images/screenshot.png">
<!-- favicons -->
<link rel="apple-touch-icon" sizes="57x57" href="./dist/favicons/apple-icon-57x57.png">
<link rel="apple-touch-icon" sizes="60x60" href="./dist/favicons/apple-icon-60x60.png">
<link rel="apple-touch-icon" sizes="72x72" href="./dist/favicons/apple-icon-72x72.png">
<link rel="apple-touch-icon" sizes="76x76" href="./dist/favicons/apple-icon-76x76.png">
<link rel="apple-touch-icon" sizes="114x114" href="./dist/favicons/apple-icon-114x114.png">
<link rel="apple-touch-icon" sizes="120x120" href="./dist/favicons/apple-icon-120x120.png">
<link rel="apple-touch-icon" sizes="144x144" href="./dist/favicons/apple-icon-144x144.png">
<link rel="apple-touch-icon" sizes="152x152" href="./dist/favicons/apple-icon-152x152.png">
<link rel="apple-touch-icon" sizes="180x180" href="./dist/favicons/apple-icon-180x180.png">
<link rel="icon" type="image/png" sizes="192x192" href="./dist/favicons/android-icon-192x192.png">
<link rel="icon" type="image/png" sizes="32x32" href="./dist/favicons/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="96x96" href="./dist/favicons/favicon-96x96.png">
<link rel="icon" type="image/png" sizes="16x16" href="./dist/favicons/favicon-16x16.png">
<link rel="manifest" href="./dist/manifest.json">
<meta name="msapplication-TileColor" content="#ffffff">
<meta name="msapplication-TileImage" content="./dist/favicons/ms-icon-144x144.png">
<meta name="theme-color" content="#ffffff">
<!-- Preload images when applicable -->
<link rel="preload" as="image" href="./dist/images/wallpaper.webp">
</head>
<body>
<!-- Load the GUI script -->
<script type="text/javascript" src="./dist/gui.js"></script>
<!-- Initialize GUI when document is loaded -->
<script type="text/javascript">
window.addEventListener('load', function() {
gui()
});
</script>
</body>
</html>
```
### Server settings
The GUI is a single page application (SPA) and as best practice any route under root (`/*`) should preferably load the `index.html` file. However, there are situations where we want to load a custom page for a specific route: for example, the `/privacy` route may need to load a page that contains your privacy policy and has nothing to do with the GUI application. In these cases it is ok to load a custom page as long as the following essential GUI routes are loaded with the GUI (i.e. `index.html` file):
- `/app/*`
- `/action/*`
In other words, consider the routes above as "reserved" for Puter.
### Best Practices
- The `title` tags and meta tags (`<title></title>`, `<meta property="og:title"`, `<meta name="twitter:title"`, ...) should be dynamically set by the server. For example, if the URL is of an app (e.g. `https://puter.com/app/editor`) the `title` tags and meta tags should contain the app's title rather than the generic Puter title.
- The `description` meta tags (`<meta name="description"`, `<meta property="og:description"`, `<meta name="twitter:description"`, ...) should be dynamically set by the server. For example, if the URL is of an app (e.g. `https://puter.com/app/editor`) the `description` meta tags should contain the app's description rather than the generic Puter description.
- Make sure to escape any HTML code that is dynamically added to the HTML page. For example, if the app's description is `Puter is a <b>privacy-first</b> personal cloud to keep all your files, apps, and games in one private and secure place, accessible from anywhere at any time.` the `<b>` tag should be escaped to `&lt;b&gt;` so that the browser doesn't interpret it as an HTML tag.
- Make sure to replace all new line characters with space when dynamically adding text to the HTML page.
- Generally, for UX and SEO reasons make sure that the tags are filled with relevant information about the state the URL is representing. E.g. is the user on the desktop or an app?
-72
View File
@@ -1,72 +0,0 @@
# Configurating Domains for Self-Hosted Puter
## Local Network Configuration
### Prerequisite Conditions
Ensure the hosting device has a static IP address to prevent potential connectivity issues due to IP changes. This setup will enable seamless access to Puter and its services across your local network.
### Using Hosts Files
The hosts file is a straightforward way to map domain names to IP addresses on individual devices. It's simple to set up but requires manual changes on each device that needs access to the domains.
#### Windows
1. Open Notepad as an administrator.
2. Open the file located at `C:\Windows\System32\drivers\etc\hosts`.
3. Add lines for your domain and subdomain with the server's IP address, in the
following format:
```
192.168.1.10 puter.local
192.168.1.10 api.puter.local
```
#### For macOS and Linux:
1. Open a terminal.
2. Edit the hosts file with a text editor, e.g., `sudo nano /etc/hosts`.
3. Add lines for your domain and subdomain with the server's IP address, in the
following format:
```
192.168.1.10 puter.local
192.168.1.10 api.puter.local
```
4. Save and exit the editor.
### Using Router Configuration
Some routers allow you to add custom DNS rules, letting you configure domain names network-wide without touching each device.
1. Access your router’s admin interface (usually through a web browser).
2. Look for DNS or DHCP settings.
3. Add custom DNS mappings for `puter.local` and `api.puter.local` to the hosting device's IP address.
4. Save the changes and reboot the router if necessary.
This method's availability and steps may vary depending on your router's model and firmware.
### Using Local DNS
Setting up a local DNS server on your network allows for flexible and scalable domain name resolution. This method works across all devices automatically once they're configured to use the DNS server.
#### Options for DNS Software:
- **Pi-hole**: Acts as both an ad-blocker and a DNS server. Ideal for easy setup and maintenance.
- **BIND9**: Offers comprehensive DNS server capabilities for complex setups.
- **Dnsmasq**: Lightweight and suitable for smaller networks or those new to running a DNS server.
**contributors note:** feel free to add any software you're aware of
which might help with this to the list. Also, feel free to add instructions here for specific software; our goal is for Puter to be easy to setup with tools you're already familiar with.
#### General Steps:
1. Choose and install DNS server software on a device within your network.
2. Configure the DNS server to resolve `puter.local` and `api.puter.local` to the IP address of your Puter hosting device.
3. Update your router’s DHCP settings to distribute the DNS server's IP address to all devices on the network.
By setting up a local DNS server, you gain the most flexibility and control over your network's domain name resolution, ensuring that all devices can access Puter and its API without manual configuration.
## Production Configuration
Please note the self-hosting feature is still in alpha and a public production
deployment is not recommended at this time. However, if you wish to host
publically you can do so following the same steps you normally would to configure
a domain name and ensuring the `api` subdomain points to the server as well.
-39
View File
@@ -1,39 +0,0 @@
## Puter Support Levels for Repository Updates
This document describes issues requiring repository changes;
which issues will be fixed by Puter's core team, and which ones
will be fixed if the community makes a contribution.
This document is not "law". It is provided only as a helpful guide
on what to expect.
### Level Glossary
| Name | Description |
| ---- | ----------- |
| Core | Core developers will fix this |
| Community | We will accept contributions to fix this |
| Mixed | Core developers will fix this if it's currently a priority |
### Issues and their Levels
| Issue | Priority |
| ----- | -------- |
| Security vulnerability | Core |
| Breaking change to SDK or API | Core |
| Bug in service in CoreModule | Core |
| Bug in a built-in app | Core |
| Login/init failure in Docker on `release` branch | Core |
| Login/init failure in Linux or OSX | Core |
| Login/init failure in Docker on `main` branch | Mixed |
| Login/init failure with specific configuration | Mixed |
| Login/init failure in Windows | Community |
## Puter Support for a Particular Deployment
If you experience issues on a self-hosted deployment we're here to
help. Some issues are related to configuration or environment, so
we may only be able to help in a limited capacity. Issues related
to data loss, data corruption, or security will have higher priority
over other issues with particular deployments.
+433
View File
@@ -0,0 +1,433 @@
# Self-Hosting Puter
`docker-compose.yml` brings up Puter **plus every external service it needs** — MariaDB, Valkey, DynamoDB-local, RustFS S3, nginx — wired together. Closest thing to a production deployment you can self-manage on a single host.
## One-line installer (recommended)
```bash
curl -fsSL https://raw.githubusercontent.com/HeyPuter/puter/main/install.sh | sh
```
Generates secrets, writes `.env` + `puter/config/config.json`, downloads `docker-compose.yml` from the OSS repo, and runs `docker compose up -d`. Re-running is safe — it won't overwrite existing config (set `PUTER_FORCE=1` to rotate). Use the manual steps below if you want to inspect or tweak each step yourself.
## Requirements
- **Docker** with the `compose` plugin.
- A **domain** with DNS access — you need a wildcard record (`*.your-domain.com` → server IP). Puter routes by subdomain (`api.<domain>`, `site.<domain>`, `app.<domain>`).
- Optional: **TLS certs** (or `certbot` to grab them — see Step 3).
## What's running
| Container | Image | Role |
| --------------- | ------------------------ | ---------------------------------------------------------- |
| `puter-nginx` | `nginx:1.27-alpine` | Reverse proxy on 80 (and 443 if TLS); forwards to Puter |
| `puter` | `ghcr.io/heyputer/puter` | The app |
| `puter-mariadb` | `mariadb:11` | SQL database — schema applied automatically on first boot |
| `puter-valkey` | `valkey/valkey:8-alpine` | Redis-compatible cache + rate-limiter |
| `puter-dynamo` | `amazon/dynamodb-local` | KV store — table auto-created on first boot |
| `puter-s3` | `rustfs/rustfs` | S3-compatible object storage (MinIO drop-in noted in file) |
| `puter-s3-init` | `amazon/aws-cli` | One-shot — creates the bucket on first boot, then exits |
Optional services (compose profile `ai`, opt-in):
| Container | Image | Role |
| ------------------- | --------------- | -------------------------------------------------------------- |
| `puter-ollama` | `ollama/ollama` | Local LLM provider (CPU; GPU passthrough opt-in) |
| `puter-ollama-init` | `ollama/ollama` | One-shot — pulls the default model (`tinyllama`) on first boot |
State lives under `./puter/data/<service>/`.
---
## Step 1 — Create `.env` and `puter/config/config.json`
> ⚠️ **Run this whole block in one shell session.** It generates secrets once and writes them into both `.env` (read by docker compose) and `config.json` (read by Puter). The two files **must** agree on the MariaDB password and the S3 secret — if they drift, MariaDB initialises with one password and Puter tries to log in with another, and you get `ER_ACCESS_DENIED_ERROR`.
```bash
MARIADB_ROOT_PASSWORD=$(openssl rand -hex 32)
MARIADB_PASSWORD=$(openssl rand -hex 32)
S3_SECRET_KEY=$(openssl rand -hex 32)
JWT_SECRET=$(openssl rand -hex 64)
JWT_SECRET_V2=$(openssl rand -hex 64)
URL_SIGNATURE_SECRET=$(openssl rand -hex 64)
cat > .env <<EOF
HTTP_PORT=80
# HTTPS_PORT=443 # uncomment after enabling TLS in Step 3
MARIADB_ROOT_PASSWORD=$MARIADB_ROOT_PASSWORD
MARIADB_DATABASE=puter
MARIADB_USER=puter
MARIADB_PASSWORD=$MARIADB_PASSWORD
S3_ACCESS_KEY=puter
S3_SECRET_KEY=$S3_SECRET_KEY
S3_BUCKET=puter-local
EOF
mkdir -p puter/config puter/data puter/tls
cat > puter/config/config.json <<EOF
{
"domain": "puter.localhost",
"protocol": "http",
"pub_port": 80,
"env": "prod",
"static_hosting_domain": "site.puter.localhost",
"static_hosting_domain_alt": "host.puter.localhost",
"private_app_hosting_domain": "app.puter.localhost",
"private_app_hosting_domain_alt": "dev.puter.localhost",
"jwt_secret": "$JWT_SECRET",
"jwt_secret_v2": "$JWT_SECRET_V2",
"allow_v1_tokens": true,
"url_signature_secret": "$URL_SIGNATURE_SECRET",
"database": {
"engine": "mysql",
"host": "mariadb",
"port": 3306,
"user": "puter",
"password": "$MARIADB_PASSWORD",
"database": "puter",
"migrationPaths": ["/opt/puter/dist/src/backend/clients/database/migrations/mysql"]
},
"redis": {
"startupNodes": [{ "host": "valkey", "port": 6379 }],
"tls": false
},
"dynamo": {
"endpoint": "http://dynamo:8000",
"bootstrapTables": true,
"aws": {
"access_key": "fake",
"secret_key": "fake",
"region": "us-east-1"
}
},
"s3": {
"s3Config": {
"endpoint": "http://s3:9000",
"publicEndpoint": "http://s3.puter.localhost",
"accessKeyId": "puter",
"secretAccessKey": "$S3_SECRET_KEY",
"region": "us-east-1",
"forcePathStyle": true
}
},
"s3_bucket": "puter-local",
"s3_region": "us-east-1",
"providers": {
"ollama": { "enabled": false }
},
"trust_proxy": 1
}
EOF
```
Replace `puter.localhost`, `site.puter.localhost`, `host.puter.localhost`, `dev.puter.localhost` and `app.puter.localhost` with your actual domain (or leave it for a localhost-only trial).
Why these knobs:
- `jwt_secret` + `jwt_secret_v2` — Puter signs new auth tokens with `jwt_secret_v2` (v2 token format, `kid: 'v2'` JWT header). `jwt_secret` is verify-only and lets tokens minted before this version (cookies still in users' browsers, stored API tokens) keep working. `allow_v1_tokens: true` keeps that fallback enabled. Fresh installs can leave it as-is; future versions will flip the flag to `false` and retire `jwt_secret` entirely once legacy tokens have drained.
- `env: "prod"` — the bundled `config.default.json` ships with `env: "dev"` (matches the source-tree `npm run start=gui` workflow, which expects webpack-dev-server emitting a CSS manifest). Self-host runs against pre-built static bundles, so `env: "prod"` makes the homepage emit the `/dist/bundle.min.css` `<link>` tag instead of waiting on a manifest that doesn't exist.
- `database.migrationPaths` — Puter applies the bundled MySQL schema on boot. `mysql_mig_1.sql` (tables) and `mysql_mig_2.sql` (default apps: editor, viewer, pdf, camera, player, recorder, git, dev-center, puter-linux). Idempotent — safe to re-run.
- `dynamo.bootstrapTables: true` — Puter creates its KV table on boot. **Only set against a local emulator**, never real AWS.
- `dynamo.aws` keys are dummies; DynamoDB-local doesn't validate them but the AWS SDK requires _something_. **Note:** DynamoDB uses `access_key` / `secret_key` (snake_case); S3 below uses `accessKeyId` / `secretAccessKey` (camelCase). Not interchangeable.
- `providers.ollama.enabled: false` — Puter auto-probes a local Ollama at `127.0.0.1:11434` by default; without one running you'd see `ECONNREFUSED` on every boot. To run a bundled Ollama, see [Optional: local LLM (Ollama)](#optional-local-llm-ollama) below.
- `s3.s3Config.forcePathStyle: true` — RustFS / MinIO / fauxqs need path-style URLs (`<endpoint>/<bucket>`). Real AWS S3 wants virtual-hosted (`<bucket>.<endpoint>`) — drop this flag (or set `false`) when you swap to real S3.
- `s3.s3Config.publicEndpoint` — `endpoint` (`http://s3:9000`) only resolves inside the docker network; presigned upload/download URLs handed to the browser need a host-reachable URL. nginx routes the `s3.<domain>` subdomain to RustFS internally and preserves the Host header end-to-end (required for S3 signature validation), so the browser hits the same port/protocol as the rest of the app — no separate published port, no mixed-content surprises when you turn on TLS. Switch to `https://s3.<your-domain>` once you enable TLS in Step 3. Real AWS S3 doesn't need this — its endpoint is already public; drop the field entirely.
- `trust_proxy: 1` — nginx terminates TLS and forwards `X-Forwarded-For`. Without this, `req.ip` is the docker-network address of the nginx container instead of the real client IP, which breaks rate limiting and IP-based audit logs. `1` = one trusted hop (nginx). Bump to `2` if you put Cloudflare in front of nginx; never set `true` (it trusts every hop and makes XFF forgeable).
> If you ever change `MARIADB_PASSWORD` after first boot, `.env` alone won't update MariaDB — its credentials are baked into `./puter/data/mariadb/` on first init. Either rotate the password inside MariaDB by hand or `docker compose down && rm -rf ./puter/data/mariadb` to start fresh.
## Step 2 — Point DNS at the server \[Optional\]
In your DNS provider, add records for the main domain plus the subdomains Puter and nginx route on (`api.*`, `site.*`, `app.*`, `s3.*`):
```
A puter.localhost → <your server's public IP>
A *.puter.localhost → <your server's public IP>
A site.puter.localhost → <your server's public IP>
A *.site.puter.localhost → <your server's public IP>
A host.puter.localhost → <your server's public IP>
A *.host.puter.localhost → <your server's public IP>
A app.puter.localhost → <your server's public IP>
A *.app.puter.localhost → <your server's public IP>
A dev.puter.localhost → <your server's public IP>
A *.dev.puter.localhost → <your server's public IP>
```
The wildcards are required — Puter routes via subdomains (`api.*`, `app.*`, etc.) and nginx routes browser S3 traffic via `s3.*` to RustFS.
## Step 3 — TLS (recommended for public installs) \[Optional\]
Skip this for a quick local demo. Don't skip it for users typing passwords.
**Get a wildcard cert.** Easiest path with Let's Encrypt + DNS-01 (works for wildcards):
```bash
sudo certbot certonly --manual --preferred-challenges dns \
-d puter.localhost -d "*.puter.localhost" \
-d site.puter.localhost -d "*.site.puter.localhost" \
-d host.puter.localhost -d "*.host.puter.localhost" \
-d app.puter.localhost -d "*.app.puter.localhost" \
-d dev.puter.localhost -d "*.dev.puter.localhost"
```
The cert needs to cover `*.puter.localhost` so that `s3.puter.localhost` (browser S3 endpoint), plus Puter's own `api.*` / `app.*` subdomains, all validate.
Drop the resulting `fullchain.pem` and `privkey.pem` into `./puter/tls/`.
**Wire nginx to use them:**
1. Open [nginx/nginx.conf](../nginx/nginx.conf), uncomment **both** `# server { listen 443 ssl … }` blocks (one for `s3.*`, one for the catch-all).
2. (Optional) Replace the body of the port-80 blocks with `return 301 https://$host$request_uri;` to force HTTPS everywhere.
3. In [docker-compose.yml](../docker-compose.yml), uncomment the `443:443` port mapping under the `nginx` service.
4. In `.env`, uncomment `HTTPS_PORT=443`.
5. In `config.json`, switch:
```json
{ "protocol": "https", "pub_port": 443 }
```
…and update the S3 public endpoint:
```json
"s3": { "s3Config": { "publicEndpoint": "https://s3.puter.local", ... } }
```
## Step 4 — Bring it up
```bash
docker compose up -d
```
First boot takes ~30s while MariaDB initialises and Puter applies the schema + default apps. Watch:
```bash
docker compose logs -f puter
```
Healthy startup:
```
[config] override from /etc/puter/config.json
[mysql] running migrations from /opt/puter/dist/src/backend/clients/database/migrations/mysql: 2 file(s)
[mysql] applied mysql_mig_1.sql (...)
[mysql] applied mysql_mig_2.sql (9 statements)
```
Then open **<https://puter.local>** (or `http://` if you skipped TLS). Login is `admin` — the temp password is printed once in the puter container logs on first boot:
```bash
docker compose logs puter | grep tmp_password
```
Change it in Settings after first login.
## Additional configuration
All optional. Drop any of the blocks below into `puter/config/config.json` and `docker compose restart puter`. See [config.template.jsonc](../config.template.jsonc) for the full list. Per-key documentation lives in [src/backend/types.ts](../src/backend/types.ts).
### Email (SMTP)
Used for password resets, email confirmation, and notifications. Without it those flows silently fail.
```json
"email": {
"from": "\"Puter\" <[email protected]>",
"host": "smtp.example.com",
"port": 587,
"secure": false,
"auth": { "user": "...", "pass": "..." }
}
```
To require email confirmation before login, also set `"strict_email_verification_required": true`.
### Sign in with Google (or another OIDC provider)
```json
"oidc": {
"providers": {
"google": {
"client_id": "...apps.googleusercontent.com",
"client_secret": "...",
"scopes": "openid email profile"
}
}
}
```
Add `https://puter.<your-domain>/auth/oidc/callback/login` to the OAuth client's authorized redirect URIs in the Google Cloud Console. For non-Google providers, replace `google` with a custom id and supply `authorization_endpoint` / `token_endpoint` / `userinfo_endpoint` explicitly.
### Sign in with Apple
```json
"oidc": {
"providers": {
"apple": {
"client_id": "com.example.your-service-id",
"team_id": "YOUR_TEAM_ID",
"key_id": "YOUR_KEY_ID",
"private_key": "-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----"
}
}
}
```
The `client_id` is your Apple Services ID. `team_id`, `key_id`, and `private_key` come from the Apple Developer Portal (Keys section — create a key with "Sign in with Apple" enabled). The `private_key` is the contents of the `.p8` file Apple provides. Add `https://puter.<your-domain>/auth/oidc/callback/login` and `https://puter.<your-domain>/auth/oidc/callback/signup` as return URLs in the Apple Services ID configuration.
### Sign in with Microsoft
```json
"oidc": {
"providers": {
"microsoft": {
"client_id": "YOUR_APPLICATION_CLIENT_ID",
"client_secret": "YOUR_CLIENT_SECRET_VALUE",
"tenant_id": "YOUR_TENANT_ID"
}
}
}
```
Register an app in the Azure Portal (Microsoft Entra ID → App registrations). The `client_id` is the Application (client) ID, `client_secret` is a client secret value, and `tenant_id` is the Directory (tenant) ID. Use `common` as `tenant_id` to allow any Microsoft account (personal and organizational); omit it to default to `common`. Add `https://puter.<your-domain>/auth/oidc/callback/login` and `https://puter.<your-domain>/auth/oidc/callback/signup` as redirect URIs under Authentication in the app registration.
### AI providers
Any provider with a key set is auto-enabled. Same shape as `ollama` above:
```json
"providers": {
"claude": { "apiKey": "sk-ant-..." },
"openai-completion": { "apiKey": "sk-..." },
"gemini": { "apiKey": "..." },
"openai-image-generation": { "apiKey": "sk-..." }
}
```
Full provider list (chat, image, video, TTS, OCR) is in the template.
### Per-user storage quota
Default is 100 MB per user.
```json
"storage_capacity": 5368709120, // 5 GB
"is_storage_limited": true
```
Set `is_storage_limited: false` for unlimited (bounded by host disk).
### Captcha on signup / login
Built-in proof-of-work captcha — no external service needed.
```json
"captcha": { "enabled": true, "difficulty": "medium" }
```
`difficulty` is one of `easy` / `medium` / `hard`.
### Block disposable email TLDs
Only enforced when `env: "prod"`.
```json
"blockedEmailDomains": ["mailinator.com", "tempmail.com", "guerrillamail.com"]
```
### Password policy
```json
"min_pass_length": 12
```
### Contact-form recipient
Where the in-app contact form posts. Defaults to `support@puter.com`.
```json
"support_email": "[email protected]"
```
## Optional: local LLM (Ollama)
The `ollama` and `ollama-init` services live behind a compose profile so they don't run unless you ask for them. By default, `puter/config/config.json` has `"ollama": { "enabled": false }` — Puter skips the auto-probe entirely. To run a local model:
1. Flip the config:
```json
"providers": {
"ollama": { "apiBaseUrl": "http://ollama:11434" }
}
```
2. (Optional) Pick a model in `.env`:
```bash
OLLAMA_DEFAULT_MODEL=tinyllama # default — 1.1B, ~640 MB on disk, ~700 MB RAM
# Other tiny picks: qwen2.5:0.5b, llama3.2:1b
# Larger / better: phi3.5, llama3.2, mistral
```
3. Bring up with the `ai` profile:
```bash
docker compose --profile ai up -d
docker compose logs -f ollama-init
```
`ollama-init` exits 0 once the model is pulled. Subsequent boots find the model already on disk and the pull is a fast no-op.
Without `--profile ai`, the `ollama` containers stay down and Puter (with `enabled: false`) doesn't try to reach them — the rest of the stack runs identically.
For GPU acceleration (NVIDIA), uncomment the `deploy:` block under the `ollama` service in [docker-compose.yml](../docker-compose.yml). Requires `nvidia-container-toolkit` on the host.
## Building from source instead of pulling
If you want to test local Dockerfile changes against the full stack, uncomment the `build:` block in [docker-compose.yml](../docker-compose.yml) under the `puter` service, change `pull_policy: always` → `pull_policy: never`, then:
```bash
docker compose up -d --build
```
---
## Managing running backend
```bash
# update
docker compose pull
docker compose up -d
# logs
docker compose logs -f puter
# stop, keep data
docker compose down
# stop, NUKE all state (irreversible)
docker compose down
rm -rf puter/data
```
Migrations re-apply idempotently across pulls. Volumes are preserved.
## Troubleshooting
**Site loads but I get "Bad Gateway" / nginx errors.**
The puter container failed to come up. `docker compose logs puter` will tell you which dependency rejected it (most often DB password mismatch between `.env` and `config.json`).
**Login screen says "admin password not set".**
First-boot temp password is logged once. Find it: `docker compose logs puter | grep "tmp_password"`. After login, change it in Settings.
**Healthcheck reports unhealthy but the site works.**
The healthcheck hits `puter.localhost:4100/test` from inside the container. If you changed `domain` or `port`, the check still uses defaults. The site itself is fine.
**Nothing resolves at `puter.example.com` after DNS changes.**
DNS propagates slowly. `dig puter.example.com` and `dig api.puter.example.com` should both return your server IP. If not, give it 5–60 minutes.
**`docker compose up` hangs at "waiting for service to be healthy".**
`docker compose ps` shows which container is unhealthy. MariaDB takes ~20–30s on a cold boot; everything else under 5s. If something stays unhealthy, `logs <service>` will tell you why.
**`Error: DynamoDB aws config requires both access_key and secret_key`.**
You wrote `accessKeyId` / `secretAccessKey` under `dynamo.aws`. That config block uses snake_case (`access_key` / `secret_key`). Only the `s3.s3Config` block uses camelCase.
+280 -12
View File
@@ -1,25 +1,293 @@
---
version: "3.8"
# Self-hosted Puter — full stack.
#
# Brings up Puter + every external service it needs:
# - nginx : reverse proxy (mirrors prod ALB; handles TLS + Host fan-out)
# - valkey : redis-compatible cache / rate-limiter backend
# - mariadb : SQL database (Puter applies its schema on first boot)
# - dynamo : DynamoDB-local (KV store; Puter creates the table itself)
# - s3 : RustFS — S3-compatible object storage
# - s3-init : one-shot init container that creates the bucket
# - puter : the application
#
# Quick start:
# 1. Copy .env.example to .env (or set the variables in your shell).
# 2. Drop a config.json into ./puter/config/ — see selfhosted/full-stack.md
# for the example that pairs with this compose.
# 3. docker compose up -d
#
# Easiest path:
# curl -fsSL https://raw.githubusercontent.com/HeyPuter/puter/main/install.sh | sh
# grabs this file, generates secrets, writes .env + config.json, and runs
# the compose up for you.
#
# Production:
# - Always replace the default passwords / S3 keys / Puter secrets.
# - Front Puter with TLS-terminating reverse proxy (Caddy / nginx).
# - Move state-bearing volumes to a backed-up location.
services:
puter:
container_name: puter
image: ghcr.io/heyputer/puter:latest
pull_policy: always
# build: ./
valkey:
image: valkey/valkey:8-alpine
container_name: puter-valkey
restart: unless-stopped
# Run as a single-node cluster so Puter's ioredis Cluster client
# (the only mode it speaks) can connect. On first boot we assign all
# 16384 slots to ourselves; subsequent boots find them already in
# nodes.conf and skip. `cluster-require-full-coverage no` keeps reads
# working if we ever land partial slots.
command:
- sh
- -c
- |
valkey-server \
--port 6379 \
--cluster-enabled yes \
--cluster-config-file /data/nodes.conf \
--cluster-node-timeout 5000 \
--cluster-require-full-coverage no \
--cluster-announce-ip valkey \
--cluster-announce-port 6379 \
--cluster-announce-bus-port 16379 \
--appendonly yes \
--save "60 1" &
SERVER_PID=$$!
until valkey-cli -p 6379 PING > /dev/null 2>&1; do sleep 0.5; done
if ! valkey-cli -p 6379 CLUSTER NODES | grep -q '0-16383'; then
valkey-cli -p 6379 CLUSTER ADDSLOTSRANGE 0 16383
fi
wait $$SERVER_PID
volumes:
# `:z` is an SELinux relabel hint for Fedora/RHEL hosts (no-op
# everywhere else) — without it those distros deny container
# access to the bind mount and the service loops on EACCES.
- ./puter/data/valkey:/data:z
healthcheck:
test:
["CMD-SHELL", "valkey-cli -p 6379 cluster info | grep -q cluster_state:ok"]
interval: 5s
timeout: 3s
retries: 20
start_period: 10s
mariadb:
image: mariadb:11
container_name: puter-mariadb
restart: unless-stopped
ports:
- '4100:4100'
environment:
# TZ: Europe/Paris
# CONFIG_PATH: /etc/puter
MARIADB_ROOT_PASSWORD: ${MARIADB_ROOT_PASSWORD:-root-change-me}
MARIADB_DATABASE: ${MARIADB_DATABASE:-puter}
MARIADB_USER: ${MARIADB_USER:-puter}
MARIADB_PASSWORD: ${MARIADB_PASSWORD:-puter-change-me}
volumes:
- ./puter/data/mariadb:/var/lib/mysql:z
healthcheck:
# `healthcheck.sh` ships with the mariadb image; --connect verifies
# the server is accepting auth, not just listening on the socket.
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
interval: 5s
timeout: 5s
retries: 20
start_period: 30s
dynamo:
# Puter creates the `store-kv-v1` table itself on startup
# (config.dynamo.bootstrapTables = true does the work).
image: amazon/dynamodb-local:latest
container_name: puter-dynamo
restart: unless-stopped
user: "1000:1000"
working_dir: /home/dynamodblocal
command:
- "-jar"
- "DynamoDBLocal.jar"
- "-sharedDb"
- "-dbPath"
- "/home/dynamodblocal/data"
volumes:
- ./puter/data/dynamo:/home/dynamodblocal/data:z
s3:
# RustFS — S3-compatible object storage. Drop-in alternative:
# MinIO (image: minio/minio, command: ["server", "/data", "--console-address", ":9001"]).
image: rustfs/rustfs:latest
container_name: puter-s3
restart: unless-stopped
environment:
RUSTFS_ACCESS_KEY: ${S3_ACCESS_KEY:-puter}
RUSTFS_SECRET_KEY: ${S3_SECRET_KEY:-puter-secret-change-me}
volumes:
- ./puter/data/s3:/data:z
# Internal-only — browsers reach RustFS via nginx (`s3.<domain>`),
# which preserves the Host header for S3 signature validation and
# rides the same TLS termination as Puter. Uncomment to also expose
# 9000 directly on the host for `aws-cli` / debugging.
# ports:
# - "9000:9000"
healthcheck:
# RustFS exposes /health on the S3 port. Use wget (curl is not in
# the slim image).
test:
[
"CMD-SHELL",
"wget -qO- --tries=1 --timeout=2 http://localhost:9000/health || exit 1",
]
interval: 5s
timeout: 3s
retries: 20
start_period: 5s
s3-init:
# One-shot container that creates the `puter-local` bucket on first
# boot. Exits 0 once the bucket exists; stays exited 0 thereafter.
image: amazon/aws-cli:latest
container_name: puter-s3-init
depends_on:
s3:
condition: service_healthy
environment:
AWS_ACCESS_KEY_ID: ${S3_ACCESS_KEY:-puter}
AWS_SECRET_ACCESS_KEY: ${S3_SECRET_KEY:-puter-secret-change-me}
AWS_DEFAULT_REGION: us-east-1
entrypoint:
- /bin/sh
- -c
- |
set -e
endpoint=http://s3:9000
bucket=${S3_BUCKET:-puter-local}
if aws --endpoint-url "$$endpoint" s3api head-bucket --bucket "$$bucket" 2>/dev/null; then
echo "bucket $$bucket already exists"
else
echo "creating bucket $$bucket"
aws --endpoint-url "$$endpoint" s3 mb "s3://$$bucket"
fi
restart: "no"
# ── Optional: local LLM ───────────────────────────────────────────
# Behind the `ai` compose profile — only starts when explicitly opted
# into. Bring up with:
# docker compose --profile ai up -d
# When enabled, also set in your `puter/config/config.json`:
# "providers": { "ollama": { "apiBaseUrl": "http://ollama:11434" } }
# When NOT enabled, set:
# "providers": { "ollama": { "enabled": false } }
# otherwise Puter spams `ECONNREFUSED 127.0.0.1:11434` on startup.
ollama:
profiles: ["ai"]
# CPU-only out of the box; uncomment the GPU `deploy:` block below
# if you've got nvidia-docker for much faster inference. Disk + RAM
# scale with the model — `tinyllama` (1.1B, ~640 MB on disk, ~700
# MB RAM) is the cheapest sane default. Swap via OLLAMA_DEFAULT_MODEL.
image: ollama/ollama:latest
container_name: puter-ollama
restart: unless-stopped
volumes:
- ./puter/data/ollama:/root/.ollama:z
# Uncomment to expose Ollama directly on the host (`localhost:11434`)
# for `ollama` CLI / OpenAI-API compatible tools. Internal-only by default.
# ports:
# - "11434:11434"
healthcheck:
test:
["CMD-SHELL", "ollama list >/dev/null 2>&1 || exit 1"]
interval: 10s
timeout: 5s
retries: 5
start_period: 15s
# GPU passthrough (NVIDIA). Requires nvidia-container-toolkit on host.
# deploy:
# resources:
# reservations:
# devices:
# - driver: nvidia
# count: all
# capabilities: [gpu]
ollama-init:
profiles: ["ai"]
# One-shot — ensures the default model is present. `ollama pull` is
# idempotent: present-and-up-to-date → fast no-op; missing → downloads.
image: ollama/ollama:latest
container_name: puter-ollama-init
depends_on:
ollama:
condition: service_healthy
environment:
OLLAMA_HOST: http://ollama:11434
OLLAMA_DEFAULT_MODEL: ${OLLAMA_DEFAULT_MODEL:-tinyllama}
entrypoint:
- /bin/sh
- -c
- |
set -e
echo "[ollama-init] ensuring $${OLLAMA_DEFAULT_MODEL}"
ollama pull "$${OLLAMA_DEFAULT_MODEL}"
echo "[ollama-init] done"
restart: "no"
puter:
image: ghcr.io/heyputer/puter:main
pull_policy: always
# Uncomment to build from this directory instead of pulling the published
# image. Also flip pull_policy to `never` so compose doesn't overwrite
# your local build by re-pulling :latest.
# build:
# context: .
# # buildx-only: cross-compile to both archs in a single push
# # platforms:
# # - linux/amd64
# # - linux/arm64
container_name: puter
restart: unless-stopped
depends_on:
valkey:
condition: service_healthy
mariadb:
condition: service_healthy
dynamo:
condition: service_started
s3-init:
condition: service_completed_successfully
# Internal-only: nginx reaches it on the compose network. Uncomment
# to also expose port 4100 directly on the host (useful for debugging).
# ports:
# - "4100:4100"
expose:
- "4100"
environment:
PUID: 1000
PGID: 1000
volumes:
- ./puter/config:/etc/puter
- ./puter/data:/var/puter
# Drop your config.json here — see selfhosted/full-stack.md.
- ./puter/config:/etc/puter:z
# Persistent runtime data (anything your config points at /var/puter).
- ./puter/data/puter:/var/puter:z
healthcheck:
test: wget --no-verbose --tries=1 --spider http://puter.localhost:4100/test || exit 1
interval: 30s
timeout: 3s
retries: 3
start_period: 30s
nginx:
image: nginx:1.27-alpine
container_name: puter-nginx
restart: unless-stopped
depends_on:
puter:
condition: service_started
ports:
- "${HTTP_PORT:-80}:80"
# Uncomment when you enable TLS in nginx/nginx.conf:
# - "${HTTPS_PORT:-443}:443"
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro,z
# TLS certs (fullchain.pem + privkey.pem). Read-only inside.
- ./puter/tls:/etc/nginx/tls:ro,z
healthcheck:
test: ["CMD-SHELL", "wget -qO- --tries=1 --timeout=2 http://localhost/ || exit 1"]
interval: 10s
timeout: 3s
retries: 5
start_period: 5s
+130
View File
@@ -0,0 +1,130 @@
import js from '@eslint/js';
import tseslintPlugin from '@typescript-eslint/eslint-plugin';
import tseslintParser from '@typescript-eslint/parser';
import prettierPlugin from 'eslint-plugin-prettier';
import prettierConfig from 'eslint-config-prettier';
import { defineConfig } from 'eslint/config';
import globals from 'globals';
// typescript-eslint's flat/recommended preset is an array of configs (base +
// eslint-recommended overrides + recommended rules). Flatten its rules so we
// can apply them via our own `files`-scoped blocks.
const tsRecommendedRules = tseslintPlugin.configs['flat/recommended'].reduce(
(acc, cfg) => ({ ...acc, ...(cfg.rules ?? {}) }),
{},
);
const prettierRules = {
...prettierConfig.rules,
'prettier/prettier': 'error',
};
const unusedVarsOptions = {
args: 'after-used',
argsIgnorePattern: '^_',
varsIgnorePattern: '^_',
caughtErrorsIgnorePattern: '^_',
destructuredArrayIgnorePattern: '^_',
ignoreRestSiblings: true,
};
const preferConstOptions = {
destructuring: 'all',
ignoreReadBeforeAssign: false,
};
const lintedGlobals = {
...globals.node,
extension: 'readonly',
config: 'readonly',
global_config: 'readonly',
};
const jsFiles = [
'src/backend/**/*.{js,mjs,cjs}',
'extensions/**/*.{js,mjs,cjs}',
];
const tsIgnores = [
'**/*.test.ts',
'**/*.test.mts',
'**/*.spec.ts',
'**/*.spec.mts',
'src/backend/test/**',
'src/backend/tools/**',
'src/backend/vitest.config.ts',
'src/backend/vitest.bench.config.ts',
];
const createTsConfig = ({ files, project }) => ({
files,
ignores: tsIgnores,
languageOptions: {
parser: tseslintParser,
globals: lintedGlobals,
parserOptions: {
ecmaVersion: 'latest',
sourceType: 'module',
projectService: { defaultProject: project },
tsconfigRootDir: import.meta.dirname,
},
},
plugins: {
'@typescript-eslint': tseslintPlugin,
prettier: prettierPlugin,
},
rules: {
...tsRecommendedRules,
...prettierRules,
'@typescript-eslint/no-unused-vars': ['error', unusedVarsOptions],
'@typescript-eslint/no-explicit-any': 'warn',
'prefer-const': ['error', preferConstOptions],
},
});
export default defineConfig([
{
ignores: [
'**/*.dbmig.js',
'dist/**',
'build/**',
'volatile/**',
'node_modules/**',
'puter.js/**',
'apps/**',
'experiment/**',
'workers/**',
'src/public/**',
'src/gui/**',
'src/docs/**',
'src/puter-js/**',
'src/worker/**',
'submodules/**',
'tests/**',
'tools/**',
],
},
{
files: jsFiles,
ignores: ['**/*.test.js'],
plugins: {
js,
prettier: prettierPlugin,
},
extends: ['js/recommended'],
languageOptions: {
ecmaVersion: 'latest',
sourceType: 'module',
globals: lintedGlobals,
},
rules: {
...prettierRules,
'no-unused-vars': ['error', unusedVarsOptions],
'prefer-const': ['error', preferConstOptions],
},
},
createTsConfig({
files: ['src/backend/**/*.ts', 'extensions/**/*.ts'],
project: './tsconfig.json',
}),
]);
-2
View File
@@ -1,2 +0,0 @@
import backend from '@heyputer/backend';
export default backend;
+221
View File
@@ -0,0 +1,221 @@
import type { Request, Response } from 'express';
import { v4 as uuidv4 } from 'uuid';
import {
afterAll,
beforeAll,
describe,
expect,
it,
vi,
} from 'vitest';
import { runWithContext } from '../src/backend/core/context.ts';
import { PuterServer } from '../src/backend/server.ts';
import { setupTestServer } from '../src/backend/testUtil.ts';
import {
handleAppTelemetryUserCount,
handleAppTelemetryUsers,
} from './appTelemetry.ts';
interface CapturedResponse {
body: unknown;
}
const makeReq = (query: Record<string, unknown> = {}): Request =>
({ query }) as unknown as Request;
const makeRes = () => {
const captured: CapturedResponse = { body: undefined };
const res = {
json: vi.fn((value: unknown) => {
captured.body = value;
return res;
}),
status: vi.fn(() => res),
};
return { res: res as unknown as Response, captured };
};
// `handleAppTelemetryUsers` calls `Context.get('actor')` for the permission
// gate. Wrap test calls in `runWithContext` so the ALS lookup resolves.
const callWithActor = async (
actor: { user: { uuid: string; id?: number }; app?: null } | undefined,
fn: () => Promise<void>,
) => runWithContext({ actor }, fn);
let server: PuterServer;
beforeAll(async () => {
server = await setupTestServer();
});
afterAll(async () => {
await server.shutdown();
});
describe('appTelemetry extension — handleAppTelemetryUsers', () => {
it('throws HttpError(400) when app_uuid is missing', async () => {
const { res } = makeRes();
await expect(
handleAppTelemetryUsers(makeReq({}), res),
).rejects.toMatchObject({
statusCode: 400,
message: expect.stringContaining('app_uuid'),
});
});
it('throws HttpError(400) for a non-numeric limit', async () => {
const { res } = makeRes();
await expect(
handleAppTelemetryUsers(
makeReq({ app_uuid: 'app-anything', limit: 'banana' }),
res,
),
).rejects.toMatchObject({
statusCode: 400,
message: expect.stringContaining('limit'),
});
});
it('throws HttpError(400) when offset exceeds the allowed maximum', async () => {
const { res } = makeRes();
await expect(
handleAppTelemetryUsers(
makeReq({ app_uuid: 'app-anything', offset: 1_000_001 }),
res,
),
).rejects.toMatchObject({ statusCode: 400 });
});
it('throws HttpError(404) when the app cannot be found', async () => {
const { res } = makeRes();
await expect(
handleAppTelemetryUsers(
makeReq({ app_uuid: 'app-does-not-exist' }),
res,
),
).rejects.toMatchObject({
statusCode: 404,
message: 'App not found',
});
});
it('throws HttpError(403) when the caller does not own the app', async () => {
// Seed an owner user + an app belonging to them, then call the
// handler as a *different* user. The real permission service should
// reject since the caller has no `apps-of-user:<owner>:write` perm.
const owner = await server.stores.user.create({
username: `owner_${Math.random().toString(36).slice(2, 8)}`,
uuid: uuidv4(),
password: 'x',
email: null,
});
const slug = Math.random().toString(36).slice(2, 8);
const app = await server.stores.app.create(
{
name: `app_${slug}`,
title: `App ${slug}`,
index_url: `https://example.com/${slug}`,
},
{ ownerUserId: owner.id as number },
);
const intruder = await server.stores.user.create({
username: `intruder_${Math.random().toString(36).slice(2, 8)}`,
uuid: uuidv4(),
password: 'x',
email: null,
});
const { res } = makeRes();
await callWithActor(
{ user: { uuid: intruder.uuid, id: intruder.id as number } },
async () => {
await expect(
handleAppTelemetryUsers(
makeReq({ app_uuid: app!.uid }),
res,
),
).rejects.toMatchObject({
statusCode: 403,
message: 'Permission denied',
});
},
);
});
it('returns an empty list for an owned app with no authenticated users', async () => {
const owner = await server.stores.user.create({
username: `owner2_${Math.random().toString(36).slice(2, 8)}`,
uuid: uuidv4(),
password: 'x',
email: null,
});
const slug = Math.random().toString(36).slice(2, 8);
const app = await server.stores.app.create(
{
name: `app2_${slug}`,
title: `App2 ${slug}`,
index_url: `https://example.com/${slug}`,
},
{ ownerUserId: owner.id as number },
);
const { res, captured } = makeRes();
await callWithActor(
{ user: { uuid: owner.uuid, id: owner.id as number } },
async () => {
await handleAppTelemetryUsers(
makeReq({ app_uuid: app!.uid }),
res,
);
},
);
expect(captured.body).toEqual([]);
});
});
describe('appTelemetry extension — handleAppTelemetryUserCount', () => {
it('throws HttpError(400) when app_uuid is missing', async () => {
const { res } = makeRes();
await expect(
handleAppTelemetryUserCount(makeReq({}), res),
).rejects.toMatchObject({ statusCode: 400 });
});
it('throws HttpError(404) for an unknown app_uuid', async () => {
const { res } = makeRes();
await expect(
handleAppTelemetryUserCount(
makeReq({ app_uuid: 'app-not-here' }),
res,
),
).rejects.toMatchObject({ statusCode: 404 });
});
it('returns { count: 0 } for an app with no authenticated users', async () => {
const owner = await server.stores.user.create({
username: `counto_${Math.random().toString(36).slice(2, 8)}`,
uuid: uuidv4(),
password: 'x',
email: null,
});
const slug = Math.random().toString(36).slice(2, 8);
const app = await server.stores.app.create(
{
name: `appcount_${slug}`,
title: `AppCount ${slug}`,
index_url: `https://example.com/${slug}`,
},
{ ownerUserId: owner.id as number },
);
const { res, captured } = makeRes();
await handleAppTelemetryUserCount(
makeReq({ app_uuid: app!.uid }),
res,
);
expect(captured.body).toEqual({ count: 0 });
});
});
+131
View File
@@ -0,0 +1,131 @@
import type { Request, Response } from 'express';
import { Context } from '@heyputer/backend/src/core';
import { HttpError } from '@heyputer/backend/src/core/http';
import { extension } from '@heyputer/backend/src/extensions';
const clients = extension.import('client');
const stores = extension.import('store');
const services = extension.import('service');
const DEFAULT_LIMIT = 100;
const MAX_LIMIT = 1000;
const MAX_OFFSET = 100_000;
const parseIntParam = (
value: unknown,
{
key,
min,
max,
fallback,
}: { key: string; min: number; max: number; fallback: number },
): number => {
if (value === undefined || value === null) return fallback;
const parsed =
typeof value === 'number'
? value
: typeof value === 'string' && value.trim() !== ''
? Number(value)
: NaN;
if (
!Number.isFinite(parsed) ||
!Number.isInteger(parsed) ||
parsed < min ||
parsed > max
) {
throw new HttpError(
400,
`${key} must be an integer between ${min} and ${max}`,
);
}
return parsed;
};
export const handleAppTelemetryUsers = async (
req: Request,
res: Response,
): Promise<void> => {
const { app_uuid } = req.query as Record<string, string>;
if (!app_uuid) throw new HttpError(400, 'Missing `app_uuid`');
const safeLimit = parseIntParam(req.query.limit, {
key: 'limit',
min: 1,
max: MAX_LIMIT,
fallback: DEFAULT_LIMIT,
});
const safeOffset = parseIntParam(req.query.offset, {
key: 'offset',
min: 0,
max: MAX_OFFSET,
fallback: 0,
});
const app = await stores.app.getByUid(app_uuid);
if (!app) throw new HttpError(404, 'App not found');
// `apps-of-user:<uuid>:write` — the implicator keys on the owner's
// UUID, not the numeric id. Look up the owner explicitly. v1 got
// this for free because its entity-storage layer eager-joined the
// owner row; v2's AppStore.getByUid returns the raw row with only
// `owner_user_id` populated.
const ownerId = (app as { owner_user_id?: number }).owner_user_id;
if (!ownerId) throw new HttpError(404, 'App owner not found');
const owner = (await stores.user.getById(ownerId)) as {
uuid?: string;
} | null;
if (!owner?.uuid) throw new HttpError(404, 'App owner not found');
const actor = Context.get('actor');
const ownsApp = await services.permission
.check(actor!, `apps-of-user:${owner.uuid}:write`)
.catch(() => false);
if (!ownsApp) throw new HttpError(403, 'Permission denied');
const users = await clients.db.read(
`SELECT u.username, u.uuid FROM user_to_app_permissions p
INNER JOIN user u ON p.user_id = u.id
WHERE p.permission = 'flag:app-is-authenticated' AND p.app_id = ?
ORDER BY (p.dt IS NOT NULL), p.dt, p.user_id
LIMIT ? OFFSET ?`,
[(app as Record<string, unknown>).id, safeLimit, safeOffset],
);
res.json(
(users as Array<{ username: string; uuid: string }>).map((e) => ({
user: e.username,
user_uuid: e.uuid,
})),
);
};
export const handleAppTelemetryUserCount = async (
req: Request,
res: Response,
): Promise<void> => {
const { app_uuid } = req.query as Record<string, string>;
if (!app_uuid) throw new HttpError(400, 'Missing `app_uuid`');
const app = await stores.app.getByUid(app_uuid);
if (!app) throw new HttpError(404, 'App not found');
const [row] = (await clients.db.read(
`SELECT COUNT(*) AS n FROM user_to_app_permissions
WHERE permission = 'flag:app-is-authenticated' AND app_id = ?`,
[(app as Record<string, unknown>).id],
)) as Array<{ n: number }>;
res.json({ count: row?.n ?? 0 });
};
extension.get(
'/app-telemetry/users',
{ subdomain: 'api', requireAuth: true },
handleAppTelemetryUsers,
);
extension.get(
'/app-telemetry/user-count',
{ subdomain: 'api', requireAuth: true },
handleAppTelemetryUserCount,
);
+421
View File
@@ -0,0 +1,421 @@
import { extension } from '@heyputer/backend/src/extensions';
import { PuterService } from '@heyputer/backend/src/services/types.js';
import { nativeImport } from '@heyputer/backend/src/util/nativeImport.js';
import { spawn, type ChildProcess } from 'node:child_process';
import { existsSync, readFileSync } from 'node:fs';
import { createRequire } from 'node:module';
import path from 'node:path';
import { pathToFileURL } from 'node:url';
const requireFromHere = createRequire(__filename);
const webpack = requireFromHere('webpack') as typeof import('webpack');
type EnvFactory = (args: {
global_config: Record<string, unknown> | null;
}) => string | undefined;
type EnvMap = Record<string, string | undefined | EnvFactory>;
type CommandEntry = {
name: string;
directory: string;
command: string;
args?: string[];
env?: EnvMap;
};
type WebpackEntry = {
name?: string;
directory: string;
env?: EnvMap;
onConfig?: (config: Record<string, unknown>) => void;
};
type WebpackStats = {
hasErrors: () => boolean;
toJson: (options: Record<string, unknown>) => {
errors?: Array<{ message?: string }>;
warnings?: Array<{ message?: string }>;
};
};
type DevWatcherConfig = {
enabled?: boolean;
root?: string;
commands?: CommandEntry[];
webpack?: WebpackEntry[];
ready_delay_ms?: number;
};
class ProxyLogger {
#buffer = '';
constructor(private readonly log: (line: string) => void) {}
attach(stream: NodeJS.ReadableStream | null): void {
if (!stream) return;
stream.on('data', (chunk) => {
this.#buffer += chunk.toString();
let lineEndIndex = this.#buffer.indexOf('\n');
while (lineEndIndex !== -1) {
const line = this.#buffer.substring(0, lineEndIndex);
this.log(line);
this.#buffer = this.#buffer.substring(lineEndIndex + 1);
lineEndIndex = this.#buffer.indexOf('\n');
}
});
stream.on('end', () => {
if (this.#buffer.length) {
this.log(this.#buffer);
this.#buffer = '';
}
});
}
}
const findPackageRoot = (): string => {
let dir = __dirname;
for (;;) {
if (
existsSync(path.join(dir, 'package.json')) &&
existsSync(path.join(dir, 'src', 'gui')) &&
existsSync(path.join(dir, 'src', 'puter-js'))
) {
return dir;
}
const parent = path.dirname(dir);
if (parent === dir) break;
dir = parent;
}
return path.resolve(__dirname, '..', '..');
};
const resolveFromRoot = (root: string, value: string): string =>
path.isAbsolute(value) ? value : path.resolve(root, value);
const defaultWebpackEntries: WebpackEntry[] = [
{
name: 'puter.js',
directory: 'src/puter-js',
onConfig: (config) => {
const output = (config.output ?? {}) as Record<string, unknown>;
output.filename = 'puter.dev.js';
config.output = output;
config.devtool = 'source-map';
},
env: {
PUTER_ORIGIN: ({ global_config }) =>
String(global_config?.origin ?? ''),
PUTER_API_ORIGIN: ({ global_config }) =>
String(global_config?.api_base_url ?? ''),
},
},
{
name: 'gui',
directory: 'src/gui',
},
];
class DevWatcherService extends PuterService {
#processes: Array<{ name: string; proc: ChildProcess }> = [];
#watchers: ReturnType<ReturnType<typeof webpack>['watch']>[] = [];
#started = false;
#packageRoot = findPackageRoot();
override async onServerStart(): Promise<void> {
if (!this.#shouldStart()) return;
if (this.#started) return;
this.#started = true;
const devwatch = this.#devwatchConfig();
const root = resolveFromRoot(
this.#packageRoot,
devwatch.root ?? this.#packageRoot,
);
const commands = devwatch.commands ?? [];
const webpackEntries = devwatch.webpack ?? defaultWebpackEntries;
console.log(`[devwatch] starting watchers from ${root}`);
await Promise.all([
...commands.map((entry) => this.#startCommand(root, entry)),
...webpackEntries.map((entry) =>
this.#startWebpackWatcher(root, entry),
),
]);
const readyDelayMs = devwatch.ready_delay_ms ?? 5000;
if (readyDelayMs > 0) {
await new Promise((resolve) => setTimeout(resolve, readyDelayMs));
}
}
override async onServerShutdown(): Promise<void> {
await Promise.all(
this.#watchers.map(
(watcher) =>
new Promise<void>((resolve) => {
watcher?.close((err) => {
if (err) {
console.warn(
'[devwatch] failed to close webpack watcher:',
err,
);
}
resolve();
});
}),
),
);
this.#watchers = [];
for (const { name, proc } of this.#processes) {
if (proc.exitCode !== null || proc.killed) continue;
console.log(`[devwatch:${name}] stopping process`);
proc.kill();
}
this.#processes = [];
}
#devwatchConfig(): DevWatcherConfig {
const raw = (this.config as Record<string, unknown>).devwatch;
return raw && typeof raw === 'object' ? (raw as DevWatcherConfig) : {};
}
#shouldStart(): boolean {
const config = this.config as Record<string, unknown>;
const devwatch = this.#devwatchConfig();
if (config.no_devwatch === true) return false;
if (devwatch.enabled === false) return false;
if (devwatch.enabled === true) return true;
return this.config.env === 'dev';
}
async #startCommand(root: string, entry: CommandEntry): Promise<void> {
const fullpath = resolveFromRoot(root, entry.directory);
console.log(`[devwatch] starting ${entry.name} in ${fullpath}`);
const proc = spawn(entry.command, entry.args ?? [], {
shell: true,
cwd: fullpath,
env: {
...process.env,
...this.#evaluateEnv(entry.env),
},
});
this.#processes.push({ name: entry.name, proc });
new ProxyLogger((line) =>
console.log(`[devwatch:${entry.name}:1] ${line}`),
).attach(proc.stdout);
new ProxyLogger((line) =>
console.warn(`[devwatch:${entry.name}:2] ${line}`),
).attach(proc.stderr);
proc.on('exit', () => {
console.log(
`[devwatch:${entry.name}:exit] process exited (${proc.exitCode})`,
);
this.#processes = this.#processes.filter(
(instance) => instance.proc !== proc,
);
});
}
async #startWebpackWatcher(
root: string,
entry: WebpackEntry,
): Promise<void> {
const directory = entry.directory;
let { configjsPath: webpackConfigPath, moduleType } = this.#getConfigJs(
{
root,
directory,
configIsFor: 'webpack',
possibleConfigNames: [
['webpack.config.js', 'package.json'],
['webpack.config.cjs', 'commonjs'],
['webpack.config.mjs', 'module'],
],
},
);
let webpackConfig = await this.#withEnv(entry.env, async () => {
if (moduleType === 'module') {
webpackConfigPath = pathToFileURL(webpackConfigPath).href;
const imported = await nativeImport<{ default?: unknown }>(
webpackConfigPath,
);
return imported.default ?? imported;
}
return requireFromHere(webpackConfigPath);
});
if (typeof webpackConfig === 'function') {
webpackConfig = await this.#withEnv(entry.env, () =>
(webpackConfig as () => unknown)(),
);
}
this.#normalizeWebpackContext(root, directory, webpackConfig);
if (entry.onConfig) {
entry.onConfig(webpackConfig as Record<string, unknown>);
}
const compiler = webpack(
webpackConfig as Parameters<typeof webpack>[0],
);
const watcher = compiler.watch({}, (err, stats) => {
this.#handleWebpackUpdate(entry, err, stats);
});
this.#watchers.push(watcher);
}
#getConfigJs(args: {
root: string;
directory: string;
configIsFor: string;
possibleConfigNames: Array<
[string, 'package.json' | 'commonjs' | 'module']
>;
}): {
configjsPath: string;
moduleType: 'commonjs' | 'module';
} {
const { root, directory, configIsFor, possibleConfigNames } = args;
let configjsPath: string | undefined;
let moduleType: 'package.json' | 'commonjs' | 'module' | undefined;
for (const [configName, supposedModuleType] of possibleConfigNames) {
const supposedPath = path.join(root, directory, configName);
if (existsSync(supposedPath)) {
configjsPath = supposedPath;
moduleType = supposedModuleType;
break;
}
}
if (!configjsPath || !moduleType) {
throw new Error(
`could not find ${configIsFor} config for: ${directory}`,
);
}
if (moduleType === 'package.json') {
const packageJSONPath = path.join(root, directory, 'package.json');
const packageJSONObject = JSON.parse(
readFileSync(packageJSONPath, 'utf8'),
) as { type?: 'commonjs' | 'module' };
moduleType = packageJSONObject.type ?? 'module';
}
return {
configjsPath,
moduleType,
};
}
async #withEnv<T>(env: EnvMap | undefined, fn: () => T | Promise<T>) {
if (!env) return fn();
const oldEnv = process.env;
process.env = {
...oldEnv,
...this.#evaluateEnv(env),
};
try {
return await fn();
} finally {
process.env = oldEnv;
}
}
#evaluateEnv(env: EnvMap | undefined): Record<string, string> {
const out: Record<string, string> = {};
if (!env) return out;
for (const [key, value] of Object.entries(env)) {
try {
const evaluated =
typeof value === 'function'
? value({
global_config: this.config as Record<
string,
unknown
>,
})
: value;
if (evaluated) out[key] = String(evaluated);
} catch (e) {
const msg = (e as Error).message;
if (
!msg.includes('Cannot read properties of null') &&
!msg.includes('Cannot read properties of undefined')
) {
console.warn(
`[devwatch] could not evaluate env function for ${key}: ${msg}`,
);
}
}
}
return out;
}
#normalizeWebpackContext(
root: string,
directory: string,
webpackConfig: unknown,
): void {
const configs = Array.isArray(webpackConfig)
? webpackConfig
: [webpackConfig];
for (const config of configs) {
if (!config || typeof config !== 'object') continue;
const obj = config as Record<string, unknown>;
obj.context = obj.context
? path.resolve(path.join(root, directory), String(obj.context))
: path.join(root, directory);
}
}
#handleWebpackUpdate(
entry: WebpackEntry,
err: Error | null | undefined,
stats: WebpackStats | undefined,
): void {
const name = entry.name ?? entry.directory;
const firstEventKey = `__devwatch_first_${entry.directory}`;
const firstEvent = !(entry as Record<string, unknown>)[firstEventKey];
(entry as Record<string, unknown>)[firstEventKey] = true;
if (err || stats?.hasErrors()) {
const info = stats?.toJson({
all: false,
errors: true,
warnings: true,
});
console.error(
`[devwatch] error information: ${name} using Webpack`,
{
err: err ? err.message : null,
errors: info?.errors?.map((e) => e.message) ?? [],
warnings: info?.warnings?.map((w) => w.message) ?? [],
},
);
console.error(`[devwatch] failed to update ${name} using Webpack`);
return;
}
if (!firstEvent) {
console.log(`[devwatch] updated ${name} using Webpack`);
}
}
}
extension.registerService('devWatcher', DevWatcherService);
+156
View File
@@ -0,0 +1,156 @@
import type { Request, Response } from 'express';
import { v4 as uuidv4 } from 'uuid';
import {
afterAll,
beforeAll,
describe,
expect,
it,
vi,
} from 'vitest';
import { runWithContext } from '../src/backend/core/context.ts';
import { PuterServer } from '../src/backend/server.ts';
import { setupTestServer } from '../src/backend/testUtil.ts';
import { handleInstalledApps } from './installedApps.ts';
interface CapturedResponse {
body: unknown;
}
const makeReq = (query: Record<string, unknown> = {}): Request =>
({ query }) as unknown as Request;
const makeRes = () => {
const captured: CapturedResponse = { body: undefined };
const res = {
json: vi.fn((value: unknown) => {
captured.body = value;
return res;
}),
};
return { res: res as unknown as Response, captured };
};
let server: PuterServer;
beforeAll(async () => {
server = await setupTestServer();
});
afterAll(async () => {
await server.shutdown();
});
const seedUser = async () => {
const slug = Math.random().toString(36).slice(2, 8);
return server.stores.user.create({
username: `iauser_${slug}`,
uuid: uuidv4(),
password: 'x',
email: null,
});
};
const seedApp = async (ownerUserId: number) => {
const slug = Math.random().toString(36).slice(2, 8);
return server.stores.app.create(
{
name: `iaapp_${slug}`,
title: `Installed App ${slug}`,
index_url: `https://example.com/${slug}`,
},
{ ownerUserId },
);
};
const grantInstalled = async (appId: number, userId: number) => {
// Mimic the `flag:app-is-authenticated` perm row the handler joins on.
await server.clients.db.write(
`INSERT INTO user_to_app_permissions (user_id, app_id, permission, extra) VALUES (?, ?, ?, ?)`,
[userId, appId, 'flag:app-is-authenticated', null],
);
};
describe('installedApps extension — handleInstalledApps', () => {
it('throws HttpError(401) when no actor is on the context', async () => {
const { res } = makeRes();
await expect(
runWithContext({ actor: undefined }, () =>
handleInstalledApps(makeReq({}), res),
),
).rejects.toMatchObject({ statusCode: 401 });
});
it('throws HttpError(400) when orderBy is not in the allowlist', async () => {
const user = await seedUser();
const { res } = makeRes();
await expect(
runWithContext(
{
actor: {
user: { uuid: user.uuid, id: user.id as number },
},
},
() =>
handleInstalledApps(
// SQL injection attempt — must be rejected.
makeReq({ orderBy: 'apps.id; DROP TABLE apps;--' }),
res,
),
),
).rejects.toMatchObject({
statusCode: 400,
message: expect.stringContaining('Invalid orderBy'),
});
});
it('returns an empty list for a user with no installed apps', async () => {
const user = await seedUser();
const { res, captured } = makeRes();
await runWithContext(
{ actor: { user: { uuid: user.uuid, id: user.id as number } } },
() => handleInstalledApps(makeReq({}), res),
);
expect(captured.body).toEqual([]);
});
it('returns the caller’s installed apps with an iconUrl field', async () => {
const user = await seedUser();
const app = await seedApp(user.id as number);
await grantInstalled(app!.id as number, user.id as number);
const { res, captured } = makeRes();
await runWithContext(
{ actor: { user: { uuid: user.uuid, id: user.id as number } } },
() => handleInstalledApps(makeReq({}), res),
);
const list = captured.body as Array<Record<string, unknown>>;
expect(list).toHaveLength(1);
expect(list[0].uid).toBe(app!.uid);
expect(list[0].name).toBe(app!.name);
expect(list[0].title).toBe(app!.title);
expect(Object.prototype.hasOwnProperty.call(list[0], 'iconUrl')).toBe(
true,
);
});
it('clamps page/limit to safe ranges (page>=1, 1<=limit<=100)', async () => {
const user = await seedUser();
const { res, captured } = makeRes();
// page=0 and limit=999 should be clamped without throwing.
await runWithContext(
{ actor: { user: { uuid: user.uuid, id: user.id as number } } },
() =>
handleInstalledApps(
makeReq({ page: 0, limit: 999, desc: '1' }),
res,
),
);
expect(Array.isArray(captured.body)).toBe(true);
});
});
+76
View File
@@ -0,0 +1,76 @@
import type { Request, Response } from 'express';
import { Context } from '@heyputer/backend/src/core';
import { HttpError } from '@heyputer/backend/src/core/http';
import { extension } from '@heyputer/backend/src/extensions';
import { getAppIconUrl } from '@heyputer/backend/src/util/appIcon.js';
const clients = extension.import('client');
const ALLOWED_ORDER_BY = [
'id',
'name',
'uid',
'title',
'installed_at',
] as const;
const ORDER_BY_FIELD_MAP: Record<string, string> = {
id: 'apps.id',
name: 'apps.name',
uid: 'apps.uid',
title: 'apps.title',
installed_at: 'installed_at',
};
export const handleInstalledApps = async (
req: Request,
res: Response,
): Promise<void> => {
const actor = Context.get('actor');
if (!actor?.user?.id) throw new HttpError(401, 'Authentication required');
const orderBy = String(req.query.orderBy ?? 'installed_at');
if (!(ALLOWED_ORDER_BY as readonly string[]).includes(orderBy)) {
throw new HttpError(
400,
`Invalid orderBy. Allowed: ${ALLOWED_ORDER_BY.join(', ')}`,
);
}
const page = Math.max(Number(req.query.page) || 1, 1);
const limit = Math.min(Math.max(Number(req.query.limit) || 100, 1), 100);
const offset = (page - 1) * limit;
const orderByField = ORDER_BY_FIELD_MAP[orderBy];
const sortDirection = req.query.desc ? 'DESC' : 'ASC';
const installedApps = (await clients.db.read(
`SELECT
apps.name,
apps.uid,
apps.title,
apps.description,
apps.icon,
MIN(perm.dt) AS installed_at
FROM apps
LEFT JOIN user_to_app_permissions AS perm ON apps.id = perm.app_id
WHERE perm.user_id = ?
GROUP BY apps.id, apps.name, apps.uid, apps.title, apps.description
ORDER BY ${orderByField} ${sortDirection}
LIMIT ?
OFFSET ?`,
[actor.user.id, limit, offset],
)) as Array<Record<string, unknown>>;
const apiBaseUrl = extension.config.api_base_url as string | undefined;
res.json(
installedApps.map((app) => ({
...app,
iconUrl: getAppIconUrl(app, { apiBaseUrl }),
})),
);
};
extension.get(
'/installedApps',
{ subdomain: 'api', requireUserActor: true },
handleInstalledApps,
);
+168
View File
@@ -0,0 +1,168 @@
import type { Request, Response } from 'express';
import { v4 as uuidv4 } from 'uuid';
import {
afterAll,
beforeAll,
describe,
expect,
it,
vi,
} from 'vitest';
import { runWithContext } from '../src/backend/core/context.ts';
import { PuterServer } from '../src/backend/server.ts';
import { setupTestServer } from '../src/backend/testUtil.ts';
import {
handleMeteringAllCosts,
handleMeteringGlobalUsage,
handleMeteringUsage,
handleMeteringUsageForApp,
} from './metering.ts';
interface CapturedResponse {
body: unknown;
}
const makeReq = (
init: { params?: Record<string, unknown> } = {},
): Request =>
({
params: init.params ?? {},
query: {},
}) as unknown as Request;
const makeRes = () => {
const captured: CapturedResponse = { body: undefined };
const res = {
json: vi.fn((value: unknown) => {
captured.body = value;
return res;
}),
};
return { res: res as unknown as Response, captured };
};
let server: PuterServer;
beforeAll(async () => {
server = await setupTestServer();
});
afterAll(async () => {
await server.shutdown();
});
const seedUser = async () => {
const slug = Math.random().toString(36).slice(2, 8);
return server.stores.user.create({
username: `muser_${slug}`,
uuid: uuidv4(),
password: 'x',
email: null,
});
};
describe('metering extension — handleMeteringUsage', () => {
it('throws HttpError(401) when no user actor is on the context', async () => {
const { res } = makeRes();
await expect(
runWithContext({ actor: undefined }, () =>
handleMeteringUsage(makeReq(), res),
),
).rejects.toMatchObject({ statusCode: 401 });
});
it('returns usage details merged with allowanceInfo for an authenticated user', async () => {
const user = await seedUser();
const { res, captured } = makeRes();
await runWithContext(
{ actor: { user: { uuid: user.uuid, id: user.id as number } } },
() => handleMeteringUsage(makeReq(), res),
);
// We don't assert the inner shape (provider-specific) — only that
// the handler returned a JSON object that carries `allowanceInfo`.
expect(typeof captured.body).toBe('object');
expect(captured.body).not.toBeNull();
expect(
(captured.body as Record<string, unknown>).allowanceInfo,
).toBeDefined();
});
});
describe('metering extension — handleMeteringUsageForApp', () => {
it('throws HttpError(401) when no user actor is on the context', async () => {
const { res } = makeRes();
await expect(
runWithContext({ actor: undefined }, () =>
handleMeteringUsageForApp(
makeReq({ params: { appIdOrName: 'any' } }),
res,
),
),
).rejects.toMatchObject({ statusCode: 401 });
});
it('throws HttpError(400) when no appId is supplied', async () => {
const user = await seedUser();
const { res } = makeRes();
await expect(
runWithContext(
{ actor: { user: { uuid: user.uuid, id: user.id as number } } },
() =>
handleMeteringUsageForApp(
makeReq({ params: { appIdOrName: '' } }),
res,
),
),
).rejects.toMatchObject({ statusCode: 400 });
});
it('throws HttpError(404) when looking up an unknown app by name', async () => {
const user = await seedUser();
const { res } = makeRes();
await expect(
runWithContext(
{ actor: { user: { uuid: user.uuid, id: user.id as number } } },
() =>
handleMeteringUsageForApp(
makeReq({ params: { appIdOrName: 'no-such-app' } }),
res,
),
),
).rejects.toMatchObject({ statusCode: 404 });
});
});
describe('metering extension — handleMeteringGlobalUsage', () => {
it('returns the global usage payload from MeteringService', async () => {
const { res, captured } = makeRes();
await handleMeteringGlobalUsage(makeReq(), res);
// Just confirm a JSON body was returned. Inner shape comes from
// MeteringService and is covered elsewhere.
expect(captured.body).toBeDefined();
});
});
describe('metering extension — handleMeteringAllCosts', () => {
it('returns a { costs: [...] } payload', async () => {
const { res, captured } = makeRes();
await handleMeteringAllCosts(makeReq(), res);
const body = captured.body as { costs: unknown };
expect(Array.isArray(body.costs)).toBe(true);
});
it('caches the costs catalogue across calls (same array reference)', async () => {
const a = makeRes();
const b = makeRes();
await handleMeteringAllCosts(makeReq(), a.res);
await handleMeteringAllCosts(makeReq(), b.res);
const costsA = (a.captured.body as { costs: unknown[] }).costs;
const costsB = (b.captured.body as { costs: unknown[] }).costs;
// Cache fields the same array instance — this is the property we
// actually want to lock down (no rewalk of every driver/controller
// per request).
expect(costsA).toBe(costsB);
});
});
+135
View File
@@ -0,0 +1,135 @@
import type { Request, Response } from 'express';
import { Context } from '@heyputer/backend/src/core';
import { HttpError } from '@heyputer/backend/src/core/http';
import {
controllersContainers,
driversContainers,
} from '@heyputer/backend/src/exports';
import { extension } from '@heyputer/backend/src/extensions';
const services = extension.import('service');
const clients = extension.import('client');
// Cached on first request — the underlying cost catalogues are baked into
// driver/controller source so they only change on deploy.
let cachedAllCosts: Record<string, unknown>[] | null = null;
function collectAllCosts(): Record<string, unknown>[] {
const all: Record<string, unknown>[] = [];
const collect = (
source: Record<string, unknown>,
kind: 'driver' | 'controller',
) => {
for (const [name, instance] of Object.entries(source)) {
const fn = (
instance as {
getReportedCosts?: () => Record<string, unknown>[];
}
)?.getReportedCosts;
if (typeof fn !== 'function') continue;
try {
const entries = fn.call(instance);
if (!Array.isArray(entries)) continue;
for (const entry of entries) {
all.push({ ...entry, registry: kind, registryKey: name });
}
} catch (e) {
console.warn(
`[metering] getReportedCosts failed for ${kind}:${name}:`,
(e as Error).message,
);
}
}
};
collect(driversContainers as Record<string, unknown>, 'driver');
collect(controllersContainers as Record<string, unknown>, 'controller');
return all;
}
export const handleMeteringUsage = async (
_req: Request,
res: Response,
): Promise<void> => {
const actor = Context.get('actor');
if (!actor?.user) throw new HttpError(401, 'Authentication required');
const [actorUsage, allowanceInfo] = await Promise.all([
services.metering.getActorCurrentMonthUsageDetails(actor),
services.metering.getAllowedUsage(actor),
]);
res.json({ ...actorUsage, allowanceInfo });
};
export const handleMeteringUsageForApp = async (
req: Request,
res: Response,
): Promise<void> => {
const actor = Context.get('actor');
if (!actor?.user) throw new HttpError(401, 'Authentication required');
let appId = String(req.params.appIdOrName ?? '');
if (!appId) throw new HttpError(400, 'appId parameter is required');
// If not a UUID-shaped app UID, look up by name
if (!appId.startsWith('app-')) {
const appRows = (await clients.db.read(
'SELECT `uid` FROM `apps` WHERE `name` = ? LIMIT 1',
[appId],
)) as Array<{ uid: string }>;
if (appRows.length > 0) {
appId = appRows[0].uid;
} else {
throw new HttpError(404, 'App not found');
}
}
const appUsage =
await services.metering.getActorCurrentMonthAppUsageDetails(
actor,
appId,
);
res.json(appUsage);
};
export const handleMeteringGlobalUsage = async (
_req: Request,
res: Response,
): Promise<void> => {
const globalUsage = await services.metering.getGlobalUsage();
res.json(globalUsage);
};
// First hit walks the registries; subsequent hits serve the in-memory cache.
export const handleMeteringAllCosts = async (
_req: Request,
res: Response,
): Promise<void> => {
if (!cachedAllCosts) {
cachedAllCosts = collectAllCosts();
}
res.json({ costs: cachedAllCosts });
};
extension.get(
'/metering/usage',
{ subdomain: 'api', requireAuth: true },
handleMeteringUsage,
);
extension.get(
'/metering/usage/:appIdOrName',
{ subdomain: 'api', requireAuth: true },
handleMeteringUsageForApp,
);
extension.get(
'/metering/globalUsage',
{ subdomain: 'api', adminOnly: true },
handleMeteringGlobalUsage,
);
extension.get(
'/metering/allCosts',
{ subdomain: 'api', requireAuth: true },
handleMeteringAllCosts,
);
+3
View File
@@ -0,0 +1,3 @@
{
"type": "commonjs"
}
+91
View File
@@ -0,0 +1,91 @@
import type { Request, Response } from 'express';
import { describe, expect, it, vi } from 'vitest';
import { handleServerInfo } from './serverInfo.ts';
interface CapturedResponse {
body: Record<string, unknown> | undefined;
}
const makeRes = () => {
const captured: CapturedResponse = { body: undefined };
const res = {
json: vi.fn((value: Record<string, unknown>) => {
captured.body = value;
return res;
}),
};
return { res: res as unknown as Response, captured };
};
describe('serverInfo extension — handleServerInfo', () => {
it('returns the full server info payload', async () => {
const { res, captured } = makeRes();
await handleServerInfo({} as Request, res);
expect(captured.body).toBeDefined();
const body = captured.body!;
// OS section
const os = body.os as Record<string, unknown>;
expect(typeof os.platform).toBe('string');
expect(typeof os.type).toBe('string');
expect(typeof os.release).toBe('string');
expect(os.pretty).toBe(`${os.type} ${os.release}`);
// CPU section
const cpu = body.cpu as Record<string, unknown>;
expect(typeof cpu.model).toBe('string');
expect(typeof cpu.cores).toBe('number');
expect((cpu.cores as number) > 0).toBe(true);
// RAM — totalGB / freeGB are stringified two-decimal values
const ram = body.ram as Record<string, unknown>;
expect(typeof ram.total).toBe('number');
expect(typeof ram.free).toBe('number');
expect(ram.totalGB).toMatch(/^\d+\.\d{2}$/);
expect(ram.freeGB).toMatch(/^\d+\.\d{2}$/);
// Uptime fields are numeric (seconds/days/hours/minutes) plus pretty.
const uptime = body.uptime as Record<string, unknown>;
expect(typeof uptime.seconds).toBe('number');
expect(typeof uptime.days).toBe('number');
expect(typeof uptime.hours).toBe('number');
expect(typeof uptime.minutes).toBe('number');
expect(uptime.pretty).toMatch(/^\d+d \d+h \d+m$/);
// Disk may fall through to N/A when statfs throws (e.g. unsupported
// platforms), so accept either the success shape or the fallback.
const disk = body.disk as Record<string, unknown>;
expect(['N/A']).toContain(disk.total === 'N/A' ? 'N/A' : 'N/A'); // keep shape-only assertion
expect(typeof disk.total).toBe('string');
expect(typeof disk.free).toBe('string');
expect(typeof disk.used).toBe('string');
expect(Array.isArray(body.loadavg)).toBe(true);
expect(typeof body.hostname).toBe('string');
});
it('falls back to N/A disk stats when statfs throws', async () => {
const fs = await import('node:fs/promises');
const statfsSpy = vi
.spyOn(fs.default, 'statfs')
.mockRejectedValue(new Error('statfs unsupported'));
const errSpy = vi
.spyOn(console, 'error')
.mockImplementation(() => {});
const { res, captured } = makeRes();
await handleServerInfo({} as Request, res);
const disk = (captured.body as Record<string, unknown>).disk as Record<
string,
string
>;
expect(disk).toEqual({ total: 'N/A', free: 'N/A', used: 'N/A' });
expect(errSpy).toHaveBeenCalled();
statfsSpy.mockRestore();
errSpy.mockRestore();
});
});
+73
View File
@@ -0,0 +1,73 @@
import type { Request, Response } from 'express';
import { extension } from '@heyputer/backend/src/extensions';
import fs from 'fs/promises';
import os from 'os';
export const handleServerInfo = async (
_req: Request,
res: Response,
): Promise<void> => {
const osData = {
platform: os.platform(),
type: os.type(),
release: os.release(),
pretty: `${os.type()} ${os.release()}`,
};
const cpus = os.cpus();
const cpuData = {
model: cpus[0]?.model || 'Unknown',
cores: cpus.length,
};
const ramData = {
total: os.totalmem(),
free: os.freemem(),
totalGB: (os.totalmem() / 1073741824).toFixed(2),
freeGB: (os.freemem() / 1073741824).toFixed(2),
};
const uptimeSeconds = os.uptime();
const uptimeData = {
seconds: uptimeSeconds,
days: Math.floor(uptimeSeconds / 86400),
hours: Math.floor((uptimeSeconds % 86400) / 3600),
minutes: Math.floor((uptimeSeconds % 3600) / 60),
pretty: `${Math.floor(uptimeSeconds / 86400)}d ${Math.floor((uptimeSeconds % 86400) / 3600)}h ${Math.floor((uptimeSeconds % 3600) / 60)}m`,
};
let diskData: Record<string, string> = {
total: 'N/A',
free: 'N/A',
used: 'N/A',
};
try {
const stats = await fs.statfs('/');
const totalGB = (stats.blocks * stats.bsize) / 1073741824;
const freeGB = (stats.bfree * stats.bsize) / 1073741824;
const usedGB = (totalGB - freeGB).toFixed(2);
diskData = {
total: totalGB.toFixed(2),
free: freeGB.toFixed(2),
used: usedGB,
};
} catch (err) {
console.error('Disk stats error:', err);
}
res.json({
os: osData,
cpu: cpuData,
ram: ramData,
uptime: uptimeData,
disk: diskData,
loadavg: os.loadavg(),
hostname: os.hostname(),
});
};
extension.get(
'/serverInfo',
{ subdomain: 'api', adminOnly: true },
handleServerInfo,
);
+320
View File
@@ -0,0 +1,320 @@
import {
GetObjectCommand,
PutObjectCommand,
type S3Client,
} from '@aws-sdk/client-s3';
import {
afterAll,
beforeAll,
describe,
expect,
it,
vi,
} from 'vitest';
import { PuterServer } from '../src/backend/server.ts';
import { setupTestServer } from '../src/backend/testUtil.ts';
import {
handleFsRemoveNodeThumbnail,
handleThumbnailCreated,
handleThumbnailRead,
handleThumbnailUploadPrepare,
} from './thumbnails.ts';
// 1x1 transparent PNG — smallest valid image sharp will accept.
const TINY_PNG_BASE64 =
'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=';
const BUCKET = 'puter-local';
const streamToBuffer = async (
body: { transformToByteArray: () => Promise<Uint8Array> } | undefined,
): Promise<Buffer> => {
if (!body) throw new Error('s3 GetObject returned no body');
return Buffer.from(await body.transformToByteArray());
};
describe('thumbnails extension — handleThumbnailCreated', () => {
let server: PuterServer;
beforeAll(async () => {
server = await setupTestServer();
});
afterAll(async () => {
await server.shutdown();
});
it('uploads a valid data: URL thumbnail to S3 and rewrites event.url to an s3:// pointer', async () => {
const s3 = server.clients.s3.get();
const event: Record<string, unknown> = {
url: `data:image/png;base64,${TINY_PNG_BASE64}`,
};
await handleThumbnailCreated(event, { s3, bucketName: BUCKET });
expect(typeof event.url).toBe('string');
const newUrl = event.url as string;
expect(newUrl.startsWith(`s3://${BUCKET}/`)).toBe(true);
const key = newUrl.slice(`s3://${BUCKET}/`.length);
const obj = await s3.send(
new GetObjectCommand({ Bucket: BUCKET, Key: key }),
);
expect(obj.ContentType).toBe('image/png');
const expected = Buffer.from(TINY_PNG_BASE64, 'base64');
const actual = await streamToBuffer(obj.Body as never);
expect(actual.equals(expected)).toBe(true);
});
it('sets event.url to null when the data: URL does not decode to a valid image', async () => {
const s3 = server.clients.s3.get();
const event: Record<string, unknown> = {
url: `data:image/png;base64,${Buffer.from('not an image').toString('base64')}`,
};
await handleThumbnailCreated(event, { s3, bucketName: BUCKET });
expect(event.url).toBeNull();
});
it('leaves event.url untouched when the URL is not a data: URL', async () => {
const s3 = server.clients.s3.get();
const original = 'https://example.com/thumb.png';
const event: Record<string, unknown> = { url: original };
await handleThumbnailCreated(event, { s3, bucketName: BUCKET });
expect(event.url).toBe(original);
});
it('returns without writing to S3 when event.url is missing', async () => {
const s3 = server.clients.s3.get();
const event: Record<string, unknown> = {};
await handleThumbnailCreated(event, { s3, bucketName: BUCKET });
expect(event.url).toBeUndefined();
});
});
describe('thumbnails extension — handleThumbnailUploadPrepare', () => {
let server: PuterServer;
let s3Presign: S3Client;
beforeAll(async () => {
server = await setupTestServer();
s3Presign = server.clients.s3.getForPresign();
});
afterAll(async () => {
await server.shutdown();
});
it('returns early when event has no items array', async () => {
const event: Record<string, unknown> = {};
await handleThumbnailUploadPrepare(event, {
s3Presign,
bucketName: BUCKET,
});
// No items property added — handler is a no-op.
expect(event).toEqual({});
});
it('throws when items array contains a non-object entry', async () => {
await expect(
handleThumbnailUploadPrepare(
{ items: ['not-an-object'] } as unknown as Record<
string,
unknown
>,
{ s3Presign, bucketName: BUCKET },
),
).rejects.toThrow('thumbnail.upload.prepare item is invalid');
});
it('skips items without a contentType (no upload URL minted)', async () => {
const item: Record<string, unknown> = { contentType: '' };
await handleThumbnailUploadPrepare(
{ items: [item] },
{ s3Presign, bucketName: BUCKET },
);
expect(item.uploadUrl).toBeUndefined();
expect(item.thumbnailUrl).toBeUndefined();
});
it('skips items whose size exceeds the max thumbnail bytes', async () => {
const item: Record<string, unknown> = {
contentType: 'image/png',
size: 999_999_999,
};
await handleThumbnailUploadPrepare(
{ items: [item] },
{ s3Presign, bucketName: BUCKET },
);
expect(item.uploadUrl).toBeUndefined();
expect(item.thumbnailUrl).toBeUndefined();
});
it('mints a presigned uploadUrl and an s3:// thumbnailUrl for valid items', async () => {
const item: Record<string, unknown> = {
contentType: 'image/png',
size: 1024,
};
await handleThumbnailUploadPrepare(
{ items: [item] },
{ s3Presign, bucketName: BUCKET },
);
expect(typeof item.uploadUrl).toBe('string');
expect((item.uploadUrl as string).startsWith('http')).toBe(true);
expect(typeof item.thumbnailUrl).toBe('string');
expect(
(item.thumbnailUrl as string).startsWith(`s3://${BUCKET}/`),
).toBe(true);
});
});
describe('thumbnails extension — handleThumbnailRead', () => {
let server: PuterServer;
let s3: S3Client;
let s3Presign: S3Client;
const stubDb = { write: vi.fn().mockResolvedValue(undefined) };
beforeAll(async () => {
server = await setupTestServer();
s3 = server.clients.s3.get();
s3Presign = server.clients.s3.getForPresign();
});
afterAll(async () => {
await server.shutdown();
});
it('rewrites an s3:// thumbnail into a presigned https URL', async () => {
// Seed an object so the presigned URL points at something real
// (the signer itself doesn't validate existence, but this keeps
// the test honest).
const key = 'thumb-read-test';
await s3.send(
new PutObjectCommand({
Bucket: BUCKET,
Key: key,
Body: Buffer.from(TINY_PNG_BASE64, 'base64'),
ContentType: 'image/png',
}),
);
const entry: Record<string, unknown> = {
thumbnail: `s3://${BUCKET}/${key}`,
};
await handleThumbnailRead(entry, {
s3,
s3Presign,
bucketName: BUCKET,
bucketEndpoint: 'http://127.0.0.1:4566/puter-local/',
db: stubDb,
});
expect(typeof entry.thumbnail).toBe('string');
expect((entry.thumbnail as string).startsWith('http')).toBe(true);
});
it('leaves the thumbnail untouched when not s3/https/data', async () => {
const entry: Record<string, unknown> = { thumbnail: 'about:blank' };
await handleThumbnailRead(entry, {
s3,
s3Presign,
bucketName: BUCKET,
bucketEndpoint: 'http://127.0.0.1:4566/puter-local/',
db: stubDb,
});
expect(entry.thumbnail).toBe('about:blank');
});
it('returns early when the thumbnail is missing or non-string', async () => {
const entry: Record<string, unknown> = {};
await handleThumbnailRead(entry, {
s3,
s3Presign,
bucketName: BUCKET,
bucketEndpoint: 'http://127.0.0.1:4566/puter-local/',
db: stubDb,
});
expect(entry.thumbnail).toBeUndefined();
});
it('migrates an inline data: URL by uploading to S3 and updating the DB row', async () => {
const entry: Record<string, unknown> = {
uuid: 'fs-entry-uuid',
thumbnail: `data:image/png;base64,${TINY_PNG_BASE64}`,
};
await handleThumbnailRead(entry, {
s3,
s3Presign,
bucketName: BUCKET,
bucketEndpoint: 'http://127.0.0.1:4566/puter-local/',
db: stubDb,
});
// The handler should have replaced the data URL with a signed
// S3 URL and kicked off the DB migration write.
expect(typeof entry.thumbnail).toBe('string');
expect((entry.thumbnail as string).startsWith('http')).toBe(true);
// Allow the best-effort write microtask to settle.
await Promise.resolve();
expect(stubDb.write).toHaveBeenCalledWith(
'UPDATE `fsentries` SET `thumbnail` = ? WHERE `uuid` = ?',
[expect.stringMatching(/^s3:\/\//), 'fs-entry-uuid'],
);
});
});
describe('thumbnails extension — handleFsRemoveNodeThumbnail', () => {
let server: PuterServer;
let s3: S3Client;
beforeAll(async () => {
server = await setupTestServer();
s3 = server.clients.s3.get();
});
afterAll(async () => {
await server.shutdown();
});
it('deletes the S3 object referenced by an s3:// thumbnail URL', async () => {
const key = 'thumb-remove-test';
await s3.send(
new PutObjectCommand({
Bucket: BUCKET,
Key: key,
Body: Buffer.from(TINY_PNG_BASE64, 'base64'),
ContentType: 'image/png',
}),
);
await handleFsRemoveNodeThumbnail(
{ target: { thumbnail: `s3://${BUCKET}/${key}` } },
{ s3 },
);
// GetObject should now error because the key was deleted.
await expect(
s3.send(new GetObjectCommand({ Bucket: BUCKET, Key: key })),
).rejects.toThrow();
});
it('is a no-op when the target has no thumbnail', async () => {
// Should not throw or attempt a delete.
await handleFsRemoveNodeThumbnail({ target: {} }, { s3 });
});
it('is a no-op when the thumbnail URL is not an s3:// pointer', async () => {
await handleFsRemoveNodeThumbnail(
{ target: { thumbnail: 'https://cdn.example.com/x.png' } },
{ s3 },
);
});
});
+290
View File
@@ -0,0 +1,290 @@
import {
DeleteObjectCommand,
GetObjectCommand,
PutObjectCommand,
S3Client,
} from '@aws-sdk/client-s3';
import { getSignedUrl } from '@aws-sdk/s3-request-presigner';
import { extension } from '@heyputer/backend/src/extensions';
import crypto from 'node:crypto';
import sharp from 'sharp';
const clients = extension.import('client');
const MAX_THUMBNAIL_BYTES = 2 * 1024 * 1024;
const MAX_THUMBNAIL_PIXELS = 64e6;
// S3 client + bucket config — lazily resolved after boot from config.
let s3Client: S3Client | null = null;
let s3PresignClient: S3Client | null = null;
let thumbnailBucketName = 'puter-local';
let extensionBucketEndpoint = 'http://127.0.0.1:4566/puter-local/';
function resolveClients(): { send: S3Client; presign: S3Client } {
if (s3Client && s3PresignClient) {
return { send: s3Client, presign: s3PresignClient };
}
// Top-level `thumbnailStore` config when the extension should use a
// dedicated S3 bucket instead of the main one.
const thumbStore = extension.config.thumbnailStore;
if (thumbStore?.endpoint && thumbStore.credentials) {
s3Client = new S3Client({
region: 'auto',
endpoint: thumbStore.endpoint,
credentials: thumbStore.credentials,
});
// Dedicated thumbnail buckets use a single endpoint for both
// server-side ops and browser-facing presigned URLs.
s3PresignClient = s3Client;
thumbnailBucketName = thumbStore.name ?? 'puter-local';
extensionBucketEndpoint = thumbStore.endpoint;
} else {
// Fall back to the project's S3 wrapper. `clients.s3` is the Puter
// `S3Client` wrapper (region-cache + lifecycle), not an AWS
// `S3Client`. `.get()` is for server-side ops (uses the internal
// `endpoint`); `.getForPresign()` is for browser-facing presigned
// URLs (uses `publicEndpoint` when configured — required for
// self-host where the docker-internal endpoint isn't reachable
// from the browser).
const wrapper = clients.s3;
s3Client = wrapper.get();
s3PresignClient = wrapper.getForPresign();
}
return { send: s3Client, presign: s3PresignClient };
}
function getClient(): S3Client {
return resolveClients().send;
}
function getPresignClient(): S3Client {
return resolveClients().presign;
}
function base64ParseDataUrl(dataURL: string) {
dataURL = dataURL.slice(5);
const mimeType = dataURL.split(';')[0];
const data = Buffer.from(dataURL.split(',')[1], 'base64');
return { mimeType, data };
}
// Strictly decode a data: URL and validate the decoded image. Encoded-string
// length lies about decoded byte count (whitespace, padding) and says nothing
// about pixel count — a 2MB PNG can decompress to hundreds of MB of raster.
async function decodeAndValidateThumbnail(
dataURL: string,
): Promise<{ mimeType: string; data: Buffer } | null> {
const commaIdx = dataURL.indexOf(',');
if (commaIdx === -1) return null;
const mimeType = dataURL.slice(5, commaIdx).split(';')[0];
const data = Buffer.from(dataURL.slice(commaIdx + 1), 'base64');
if (data.length === 0 || data.length > MAX_THUMBNAIL_BYTES) return null;
try {
await sharp(data, {
limitInputPixels: MAX_THUMBNAIL_PIXELS,
density: 72,
failOn: 'error',
}).metadata();
} catch {
return null;
}
return { mimeType, data };
}
// -- thumbnail.created -----------------------------------------------
// Intercept data-URL thumbnails before they hit the DB: upload to S3
// and replace the URL with an s3:// pointer.
export async function handleThumbnailCreated(
event: Record<string, unknown>,
deps: { s3: S3Client; bucketName: string },
): Promise<void> {
const url = event.url;
if (typeof url !== 'string' || !url.startsWith('data:')) return;
const decoded = await decodeAndValidateThumbnail(url);
if (!decoded) {
event.url = null;
return;
}
const key = crypto.randomUUID();
event.url = `s3://${deps.bucketName}/${key}`;
await deps.s3.send(
new PutObjectCommand({
Bucket: deps.bucketName,
Key: key,
Body: decoded.data,
ContentType: decoded.mimeType,
}),
);
}
export const handleThumbnailUploadPrepare = async (
event: Record<string, unknown>,
deps: { s3Presign: S3Client; bucketName: string },
): Promise<void> => {
if (!event || !Array.isArray(event.items)) return;
const presignClient = deps.s3Presign;
for (const item of event.items as Array<Record<string, unknown>>) {
if (!item || typeof item !== 'object') {
throw new Error('thumbnail.upload.prepare item is invalid');
}
const contentType =
typeof item.contentType === 'string' ? item.contentType.trim() : '';
if (!contentType) continue;
if (item.size !== undefined) {
const size = Number(item.size);
if (
!Number.isFinite(size) ||
size < 0 ||
size > MAX_THUMBNAIL_BYTES
)
continue;
}
const key = crypto.randomUUID();
const command = new PutObjectCommand({
Bucket: deps.bucketName,
Key: key,
ContentType: contentType,
});
item.uploadUrl = await getSignedUrl(presignClient, command, {
expiresIn: 900,
});
item.thumbnailUrl = `s3://${deps.bucketName}/${key}`;
}
};
export const handleThumbnailRead = async (
entry: Record<string, unknown>,
deps: {
s3: S3Client;
s3Presign: S3Client;
bucketName: string;
bucketEndpoint: string;
db: { write: (sql: string, params: unknown[]) => Promise<unknown> };
},
): Promise<void> => {
const thumb = entry.thumbnail;
if (typeof thumb !== 'string' || !thumb) return;
const presignClient = deps.s3Presign;
if (thumb.startsWith('s3://')) {
const [bucket, key] = thumb.slice(5).split('/');
entry.thumbnail = await getSignedUrl(
presignClient,
new GetObjectCommand({ Bucket: bucket, Key: key }),
{ expiresIn: 604800 },
);
} else if (
thumb.startsWith('https') &&
thumb.includes(new URL(deps.bucketEndpoint).hostname)
) {
// Legacy format — remove after full migration
const [bucket, key] = new URL(thumb).pathname.slice(1).split('/');
entry.thumbnail = await getSignedUrl(
presignClient,
new GetObjectCommand({ Bucket: bucket, Key: key }),
{ expiresIn: 604800 },
);
} else if (thumb.startsWith('data')) {
// Inline data-URL migration: upload to S3 and update the DB entry.
const key = crypto.randomUUID();
const { mimeType, data } = base64ParseDataUrl(thumb);
const newUrl = `s3://${deps.bucketName}/${key}`;
await deps.s3.send(
new PutObjectCommand({
Bucket: deps.bucketName,
Key: key,
Body: data,
ContentType: mimeType,
}),
);
// Best-effort async DB update
const uuid = entry.uuid ?? entry.uid;
if (uuid) {
deps.db
.write(
'UPDATE `fsentries` SET `thumbnail` = ? WHERE `uuid` = ?',
[newUrl, uuid],
)
.catch((err: unknown) =>
console.warn('[thumbnails] inline migration failed', err),
);
}
entry.thumbnail = await getSignedUrl(
presignClient,
new GetObjectCommand({ Bucket: deps.bucketName, Key: key }),
{ expiresIn: 604800 },
);
}
};
export const handleFsRemoveNodeThumbnail = async (
payload: { target: Record<string, unknown> },
deps: { s3: S3Client },
): Promise<void> => {
const thumbnailUrl = payload.target.thumbnail as string | undefined;
if (!thumbnailUrl || !thumbnailUrl.startsWith('s3://')) return;
const [bucket, key] = thumbnailUrl.slice(5).split('/');
await deps.s3.send(new DeleteObjectCommand({ Bucket: bucket, Key: key }));
};
extension.on(
'thumbnail.created',
async (_key, event: Record<string, unknown>) => {
await handleThumbnailCreated(event, {
s3: getClient(),
bucketName: thumbnailBucketName,
});
},
);
// -- thumbnail.upload.prepare ----------------------------------------
// Generate pre-signed upload URLs so the client can PUT directly to S3.
extension.on(
'thumbnail.upload.prepare',
async (_key, event: Record<string, unknown>) => {
await handleThumbnailUploadPrepare(event, {
s3Presign: getPresignClient(),
bucketName: thumbnailBucketName,
});
},
);
// -- thumbnail.read --------------------------------------------------
// Convert s3:// or legacy https:// thumbnails to signed URLs.
extension.on('thumbnail.read', async (_key, entry: Record<string, unknown>) => {
await handleThumbnailRead(entry, {
s3: getClient(),
s3Presign: getPresignClient(),
bucketName: thumbnailBucketName,
bucketEndpoint: extensionBucketEndpoint,
db: clients.db,
});
});
// -- fs.remove.node --------------------------------------------------
// Delete S3 thumbnail when the file is removed.
extension.on(
'fs.remove.node',
async (_key, payload: { target: Record<string, unknown> }) => {
await handleFsRemoveNodeThumbnail(payload, { s3: getClient() });
},
);
+184
View File
@@ -0,0 +1,184 @@
import type { Request, Response } from 'express';
import { v4 as uuidv4 } from 'uuid';
import {
afterAll,
beforeAll,
describe,
expect,
it,
vi,
} from 'vitest';
import { runWithContext } from '../src/backend/core/context.ts';
import { PuterServer } from '../src/backend/server.ts';
import { setupTestServer } from '../src/backend/testUtil.ts';
import { handleWhoami } from './whoami.ts';
interface CapturedResponse {
statusCode: number;
body: unknown;
}
const makeReq = (query: Record<string, unknown> = {}): Request =>
({ query }) as unknown as Request;
const makeRes = () => {
const captured: CapturedResponse = { statusCode: 200, body: undefined };
const res = {
json: vi.fn((value: unknown) => {
captured.body = value;
return res;
}),
status: vi.fn((code: number) => {
captured.statusCode = code;
return res;
}),
};
return { res: res as unknown as Response, captured };
};
let server: PuterServer;
beforeAll(async () => {
server = await setupTestServer({
// Feature flag allowlist is enforced in the handler. We seed
// both an allow-listed flag and an internal flag to verify the
// internal one never reaches the response.
feature_flags: {
create_shortcut: true,
payment_bypass: true,
},
} as never);
});
afterAll(async () => {
await server.shutdown();
});
const seedUser = async () => {
const slug = Math.random().toString(36).slice(2, 8);
return server.stores.user.create({
username: `wuser_${slug}`,
uuid: uuidv4(),
password: 'hashedpw',
email: `${slug}@example.com`,
});
};
describe('whoami extension — handleWhoami', () => {
it('returns 401 when no actor is on the context', async () => {
const { res, captured } = makeRes();
await runWithContext({ actor: undefined }, () =>
handleWhoami(makeReq(), res),
);
expect(captured.statusCode).toBe(401);
expect(captured.body).toEqual({ error: 'Authentication required' });
});
it('returns 404 when the actor’s user no longer exists', async () => {
const { res, captured } = makeRes();
await runWithContext(
{
actor: {
user: { uuid: 'ghost-uuid', id: 99_999_999 },
},
},
() => handleWhoami(makeReq(), res),
);
expect(captured.statusCode).toBe(404);
expect(captured.body).toEqual({ error: 'User not found' });
});
it('returns full user details for a user actor', async () => {
const user = await seedUser();
const { res, captured } = makeRes();
await runWithContext(
{ actor: { user: { uuid: user.uuid, id: user.id as number } } },
() => handleWhoami(makeReq(), res),
);
const body = captured.body as Record<string, unknown>;
expect(body.username).toBe(user.username);
expect(body.uuid).toBe(user.uuid);
expect(body.email).toBe(user.email);
expect(body.is_temp).toBe(false);
expect(body.oidc_only).toBe(false);
// `directories` is only sent to user actors — confirm it’s present.
expect(body.directories).toBeDefined();
// taskbar_items is only sent to user actors.
expect(body).toHaveProperty('taskbar_items');
});
it('only forwards allow-listed feature flags', async () => {
const user = await seedUser();
const { res, captured } = makeRes();
await runWithContext(
{ actor: { user: { uuid: user.uuid, id: user.id as number } } },
() => handleWhoami(makeReq(), res),
);
const flags = (captured.body as Record<string, unknown>)
.feature_flags as Record<string, boolean>;
// Allowed flag is forwarded as a coerced boolean.
expect(flags.create_shortcut).toBe(true);
// Internal flag must never leak.
expect(flags.payment_bypass).toBeUndefined();
});
it('strips desktop_bg_* and human_readable_age fields for app actors', async () => {
const user = await seedUser();
const { res, captured } = makeRes();
await runWithContext(
{
actor: {
user: { uuid: user.uuid, id: user.id as number },
app: { uid: 'app-test-actor' },
},
},
() => handleWhoami(makeReq(), res),
);
const body = captured.body as Record<string, unknown>;
expect(body.app_name).toBe('app-test-actor');
expect(body.desktop_bg_url).toBeUndefined();
expect(body.desktop_bg_color).toBeUndefined();
expect(body.desktop_bg_fit).toBeUndefined();
expect(body.human_readable_age).toBeUndefined();
// Directories are user-only.
expect(body.directories).toBeUndefined();
});
it('marks the user as oidc_only when password is null', async () => {
const slug = Math.random().toString(36).slice(2, 8);
const oidcUser = await server.stores.user.create({
username: `oidc_${slug}`,
uuid: uuidv4(),
password: null,
email: `${slug}@oidc.test`,
});
const { res, captured } = makeRes();
await runWithContext(
{
actor: {
user: {
uuid: oidcUser.uuid,
id: oidcUser.id as number,
},
},
},
() => handleWhoami(makeReq(), res),
);
const body = captured.body as Record<string, unknown>;
expect(body.oidc_only).toBe(true);
// No email yet means temp account.
expect(body.is_temp).toBe(false);
});
});
+192
View File
@@ -0,0 +1,192 @@
import { Context } from '@heyputer/backend/src/core';
import { extension } from '@heyputer/backend/src/extensions';
import { getTaskbarItems } from '@heyputer/backend/src/util/taskbarItems.js';
import type { Request, Response } from 'express';
import TimeAgo from 'javascript-time-ago';
import localeEn from 'javascript-time-ago/locale/en';
const stores = extension.import('store');
const services = extension.import('service');
const clients = extension.import('client');
const timeago = (() => {
TimeAgo.addDefaultLocale(localeEn);
return new TimeAgo('en-US');
})();
// Allowlist of `config.feature_flags` keys safe to surface via /whoami.
// Anything not listed here stays server-side, so internal flags
// (payment_bypass, staff_only_*, etc.) cannot leak by accident. Add a
// flag here when, and only when, the client actually needs to read it.
const CLIENT_VISIBLE_FEATURE_FLAGS: ReadonlySet<string> = new Set([
'create_shortcut',
'download_directory',
'prompt_user_when_navigation_away_from_puter',
]);
export const handleWhoami = async (
req: Request,
res: Response,
): Promise<void> => {
const actor = Context.get('actor');
if (!actor?.user?.id) {
res.status(401).json({ error: 'Authentication required' });
return;
}
const isUser = !actor.app;
const user = await stores.user.getById(actor.user.id);
if (!user) {
res.status(404).json({ error: 'User not found' });
return;
}
const oidcOnly = user.password === null;
const ALLOWED_ICON_SIZES = new Set([16, 32, 64, 128, 256, 512]);
const rawIconSize =
typeof req.query?.icon_size === 'string'
? Number(req.query.icon_size)
: undefined;
const iconSize =
rawIconSize !== undefined && ALLOWED_ICON_SIZES.has(rawIconSize)
? rawIconSize
: undefined;
const noIcons = !iconSize;
// Feature flags come from `config.feature_flags`. We only forward keys
// listed in CLIENT_VISIBLE_FEATURE_FLAGS so internal flags can't leak.
// Non-boolean values (e.g. `"true"` as a string) are coerced so the
// client never has to guess.
const rawFlags = extension.config.feature_flags ?? {};
const feature_flags: Record<string, boolean> = {};
for (const [k, v] of Object.entries(rawFlags)) {
if (CLIENT_VISIBLE_FEATURE_FLAGS.has(k)) {
feature_flags[k] = Boolean(v);
}
}
const details: Record<string, unknown> = {
username: user.username,
uuid: user.uuid,
email: user.email,
unconfirmed_email: user.email,
email_confirmed: user.email_confirmed || user.username === 'admin',
requires_email_confirmation: user.requires_email_confirmation,
desktop_bg_url: user.desktop_bg_url,
desktop_bg_color: user.desktop_bg_color,
desktop_bg_fit: user.desktop_bg_fit,
is_temp: user.password === null && user.email === null,
oidc_only: oidcOnly,
taskbar_items: isUser
? await getTaskbarItems(
user,
{
clients,
stores,
services,
apiBaseUrl: String(extension.config.api_base_url ?? ''),
},
{ iconSize, noIcons },
)
: undefined,
otp: !!user.otp_enabled,
feature_flags,
human_readable_age: user.timestamp
? timeago.format(new Date(user.timestamp as string))
: null,
metadata: user.metadata,
hasDevAccountAccess: !!user.metadata?.hasDevAccountAccess,
};
// OIDC revalidate URL for password-less accounts
if (oidcOnly) {
try {
const provider = await services.oidc.getLinkedProviderForUser(
user.id as number,
);
if (provider) {
const origin = (extension.config.origin ?? '').replace(
/\/$/,
'',
);
details.oidc_revalidate_url = `${origin}/auth/oidc/${provider}/start?flow=revalidate&user_uuid=${encodeURIComponent(user.uuid)}`;
}
} catch {
// OIDC not configured
}
}
// Directories — only sent to user actors
if (isUser) {
const directories: Record<string, unknown> = {};
const nameToProp: Record<string, string> = {
desktop_uuid: `/${user.username}/Desktop`,
appdata_uuid: `/${user.username}/AppData`,
documents_uuid: `/${user.username}/Documents`,
pictures_uuid: `/${user.username}/Pictures`,
videos_uuid: `/${user.username}/Videos`,
trash_uuid: `/${user.username}/Trash`,
};
for (const k in nameToProp) {
directories[nameToProp[k]] = user[k];
}
details.directories = directories;
}
// Last activity
if (user.last_activity_ts) {
try {
details.last_activity_ts = Math.round(
new Date(user.last_activity_ts as string).getTime() / 1000,
);
} catch {
/* ignore parse error */
}
}
// Strip sensitive fields for app actors
if (!isUser) {
const canReadEmail = await services.permission
.check(actor, `user:${user.uuid}:email:read`)
.catch(() => false);
if (!canReadEmail) {
delete details.email;
delete details.unconfirmed_email;
}
delete details.desktop_bg_url;
delete details.desktop_bg_color;
delete details.desktop_bg_fit;
delete details.human_readable_age;
}
if (actor.app) {
details.app_name = actor.app.uid;
}
try {
await clients.event.emitAndWait(
'whoami.details',
{ user, details, isUser },
{},
);
} catch {
/* best-effort */
}
const subscription = details.subscription as
| { offering?: Record<string, unknown> }
| undefined;
if (subscription?.offering) {
delete subscription.offering.group;
delete subscription.offering.benefits;
delete subscription.offering.price_id;
}
res.json(details);
};
extension.get(
'/whoami',
{ subdomain: 'api', requireAuth: true, allowUnconfirmed: true },
handleWhoami,
);
+41
View File
@@ -0,0 +1,41 @@
import type { Request, Response } from 'express';
import { describe, expect, it, vi } from 'vitest';
import { handleWorkerSandboxPage } from './workerSandbox.ts';
interface CapturedResponse {
contentType: string | undefined;
body: string | undefined;
}
const makeRes = () => {
const captured: CapturedResponse = {
contentType: undefined,
body: undefined,
};
const res = {
type: vi.fn((mime: string) => {
captured.contentType = mime;
return res;
}),
send: vi.fn((value: string) => {
captured.body = value;
return res;
}),
};
return { res: res as unknown as Response, captured };
};
describe('workerSandbox extension — handleWorkerSandboxPage', () => {
it('sends the playground HTML page with text/html content type', () => {
const { res, captured } = makeRes();
handleWorkerSandboxPage({} as Request, res);
expect(captured.contentType).toBe('html');
expect(typeof captured.body).toBe('string');
expect(captured.body).toContain('<!doctype html>');
expect(captured.body).toContain('Puter Worker Sandbox Playground');
// The page is meant to load the public puter SDK
expect(captured.body).toContain('https://js.puter.com/v2/');
});
});
+101
View File
@@ -0,0 +1,101 @@
import type { Request, Response } from 'express';
import { extension } from '@heyputer/backend/src/extensions';
const page = `
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Puter Worker Sandbox Playground</title>
<style>
:root {
color-scheme: light;
--bg: #0f172a;
--panel: #111827;
--panel-2: #1f2937;
--text: #e5e7eb;
--muted: #94a3b8;
--accent: #22d3ee;
--danger: #fb7185;
--ok: #34d399;
--border: #334155;
}
* { box-sizing: border-box; }
body {
margin: 0;
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
background: radial-gradient(circle at top, #1e293b, var(--bg) 55%);
color: var(--text);
min-height: 100vh;
padding: 20px;
}
.wrap { max-width: 980px; margin: 0 auto; }
h1 { margin: 0 0 8px; font-size: 24px; }
p { margin: 0 0 14px; color: var(--muted); }
.toolbar { display: flex; gap: 10px; margin-bottom: 10px; flex-wrap: wrap; }
button { border: 1px solid var(--border); background: var(--panel-2); color: var(--text); padding: 8px 12px; border-radius: 8px; cursor: pointer; }
button:hover { border-color: var(--accent); }
.layout { display: grid; gap: 12px; grid-template-columns: 1fr; }
@media (min-width: 900px) { .layout { grid-template-columns: 1fr 1fr; } }
.card { border: 1px solid var(--border); border-radius: 10px; background: color-mix(in srgb, var(--panel) 88%, black 12%); overflow: hidden; }
.card h2 { margin: 0; padding: 10px 12px; font-size: 14px; border-bottom: 1px solid var(--border); background: color-mix(in srgb, var(--panel-2) 90%, black 10%); }
textarea { display: block; width: 100%; min-height: 420px; border: 0; resize: vertical; background: transparent; color: var(--text); padding: 12px; outline: none; font-size: 13px; line-height: 1.5; }
#logs { margin: 0; padding: 12px; min-height: 420px; max-height: 70vh; overflow: auto; white-space: pre-wrap; word-break: break-word; font-size: 13px; line-height: 1.45; }
.line { margin: 0 0 8px; }
.info { color: var(--muted); }
.ok { color: var(--ok); }
.warn { color: #fbbf24; }
.error { color: var(--danger); }
code { color: var(--accent); }
</style>
</head>
<body>
<main class="wrap">
<h1>Puter Worker Sandbox Playground</h1>
<p>Use this page to interact with the puter APIs in the same sandbox as your worker.</p>
<div class="toolbar">
<button id="run">Run</button>
<button id="clear">Clear Logs</button>
</div>
<section class="layout">
<article class="card">
<h2>Code</h2>
<textarea id="code" spellcheck="false">console.log(JSON.stringify(await puter.kv.list({limit: 100})))</textarea>
</article>
<article class="card">
<h2>Logs</h2>
<pre id="logs"></pre>
</article>
</section>
</main>
<script src="https://js.puter.com/v2/"></script>
<script>
(() => {
const codeEl = document.getElementById('code');
const logsEl = document.getElementById('logs');
const runBtn = document.getElementById('run');
const clearBtn = document.getElementById('clear');
const originalConsole = { log: console.log.bind(console), info: console.info.bind(console), warn: console.warn.bind(console), error: console.error.bind(console) };
const safeStringify = (v) => { if (typeof v === 'string') return v; if (v instanceof Error) return v.stack || v.message || String(v); try { return JSON.stringify(v, null, 2); } catch { return String(v); } };
const appendLog = (level, parts) => { const line = document.createElement('div'); line.className = 'line ' + level; line.textContent = '[' + new Date().toLocaleTimeString() + '] ' + parts.map(safeStringify).join(' '); logsEl.appendChild(line); logsEl.scrollTop = logsEl.scrollHeight; };
['log', 'info', 'warn', 'error'].forEach((level) => { console[level] = (...args) => { appendLog(level === 'log' ? 'ok' : level, args); originalConsole[level](...args); }; });
window.addEventListener('error', (event) => { appendLog('error', [event.error || event.message]); });
const AsyncFunction = Object.getPrototypeOf(async function () {}).constructor;
runBtn.addEventListener('click', async () => { const source = codeEl.value; appendLog('info', ['Running...']); try { const fn = new AsyncFunction(source); const result = await fn.call(window); appendLog('ok', ['Result:', result]); } catch (err) { appendLog('error', ['Execution failed:', err]); } });
clearBtn.addEventListener('click', () => { logsEl.textContent = ''; });
})();
</script>
</body>
</html>
`;
export const handleWorkerSandboxPage = (_req: Request, res: Response): void => {
res.type('html').send(page);
};
extension.get(
'/',
{ requireAuth: false, subdomain: 'worker-sandbox' },
handleWorkerSandboxPage,
);
-17
View File
@@ -1,17 +0,0 @@
# Research + Planning for x86 Emulation in Puter
## Resources
- [copy.sh/v86 docs](https://github.com/copy/v86/blob/master/docs)
- [greenfield github](https://github.com/udevbe/greenfield)
## TODO
### Documents to Write
- [ ] specification for Puter network driver
- [ ] specification for Puter network relay
### Things to Try
- [ ] greenfield/wayland/arch/v86
- [ ] puter-fuse in v86
+208
View File
@@ -0,0 +1,208 @@
#!/usr/bin/env pwsh
# Self-hosted Puter — one-shot installer (PowerShell port of install.sh).
#
# Usage (interactive):
# .\install.ps1
#
# Usage (one-liner, like curl|sh):
# irm https://raw.githubusercontent.com/HeyPuter/puter/main/install.ps1 | iex
# (when piped through iex, params can't be passed; use env vars below)
#
# What this does, in order:
# 1. Checks that docker (with the compose plugin) exists.
# 2. Creates ./puter-selfhosted/ (override with $env:PUTER_DIR).
# 3. Downloads docker-compose.yml + nginx.conf from the OSS repo.
# 4. Generates fresh secrets and writes .env + puter/config/config.json.
# 5. Runs `docker compose up -d` and prints how to find the admin password.
#
# Re-running in an already-initialised directory is a no-op for config
# (it won't clobber existing .env / config.json) and just refreshes the
# compose file + brings the stack up. Set PUTER_FORCE=1 to overwrite.
#
# Tunable env vars (or pass as -Parameters when running the file directly):
# PUTER_DIR install directory (default: ./puter-selfhosted)
# PUTER_URL base URL to fetch docker-compose.yml (default: GitHub raw, main branch)
# PUTER_DOMAIN domain Puter will serve on (default: puter.localhost)
# PUTER_PORT HTTP port for nginx (default: 80)
# PUTER_FORCE set to 1 to overwrite existing .env / config.json
[CmdletBinding()]
param(
[string]$PuterDir = $(if ($env:PUTER_DIR) { $env:PUTER_DIR } else { 'puter-selfhosted' }),
[string]$PuterUrl = $(if ($env:PUTER_URL) { $env:PUTER_URL } else { 'https://raw.githubusercontent.com/HeyPuter/puter/main' }),
[string]$PuterDomain = $(if ($env:PUTER_DOMAIN) { $env:PUTER_DOMAIN } else { 'puter.localhost' }),
[int] $PuterPort = $(if ($env:PUTER_PORT) { [int]$env:PUTER_PORT } else { 80 }),
[switch]$Force = $($env:PUTER_FORCE -eq '1')
)
$ErrorActionPreference = 'Stop'
function Write-Log { param($Msg) Write-Host "[puter-install] $Msg" -ForegroundColor Cyan }
function Write-Warn { param($Msg) Write-Host "[puter-install] $Msg" -ForegroundColor Yellow }
function Die { param($Msg) Write-Host "[puter-install] $Msg" -ForegroundColor Red; exit 1 }
function Test-Command {
param([string]$Name)
if (-not (Get-Command $Name -ErrorAction SilentlyContinue)) {
Die "missing required command: $Name"
}
}
function New-HexSecret {
param([int]$Bytes)
$buf = New-Object byte[] $Bytes
$rng = [System.Security.Cryptography.RandomNumberGenerator]::Create()
try { $rng.GetBytes($buf) } finally { $rng.Dispose() }
# BitConverter is portable across PS 5.1 and 7+ (ToHexString is 7+ only).
return [System.BitConverter]::ToString($buf).Replace('-', '').ToLowerInvariant()
}
function Write-Utf8NoBomLF {
param([string]$Path, [string]$Content)
$full = if ([System.IO.Path]::IsPathRooted($Path)) { $Path } else { Join-Path (Get-Location) $Path }
$lf = $Content -replace "`r`n", "`n"
[System.IO.File]::WriteAllText($full, $lf, (New-Object System.Text.UTF8Encoding $false))
}
# ── Step 1: dependency check ────────────────────────────────────────
Write-Log 'checking dependencies'
Test-Command docker
# curl + openssl aren't required on Windows; PowerShell + .NET cover both.
$null = & docker compose version 2>&1
if ($LASTEXITCODE -ne 0) {
Die "docker compose plugin not found — install Docker Desktop (or enable the v2 compose plugin)"
}
# ── Step 2: install dir ─────────────────────────────────────────────
$null = New-Item -ItemType Directory -Force -Path $PuterDir
Set-Location $PuterDir
$null = New-Item -ItemType Directory -Force -Path 'puter/config', 'puter/data', 'puter/tls'
Write-Log "install dir: $((Get-Location).Path)"
# ── Step 3: docker-compose.yml + nginx config ──────────────────────
Write-Log "downloading docker-compose.yml from $PuterUrl"
try {
Invoke-WebRequest -Uri "$PuterUrl/docker-compose.yml" -OutFile 'docker-compose.yml' -UseBasicParsing
} catch {
Die "could not fetch $PuterUrl/docker-compose.yml — $_"
}
Write-Log "downloading nginx/nginx.conf from $PuterUrl"
$null = New-Item -ItemType Directory -Force -Path 'nginx'
# If the path was previously auto-created as a directory by a failed
# `compose up`, remove it so we can write the file there.
if (Test-Path 'nginx/nginx.conf' -PathType Container) {
Remove-Item 'nginx/nginx.conf' -Recurse -Force
}
try {
Invoke-WebRequest -Uri "$PuterUrl/nginx/nginx.conf" -OutFile 'nginx/nginx.conf' -UseBasicParsing
} catch {
Die "could not fetch $PuterUrl/nginx/nginx.conf — $_"
}
# ── Step 4: secrets, .env, config.json ──────────────────────────────
$writeConfig = $true
if ((Test-Path '.env') -and (Test-Path 'puter/config/config.json') -and -not $Force) {
Write-Log ".env + config.json already present — keeping existing secrets (PUTER_FORCE=1 or -Force to overwrite)"
$writeConfig = $false
}
if ($writeConfig) {
Write-Log 'generating secrets'
$mariadbRootPw = New-HexSecret 32
$mariadbPw = New-HexSecret 32
$s3SecretKey = New-HexSecret 32
# Two JWT secrets: $jwtSecret is verify-only for legacy v1 tokens
# already in circulation; $jwtSecretV2 signs every new token.
$jwtSecret = New-HexSecret 64
$jwtSecretV2 = New-HexSecret 64
$urlSigSecret = New-HexSecret 64
$envContent = @"
HTTP_PORT=$PuterPort
# HTTPS_PORT=443 # uncomment after enabling TLS (see doc/selfhosting/full-stack.md)
MARIADB_ROOT_PASSWORD=$mariadbRootPw
MARIADB_DATABASE=puter
MARIADB_USER=puter
MARIADB_PASSWORD=$mariadbPw
S3_ACCESS_KEY=puter
S3_SECRET_KEY=$s3SecretKey
S3_BUCKET=puter-local
"@
Write-Utf8NoBomLF -Path '.env' -Content $envContent
Write-Log 'writing puter/config/config.json'
$config = [ordered]@{
domain = $PuterDomain
protocol = 'http'
pub_port = $PuterPort
env = 'prod'
static_hosting_domain = "site.$PuterDomain"
static_hosting_domain_alt = "host.$PuterDomain"
private_app_hosting_domain = "app.$PuterDomain"
private_app_hosting_domain_alt = "dev.$PuterDomain"
jwt_secret = $jwtSecret
jwt_secret_v2 = $jwtSecretV2
allow_v1_tokens = $true
url_signature_secret = $urlSigSecret
database = [ordered]@{
engine = 'mysql'
host = 'mariadb'
port = 3306
user = 'puter'
password = $mariadbPw
database = 'puter'
migrationPaths = @('/opt/puter/dist/src/backend/clients/database/migrations/mysql')
}
redis = [ordered]@{
startupNodes = @(
[ordered]@{ host = 'valkey'; port = 6379 }
)
tls = $false
}
dynamo = [ordered]@{
endpoint = 'http://dynamo:8000'
bootstrapTables = $true
aws = [ordered]@{
access_key = 'fake'
secret_key = 'fake'
region = 'us-east-1'
}
}
s3 = [ordered]@{
s3Config = [ordered]@{
endpoint = 'http://s3:9000'
publicEndpoint = "http://s3.$PuterDomain"
accessKeyId = 'puter'
secretAccessKey = $s3SecretKey
region = 'us-east-1'
forcePathStyle = $true
}
}
s3_bucket = 'puter-local'
s3_region = 'us-east-1'
providers = [ordered]@{
ollama = [ordered]@{ enabled = $false }
}
trust_proxy = 1
}
$configJson = $config | ConvertTo-Json -Depth 10
Write-Utf8NoBomLF -Path 'puter/config/config.json' -Content $configJson
}
# ── Step 5: bring it up ─────────────────────────────────────────────
Write-Log 'docker compose up -d'
& docker compose up -d
if ($LASTEXITCODE -ne 0) { Die 'docker compose up failed' }
Write-Log ''
Write-Log 'stack starting. first boot takes ~30s while MariaDB initialises.'
Write-Log 'follow puter logs:'
Write-Log " cd $PuterDir; docker compose logs -f puter"
Write-Log ''
Write-Log "open http://${PuterDomain}:${PuterPort} once the puter container is healthy."
Write-Log 'first-boot admin password is logged once — grab it with:'
Write-Log " cd $PuterDir; docker compose logs puter | Select-String password"
Executable
+192
View File
@@ -0,0 +1,192 @@
#!/usr/bin/env sh
# Self-hosted Puter — one-shot installer.
#
# Usage:
# curl -fsSL https://raw.githubusercontent.com/HeyPuter/puter/main/install.sh | sh
#
# What this does, in order:
# 1. Checks that docker (with the compose plugin), curl, and openssl exist.
# 2. Creates ./puter-selfhosted/ (override with PUTER_DIR=...).
# 3. Downloads docker-compose.yml from the OSS repo (raw.githubusercontent.com).
# 4. Generates fresh secrets and writes .env + puter/config/config.json.
# 5. Runs `docker compose up -d` and prints the first-boot admin password.
#
# Re-running the script in an already-initialised directory is a no-op for
# config (it won't clobber existing .env / config.json) and just refreshes
# the compose file + brings the stack up. Set PUTER_FORCE=1 to overwrite.
#
# Tunable env vars:
# PUTER_DIR install directory (default: ./puter-selfhosted)
# PUTER_URL base URL to fetch docker-compose.yml (default: GitHub raw, main branch)
# PUTER_DOMAIN domain Puter will serve on (default: puter.localhost)
# PUTER_PORT HTTP port for nginx (default: 80)
# PUTER_FORCE set to 1 to overwrite existing .env / config.json
set -eu
PUTER_DIR="${PUTER_DIR:-puter-selfhosted}"
PUTER_URL="${PUTER_URL:-https://raw.githubusercontent.com/HeyPuter/puter/main}"
PUTER_DOMAIN="${PUTER_DOMAIN:-puter.localhost}"
PUTER_PORT="${PUTER_PORT:-80}"
PUTER_FORCE="${PUTER_FORCE:-0}"
log() { printf '\033[1;36m[puter-install]\033[0m %s\n' "$*"; }
warn() { printf '\033[1;33m[puter-install]\033[0m %s\n' "$*" >&2; }
die() { printf '\033[1;31m[puter-install]\033[0m %s\n' "$*" >&2; exit 1; }
need() {
command -v "$1" >/dev/null 2>&1 || die "missing required command: $1"
}
# ── Step 1: dependency check ────────────────────────────────────────
log "checking dependencies"
need docker
need curl
need openssl
docker compose version >/dev/null 2>&1 \
|| die "docker compose plugin not found — install docker desktop or 'docker-compose-plugin'"
# ── Step 2: install dir ─────────────────────────────────────────────
mkdir -p "$PUTER_DIR"
cd "$PUTER_DIR"
mkdir -p puter/config puter/data puter/tls
# Pre-create per-service data dirs and make them writable by any UID.
# Several upstream images run as non-root inside the container (rustfs
# uses UID 10001; dynamo is pinned to 1000 in compose), and rustfs's
# entrypoint runs as that same non-root user so it can't chown an
# already-existing bind-mounted dir. On hosts where the user that ran
# this script has a UID that doesn't match — or where docker is running
# rootless — those containers loop on EACCES at startup. 0777 on the
# bind-mount roots sidesteps the mismatch without guessing each image's
# internal UID. (Docker Desktop on macOS/Windows papers over this with
# its VM layer; native Linux docker on Debian/Alpine doesn't.)
mkdir -p puter/data/valkey puter/data/mariadb puter/data/dynamo puter/data/s3 puter/data/puter
chmod 0777 puter/data/valkey puter/data/mariadb puter/data/dynamo puter/data/s3 puter/data/puter
log "install dir: $(pwd)"
# ── Step 3: docker-compose.yml + nginx config ──────────────────────
log "downloading docker-compose.yml from $PUTER_URL"
curl -fsSL "$PUTER_URL/docker-compose.yml" -o docker-compose.yml \
|| die "could not fetch $PUTER_URL/docker-compose.yml"
# nginx is mounted as `./nginx/nginx.conf:/etc/nginx/nginx.conf:ro` — if
# the host file is missing, docker silently creates a directory at that
# path and the mount fails with "not a directory" at container start.
log "downloading nginx/nginx.conf from $PUTER_URL"
mkdir -p nginx
# If the path was previously auto-created as a dir by a failed `compose up`,
# remove it so curl can write the file.
[ -d nginx/nginx.conf ] && rmdir nginx/nginx.conf 2>/dev/null || true
curl -fsSL "$PUTER_URL/nginx/nginx.conf" -o nginx/nginx.conf \
|| die "could not fetch $PUTER_URL/nginx/nginx.conf"
# ── Step 4: secrets, .env, config.json ──────────────────────────────
write_config=1
if [ -f .env ] && [ -f puter/config/config.json ] && [ "$PUTER_FORCE" != "1" ]; then
log ".env + config.json already present — keeping existing secrets (PUTER_FORCE=1 to overwrite)"
write_config=0
fi
if [ "$write_config" = "1" ]; then
log "generating secrets"
MARIADB_ROOT_PASSWORD=$(openssl rand -hex 32)
MARIADB_PASSWORD=$(openssl rand -hex 32)
S3_SECRET_KEY=$(openssl rand -hex 32)
# Two JWT secrets: `jwt_secret` is verify-only for legacy v1 tokens
# already in circulation; `jwt_secret_v2` signs every new token.
# Both are required at boot (`jwt_secret` only when verifying v1).
JWT_SECRET=$(openssl rand -hex 64)
JWT_SECRET_V2=$(openssl rand -hex 64)
URL_SIGNATURE_SECRET=$(openssl rand -hex 64)
cat > .env <<EOF
HTTP_PORT=$PUTER_PORT
# HTTPS_PORT=443 # uncomment after enabling TLS (see doc/selfhosting/full-stack.md)
MARIADB_ROOT_PASSWORD=$MARIADB_ROOT_PASSWORD
MARIADB_DATABASE=puter
MARIADB_USER=puter
MARIADB_PASSWORD=$MARIADB_PASSWORD
S3_ACCESS_KEY=puter
S3_SECRET_KEY=$S3_SECRET_KEY
S3_BUCKET=puter-local
EOF
log "writing puter/config/config.json"
cat > puter/config/config.json <<EOF
{
"domain": "$PUTER_DOMAIN",
"protocol": "http",
"pub_port": $PUTER_PORT,
"env": "prod",
"static_hosting_domain": "site.$PUTER_DOMAIN",
"static_hosting_domain_alt": "host.$PUTER_DOMAIN",
"private_app_hosting_domain": "app.$PUTER_DOMAIN",
"private_app_hosting_domain_alt": "dev.$PUTER_DOMAIN",
"jwt_secret": "$JWT_SECRET",
"jwt_secret_v2": "$JWT_SECRET_V2",
"allow_v1_tokens": true,
"url_signature_secret": "$URL_SIGNATURE_SECRET",
"database": {
"engine": "mysql",
"host": "mariadb",
"port": 3306,
"user": "puter",
"password": "$MARIADB_PASSWORD",
"database": "puter",
"migrationPaths": ["/opt/puter/dist/src/backend/clients/database/migrations/mysql"]
},
"redis": {
"startupNodes": [{ "host": "valkey", "port": 6379 }],
"tls": false
},
"dynamo": {
"endpoint": "http://dynamo:8000",
"bootstrapTables": true,
"aws": {
"access_key": "fake",
"secret_key": "fake",
"region": "us-east-1"
}
},
"s3": {
"s3Config": {
"endpoint": "http://s3:9000",
"publicEndpoint": "http://s3.$PUTER_DOMAIN",
"accessKeyId": "puter",
"secretAccessKey": "$S3_SECRET_KEY",
"region": "us-east-1",
"forcePathStyle": true
}
},
"s3_bucket": "puter-local",
"s3_region": "us-east-1",
"providers": {
"ollama": { "enabled": false }
},
"trust_proxy": 1
}
EOF
fi
# ── Step 5: bring it up ─────────────────────────────────────────────
log "docker compose up -d"
docker compose up -d
log ""
log "stack starting. first boot takes ~30s while MariaDB initialises."
log "follow puter logs:"
log " cd $PUTER_DIR && docker compose logs -f puter"
log ""
log "open http://$PUTER_DOMAIN:$PUTER_PORT once the puter container is healthy."
log "first-boot admin password is logged once — grab it with:"
log " cd $PUTER_DIR && docker compose logs puter | grep password"
-26
View File
@@ -1,26 +0,0 @@
{
"ignore": ["**/!(*.js|*.css)", "**/assets/**"],
"license": "doc/license_header.txt",
"licenseFormats": {
"js": {
"prepend": "/*",
"append": " */",
"eachLine": {
"prepend": " * "
}
},
"dotfile|^Dockerfile": {
"eachLine": {
"prepend": "# "
}
},
"css": {
"prepend": "/*",
"append": " */",
"eachLine": {
"prepend": " * "
}
}
},
"trailingWhitespace": "TRIM"
}
+135
View File
@@ -0,0 +1,135 @@
# Reverse proxy in front of Puter — mirrors what the prod ALB does:
# accepts every Host header, forwards to the Puter container, and lets
# the Puter app handle subdomain-based routing internally (api.*,
# site.*, app.*, etc).
#
# To enable TLS:
# 1. Drop your fullchain.pem + privkey.pem into ./puter/tls/.
# 2. Uncomment the 443 server{} block below.
# 3. Update server_name to your domain (and wildcard subdomains).
worker_processes auto;
events {
worker_connections 4096;
}
http {
# Required for Puter's WebSocket / socket.io upgrades.
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
# Rough size cap that mirrors prod ALB defaults; tune for your
# uploads. Puter chunks large uploads, so 1 GiB per request is plenty.
client_max_body_size 1024m;
proxy_read_timeout 600s;
proxy_send_timeout 600s;
proxy_buffering off;
server_tokens off;
upstream puter_backend {
server puter:4100;
keepalive 32;
}
upstream s3_backend {
# RustFS — see `s3` service in docker-compose.full.yml. Browsers
# PUT/GET here for presigned-URL uploads / downloads. Routed via
# the `s3.<domain>` subdomain so signature verification works
# (Host header preserved end-to-end) and so HTTPS stays clean
# (no mixed-content from a port-9000 host publish).
server s3:9000;
keepalive 32;
}
# ── HTTP (port 80) ─────────────────────────────────────────────
server {
listen 80;
listen [::]:80;
server_name ~^s3\.;
location / {
proxy_pass http://s3_backend;
proxy_http_version 1.1;
# Critical: preserve the original Host so RustFS validates
# the request against the same host the URL was signed for.
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
# Note: when you enable TLS, replace this block with a redirect:
# return 301 https://$host$request_uri;
location / {
proxy_pass http://puter_backend;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
}
# ── HTTPS (port 443) — uncomment after dropping certs in ./puter/tls/ ─
# server {
# listen 443 ssl;
# listen [::]:443 ssl;
# http2 on;
# server_name ~^s3\.;
#
# ssl_certificate /etc/nginx/tls/fullchain.pem;
# ssl_certificate_key /etc/nginx/tls/privkey.pem;
# ssl_protocols TLSv1.2 TLSv1.3;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_session_cache shared:SSL:10m;
# ssl_session_timeout 10m;
#
# location / {
# proxy_pass http://s3_backend;
# proxy_http_version 1.1;
# proxy_set_header Host $host;
# proxy_set_header X-Real-IP $remote_addr;
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# proxy_set_header X-Forwarded-Proto $scheme;
# }
# }
#
# server {
# listen 443 ssl default_server;
# listen [::]:443 ssl default_server;
# http2 on;
# server_name _;
#
# ssl_certificate /etc/nginx/tls/fullchain.pem;
# ssl_certificate_key /etc/nginx/tls/privkey.pem;
# ssl_protocols TLSv1.2 TLSv1.3;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_session_cache shared:SSL:10m;
# ssl_session_timeout 10m;
#
# location / {
# proxy_pass http://puter_backend;
# proxy_http_version 1.1;
# proxy_set_header Host $host;
# proxy_set_header X-Real-IP $remote_addr;
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# proxy_set_header X-Forwarded-Proto $scheme;
# proxy_set_header X-Forwarded-Host $host;
# proxy_set_header X-Forwarded-Port $server_port;
# proxy_set_header Upgrade $http_upgrade;
# proxy_set_header Connection $connection_upgrade;
# }
# }
}
Loaded 100 of 2136 files, more files were not shown because too many files have changed in this diff. Show more