Commit graph

767 commits

Author SHA1 Message Date
github-actions[bot]
8da7042ae0
Release HyperDX (#1013)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-07-28 01:20:14 -07:00
Mike Shi
c98057daf0
Update contributing.md with unit test docs (#1022) 2025-07-25 17:18:58 +00:00
Mike Shi
61c79a16a4
fix: Ensure percentile aggregations on histograms dont create invalid SQL queries due to improperly escaped aliases. (#1021)
Closes #1020
Closes HDX-2063

<img width="1855" height="897" alt="image" src="https://github.com/user-attachments/assets/5f7f0505-934c-4da0-8e46-f07aa5035455" />
2025-07-25 17:15:37 +00:00
Warren
6c134035c4
fix: use '--kill-others-on-fail' to prevent processes from terminating when RUN_SCHEDULED_TASKS_EXTERNALLY is enabled (#1015)
Ref: HDX-2044

Co-authored-by: Dan Hable <418679+dhable@users.noreply.github.com>
2025-07-24 21:56:38 +00:00
Dan Hable
bb37520541
feat: Auto-link correlated sources bidirectionally (#990)
Automatically maintain bidirectional relationships between correlated sources. When a user selects a correlated source (e.g., Log → Metric), the target source is updated to link back (Metric → Log) if not already linked.

- Works for both new and existing sources
- Preserves existing correlations (no overwriting)
- Improves data consistency across the application
2025-07-24 15:41:56 +00:00
Warren
4ce81d42b0
fix: handle Nullable + Tuple type column + decouple useRowWhere (#1008)
Ref: HDX-1939
2025-07-23 18:44:02 +00:00
Warren
21b5df66aa
fix: prevent the app from crashing due to a strict mode exception (#1011)
The api throws 504 and hangs when invalid credentials are given on login page.
> {"level":"error","message":"'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them","name":"TypeError","stack":"TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them\n    at i (/app/packages/api/index.js:335:35331)\n    at new i (/app/packages/api/index.js:335:35235)\n    at PBKDF2Job.<anonymous> (/app/packages/api/index.js:335:38225)\n    
at job.ondone (node:internal/crypto/pbkdf2:56:12)"

The root cause is due to the strict mode enforced by the esbuild. The fix here is to fork the `passport-local-mongoose` and fix the part that causes the error (edb1149704)

Ref: HDX-2036
2025-07-23 17:55:03 +00:00
github-actions[bot]
c8729b8479
Release HyperDX (#1001)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-07-21 09:22:05 -07:00
Mike Shi
10abadd30e
feat: Add verbose time range used for search in results table (#1004)
<img width="1040" height="317" alt="image" src="https://github.com/user-attachments/assets/ec91cfd4-8344-434c-85ce-66737e274348" />
<img width="1162" height="340" alt="image" src="https://github.com/user-attachments/assets/d74902ba-9e85-4513-9738-a36337e4af02" />
2025-07-17 17:12:24 +00:00
Aaron Knudtson
4581a68a0b
fix: queries firing before having a table or connection id (#1003) 2025-07-16 11:30:25 -05:00
Aaron Knudtson
86f5fa7d2c
fix: add delete case for both authorization spellings (#1002) 2025-07-16 10:47:36 -05:00
Mike Shi
33fc071dfa
feat: Allow users to define custom column aliases for charts (#996)
<img width="1337" height="988" alt="image" src="https://github.com/user-attachments/assets/80d83541-3fa9-4ebb-b54c-3caccbd86e90" />

Resolves HDX-1719
2025-07-15 14:08:29 +00:00
Mike Shi
2741646c80
feat: Update Cloud CTA to ClickHouse Cloud (#997)
<img width="220" height="150" alt="image" src="https://github.com/user-attachments/assets/d1f16f19-86c1-4905-a4f4-5be2be1d007e" />

Resolves HDX-1950
2025-07-15 14:04:58 +00:00
Mike Shi
40d0439ce8
feat: Allow pinning a field in the filter panel (#998)
<img width="1080" height="776" alt="image" src="https://github.com/user-attachments/assets/fbc19329-432d-400d-8dcb-ea70da4c79ab" />

Resolves HDX-1866
2025-07-15 14:00:50 +00:00
Mike Shi
b9ad3bdbd2
fix: Limit source selector to only display the supported types in search, sessions and dashboards (#999)
<img width="337" height="197" alt="image" src="https://github.com/user-attachments/assets/fe331efc-59a8-475e-aab3-7dcbd0001097" />

No more metrics in search! or logs in APM panel, etc.

Resolves HDX-1400
2025-07-15 13:45:51 +00:00
Mike Shi
9ec259490a
Update CONTRIBUTING.md (#1000) 2025-07-14 18:03:54 -07:00
github-actions[bot]
8bbc5f4398
Release HyperDX (#979)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-07-12 11:11:32 -07:00
Tom Alexander
a4f2afa539
fix: Add samesite to cookies for better security (#992)
Fixes HDX-1920
2025-07-11 15:56:44 +00:00
Mike Shi
973b9e8d0a
feat: Add any aggFn support, fix select field input not showing up (#991)
Closes HDX-2011

Co-authored-by: Tom Alexander <3245235+teeohhem@users.noreply.github.com>
2025-07-11 14:20:09 +00:00
Aaron Knudtson
f7eb1ef28c
feat: configurable search row limit (#987) 2025-07-10 10:26:26 -05:00
Warren
d617841a9f
ci: use HYPERDX_INTERNAL_TOKEN for notify_helm_charts step (#986) 2025-07-09 14:26:20 +00:00
Aaron Knudtson
8b0b070377
fix: set value to emptystring when undefined (#980) 2025-07-08 20:44:55 -05:00
Warren
83aa3d3f58
ci: update release scripts to prevent tag overrides (#977)
Ref: HDX-1976

1. Updated release-xxx commands to prevent image tag overrides
2. Updated release workflow so that notify-xxx steps won't be triggered if no new app image was pushed
2025-07-08 18:49:57 +00:00
Spencer Torres
844f74c2ce
fix: validate name for saved searches (#964) 2025-07-08 13:03:59 -04:00
github-actions[bot]
7a14dea07a
Release HyperDX (#970)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-07-06 23:14:43 -07:00
Mike Shi
ecb0f2c889
feat: Add JSON support to all in one build (#972) 2025-07-03 22:54:59 +00:00
Warren
808145b623
feat: specify NODE_ENV in api build (prod stage) (#971) 2025-07-03 22:39:39 +00:00
Mike Shi
52ca1823a4
feat: Add ClickHouse JSON Type Support (#969)
- Upgrades ClickHouse to 25.6, fixes breaking config change, needed for latest JSON type
- Upgrades OTel Collector to 0.129.1, fixes breaking config change, needed for latest JSON support in exporter
- Upgrades OTel OpAMP Supervisor to 0.128.0
- Fixes features to support JSON type columns in OTel in HyperDX (filtering, searching, graphing, opening rows, etc.)

Requires users to set `BETA_CH_OTEL_JSON_SCHEMA_ENABLED=true` in `ch-server` and `OTEL_AGENT_FEATURE_GATE_ARG='--feature-gates=clickhouse.json'` in `otel-collector` to enable JSON schema. Users must start a new ClickHouse DB or migrate their own table manually to enable as it is not schema compatible and migration is not automatic.

Closes HDX-1849, HDX-1969, HDX-1849, HDX-1966, HDX-1964

Co-authored-by: Tom Alexander <3245235+teeohhem@users.noreply.github.com>
2025-07-03 17:11:03 +00:00
Warren
8fb3db3cc5
fix: api + app's individual build (#961) 2025-07-03 15:44:10 +00:00
github-actions[bot]
26e5bd7df7
Release HyperDX (#946)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-06-27 13:28:17 -07:00
Warren
f5cbfff0e7
ci: trigger helm-charts update-app-version workflow after release (#925) 2025-06-27 16:05:59 +00:00
Aaron Knudtson
93e36b5581
fix: connection creation revamp (#947)
Fixes HDX-1926
2025-06-26 15:08:47 +00:00
Tom Alexander
a06c8cdb9d
feat: Add download csv functionality to search tables (#939)
Adds a download icon that allows users to download a csv of results. Note: In v1, this was a gear icon that brought up a modal with a few different search options, including adding additional columns. Since that functionality doesn't exist in v2 yet, I thought it was best to just have a direct icon for now.

![image](https://github.com/user-attachments/assets/f6c71d0e-951e-4cc8-a2af-489c03a53598)


Fixes: HDX-1590
2025-06-26 14:31:53 +00:00
Aaron Knudtson
b75d7c0595
feat: add robust source form validation and error reporting (#923)
Co-authored-by: Tom Alexander <teeohhem@gmail.com>
2025-06-25 12:41:42 -04:00
Tom Alexander
d4db9fbc8f
chore: Run smoke tests on PR w/vercel link (#945)
Adds a github action that will properly wait for a vercel deploy link via github API

Fixes: HDX-1910
2025-06-25 13:36:21 +00:00
dependabot[bot]
295e99fff9
build(deps): bump pbkdf2 from 3.1.2 to 3.1.3 (#940)
Bumps [pbkdf2](https://github.com/crypto-browserify/pbkdf2) from 3.1.2 to 3.1.3.
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a href="https://github.com/browserify/pbkdf2/blob/master/CHANGELOG.md">pbkdf2's changelog</a>.</em></p>
<blockquote>
<h2><a href="https://github.com/browserify/pbkdf2/compare/v3.1.2...v3.1.3">v3.1.3</a> - 2025-06-20</h2>
<h3>Commits</h3>
<ul>
<li>Only apps should have lockfiles <a href="8b067308ee"><code>8b06730</code></a></li>
<li>[lint] fix whitespace <a href="9a76e2f37e"><code>9a76e2f</code></a></li>
<li>[lint] fix parens/curlies/semis/etc <a href="6fd84bf64a"><code>6fd84bf</code></a></li>
<li>[meta] add <code>auto-changelog</code> <a href="796c38d428"><code>796c38d</code></a></li>
<li>[Tests] fix tests in node 17 <a href="3661fb0156"><code>3661fb0</code></a></li>
<li>Revert &quot;[Tests] fix tests in node &lt; 3&quot; <a href="7431b57668"><code>7431b57</code></a></li>
<li>[Tests] fix tests in node &lt; 3 <a href="eb9f97a66e"><code>eb9f97a</code></a></li>
<li>[Fix] ensure unknown algorithms throw + known ones match node <a href="26d4fd391e"><code>26d4fd3</code></a></li>
<li>[Tests] add GHA, always run nyc <a href="513906a735"><code>513906a</code></a></li>
<li>[lint] fix a few more rules <a href="ab04da834a"><code>ab04da8</code></a></li>
<li>[lint] switch to eslint <a href="89694cf7e4"><code>89694cf</code></a></li>
<li>[Tests] add coverage <a href="d0d534bfdc"><code>d0d534b</code></a></li>
<li>[Refactor] use <code>to-buffer</code> <a href="e3102a8cd4"><code>e3102a8</code></a></li>
<li>[readme] improve badges <a href="fca0c9d4c5"><code>fca0c9d</code></a></li>
<li>[Tests] remove unused travis file <a href="a2c7d93bbc"><code>a2c7d93</code></a></li>
<li>[meta] switch from <code>files</code> to <code>npmignore</code> <a href="7f31fbca52"><code>7f31fbc</code></a></li>
<li>[Tests] use .nycrc <a href="8d628e8d55"><code>8d628e8</code></a></li>
<li>[Refactor] minor tweaks <a href="fc61005c8c"><code>fc61005</code></a></li>
<li>[Deps] update <code>create-hmac</code>, <code>safe-buffer</code>, <code>sha.js</code> <a href="ae2a7d051c"><code>ae2a7d0</code></a></li>
<li>[Fix] pin <code>create-hash</code>, <code>ripemd160</code> due to breaking changes <a href="e07996890a"><code>e079968</code></a></li>
<li>[Tests] fix tests in node 3 <a href="45fbcf3043"><code>45fbcf3</code></a></li>
<li>[meta] skip publishing benchmarks <a href="19ea57bf11"><code>19ea57b</code></a></li>
<li>[Dev Deps] add missing peer dep <a href="645e252375"><code>645e252</code></a></li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="3e40827b18"><code>3e40827</code></a> v3.1.3</li>
<li><a href="e3102a8cd4"><code>e3102a8</code></a> [Refactor] use <code>to-buffer</code></li>
<li><a href="7431b57668"><code>7431b57</code></a> Revert &quot;[Tests] fix tests in node &lt; 3&quot;</li>
<li><a href="19ea57bf11"><code>19ea57b</code></a> [meta] skip publishing benchmarks</li>
<li><a href="a2c7d93bbc"><code>a2c7d93</code></a> [Tests] remove unused travis file</li>
<li><a href="645e252375"><code>645e252</code></a> [Dev Deps] add missing peer dep</li>
<li><a href="796c38d428"><code>796c38d</code></a> [meta] add <code>auto-changelog</code></li>
<li><a href="d0d534bfdc"><code>d0d534b</code></a> [Tests] add coverage</li>
<li><a href="7f31fbca52"><code>7f31fbc</code></a> [meta] switch from <code>files</code> to <code>npmignore</code></li>
<li><a href="fca0c9d4c5"><code>fca0c9d</code></a> [readme] improve badges</li>
<li>Additional commits viewable in <a href="https://github.com/crypto-browserify/pbkdf2/compare/v3.1.2...v3.1.3">compare view</a></li>
</ul>
</details>
<details>
<summary>Maintainer changes</summary>
<p>This version was pushed to npm by <a href="https://www.npmjs.com/~ljharb">ljharb</a>, a new releaser for pbkdf2 since your current version.</p>
</details>
<br />


[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=pbkdf2&package-manager=npm_and_yarn&previous-version=3.1.2&new-version=3.1.3)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/hyperdxio/hyperdx/network/alerts).

</details>
2025-06-25 03:25:57 +00:00
github-actions[bot]
326e52ea04
Release HyperDX (#917)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-06-24 14:26:00 -07:00
Warren
73aff7742d
feat: Improve source editing UX (#944)
Restored https://github.com/hyperdxio/hyperdx/pull/805 which should be merged it into main

Co-authored-by: Ernest Iliiasov <20255948+ernestii@users.noreply.github.com>
2025-06-24 21:11:11 +00:00
Tom Alexander
993627fab6
chore: Use repository_dispatch event for post-deployment tests (#941)
Uses repository_dispatch trigger to kick off the stably tests so that we can grab the vercel url properly.
2025-06-24 20:44:35 +00:00
Warren
eb9d009772
feat: DBRowSidePanel global error boundary (#943)
Restored this PR https://github.com/hyperdxio/hyperdx/pull/856 which should be merged into main

Co-authored-by: Ernest Iliiasov <20255948+ernestii@users.noreply.github.com>
2025-06-24 19:26:50 +00:00
Aaron Knudtson
9191c11323
fix: disable nx daemon (#942) 2025-06-24 16:51:59 +00:00
Aaron Knudtson
ad6887796f
feat: bundle api for image size reduction (#937)
all-in-one image: 1.51 gb -> 1.21 gb
app image: 573 mb -> 271 mb

Ref HDX-1803
2025-06-24 15:51:34 +00:00
dependabot[bot]
b3b02b8325
build(deps): bump formidable from 2.1.2 to 2.1.5 (#918)
Bumps [formidable](https://github.com/node-formidable/formidable) from 2.1.2 to 2.1.5.
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a href="https://github.com/node-formidable/formidable/commits">compare view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=formidable&package-manager=npm_and_yarn&previous-version=2.1.2&new-version=2.1.5)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/hyperdxio/hyperdx/network/alerts).

</details>
2025-06-24 15:23:37 +00:00
Tom Alexander
2f211ccc63
chore: Add GH action for smoke tests (#938) 2025-06-23 22:22:09 -04:00
Aaron Knudtson
d1fc0c727a
fix: change NEXT_PUBLIC_SERVER_URL to SERVER_URL because it's not available on the frontend (#936) 2025-06-23 12:30:09 -04:00
dependabot[bot]
1ef1ed5caa
build(deps): bump next from 14.2.29 to 14.2.30 (#930)
Bumps [next](https://github.com/vercel/next.js) from 14.2.29 to 14.2.30.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/vercel/next.js/releases">next's releases</a>.</em></p>
<blockquote>
<h2>v14.2.30</h2>
<blockquote>
<p>[!NOTE]<br />
This release is backporting bug fixes. It does <strong>not</strong> include all pending features/changes on canary.</p>
</blockquote>
<h3>Core Changes</h3>
<ul>
<li>Backport <code>config.allowedDevOrigins</code> (<a href="https://redirect.github.com/vercel/next.js/issues/80410">#80410</a>) (<a href="https://nextjs.org/docs/app/api-reference/config/next-config-js/allowedDevOrigins">Learn More</a>)</li>
</ul>
<h3>Credits</h3>
<p>Huge thanks to <a href="https://github.com/ijjk"><code>@​ijjk</code></a> and <a href="https://github.com/ztanner"><code>@​ztanner</code></a> for helping!</p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="243072b7a8"><code>243072b</code></a> v14.2.30</li>
<li><a href="f523d4a142"><code>f523d4a</code></a> [backport]: config.allowedDevOrigins (<a href="https://redirect.github.com/vercel/next.js/issues/80410">#80410</a>)</li>
<li>See full diff in <a href="https://github.com/vercel/next.js/compare/v14.2.29...v14.2.30">compare view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=next&package-manager=npm_and_yarn&previous-version=14.2.29&new-version=14.2.30)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/hyperdxio/hyperdx/network/alerts).

</details>
2025-06-23 15:54:43 +00:00
Dan Hable
86fa929566
refactor: remove duplicate Connection type definition (#935)
Ref: HDX-1905
2025-06-20 20:09:12 +00:00
Aaron Knudtson
d1f4184536
perf: reduce DBSearchPage and DBChartExplorerPage rerenders from typing in search input (#924) 2025-06-20 10:12:23 -04:00
Tom Alexander
b427ae3526
fix: Update ch connection form to use password field (#929)
Fixes: HDX-1877
2025-06-18 22:46:51 +00:00
Aaron Knudtson
8ab3b42843
fix: fix play.hyperdx.io for those with stale demo instances (#926)
Fixes HDX-1835

I tested this by running the main branch first via `cd packages/app && yarn dev:local`, loading localhost:8080 and clicked demo servers, pasting the json from the HDX-1835 linear ticket into the `hdx-local-source` localStorage slot, verified some sources gave that permissions issue, then closed the tab. Then I checked out this branch, opened a new tab with localhost:8080, selected demo servers, and all demo sources work as expected
2025-06-12 22:07:05 +00:00