59 Commits
Author SHA1 Message Date
github-actions[bot] b32528a990 chore(extension): release 1.6.0
# [thingport-grab-v1.6.0](https://github.com/TautvydasDerzinskas/Thingport/compare/thingport-grab-v1.5.0...thingport-grab-v1.6.0) (2026-10-17)

### Bug Fixes

* **import:** stop flagging models that mention robots as a MakerWorld CAPTCHA, and let a manual retry try again ([#18](https://github.com/TautvydasDerzinskas/Thingport/issues/18)) ([d70dcfe](https://github.com/TautvydasDerzinskas/Thingport/commit/d70dcfeac2c788686728598c6d3c61b9f4cce369))
* skip a stale MakerWorld defaultInstanceId when picking the print profile ([#15](https://github.com/TautvydasDerzinskas/Thingport/issues/15)) ([d5ae809](https://github.com/TautvydasDerzinskas/Thingport/commit/d5ae80951cf69a9a4db118eee4f68d332f0af17a)), closes [#14](https://github.com/TautvydasDerzinskas/Thingport/issues/14)

### Features

* administration settings remake + OIDC support ([#49](https://github.com/TautvydasDerzinskas/Thingport/issues/49)) ([9a22386](https://github.com/TautvydasDerzinskas/Thingport/commit/9a2238691d8b079adf7bfb4becebc9cf01cb6cad))
* system notifications updates, Thingport grab in System health check, node 24+ ([#52](https://github.com/TautvydasDerzinskas/Thingport/issues/52)) ([358dfc1](https://github.com/TautvydasDerzinskas/Thingport/commit/358dfc1a03a178115642d41423f40586cd879b90))
2026-10-17 09:41:06 +00:00
Tautvydas Derzinskas 358dfc1a03 feat: system notifications updates, Thingport grab in System health check, node 24+ (#52)
* feat: update system notifications

* feat: add Thingport grab to system health check

* ci: upgrade to Node.js 24 and centralize version management
2026-10-17 10:44:13 +02:00
Tautvydas Derzinskas 9a2238691d feat: administration settings remake + OIDC support (#49)
* feat: expand storage usage reporting with disk breakdown

* feat: add providers admin view

* feat(storage): add background reorganization and admin browser

Adds background-driven storage reorganization for moving model files
when the storage template changes, with an admin interface to preview
changes, check impact, monitor progress, and browse the storage tree
built from plate records rather than filesystem walks.

* feat: new auth admin settings page + OIDC support

* test: fix failing test
2026-10-17 05:07:24 +02:00
Rui Valim d70dcfeac2 fix(import): stop flagging models that mention robots as a MakerWorld CAPTCHA, and let a manual retry try again (#18)
* fix(import): stop flagging models that mention robots as a MakerWorld CAPTCHA, and let a manual retry try again

isCaptchaChallenge looked for "captcha" or "robot" in every top-level string of a reply,
design titles and summaries included, so a model named "Robot ..." failed as a CAPTCHA on
every retry and started the 2h cooloff for every other import. Only a captcha key or the
reply's own error, message or msg text counts now.

The cooloff also failed a retry straight away after the user solved the puzzle in the
browser, which is what the error message tells them to do. Starting or retrying a queue job
by hand, a bulk start or retry, and POST /import/jobs/:id/retry now lift it. Automatic
collection syncs still respect it.

* feat(extension): offer "Add to the queue" when MakerWorld blocks an import

A CAPTCHA or the daily download limit won't clear by clicking Import again, so the error
panel lets an admin park the link in the queue with the same collection and profile scope.

* fix(import): let a queue job cut off by a restart be started or retried

A restart marks a running job ERROR with its links still PENDING or RUNNING. The queue page
only offered Start for PAUSED jobs and Retry for jobs with FAILED links, and the API agreed,
so such a job could never run again. The same held for a job whose runner crashed.

Start now takes an ERROR job with links waiting, and a retry reruns links an interrupted
run never reached even when none of them failed.
2026-10-14 10:18:48 +02:00
Paul TrainaandClaude Opus 5.5 d5ae80951c fix: skip a stale MakerWorld defaultInstanceId when picking the print profile (#15)
MakerWorld can leave a design's defaultInstanceId pointing at a print profile that no longer
exists. pickMakerworldInstanceId (extension) and makerworldInstanceIdFromNextData (backend)
returned it unchecked, so the download-link request went to the dead profile and MakerWorld
answered 403 "The client does not have access rights to the content." Use the default only when
it is still one of the design's instances, otherwise the first, as selectMakerworldProfiles
already does.

Fixes #14


Claude-Session: https://claude.ai/code/session_01KGCb65Zhzwd3daF862ZE6R

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 06:47:04 +02:00
github-actions[bot] 2d433dff17 chore(extension): release 1.5.0
# [thingport-grab-v1.5.0](https://github.com/TautvydasDerzinskas/Thingport/compare/thingport-grab-v1.4.0...thingport-grab-v1.5.0) (2026-10-12)

### Bug Fixes

* **extension:** check a MakerWorld collection against the library in one call ([44c687b](https://github.com/TautvydasDerzinskas/Thingport/commit/44c687b3ae7ba96a7246ece73d79212733cfd449))

### Features

* browse private collections functionality ([b619084](https://github.com/TautvydasDerzinskas/Thingport/commit/b619084be7ed060d02cd6ba473a196e7ba0859de))
* **collections:** add many models to a collection in one call ([acfa844](https://github.com/TautvydasDerzinskas/Thingport/commit/acfa844ebe62ee635941a2a6d499083cf4856d47))
* **collections:** turn sync on from Thingport, picking the provider's collection ([1131700](https://github.com/TautvydasDerzinskas/Thingport/commit/1131700ec5eb53801a85c842143717c66696d8d8))
* **extension:** show when Thingport Grab can't sign in ([623cf25](https://github.com/TautvydasDerzinskas/Thingport/commit/623cf25f2c43d153b6e89952ab572923558aa6b7))
* **extension:** tell Thingport who you're signed in as on Printables and Thingiverse ([d3ed673](https://github.com/TautvydasDerzinskas/Thingport/commit/d3ed67342aae85bc170b95b01b7aba9dfcab15e0))
* **notifications:** reinvent notifications ([1408b09](https://github.com/TautvydasDerzinskas/Thingport/commit/1408b09c5989499b38ee0effd1b7c29661a233a5))
* **sync:** notify on enable, change defaults to daily and designer profiles ([9334438](https://github.com/TautvydasDerzinskas/Thingport/commit/9334438a521a2a5f9a39f6af4d892ac2465c02ce))
2026-10-12 11:42:48 +00:00
Tautvydas Derzinskas b619084be7 feat: browse private collections functionality 2026-10-12 12:54:26 +02:00
Tautvydas Derzinskas d3ed67342a feat(extension): tell Thingport who you're signed in as on Printables and Thingiverse
So the web app's Browse tab can list the user's collections there
without asking for a username. Thingiverse's comes from the page
header's own account link; Printables' from its API's `me`, asked with
the session token the way the site does. Sent only when it changes.
2026-10-12 05:31:19 +02:00
Tautvydas Derzinskas 1131700ec5 feat(collections): turn sync on from Thingport, picking the provider's collection
Every collection's Sync configuration now works before it's synced: a
Browse tab lists the user's own collections on MakerWorld (through
their cookie, private ones included), Printables and Thingiverse (by a
username asked once), and takes any collection's link. Each provider's
collections are drawn in its own colours and manner.

On Printables and Thingiverse the collection's current models are
imported by the sync's first check. MakerWorld rate-limits bulk
imports, so there only models added from now on come in. Settings can
be picked before turning sync on.
2026-10-12 05:31:01 +02:00
Tautvydas Derzinskas 9334438a52 feat(sync): notify on enable, change defaults to daily and designer profiles 2026-10-12 04:08:24 +02:00
Tautvydas Derzinskas acfa844ebe feat(collections): add many models to a collection in one call
Add POST /collection/:id/items. Thingport Grab uses it to file a
MakerWorld collection's already-imported models instead of one request
per model, falling back on older instances.
2026-10-12 03:50:57 +02:00
Tautvydas Derzinskas 623cf25f2c feat(extension): show when Thingport Grab can't sign in
A session token outlives a password change, so a stale saved password
only surfaced days later as failing imports. Check the connection by
signing in (at most every 10 minutes) at browser start, before showing
the in-page icon, and when the popup opens.

When it fails, the icon shows a "not connected" badge whose dialog says
whether the credentials were rejected or the instance didn't answer,
and opens the popup's edit form. The toolbar icon gets a badge too.
Concurrent calls with an expired token now share one sign-in.
2026-10-12 03:50:46 +02:00
Tautvydas Derzinskas 44c687b3ae fix(extension): check a MakerWorld collection against the library in one call
The collection panel sent one /import/status request per model, all at
once. When any failed it counted the model as new, so a collection
already imported could offer to import almost everything again.

Add POST /import/status/batch and use it, falling back to paced
per-model checks on older instances. A failed check now shows an error
instead of guessing.
2026-10-12 03:50:28 +02:00
Tautvydas Derzinskas 1408b09c59 feat(notifications): reinvent notifications 2026-10-11 23:20:21 +02:00
Tautvydas Derzinskas e24e797999 docs: add synced collections guide and showcase 2026-10-09 07:42:42 +02:00
github-actions[bot] d01c4ee592 chore(extension): release 1.4.0
# [thingport-grab-v1.4.0](https://github.com/TautvydasDerzinskas/Thingport/compare/thingport-grab-v1.3.0...thingport-grab-v1.4.0) (2026-10-08)

### Bug Fixes

* **extension:** store imports in shared storage ([84b4f5b](https://github.com/TautvydasDerzinskas/Thingport/commit/84b4f5bd141e2187cbfe980f7cfc9925829fd467))
* **extension:** use template for Edge certification notes ([30be8c4](https://github.com/TautvydasDerzinskas/Thingport/commit/30be8c434901438225f4a3fd15ed63c222ce4173))

### Features

* **collection-sync:** allow syncing collections with provider collections ([ef9152d](https://github.com/TautvydasDerzinskas/Thingport/commit/ef9152df6cd0edee4fff8355434c9e2e09f73731)), closes [#10](https://github.com/TautvydasDerzinskas/Thingport/issues/10)
* handle download limit error gracefully ([fd7c26a](https://github.com/TautvydasDerzinskas/Thingport/commit/fd7c26a760b82142b8be74634f1461e2007d5ab1))
2026-10-08 23:07:11 +00:00
Tautvydas Derzinskas ef9152df6c feat(collection-sync): allow syncing collections with provider collections
Implements #10
2026-10-09 00:34:44 +02:00
Tautvydas Derzinskas 9df01d0ed5 docs: update docs, screenshots & site 2026-10-08 19:20:54 +02:00
Tautvydas Derzinskas 30be8c4349 fix(extension): use template for Edge certification notes 2026-10-06 17:49:34 +02:00
Tautvydas Derzinskas 84b4f5bd14 fix(extension): store imports in shared storage 2026-10-06 15:00:54 +02:00
Tautvydas Derzinskas c52554fe7e refactor: replace re-import with narrower fill-gaps 2026-10-06 14:46:30 +02:00
Tautvydas Derzinskas fd7c26a760 feat: handle download limit error gracefully 2026-10-06 07:26:48 +02:00
github-actions[bot] 9e61819453 chore(extension): release 1.3.0
# [thingport-grab-v1.3.0](https://github.com/TautvydasDerzinskas/Thingport/compare/thingport-grab-v1.2.0...thingport-grab-v1.3.0) (2026-10-05)

### Features

* **extension:** add loading state phrases for different operations ([0325f16](https://github.com/TautvydasDerzinskas/Thingport/commit/0325f16c8527bea78343f91f386c0c0a0d61d02a))
* **extension:** allow importing to new custom collections ([a5ac824](https://github.com/TautvydasDerzinskas/Thingport/commit/a5ac82411079f395db9bcf9f951b7c1df9f096c8))
* **extension:** improve loading messaging + make queue admin-only ([67a31cc](https://github.com/TautvydasDerzinskas/Thingport/commit/67a31cc94052fda9faf1daf831b6fbf5ce7b53e9))
* link import queue with an admin page and send-to-queue in the extension, plus update from source ([#6](https://github.com/TautvydasDerzinskas/Thingport/issues/6)) ([96da36a](https://github.com/TautvydasDerzinskas/Thingport/commit/96da36ae7999ab5c91bf076a727922a0dbdad0ec))
* pause guided MakerWorld imports on a CAPTCHA, and fix localized and long collection imports ([627a442](https://github.com/TautvydasDerzinskas/Thingport/commit/627a442d53a709f41e42bc508af7305aca5578a1))
2026-10-05 19:17:57 +00:00
Tautvydas Derzinskas a5ac824110 feat(extension): allow importing to new custom collections 2026-10-05 21:06:26 +02:00
Tautvydas Derzinskas 0325f16c85 feat(extension): add loading state phrases for different operations 2026-10-05 20:49:39 +02:00
Tautvydas Derzinskas 67a31cc940 feat(extension): improve loading messaging + make queue admin-only 2026-10-05 20:39:46 +02:00
Tautvydas Derzinskas 627a442d53 feat: pause guided MakerWorld imports on a CAPTCHA, and fix localized and long collection imports
- A MakerWorld CAPTCHA was reported as "No downloadable model file
  found". The extension's real-click download looked for a "Download"
  button that no longer exists in any language: the downloads sit in the
  menu behind the arrow next to "Open in Bambu Studio". It now opens that
  menu and clicks "Download 3MF", else "Download STL/CAD" then "Download
  All" (a zip), matched in all 12 MakerWorld UI languages. A 418/CAPTCHA
  reply is detected by both the extension and the backend, which now
  answers 429 with a clear message instead of trying more endpoints.
- A CAPTCHA now pauses the guided import on the same model instead of
  ending it. A docked panel leaves MakerWorld's puzzle reachable, and
  Resume retries that model. A "Wait between models" choice (5 s to
  5 min) paces long unattended runs; the countdown runs on the next
  model's page, since the extension background is killed after 30 s idle.
- The collection scan stopped early (e.g. 40 of 56) on localized pages:
  the end marker was English-only, so a 4 s no-new-cards timeout ended
  the scan on any slow page load. It now stops at the collection's own
  model count from the page data, knows the end marker in every
  language, and keeps the timeout only as a long fallback.
- The guided import hung every few models with nginx logging 499s:
  Chromium kills an extension service worker whose fetch() takes over
  30 s to answer. POST /import?async=1 now returns a task id to poll at
  GET /import/tasks/:id; an older instance ignores the flag and answers
  as before.
- The overlay's "Import next" button was always visible instead of only
  after a step looks stuck.
2026-10-05 19:59:01 +02:00
Rui Valim 96da36ae79 feat: link import queue with an admin page and send-to-queue in the extension, plus update from source (#6)
* feat: link queue with retries and update-from-source

Pasting several model links now imports them as one background queue
job (LINKS), one at a time, with an in-place retry for transient
failures and a retry button for whatever still fails. Failed links are
kept per item, so a retry reruns only those.

An imported model can also be refreshed from its source ("Update from
source" in the model menu, "Update model in Thingport" in the
extension). Only empty fields are filled, so an edit always wins and
tags are only added; missing files come in (for MakerWorld, the print
profiles the model doesn't hold yet) and an empty image slot is
filled.

* fix: show the import queue and log its execution

Feedback from testing a mixed batch: the provider chips only showed one
of the pasted links' providers (now every provider in the batch lights
up), the queue had no view while it ran, and the pod's logs said nothing
about what was importing.

The progress bar is now clickable and opens the queue as a list: one row
per link with its status (waiting/importing/imported/failed) and why it
failed. Items carry a RUNNING state so the current link is visible, and
a finished batch with failures shows up in warning colors instead of the
quiet bar. The runner logs each link and the job summary with an
[import] prefix, in the console style the rest of the backend uses.

* feat: admin import queue page with start, pause and retry

Links can now wait in a PAUSED LINKS job until someone starts them. The
new Administration > Import queue page lists every user's batch imports
and starts, pauses, retries and deletes link-list jobs as their owner,
with the owner's saved MakerWorld cookie. Start all and Retry all failed
run jobs one at a time across users, so a bulk run never bursts the
providers from one IP.

POST /import/queue parks one link in the user's paused queue with its
own collection, profile scope and title, keeping a single "N links
waiting" notification up to date. Pausing is cooperative: the runner
finishes the link it is on, then stops, and a job cut off by a restart
can be paused and started again to finish.

* feat(extension): send to queue toggle

A "Send to queue" switch under "Extension enabled" makes the single
model panel add the link to the instance's paused import queue instead
of importing it, keeping the panel's collection and print profile
choice. Choosing files out of a zip still imports directly, since it
needs the download right away.
2026-10-04 19:11:06 +01:00
github-actions[bot] 90205c5ab5 chore(extension): release 1.2.0
# [thingport-grab-v1.2.0](https://github.com/TautvydasDerzinskas/Thingport/compare/thingport-grab-v1.1.2...thingport-grab-v1.2.0) (2026-10-01)

### Bug Fixes

* **extension:** drop unneeded tabs permission ([9549148](https://github.com/TautvydasDerzinskas/Thingport/commit/9549148dfd38e642e7374f4e21748360cb73b9e6))
* **extension:** include captcha related header ([7d51458](https://github.com/TautvydasDerzinskas/Thingport/commit/7d5145898862f4220a77cb277973489bd2863cd0))
* **extension:** send devmodelname and match makerworld button design ([955513c](https://github.com/TautvydasDerzinskas/Thingport/commit/955513c5c52e63294f15d1e6816c3ca6063d3114))
* **extension:** show print profile choices after navigating within MakerWorld ([484efff](https://github.com/TautvydasDerzinskas/Thingport/commit/484efff1c956b7cc1967cbb4699bab78955b40e2))

### Features

* **extension:** add normalized download for MakerWorld ([2380c56](https://github.com/TautvydasDerzinskas/Thingport/commit/2380c566e54cd9ba0225689cf58f2899597a15d7))
* **extension:** automate publishing to Chrome Web Store ([e37073c](https://github.com/TautvydasDerzinskas/Thingport/commit/e37073cf531e55c15f917cf44e6595dc29d661af))
* **extension:** choose which MakerWorld print profiles to import ([fc612b3](https://github.com/TautvydasDerzinskas/Thingport/commit/fc612b30c0dd7e8fe6df1801d67e790e420ac1c8))
* **extension:** send MakerWorld page data with imports ([c3a189e](https://github.com/TautvydasDerzinskas/Thingport/commit/c3a189ea7fdba849c257b05c1dc16f95a3a83a2f))
2026-10-01 06:05:23 +00:00
Tautvydas Derzinskas e37073cf53 feat(extension): automate publishing to Chrome Web Store 2026-10-01 07:58:17 +02:00
Tautvydas Derzinskas 955513c5c5 fix(extension): send devmodelname and match makerworld button design 2026-09-30 20:26:15 +02:00
Tautvydas Derzinskas 2380c566e5 feat(extension): add normalized download for MakerWorld 2026-09-30 19:33:31 +02:00
Tautvydas Derzinskas 0c09b30287 ci: add auto publishing to Mozilla addons store 2026-09-30 13:36:05 +02:00
Tautvydas Derzinskas ea463e681a docs: start using Mozilla's listing for Thingport grab 2026-09-30 13:27:15 +02:00
Tautvydas Derzinskas 9549148dfd fix(extension): drop unneeded tabs permission 2026-09-29 07:09:10 +02:00
Tautvydas Derzinskas dae33246aa chore: deal with formatting by adding prettier + reformat 2026-09-28 22:50:39 +02:00
Tautvydas Derzinskas e111dc27d7 chore: update licence and perform comment clean up 2026-09-28 22:34:47 +02:00
Tautvydas Derzinskas c3a189ea7f feat(extension): send MakerWorld page data with imports
Sends the model page's design data (title, tags, description, creator, cover,
gallery, categories) with a MakerWorld import, so the backend doesn't have to
fetch the page again for them -- only when that data is this model's, and
small enough to send.
2026-09-28 08:19:43 +02:00
Tautvydas Derzinskas 484efff1c9 fix(extension): show print profile choices after navigating within MakerWorld
MakerWorld only writes its page data (__NEXT_DATA__) on a full page load, so
after clicking through to another model it still describes the first one, and
the import panel had no profile list to offer. The extension now fetches the
current model's page for its data when the embedded data is stale, and keeps it
for that model while the tab is open, which also restores per-profile download
resolution after in-app navigation.

The "Print profiles" options now depend on the model's profiles: "all designer
print profiles" only when the designer uploaded more than one, and "designer &
community" only when there are community profiles. The first option is renamed
"Currently selected print profile".
2026-09-28 01:29:48 +02:00
Tautvydas Derzinskas fc612b30c0 feat(extension): choose which MakerWorld print profiles to import
On a MakerWorld model page with more than one print profile, the import panel
offers "Print profiles": the one from the link (the default), all designer
print profiles, or designer and community print profiles. Each profile's file
is resolved in the page and imported in turn, added to the same model, with
progress shown and a summary at the end.
2026-09-28 01:10:09 +02:00
Tautvydas Derzinskas 7d51458988 fix(extension): include captcha related header 2026-09-27 19:53:26 +02:00
Tautvydas Derzinskas a1b8ac7887 ci(extension): release with semantic-release weekly or on demand
Extension versions are now derived from Conventional Commits that touch
extension/ (semantic-release-monorepo), instead of being bumped by hand.
The new "Extension store release" workflow runs every Friday at 13:00
Europe/Warsaw, or manually: it bumps package.json, writes CHANGELOG.md,
tags thingport-grab-v<version>, creates a non-latest GitHub release with
the store zips, and publishes to Edge Add-ons in a separately retryable
job.

The per-merge workflow keeps building the extension-latest zips and the
signed Firefox .xpi, but no longer publishes to Edge.
2026-09-27 13:54:12 +02:00
Tautvydas Derzinskas caeb394fdb ci(docs): edge store listing info and auto publishing 2026-09-27 13:35:25 +02:00
Tautvydas Derzinskas 427b08db59 refactor: make sure using correct paths in extension build 2026-09-27 10:28:42 +02:00
Tautvydas Derzinskas af7e15ab57 chore(extension): add store assets scripts 2026-09-27 10:19:09 +02:00
Tautvydas Derzinskas a48b0fcdc4 refactor(web): update grab policy links 2026-09-27 10:01:52 +02:00
Tautvydas Derzinskas 72e7aeb884 docs(privacy): add privacy info 2026-09-27 09:56:50 +02:00
Tautvydas Derzinskas 80c79f624f refactor: major overhaul related to browser extension 2026-09-27 09:38:05 +02:00
Tautvydas Derzinskas d51fd9cda3 feat: browser extension should show inactive import bubble 2026-09-27 08:55:14 +02:00
Tautvydas Derzinskas ef14899fe7 feat: add last 5 imports to extension popup 2026-09-24 19:30:11 +02:00