Commit Graph
233 Commits
Author SHA1 Message Date
Tautvydas Derzinskas 5fa6c40324 feat(flaresolverr): make URL configurable in admin settings 2026-10-11 19:34:29 +02:00
Tautvydas Derzinskas b15adb087b feat: add react skeleton loading bits 2026-10-11 19:09:06 +02:00
Tautvydas Derzinskas b13d0bf597 refactor(dashboard): server-side weather, render priorities, and model query optimization
Move weather endpoints to the server with caching and rate-limiting. Prioritize
3D viewer renders over background thumbnails. Query featured models from database
instead of loading all into memory.
2026-10-11 00:08:23 +03:00
Tautvydas Derzinskas 163d73f2a7 feat: add setting to customize dashboard model thumbnail appearance 2026-10-10 23:22:02 +03:00
Tautvydas Derzinskas c71154a83e feat(dashboard): add clock, weather, and featured-model widgets 2026-10-10 23:13:56 +03:00
Tautvydas Derzinskas 2813237e03 feat: extend dashboard settings with layouts 2026-10-10 21:50:29 +03:00
Rui ValimandTautvydas Derzinskas 708a93822a feat: categorize models with an OpenAI-compatible AI provider (#11)
* feat: categorize models with an OpenAI-compatible AI provider

Models can now be sorted into the user's categories by any OpenAI-compatible
chat endpoint (llama.cpp, Ollama, vLLM, OpenAI, OpenRouter...), configured once
by an admin under settings: mode off/suggest/auto, confidence threshold,
categorize on import, concurrency, optional preview image.

Every print now records where its category came from (manual, site rule, AI,
or legacy for rows that predate this). AI never changes a manual choice: runs
and the import hook skip them, and a single-model request needs force. Folders
are never touched. Category changes go through one setPrintCategory path, so
the name check and file relocation stay shared, and AI writes are a
compare-and-set against what was read before the provider call, so an edit
made meanwhile wins.

Users get per-model recategorize, accept/reject of pending suggestions (a
rejected category is not offered again), and a background "recategorize all"
with scope flags, progress and cancel that stops after repeated provider
failures.

* feat: AI categorization settings, suggestions and bulk runs in the UI

Admin settings get an AI categorization section with a connection test and a
privacy note. The model menu offers "Recategorize with AI" (asking before it
overrides a manual category), the side panel shows a pending suggestion with
accept/reject and marks AI-set categories, and the models page has
"Recategorize all with AI" with scope, progress and cancel, plus a pending
suggestions list with bulk accept/reject.

* fix: keep suggestion actions from overlapping the reason

MUI's secondaryAction is absolutely positioned over a fixed padding, so the
two buttons covered a long reason. They now sit in the row, and wrap under
the text on narrow screens.

* fix: put the clear API key action inside the key field

A full-width outlined button under the field read as an empty input in an
error state. It is now a small action at the end of the field, and the
helper text says the key goes away on save once it's clicked.

* refactor: update AI categorization admin part

* refactor: move ai categorization buttons to categories manager modal

* fix: multiple smaller problems with AI categorization

---------

Co-authored-by: Tautvydas Derzinskas <tautvydasuk@gmail.com>
2026-10-10 20:59:52 +03:00
Tautvydas Derzinskas 840733dd22 docs: screenshot reorder 2026-10-09 07:45:23 +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))
thingport-grab-v1.4.0
2026-10-08 23:07:11 +00:00
Tautvydas Derzinskas 2ac5a4cd04 feat(collections): add sync indicator to collection toolbar 2026-10-09 01:05:39 +02: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 093e6d36df docs(readme): restructure readme 2026-10-08 19:40:36 +02:00
Tautvydas Derzinskas ee359ef53a fix(site): add sitemap.xml alias for search engines
Search engines look for sitemap.xml by default, but @astrojs/sitemap
only generates sitemap-index.xml. Add a build hook to copy the index
file so search engines can find it.
2026-10-08 19:24:12 +02:00
Tautvydas Derzinskas 9df01d0ed5 docs: update docs, screenshots & site 2026-10-08 19:20:54 +02:00
Tautvydas Derzinskas 1a88f8ffea ci: add issue templates, label sync, and issue branding 2026-10-08 16:53:10 +02:00
Tautvydas Derzinskas 90a9942d1b feat(search): add ability to load search active views 2026-10-08 08:36:23 +02:00
Tautvydas Derzinskas 469641de18 feat(api-tokens): add per-user API tokens with generation and revocation 2026-10-08 08:10:54 +02:00
Tautvydas Derzinskas 049efdedb6 feat: remake profile page and add configuration modal 2026-10-07 22:45:52 +02:00
Tautvydas Derzinskas 6533781a21 feat: add users activity page 2026-10-07 20:51:44 +02:00
Tautvydas Derzinskas ddcd3c785c feat(search): improve search UX and results 2026-10-07 18:49:14 +02:00
Tautvydas Derzinskas 3d1c851ad7 feat(dashboard): make dashboard panes toggleable 2026-10-07 18:13:24 +02:00
Tautvydas Derzinskas 0cc27c9eb6 feat: add admin job to refetch all user descriptions 2026-10-07 07:52:07 +02:00
Tautvydas Derzinskas d49d7c9919 feat: add rich text formatting toolbar to model descriptions 2026-10-07 00:53:49 +02:00
Tautvydas Derzinskas 97f0eea4c2 feat: support Markdown with embedded images in model descriptions 2026-10-07 00:31:34 +02:00
Tautvydas Derzinskas b4ead39283 refactor: sort manifest related warning 2026-10-06 22:59:00 +02:00
Tautvydas Derzinskas 53dcacfc09 feat: make Thingport installable 2026-10-06 22:47:03 +02:00
Tautvydas Derzinskas da0111b9e3 docs(license): move copyright to footer 2026-10-06 21:27:12 +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))
thingport-grab-v1.3.0
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
Tautvydas Derzinskas 62480d7828 docs: refresh app screenshots and add a script to capture them
regression/screenshots.mjs signs in to any instance (--url, --email,
THINGPORT_PASSWORD) and captures the README and website screenshots at
1400x790 and 2x scale. The account's theme and Categories/Folders choice
are switched for the shots and restored afterwards.
2026-10-04 21:09:52 +02:00
Tautvydas Derzinskas 47e10a2ec5 docs: add honorable contributors first entry 2026-10-04 20:56:48 +02:00
Tautvydas Derzinskas dd4d2592ea fix: count queued links as models and let imported images replace 3D renders
- A links import with a profile scope counted print profiles against the
  number of links ("Imported 11 of 3 links"). Each link now counts as one
  model, and the profile totals go in the notification body.
