Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
105 commits
Select commit Hold shift + click to select a range
b9ca174
docs(devlog): plan opt-in telemetry and the opencodex.me usage dashboard
lidge-jun Nov 7, 2026
0c542de
feat(telemetry): add shared wire contract, config schema, and core te…
lidge-jun Nov 7, 2026
643dd4f
feat(telemetry): add management API routes, CLI commands, and consent…
lidge-jun Nov 7, 2026
c47ff3d
test(telemetry): add client telemetry test suite and structure ownership
lidge-jun Nov 7, 2026
b5eddc3
fix(telemetry): remove state installId leak, harden writes, and prese…
lidge-jun Nov 7, 2026
f1dd803
feat(gui): add telemetry consent popup, Proxy details toggle, and pay…
lidge-jun Nov 7, 2026
9bb2856
fix(gui): prevent stacked telemetry dialogs, restore preview focus, a…
lidge-jun Nov 7, 2026
f16231e
feat(telemetry-collector): add Cloudflare Worker + D1 collector and s…
lidge-jun Nov 7, 2026
03cddb6
fix(telemetry-collector): enforce streaming bounds, atomic D1 rollups…
lidge-jun Nov 7, 2026
16eeb10
test(cli): map the GUI telemetry routes to ocx telemetry in the headl…
lidge-jun Nov 7, 2026
62aa4c5
Merge branch 'goat/telemetry-03-gui-consent' into goat/telemetry-04-c…
lidge-jun Nov 7, 2026
57108f5
docs(telemetry): add telemetry privacy guide and configuration reference
lidge-jun Nov 7, 2026
e9a2aba
docs(telemetry): address review findings and localize dashboard/serve…
lidge-jun Nov 7, 2026
3e4597d
docs(devlog): record PR review round 1 decisions for the telemetry stack
lidge-jun Nov 7, 2026
5b6092c
fix(gui): drop notice write on dismiss and show previewEligible false…
lidge-jun Nov 7, 2026
d8fc29c
docs(telemetry): apply D1-D19 review round decisions across guide, re…
lidge-jun Nov 7, 2026
057c57e
fix(telemetry-collector): fold small cohorts, add avgDailyActiveInsta…
lidge-jun Nov 7, 2026
9e0284d
fix(telemetry): apply review round 1 client core, consent, and privac…
lidge-jun Nov 7, 2026
64ac26a
Merge layer 1 review-round plan into layer 2
lidge-jun Nov 7, 2026
ea8175f
Merge layer 2 review-round fixes into layer 3
lidge-jun Nov 7, 2026
5401960
Merge layer 3 review-round fixes into layer 4
lidge-jun Nov 7, 2026
4ebb3c1
Merge layer 4 review-round fixes into layer 5
lidge-jun Nov 7, 2026
8f0b86e
test(telemetry): prove env opt-out days of a long-running proxy are n…
lidge-jun Nov 8, 2026
a09bb51
fix(telemetry): keep a long-running env opt-out period ineligible unt…
lidge-jun Nov 8, 2026
b6c9314
docs(devlog): plan the env opt-out marker, privacy statement files, a…
lidge-jun Nov 8, 2026
88c5586
Merge layer 1 plan update into layer 2
lidge-jun Nov 8, 2026
48b9ef8
Merge layer 02 env opt-out fix and plan update into layer 03
lidge-jun Nov 8, 2026
9ff969e
Merge layer 03 env opt-out fix and plan update into layer 04
lidge-jun Nov 8, 2026
7d5d99f
Merge layer 04 env opt-out fix and plan update into layer 05
lidge-jun Nov 8, 2026
5b8e9d6
docs(telemetry): say that every day of an env opt-out period stays un…
lidge-jun Nov 8, 2026
11a0f8f
test(telemetry): pin that an unreachable or undeployed collector fail…
lidge-jun Nov 8, 2026
0048db9
Merge layer 02 collector-failure test into layer 03
lidge-jun Nov 8, 2026
845c4d7
Merge layer 03 collector-failure test into layer 04
lidge-jun Nov 8, 2026
4b382aa
Merge layer 04 collector-failure test into layer 05
lidge-jun Nov 8, 2026
ed53c2e
test(telemetry): prove zero sends before noticeShownAt across ten und…
lidge-jun Nov 8, 2026
b4dd934
fix(telemetry): let ocx telemetry disable create config.json on a fre…
lidge-jun Nov 8, 2026
4ba7d13
feat(desktop): Windows installer page to disclose telemetry and opt o…
lidge-jun Nov 8, 2026
0e3c03a
docs(devlog): record the owner's SignPath decision (D21) and the Wind…
lidge-jun Nov 8, 2026
3fe3652
Merge layer 1 SignPath decision into layer 2
lidge-jun Nov 8, 2026
f8e78a2
Merge layer 2 into layer 2b
lidge-jun Nov 8, 2026
dd040f0
Merge layer 02b (installer opt-out, fresh-install decline, zero-send …
lidge-jun Nov 8, 2026
d022657
Merge layer 03 (installer opt-out, fresh-install decline, zero-send t…
lidge-jun Nov 8, 2026
6dbee9c
Merge layer 04 (installer opt-out, fresh-install decline, zero-send t…
lidge-jun Nov 8, 2026
e63fb2e
docs(telemetry): list the Windows installer checkbox among the ways t…
lidge-jun Nov 8, 2026
04abd39
fix(telemetry): hold a pre-config decision instead of creating config…
lidge-jun Nov 8, 2026
6d387ff
docs(telemetry): match the privacy statement and AGENTS_INSTALL to th…
lidge-jun Nov 8, 2026
b053cd5
Merge layer 2 round-3 fixes into layer 2b, and harden the installer o…
lidge-jun Nov 8, 2026
6d696c7
Merge layer 2b round-3 fixes into layer 3
lidge-jun Nov 8, 2026
0b91aa5
fix(gui): start the consent dialog's focus on its heading and re-read…
lidge-jun Nov 8, 2026
746274c
fix(telemetry-collector): apply the cohort threshold per day on disti…
lidge-jun Nov 8, 2026
5f0e29c
fix(config): keep a telemetry decision on disk through a live setting…
lidge-jun Nov 8, 2026
3b8a901
docs(telemetry-collector): describe the per-day distinct-install thre…
lidge-jun Nov 8, 2026
5b88d16
fix(telemetry): keep a running opted-out proxy's days unsent, fail cl…
lidge-jun Nov 8, 2026
1fb26f9
Merge layer 2 round-3 fixes (live save, opt-out owners, state module)…
lidge-jun Nov 8, 2026
5ded863
fix(desktop): make the installer opt-out machine-wide, keep it throug…
lidge-jun Nov 8, 2026
c2eeae7
Merge layer 2b round-3 fixes into layer 3
lidge-jun Nov 8, 2026
3a011c8
docs(structure): record the dashboard consent popup's rules
lidge-jun Nov 8, 2026
64017f3
Merge layer 3 round-3 fixes into layer 4
lidge-jun Nov 8, 2026
d576dc4
docs(devlog): record that installer-less installs rely on the first-r…
lidge-jun Nov 8, 2026
b823dba
Merge layer 4 round-3 fixes into layer 5
lidge-jun Nov 8, 2026
b66bb7e
docs(telemetry): match the guide to round-3 behavior and fix the roun…
lidge-jun Nov 8, 2026
7aee518
fix(config,telemetry): carry validated on-disk consent through every …
lidge-jun Nov 8, 2026
98af425
Merge layer 2 save-path hardening into layer 2b
lidge-jun Nov 8, 2026
bc5cbe8
fix(desktop): keep a carried installer choice's stamp, compare optout…
lidge-jun Nov 8, 2026
c9443b1
fix(desktop): issue a new installer stamp only when the page changes …
lidge-jun Nov 8, 2026
8cf6ad2
Merge branch 'goat/telemetry-02b-msi-choice' into goat/telemetry-03-g…
lidge-jun Nov 8, 2026
236188d
Merge branch 'goat/telemetry-03-gui-consent' into goat/telemetry-04-c…
lidge-jun Nov 8, 2026
e6d9fdb
Merge branch 'goat/telemetry-04-collector' into goat/telemetry-05-docs
lidge-jun Nov 8, 2026
ab92292
docs(telemetry-collector): document that forged reports can lift a re…
lidge-jun Nov 8, 2026
8aa3296
docs(telemetry): service environment note, forged-cohort residual, an…
lidge-jun Nov 8, 2026
e316625
fix(gui): focus the consent heading after showModal, align the popup …
lidge-jun Nov 8, 2026
5ddf73c
Merge branch 'goat/telemetry-03-gui-consent' into goat/telemetry-04-c…
lidge-jun Nov 8, 2026
9179c5e
Merge branch 'goat/telemetry-04-collector' into goat/telemetry-05-docs
lidge-jun Nov 8, 2026
12d45a3
fix(telemetry): never overwrite an unreadable state file after a send…
lidge-jun Nov 8, 2026
c7215bc
Merge branch 'goat/telemetry-02-client-core' into goat/telemetry-02b-…
lidge-jun Nov 8, 2026
0a0ea74
docs(privacy): name the per-day install hash in the privacy statement
lidge-jun Nov 8, 2026
22391f9
Merge branch 'goat/telemetry-02-client-core' into goat/telemetry-02b-…
lidge-jun Nov 8, 2026
94e15a6
fix(desktop): keep the carried stamp after Back and Next, fail closed…
lidge-jun Nov 8, 2026
2223fe7
Merge branch 'goat/telemetry-02b-msi-choice' into goat/telemetry-03-g…
lidge-jun Nov 8, 2026
9b9a12c
fix(gui): say when a saved telemetry choice could not be read back, a…
lidge-jun Nov 8, 2026
0b31906
Merge branch 'goat/telemetry-03-gui-consent' into goat/telemetry-04-c…
lidge-jun Nov 8, 2026
a28b56b
Merge branch 'goat/telemetry-04-collector' into goat/telemetry-05-docs
lidge-jun Nov 8, 2026
02524d4
docs(telemetry): name the per-day install hash in the privacy stateme…
lidge-jun Nov 8, 2026
a9cd848
Merge branch 'goat/telemetry-02b-msi-choice' into goat/telemetry-03-g…
lidge-jun Nov 8, 2026
e8f8662
fix(desktop): schedule the installer's default choice after an action…
lidge-jun Nov 8, 2026
7bea255
fix(gui): list the release channel and first-report flag in the popup…
lidge-jun Nov 8, 2026
0349c4f
Merge branch 'goat/telemetry-04-collector' into goat/telemetry-05-docs
lidge-jun Nov 8, 2026
af26e03
Merge branch 'goat/telemetry-03-gui-consent' into goat/telemetry-04-c…
lidge-jun Nov 8, 2026
9e26c1d
docs(telemetry): note that a background service follows a later insta…
lidge-jun Nov 8, 2026
37d09e9
fix(config,telemetry): a save that creates config.json never introduc…
lidge-jun Nov 8, 2026
156301c
Merge branch 'goat/telemetry-02-client-core' into goat/telemetry-02b-…
lidge-jun Nov 8, 2026
aab8573
Merge branch 'goat/telemetry-02b-msi-choice' into goat/telemetry-03-g…
lidge-jun Nov 8, 2026
f4501a1
fix(gui): a Continue whose request drops reads the status back before…
lidge-jun Nov 8, 2026
e92e339
Merge branch 'goat/telemetry-03-gui-consent' into goat/telemetry-04-c…
lidge-jun Nov 8, 2026
010556e
Merge branch 'goat/telemetry-04-collector' into goat/telemetry-05-docs
lidge-jun Nov 8, 2026
cb3398e
fix(desktop): compare every installer condition explicitly, so a carr…
lidge-jun Nov 8, 2026
6bdca15
Merge branch 'goat/telemetry-02b-msi-choice' into goat/telemetry-03-g…
lidge-jun Nov 8, 2026
374782a
Merge branch 'goat/telemetry-03-gui-consent' into goat/telemetry-04-c…
lidge-jun Nov 8, 2026
d5cb64f
Merge branch 'goat/telemetry-04-collector' into goat/telemetry-05-docs
lidge-jun Nov 8, 2026
d6fc2e2
fix(desktop): allow Windows-only installer telemetry items to be unus…
lidge-jun Nov 8, 2026
d496b18
Merge branch 'goat/telemetry-02b-msi-choice' into goat/telemetry-03-g…
lidge-jun Nov 8, 2026
fb7a18a
Merge branch 'goat/telemetry-03-gui-consent' into goat/telemetry-04-c…
lidge-jun Nov 8, 2026
4be582b
Merge branch 'goat/telemetry-04-collector' into goat/telemetry-05-docs
lidge-jun Nov 8, 2026
23b9307
Merge remote-tracking branch 'origin/dev' into goat/telemetry-05-docs
lidge-jun Nov 9, 2026
4c48c05
docs(structure): keep this layer's tick wording after merging dev
lidge-jun Nov 9, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -502,7 +502,7 @@ Free code signing provided by [SignPath.io](https://about.signpath.io/), certifi

- Committers and reviewers: [lidge-jun](https://github.com/lidge-jun)
- Approvers: [lidge-jun](https://github.com/lidge-jun)
- Privacy: OpenCodex sends one anonymous daily usage summary (a per-day install hash that changes daily, version, release channel, platform, install channel, provider kind, coarse model family, active minutes and request, token and error counts; never prompts, outputs, keys, accounts, hosts or paths) to `telemetry.opencodex.me` only after the person installing or operating it has seen the notice (dashboard popup or interactive CLI prompt) and has not declined; it can be turned off in that notice, in the Windows installer (a "Send anonymous usage statistics" checkbox, checked by default) and anytime with `ocx telemetry disable`, `OCX_TELEMETRY=0`, `DO_NOT_TRACK=1` or Proxy details; project-wide aggregates are public; otherwise data goes only where the user configures.
- Privacy: opencodex sends one anonymous daily usage summary (a per-day install hash that changes daily, version, release channel, platform, install channel, provider kind, coarse model family, active minutes and request, token and error counts; never prompts, model outputs, keys, accounts, hostnames or paths) to telemetry.opencodex.me, and only after the person installing or operating it has seen the notice in the dashboard or an interactive CLI prompt and has not declined. It can be turned off in that notice, in the Windows installer ("Send anonymous usage statistics", checked by default), in Proxy details, or with ocx telemetry disable, OCX_TELEMETRY=0 or DO_NOT_TRACK=1. Project-wide aggregates are public. Everything else goes only to the providers and services you configure. See the [telemetry guide](https://opencodex.me/guides/telemetry/).

## Disclaimer

Expand Down
1 change: 1 addition & 0 deletions docs-site/astro.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,7 @@ export default defineConfig({
{ label: "Image Bridge", translations: { fr: "Pont d’images", ko: "이미지 브릿지", "zh-CN": "图像桥接", "zh-TW": "圖像橋接", ru: "Image Bridge", ja: "画像ブリッジ", tr: "Image Bridge" }, slug: "guides/image-bridge" },
{ label: "Video Bridge", translations: { fr: "Pont vidéo", ko: "비디오 브릿지", "zh-CN": "视频桥接", "zh-TW": "影片橋接", ru: "Video Bridge", ja: "動画ブリッジ", tr: "Video Bridge" }, slug: "guides/video-bridge" },
{ label: "Web Dashboard", translations: { fr: "Tableau de bord web", ko: "웹 대시보드", "zh-CN": "网页控制台", "zh-TW": "網頁儀表板", ru: "Веб-дашборд", ja: "ウェブダッシュボード", tr: "Web Kontrol Paneli" }, slug: "guides/web-dashboard" },
{ label: "Telemetry & Privacy", translations: { fr: "Télémétrie et confidentialité", ko: "텔레메트리 및 개인정보", "zh-CN": "遥测与隐私", "zh-TW": "遙測與隱私", ru: "Телеметрия и конфиденциальность", ja: "テレメトリとプライバシー", tr: "Telemetri ve Gizlilik" }, slug: "guides/telemetry" },
{ label: "Sub-agent Surface", translations: { fr: "Interface des sous-agents", ko: "서브에이전트 서피스", "zh-CN": "子代理界面", "zh-TW": "子代理介面", ru: "Интерфейс подагентов", ja: "サブエージェントサーフェス", tr: "Alt Ajan Arayüzü" }, slug: "guides/sub-agent-surface" },
{ label: "Why v1 Is the Default", translations: { fr: "Pourquoi v1 est la valeur par défaut", ko: "v1이 기본값인 이유", "zh-CN": "为什么默认是 v1", "zh-TW": "為什麼預設是 v1", ru: "Почему v1 по умолчанию", ja: "v1 がデフォルトである理由", tr: "Neden varsayılan v1" }, slug: "guides/subagent-v1-default" },
],
Expand Down
1 change: 1 addition & 0 deletions docs-site/src/content/docs/fr/guides/web-dashboard.md
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ force jamais d'actualisation en amont.
| **Sécurité au démarrage** | Vérifiez si le routage Codex injecté résiste à un redémarrage, avec des états distincts pour le service et le lanceur intermédiaire, ainsi que les commandes de réparation exactes. |
| **Zone de notification Windows** | Installez au niveau de l'utilisateur un contrôleur lancé à la connexion pour démarrer, arrêter ou redémarrer le proxy en un clic, ouvrir le tableau de bord et consulter l'état. Ce contrôleur n'est pas un service de redémarrage du proxy. |
| **Démarrage automatique de Codex** | Autorisez un lanceur intermédiaire Codex déjà installé à exécuter `ocx ensure`. Ce commutateur n'installe ni lanceur ni service d'arrière-plan. |
| **Télémétrie** | Activez ou désactivez **Partager des statistiques d'utilisation anonymes** et consultez **Aperçu du JSON** dans **Détails du proxy** (`#proxy-telemetry`). Lors du premier lancement ou après une mise à jour sans décision enregistrée, la fenêtre de consentement n'enregistre un choix que lorsque vous cliquez sur **Continuer** (`PUT /api/telemetry`) ; la fermer n'enregistre rien. Voir [Télémétrie et confidentialité](/fr/guides/telemetry/). |
| **Fournisseurs** | Ajoutez, modifiez, activez, désactivez ou supprimez des fournisseurs, définissez le fournisseur par défaut parmi ceux activés et gérez, lorsqu'ils sont pris en charge, les groupes de comptes OAuth et de clés API. Si le fournisseur par défaut actuel est supprimé, le premier fournisseur activé restant prend sa place ; s'il n'en reste aucun, la suppression est refusée et le fournisseur par défaut actuel est conservé. Les réglages d'un fournisseur peuvent désactiver la découverte dynamique pour les points de terminaison dont le catalogue `/models` est absent, lent ou trop volumineux. Pour les groupes OAuth Claude (Anthropic), chaque compte connecté affiche ses propres barres de limites sur 5 heures et une semaine — l'utilisation est propre à chaque identifiant. En cas d'échec d'une sonde, les dernières barres connues sont conservées et marquées indisponibles jusqu'à la prochaine actualisation réussie. |
| **Ajouter un fournisseur** | Recherchez dans les préréglages du registre une connexion par compte, un service à clé API, un serveur local ou un point de terminaison personnalisé. |
| **Authentification Codex** | Ajoutez des comptes ChatGPT/Codex au groupe, sélectionnez le compte de la prochaine session, actualisez les quotas sur 5 h, une semaine et 30 jours, activez ou désactivez le changement automatique selon les quotas, réglez son seuil de 1 à 100 % et configurez le basculement en cas de défaillance transitoire. |
Expand Down
30 changes: 30 additions & 0 deletions docs-site/src/content/docs/fr/reference/configuration/server.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ exécute des fonctionnalités d'assistance autour des demandes du fournisseur.
| `webSearchSidecar?` | `OcxWebSearchSidecarConfig` | activé lorsqu'il est utilisable | Options du service auxiliaire de recherche Web. |
| `visionSidecar?` | `OcxVisionSidecarConfig` | activé lorsqu'il est utilisable | Options du service auxiliaire de description d'images. |
| `images?` | `OcxImagesConfig` | sélection automatique OpenAI | Options de relais d'images autonomes pour Codex `image_gen`. |
| `telemetry?` | `OcxTelemetryConfig` | activé par défaut après information d'un humain | État du consentement à la télémétrie quotidienne anonyme (`decision`, `decidedAt`, `noticeShownAt`). Rien n'est envoyé tant qu'une personne n'a pas vu l'avis ou donné son accord. Remplacé par `OCX_TELEMETRY=0` ou `DO_NOT_TRACK=1`. Voir [Télémétrie (`telemetry`)](#télémétrie-telemetry) et [Télémétrie et confidentialité](/fr/guides/telemetry/). |

Si une ancienne version de développement a modifié les métadonnées de l'historique de reprise avant que la prise en charge de la sauvegarde n'existe, exécutez
`ocx recover-history --legacy-openai --yes` pour forcer la récupération du fournisseur natif.
Expand Down Expand Up @@ -155,6 +156,35 @@ La commande `ssh -L` simple écoute sur votre interface de bouclage locale et co
`0.0.0.0`. Liez explicitement avec `ssh -L 127.0.0.1:20100:localhost:10100` en cas de doute.
:::

## Télémétrie (`telemetry`)

La télémétrie d'utilisation quotidienne anonyme n'est activée par défaut qu'après qu'une personne a vu l'avis d'information (dans la fenêtre du tableau de bord ou une invite de terminal interactif). Le bloc `telemetry` dans `config.json` enregistre cet état de consentement :

```json
{
"telemetry": {
"decision": "accepted",
"decidedAt": "2026-11-07T09:00:00.000Z",
"noticeShownAt": "2026-11-07T09:00:00.000Z"
}
}
```

| Champ | Type | Par défaut | Signification |
| --- | --- | --- | --- |
| `telemetry.decision?` | `"accepted" \| "declined"` | non défini (indécis) | Choix explicite de l'utilisateur. `"declined"` désactive la télémétrie et supprime `<OPENCODEX_HOME>/telemetry-id.json` ; `"accepted"` active les rapports quotidiens. |
| `telemetry.decidedAt?` | `string` (ISO 8601) | non défini | Horodatage UTC de l'enregistrement de `decision`. Seuls les jours calendaires UTC complets strictement postérieurs au jour UTC de `decidedAt ?? noticeShownAt` (`day > formatUtcDay(decidedAt ?? noticeShownAt)`) sont envoyés ; le jour du consentement et les jours antérieurs ne sont jamais envoyés rétroactivement. |
| `telemetry.noticeShownAt?` | `string` (ISO 8601) | non défini | Horodatage UTC auquel un humain a vu l'avis dans le tableau de bord web ou un terminal interactif. Lorsque `decision` n'est pas défini, la télémétrie n'envoie de rapport que si `noticeShownAt` est défini (`default-on`) ; sans lui, le proxy reste en `awaiting-notice`. |

Le point de terminaison du collecteur (`https://telemetry.opencodex.me/v1/events`) est une constante du code et ne peut pas être configuré dans `config.json`.

Deux variables d'environnement remplacent `config.json` et désactivent immédiatement la télémétrie sans modifier `config.json` (observer l'une d'elles au démarrage ou lors d'un cycle enregistre aussi `ineligibleThroughDay` dans `<OPENCODEX_HOME>/telemetry-state.json` et supprime `<OPENCODEX_HOME>/telemetry-id.json`, de sorte que ces jours ne sont jamais envoyés ultérieurement) :

- `OCX_TELEMETRY=0` (accepte aussi `false`, `off` ou `no`, insensible à la casse)
- `DO_NOT_TRACK=1` (accepte aussi `true` ou `yes`, insensible à la casse)

`ocx config set telemetry` et `ocx config unset telemetry` sont refusés, et `ocx config import` ignore tout bloc `telemetry` importé pour tous les appelants en préservant l'état existant ; utilisez plutôt `ocx telemetry enable` (nécessite un terminal humain interactif avec invite de confirmation, sinon échoue avec `agent_consent_required` / `tty_required`), `ocx telemetry disable`, `ocx telemetry status [--json]` ou le commutateur **Détails du proxy** du tableau de bord. Voir [Télémétrie et confidentialité](/fr/guides/telemetry/) pour le schéma complet et la politique de conservation.

## Nettoyage du stockage

`storageCleanupPolicy` est désactivé par défaut. Lorsqu'il est activé, il s'exécute selon `startup`, `daily`, `weekly`
Expand Down
Loading
Loading