- Opening a model while its import was still downloading images rendered a
  3D thumbnail that then stuck as the card image and first gallery image.
  Renders are now flagged, imported images replace them, and a late render
  no longer overwrites an imported cover. "Update from source" treats a
  model with only renders as having no images.
2026-10-04 20:40:06 +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
Tautvydas Derzinskas b5ba52d8bf fix: folder/category switch overridden by late server response 2026-10-03 19:40:04 +01:00
Tautvydas Derzinskas 179ce389b6 docs: explain existing library import pathways 2026-10-03 19:34:41 +01:00
Tautvydas Derzinskas 300fe3db0d test: add regression test + couple minor bug fixes 2026-10-03 19:10:50 +01:00
Tautvydas Derzinskas e22f57903f feat: add consume folder support 2026-10-02 13:22:56 +02:00
Tautvydas Derzinskas 93136629e4 refactor: rename storage token to support categories and folders 2026-10-02 12:49:36 +02:00
Tautvydas Derzinskas 33400fa128 feat(categories): add toggle between categories and folders 2026-10-02 12:27:03 +02:00
Tautvydas Derzinskas 04f3106ce8 feat(categories): allow unlimited depth of categories 2026-10-01 22:15:23 +02:00
Tautvydas Derzinskas 172270fce8 feat(categories): allow moving subcategories between parent categories 2026-10-01 21:57:23 +02:00
Tautvydas Derzinskas 3a05fae555 feat(auth): add password reset flow 2026-10-01 21:46:19 +02:00