22 Commits
Author SHA1 Message Date
Tautvydas Derzinskas 0dfdae545f feat: dashboard remade (v3) + custom dashboard widget system (#131)
* feat(backend): store dashboard templates per user

Adds a dashboardTemplates JSON column and GET/PUT /settings/dashboard for the
user's templates: each holds its panels (one widget, or several as tabs) and
their grid layout per breakpoint, plus which built-in templates were offered.
Reading drops widgets since removed instead of failing the whole dashboard.
The old widget and layout settings stay, read once to build the first
templates.

* feat: customizable dashboard grid with tabbed panels and templates

The dashboard is now a responsive grid (12, 6 and 1 columns) of panels the
user arranges in edit mode: drag to move, resize from the corner, or use the
arrow keys. Panels merge into tabbed panels by dragging a panel's name onto
another or with the bulk Merge action, and split back out. Edit mode expands
like bulk select into Add panel, Merge and Remove, over a dotted grid.

Templates replace the fixed layouts: built-in Classic, Overview, Compact tabs,
Showcase, Puzzle and Minimal, each with its own panels and arrangement, and
user-made ones to switch between, rename, copy, reset or delete. A user's old
layout and widget choices carry over into their first template, and built-ins
added later are offered once.

* feat(backend): dashboard panel settings, °F weather and recently added list

Stores each widget's options on its dashboard template. The weather endpoint
takes a unit and converts from the cached Celsius reading, so Fahrenheit isn't
rounded twice. The web dashboard's summary holds up to 10 of each list, enough
for any list panel's item count, while the MCP tool keeps its short lists.
Adds /dashboard/recently-added for that panel's "See more", in the API
token's Dashboard scope.

* feat: dashboard panel settings and panels that fit their content

Panels get options from a cog shown in edit mode: 12/24-hour clock with or
without date and greeting, weather in °C or °F with or without the later
forecast, and for lists the items shown (3, 5, 7 or 10; 5 by default) and
whether "See more" shows. Top providers and recently added gain "See more",
and every list shows it only when there is more to see.

Changing a panel's options resizes it to fit, as does Fit to content in its
menu. A list too long for its panel scrolls between its title and "See more",
which stay in sight. Built-in lists are sized to fit five items, and the
Showcase template is no longer built in.

* feat(backend): RSS, uptime and server stats for new dashboard panels

/dashboard/feeds reads the RSS, RSS 1.0 and Atom feeds a panel lists, merged
newest first, with any it couldn't read named. /dashboard/monitors checks
whether addresses answer and how quickly. /dashboard/system gives admins the
server's CPU, load, memory and uptime. Feeds and checks may reach the local
network, but only over http(s), with a timeout and a size cap, and both are
cached briefly. Panel settings can now hold lists, like a launcher's links.

* feat: RSS, CPU, uptime and launcher dashboard panels

RSS merges the feeds it's given; uptime shows whether each address answers,
and for admins how long the server has been up; CPU, for admins only, shows
load with a short history and memory. The launcher shows bookmarks as app
icons, coloured, mono or grayed, with optional search and a limit with Show
all, starting with Thingport's site and repository. Panels added later go into
the first gap they fit and size themselves to their content.

* feat(backend): dashboard templates can hold copies of a widget

A panel's widgets are now instances: a widget's own id for its first copy,
and the id with a suffix ("rss:k3j2h9") for any further one, so templates
saved before stay valid. Options are kept per instance and may hold a record,
such as a weather panel's own place. Saving refuses unknown widgets and
malformed instances; reading still drops widgets since removed.

* feat: add RSS, launcher and weather panels more than once

Each copy has its own options: its own feeds, links, unit or place. Add
panel keeps offering these three, and their tiles in the Panels dialog count
the copies and add another. A copy's options go with it into and out of tabs
and are dropped when it's removed. A weather panel's place is now its own,
chosen on the panel; one without falls back to the account's place, so
existing dashboards look the same.

* fix: split tabbed panels from the edit toolbar, keeping their tabs together

Split into panels joins Merge and Remove in the edit toolbar, active when
every selected panel has tabs. Splitting now puts each tab under the one
before it, the size the panel was, where the panel stood, and moves what was
below down to make room; before, all but the first went to the bottom.

* fix: keep a tab's size when it leaves its panel, and drop launcher tooltips

A tab dragged out of a tabbed panel onto empty space now takes the size of
the panel it came from, as split tabs already did, rather than its widget's
usual size. Launcher tiles no longer show the address in a tooltip on hover.

* feat(backend): trending models from each provider for the dashboard

/dashboard/trending gives one provider's trending list at a time, in one
shape: title, link, image, likes, author and whether it's paid. Printables,
MakerWorld, Thangs and MakerOnline give their trending lists; Snapmaker
Space its featured one, NexPrint and Creality Cloud their recommended ones;
Thingiverse and MyMiniFactory their popular ones with the instance's token or
key, and Cults3D its most downloaded with the user's own key. A provider
without what it needs answers with what to set up. Lists are cached half an
hour, NSFW models are left out, and the path is in the Dashboard token scope.

* feat: Explore trending dashboard panel

Shows what's trending on the providers the user picks and drags into order,
their logos beside the title: the first loads with the panel, and clicking
another loads that one. Models show as a list or as even-sized cards and
open on the provider's site, as does More. A provider that needs a token or
key shows what's missing and where to add it. The panel can be added more
than once.

* feat: open the dashboard on its own as a homepage

A button beside the edit button opens /home in a new tab: the dashboard's
panels alone, without the side menu, top bar or editing, to set as a
browser's homepage. It's kept to the template it was opened from, so
switching templates in the app later doesn't change it.

* feat: search the homepage view with ⌘S

The homepage view gets the top bar's search as a spotlight: hidden until ⌘S
(Ctrl+S) or its corner button opens it, larger and in the middle of a dimmed
screen, focused and ready to type, and searching just as the top bar does.
Its import and Configuration commands take the user into the app, the latter
through a new ?configuration=<tab> link the top bar opens on arrival.

* feat: put the homepage button beside the template picker

* feat: custom and community dashboard widgets

A widget is metadata (JSON or YAML: name, icon, size, settings, hosts), an ES module and optional HTML, run in its
own dashboard panel with its size, settings, theme, a server-side fetch to the hosts it declares and Thingport's API.
Users write their own in an editor or with an AI over the new widget_guide, list_widgets and save_widget MCP tools,
and install shared ones from community-widgets/ in this repository, kept as installed until an update is approved.
A workflow validates community widgets in pull requests, and an admin can turn custom widgets off.

* refactor: address pr comments

* refactor: address pr comments pt2

* refactor: improve widget editor

* feat: reorder tabs in a tabbed dashboard panel

* feat: icon browser with built-in and uploaded icons for launcher links and custom widgets

* fix: show a launcher link's new icon without a refresh

* feat: self-hosted, media, 3D printing and popular site icons in the icon browser

* fix: keep the code editor's change handler current without writing a ref during render

* feat: dashboard admin page with separate own and community widget switches and widgets in use

* feat: homepage as the default dashboard template, with presets carrying widget settings

* feat: widget icons from the icon browser, preinstalled countdown sample, MCP icon tools

Drops the emoji icon, adds an hourglass icon, list_icons and upload_icon MCP tools, and folds the dashboard migrations into one.

* feat: save_widget and upload_icon on by default for new API tokens

* feat: weather scene as the first community widget, no preinstalled widgets, bare editor starter

Drops the world clock starter and the countdown sample install, and adds a built-in weather icon.

* chore: drop the countdown community widget
2026-10-23 16:24:48 +02:00
Mantas Kantautas e2382f801d fix: read every valid Content-Disposition filename on link imports (#129)
* fix: read every valid Content-Disposition filename on link imports

* fix: fall back to filename when filename* has a malformed percent escape
2026-10-22 17:40:20 +02:00
github-actions[bot] a59d15b15a chore(backend): release 1.2.0
# [thingport-backend-v1.2.0](https://github.com/TautvydasDerzinskas/Thingport/compare/thingport-backend-v1.1.0...thingport-backend-v1.2.0) (2026-10-21)

### Bug Fixes

* address card preview review comments ([678c480](https://github.com/TautvydasDerzinskas/Thingport/commit/678c4802d74c16aee75f3f62ebee51cebd8f7037))
* announce each version once, and don't flash old notes on reopen ([58eb011](https://github.com/TautvydasDerzinskas/Thingport/commit/58eb01179346dd12d78ae8a23e4c27e3e255e681))
* check an imported model's description once its import is done ([6555875](https://github.com/TautvydasDerzinskas/Thingport/commit/6555875e29f7cfafc4b1a2db897a7cc59db626ff))
* count only MakerWorld profiles with an id before taking the raw files ([8affbbb](https://github.com/TautvydasDerzinskas/Thingport/commit/8affbbb6c3de73b9bafb505d4e8877832378c436))
* count suffixed renames, roll back failed theme saves, keep reset dialog open on error ([1a44b87](https://github.com/TautvydasDerzinskas/Thingport/commit/1a44b87cdc875fa92d23976eff44e48bb5dc727b))
* guard tag rewrites against concurrent edits, pluralise merge count, fix lt wording ([ef14f54](https://github.com/TautvydasDerzinskas/Thingport/commit/ef14f54221160dc416b8553f36aaab59d2dd7d47))
* harden mesh check against bad indices and tidy review follow-ups ([8b4653e](https://github.com/TautvydasDerzinskas/Thingport/commit/8b4653e415588b6cda7cae434052e4703f3abf7a))
* keep non-ASCII names readable in zip downloads ([060be2f](https://github.com/TautvydasDerzinskas/Thingport/commit/060be2f6920140dc005149b60f957accdd6831ac))
* keep skipped releases with curated notes, and show a failed copy ([60ee06b](https://github.com/TautvydasDerzinskas/Thingport/commit/60ee06ba438e266f545972870fc6c959b29cf05f))
* leave room for a reasoning model's thinking in the AI token budget ([5dc6ff6](https://github.com/TautvydasDerzinskas/Thingport/commit/5dc6ff67a3166fbe6aec2034c594d7b22262a9c2))
* list a nested pictures folder's files as its own model's ([67bea14](https://github.com/TautvydasDerzinskas/Thingport/commit/67bea149a92803472d30d5e1e4f64b77427b3071))
* **mcp:** rank list_tags by use and let it narrow, instead of every tag at once ([04e9719](https://github.com/TautvydasDerzinskas/Thingport/commit/04e97197d7ede73743c6692ad1317e437dfaa69b))
* retry a dashboard row's render when its url changes ([401cc38](https://github.com/TautvydasDerzinskas/Thingport/commit/401cc38461a9650b430998cf02aea4a11fdc34f7))
* touch only a model's own pictures, check picture files once, drop plate folders for other files ([ecc551e](https://github.com/TautvydasDerzinskas/Thingport/commit/ecc551ef2771e0d35be57face89547a3a5a54c23))

### Features

* add render colour, graphite accent and hover slideshow toggle ([926c5d3](https://github.com/TautvydasDerzinskas/Thingport/commit/926c5d345b9e52479cf083230fa9bc7839b97ca6))
* admin MCP access, token permissions dialog, and review fixes ([dec1b0d](https://github.com/TautvydasDerzinskas/Thingport/commit/dec1b0dbe3f8566a77bc981017ed29a0bbbc3703))
* **backend:** MCP endpoint at /api/mcp, with tools chosen per API token ([8567f19](https://github.com/TautvydasDerzinskas/Thingport/commit/8567f195c07254b48710fc7fd9f6679a25b2555f))
* **backend:** MCP tools that import models and file them into collections ([a36a996](https://github.com/TautvydasDerzinskas/Thingport/commit/a36a99639a1537d098f58e0555bf6af9da167550))
* check models for print problems when they are opened ([f913710](https://github.com/TautvydasDerzinskas/Thingport/commit/f913710cc4d1ad045b818b7fbff4d0a2cdeab9c3))
* import MakerWorld models that have only raw files ([437d85b](https://github.com/TautvydasDerzinskas/Thingport/commit/437d85be146d8a8c8fd04f7a626fc46605389a54))
* keep a model's pictures and supporting files beside its model files ([0d505b7](https://github.com/TautvydasDerzinskas/Thingport/commit/0d505b716a4cc496db0b3e5edcbf138bf5594da7))
* let a release update without notifying users ([aab83df](https://github.com/TautvydasDerzinskas/Thingport/commit/aab83df8861a1898d41a0c66c31a99069228d5e0))
* let users choose what their API token can read over the REST API ([88949d9](https://github.com/TautvydasDerzinskas/Thingport/commit/88949d9d8c8ab5ec575429d9bd6a8a4816acfaac))
* let users pick an accent color ([d26f730](https://github.com/TautvydasDerzinskas/Thingport/commit/d26f730bee0ec65597c68f97c0b05f327e673653))
* reset categories to the starter tree, previewing what changes ([f8424dc](https://github.com/TautvydasDerzinskas/Thingport/commit/f8424dcb2306c0bf2c3f4c4aa15f596594020ae6))
* show what's new after an update ([aebc0ac](https://github.com/TautvydasDerzinskas/Thingport/commit/aebc0ac97eddc75dfbb666a22efd6407070f810b))
* sort, bulk actions and merge for collections and tags ([a0dbba8](https://github.com/TautvydasDerzinskas/Thingport/commit/a0dbba80587d771eb37950c195e61f77b3a83c74))
* tint generated model renders with the accent ([908ae80](https://github.com/TautvydasDerzinskas/Thingport/commit/908ae80b5b6db48c645ab2be44b6e0a102447e0e))

### Performance Improvements

* **backend:** load a listing's files for the returned page only ([0da5db6](https://github.com/TautvydasDerzinskas/Thingport/commit/0da5db6536f11a6af03e8b05923204f47aaab0f9))
2026-10-21 20:23:38 +00:00
Rui Valim 8567f195c0 feat(backend): MCP endpoint at /api/mcp, with tools chosen per API token
An AI assistant connects over Streamable HTTP (stateless) with the user's
API token and gets read-only tools: search_models, list_models,
get_model, list_collections, get_collection, list_tags,
list_categories, get_author and library_stats. Each runs as the token's
user through the same services as the REST API.

Every MCP message is a POST, which requireAuth refuses to an API token,
so /api/mcp checks the token itself and is mounted before the routers
that apply requireAuth to every path. The token stays read-only over
REST; over MCP it only reaches the tools its user ticked, stored per
token in User.apiTokenMcpTools. Existing tokens get the read-only tools;
a tool that writes would be off for every token until its user turns it
on.

get_model reads through printOutById rather than GET /print/:id, so an
assistant looking a model up doesn't count as a view or land in
Browsing History.
2026-10-20 14:23:37 -03:00
github-actions[bot] 999179a7f9 chore(backend): release 1.1.0
# [thingport-backend-v1.1.0](https://github.com/TautvydasDerzinskas/Thingport/compare/thingport-backend-v1.0.2...thingport-backend-v1.1.0) (2026-10-20)

### Bug Fixes

* add validation and improve error handling in sync operations ([7c3c7ec](https://github.com/TautvydasDerzinskas/Thingport/commit/7c3c7ec90298672150219ea18c44ac37bc40280c))
* correct category updates and improve NexPrint error handling ([1cf2903](https://github.com/TautvydasDerzinskas/Thingport/commit/1cf2903b8efd9e13f71b50e4e768f7930c1382eb))
* detect Cults3D clearance cookie in Cloudflare partitions ([2f66ed6](https://github.com/TautvydasDerzinskas/Thingport/commit/2f66ed682b1bc61b0a6c456db23aedbc15193eb1))
* handle malformed tokens, add refresh concurrency control, and improve list URL validation ([44f4bf2](https://github.com/TautvydasDerzinskas/Thingport/commit/44f4bf26354675ce41ee0c7e2684d3fe9384e70f))
* Makerworld profile thumbnails being all the same ([c6c8161](https://github.com/TautvydasDerzinskas/Thingport/commit/c6c8161a74dceca83d0827fec00735763ce76428))
* models with images should use them as thumbnails ([cf0653b](https://github.com/TautvydasDerzinskas/Thingport/commit/cf0653b005e9339a8cd0f200a7ef4a7e6f028f75))
* page a Thangs collection to the end without a total ([68a1481](https://github.com/TautvydasDerzinskas/Thingport/commit/68a14817079d8cc3bd275cfe4badf7bc16084194))
* **printService:** restore file on failed plate database update ([03fdd83](https://github.com/TautvydasDerzinskas/Thingport/commit/03fdd836a5889e9f06deea8d2311d69cae27efa1))
* tell print profiles apart by name and picture on every provider ([f34a488](https://github.com/TautvydasDerzinskas/Thingport/commit/f34a488fb21b69b50e8170105f5933f70cf46f01))

### Features

* add Cults3D provider ([930b9b4](https://github.com/TautvydasDerzinskas/Thingport/commit/930b9b48dba5c2375d4fccf2e59ced2965e87711))
* add MyMiniFactory as a provider ([a7a9190](https://github.com/TautvydasDerzinskas/Thingport/commit/a7a91902a0f43d47741e8cb52c1ec294f143fadb))
* add Thangs provider ([2591714](https://github.com/TautvydasDerzinskas/Thingport/commit/2591714c0cd44b086c0cb3c94d11e99c8262fe81))
* enable Creality Cloud provider ([772b1ac](https://github.com/TautvydasDerzinskas/Thingport/commit/772b1acfef609796015b51db186012e717124bc5))
* enable NextPrint provider ([4037151](https://github.com/TautvydasDerzinskas/Thingport/commit/4037151e4aaa6a744469b52ef60f999b343e085a))
* multi-select models in grids with bulk actions ([fe5dbec](https://github.com/TautvydasDerzinskas/Thingport/commit/fe5dbecdc5a76ab43eec39a5dd432626a9eaf2f6)), closes [#91](https://github.com/TautvydasDerzinskas/Thingport/issues/91)
* pick mapped provider categories by name ([87db3f0](https://github.com/TautvydasDerzinskas/Thingport/commit/87db3f0ff0346a2811ea4b4659056e9e5928df22))
* preview dashboard panels as tiles and add an activity heatmap panel ([c65e712](https://github.com/TautvydasDerzinskas/Thingport/commit/c65e712a31c30c0c0621c440a50a4e3f256dfb42))
* **providers:** enable MakerOnline provider ([5bf3457](https://github.com/TautvydasDerzinskas/Thingport/commit/5bf3457e8c5a5448c97f12fb0ac9101137884dca))
* **providers:** enable Snapmaker Space provider ([ac5bf25](https://github.com/TautvydasDerzinskas/Thingport/commit/ac5bf253c7c3a09abd0ce90e8c24539004f0f879))
* replace the AI Thinking toggle with a per-connection reasoning effort ([b30b0ce](https://github.com/TautvydasDerzinskas/Thingport/commit/b30b0cefd82691d391a9144d40efbd178ffbb331))
2026-10-20 06:35:30 +00:00
github-actions[bot] 8b29a50e18 chore(backend): release 1.0.2
# [thingport-backend-v1.0.2](https://github.com/TautvydasDerzinskas/Thingport/compare/thingport-backend-v1.0.1...thingport-backend-v1.0.2) (2026-10-18)

### Bug Fixes

* download from Thingiverse with a Chrome TLS fingerprint ([8e6e5b2](https://github.com/TautvydasDerzinskas/Thingport/commit/8e6e5b2e0ee63b8d3c09bbbd3a086ad5543d2974))
* ensure Thingiverse gets browser agent ([40d36a4](https://github.com/TautvydasDerzinskas/Thingport/commit/40d36a4b20fc70133721f0ff60edf1240fa69030))
2026-10-18 02:50:13 +00:00
Tautvydas Derzinskas 8e6e5b2e0e fix: download from Thingiverse with a Chrome TLS fingerprint
Thingiverse's Cloudflare now challenges every request whose TLS handshake
isn't a browser's, whatever the headers or cookies, so file downloads,
preview images and API calls all failed. Route all thingiverse.com
requests through impit, which impersonates Chrome.
2026-10-18 04:38:47 +02:00
github-actions[bot] 8a39a87b6c chore(backend): release 1.0.1
# [thingport-backend-v1.0.1](https://github.com/TautvydasDerzinskas/Thingport/compare/thingport-backend-v1.0.0...thingport-backend-v1.0.1) (2026-10-17)

### Bug Fixes

* rename Thingiverse Access Token to App Token to match what it provides ([cc41076](https://github.com/TautvydasDerzinskas/Thingport/commit/cc4107694aa0f35a234099a1fabaa840663cd29e))
* retry file downloads blocked by Cloudflare or rate limits ([b7c2f36](https://github.com/TautvydasDerzinskas/Thingport/commit/b7c2f36aced158b74072cb1f3507f4d83c58edf5))
2026-10-17 19:29:59 +00:00
github-actions[bot] 495e04d535 chore(backend): release 1.0.0
# thingport-backend-v1.0.0 (2026-10-17)

### Bug Fixes

* 3mf model preview default to proper solid ([46b8687](https://github.com/TautvydasDerzinskas/Thingport/commit/46b8687d1d25c7b62307340b28108fe8966fa269))
* adjust downloads page ([58c773b](https://github.com/TautvydasDerzinskas/Thingport/commit/58c773b955131af5a4ae8e9c3d9ccc4255f23d8b))
* **ai:** disable categorization when last model is deleted ([bfc3fa0](https://github.com/TautvydasDerzinskas/Thingport/commit/bfc3fa0d72f86eeb508031a2457c9574a4421eca))
* **ai:** explain answers cut off by the token limit, and log AI and import runs ([#16](https://github.com/TautvydasDerzinskas/Thingport/issues/16)) ([7488793](https://github.com/TautvydasDerzinskas/Thingport/commit/748879311acebf47929bac613cce85ba4f0dc265))
* **ai:** show why a recategorization failed ([5fcadfb](https://github.com/TautvydasDerzinskas/Thingport/commit/5fcadfb179eeb8f40bb597a2826fa65f605ee256))
* allow replacing a model's only file in the edit dialog ([fc3f3ef](https://github.com/TautvydasDerzinskas/Thingport/commit/fc3f3efd48b9e926549773610e9d218780a28f21))
* big collection import printables ([8cb97bd](https://github.com/TautvydasDerzinskas/Thingport/commit/8cb97bd315a7a4a53c1879432679cdeb6f42bf71))
* correct multi-part 3MF previews and stop risky in-browser fallback ([65236c5](https://github.com/TautvydasDerzinskas/Thingport/commit/65236c5803b0624eced5fea069cd9594abeeeade))
* count queued links as models and let imported images replace 3D renders ([dd4d259](https://github.com/TautvydasDerzinskas/Thingport/commit/dd4d2592eae358357f71be13ac305d7219381d30))
* couple ux improvements ([030b155](https://github.com/TautvydasDerzinskas/Thingport/commit/030b1553e170b75c46766ee285dad21f0608e957))
* decode UTF-8 filenames delivered in the Latin-1 Content-Disposition header ([#3](https://github.com/TautvydasDerzinskas/Thingport/issues/3)) ([b732992](https://github.com/TautvydasDerzinskas/Thingport/commit/b73299222a3c086d6663bc2c59a7b7f0902ac755))
* derive the 3D preview memory budget from available memory ([5685514](https://github.com/TautvydasDerzinskas/Thingport/commit/5685514da632c4aa407d8e79d5f0ffddac479815))
* distinguish Thingiverse rate limits from auth errors and add AI run logging ([c5e5ab4](https://github.com/TautvydasDerzinskas/Thingport/commit/c5e5ab460e336e2b4eb071f8928d77b96cc36ea4))
* **extension:** check a MakerWorld collection against the library in one call ([44c687b](https://github.com/TautvydasDerzinskas/Thingport/commit/44c687b3ae7ba96a7246ece73d79212733cfd449))
* file upload file name utf8 issues ([6d34243](https://github.com/TautvydasDerzinskas/Thingport/commit/6d34243b89fe5f4e08f1fe9cc1fcb784d55d447d))
* import issues ([0d1efdb](https://github.com/TautvydasDerzinskas/Thingport/commit/0d1efdba02149f00ac3d0aca279cbe35e7b1e97e))
* importing models due preview generation uses all resources ([355833c](https://github.com/TautvydasDerzinskas/Thingport/commit/355833ca240865bf89684c4cb4bf05eb4648ddc6))
* **import:** limit manual CAPTCHA cooloff lifts to one per 5 minutes, require value on captcha keys ([bf083bc](https://github.com/TautvydasDerzinskas/Thingport/commit/bf083bcb26d2d49cafdc270523a210a15ad918da))
* **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))
* improve bookmarks ui ([01f8812](https://github.com/TautvydasDerzinskas/Thingport/commit/01f8812cef9abf45824038d735eed6d9b2d9f731))
* include MakerWorld gallery images when importing from the model page ([e87eb39](https://github.com/TautvydasDerzinskas/Thingport/commit/e87eb39ab6aa0cb8f8ea465c0407f0ae8c71b6e0))
* make link-authors test deterministic ([9ada95b](https://github.com/TautvydasDerzinskas/Thingport/commit/9ada95b0a23fc949de3a57f413f423edddfd587a))
* make storage template collection and creator tokens reflect real data ([32710f2](https://github.com/TautvydasDerzinskas/Thingport/commit/32710f25e7b1011b9dc85bbbb67d403f6381a14a))
* make sure authors are removed when no models assigned to them ([55f5aaa](https://github.com/TautvydasDerzinskas/Thingport/commit/55f5aaa4a0473e23f87933f2347e7ef1bd75bb45))
* maker world importing ([476895f](https://github.com/TautvydasDerzinskas/Thingport/commit/476895f72f2d5327b1b193d8bfb7eddb4bb3c38e))
* MakerWorld author to print linking ([60eb0b9](https://github.com/TautvydasDerzinskas/Thingport/commit/60eb0b90feb2fefb1296a07a792ca0965a1e39ba))
* Makerworld import issues + allowing import different profiles ([303ab91](https://github.com/TautvydasDerzinskas/Thingport/commit/303ab918ea9b1f2d6866baf89f11b601364a1a36))
* minor adjustments in regards of import redirects and authors ([f187b9f](https://github.com/TautvydasDerzinskas/Thingport/commit/f187b9f25ec2cadf12ca03430c601ec0077b27bc))
* minor fixes along admin ([75de79c](https://github.com/TautvydasDerzinskas/Thingport/commit/75de79c4bcf6cc30bd79739bc8ff729718088244))
* minor fixes in UI ([f93bfc7](https://github.com/TautvydasDerzinskas/Thingport/commit/f93bfc7db4de24d07d03d30cfa51d988a87f76da))
* more than 11 models printables import ([27948c0](https://github.com/TautvydasDerzinskas/Thingport/commit/27948c01eef2202d851098f82972194c67f47d63))
* move preview generation to own separate thread ([ba08d30](https://github.com/TautvydasDerzinskas/Thingport/commit/ba08d30e1ee5685c67260886d4edb87e82332e1d))
* profile menu chips ([f903abc](https://github.com/TautvydasDerzinskas/Thingport/commit/f903abcd293b77adce74f0d786b6fa462ff4ef3b))
* show a proper error message when MakerWorld cookie fails due flareSolverr ([a81765e](https://github.com/TautvydasDerzinskas/Thingport/commit/a81765e1caff377ef442d3202ecebb6b566ebf92))
* 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)
* update Makerworld import logic ([3bc4f9c](https://github.com/TautvydasDerzinskas/Thingport/commit/3bc4f9c96dfe0b07de83d3fbff113efb3d14a2a1))
* various small UI issues ([8ba368e](https://github.com/TautvydasDerzinskas/Thingport/commit/8ba368e209c7d56e4ee48e5bf042e777f19d5b0a))

### Features

* ability to link multiple AIs ([56f173a](https://github.com/TautvydasDerzinskas/Thingport/commit/56f173a20b574014f5a29c6c8bbcc38f71c3dda8))
* accept MakerWorld page data sent with an extension import ([616a8b8](https://github.com/TautvydasDerzinskas/Thingport/commit/616a8b82c3657727b80da1fa924f35a32ca46d38))
* add ability to enable catpcha ([6a6a87e](https://github.com/TautvydasDerzinskas/Thingport/commit/6a6a87e38d8a8b65edf137171dfb6ff15dde3976))
* add admin job to refetch all user descriptions ([0cc27c9](https://github.com/TautvydasDerzinskas/Thingport/commit/0cc27c9eb618154c477dac5bd9cb1361eb7d291c))
* add Anycubic Slicer Next, Elegoo Slicer and Snapmaker Orca slicer options ([9dd3e69](https://github.com/TautvydasDerzinskas/Thingport/commit/9dd3e693e09efadb958b7ed31713310aad99f9c8))
* add author hover popover preview card ([864ec1c](https://github.com/TautvydasDerzinskas/Thingport/commit/864ec1cacdcf85a2f49a3ac64054178739ee36c5))
* add author linking admin trigger ([2a3434f](https://github.com/TautvydasDerzinskas/Thingport/commit/2a3434f126a92eb44e4ee633394146e8942f2a9a))
* add author page ([45b6bac](https://github.com/TautvydasDerzinskas/Thingport/commit/45b6bac574c69e376f982c18c71f7a3306176cd0))
* add captcha options for changing password and email ([21f91d6](https://github.com/TautvydasDerzinskas/Thingport/commit/21f91d62758e894488a18663adecc998f1a207a6))
* add collections ([b5568d3](https://github.com/TautvydasDerzinskas/Thingport/commit/b5568d35e61734f18504ddf697a8a78bf5521da6))
* add consume folder support ([e22f579](https://github.com/TautvydasDerzinskas/Thingport/commit/e22f57903f3c3f564e92a085eef99c4877127723))
* add first version of search ([83e0beb](https://github.com/TautvydasDerzinskas/Thingport/commit/83e0bebf45836017c3181b7ded881153b7e84451))
* add flaresolverr ([d8c2ef2](https://github.com/TautvydasDerzinskas/Thingport/commit/d8c2ef20ffe226df89c2a5bc64124d73aa5c17ec))
* add proper auth ([be45bac](https://github.com/TautvydasDerzinskas/Thingport/commit/be45bacbea7e313253c4cccc0a3dc633ad3b2876))
* add rich text formatting toolbar to model descriptions ([d49d7c9](https://github.com/TautvydasDerzinskas/Thingport/commit/d49d7c99196633d85b7ae3d375edd5f45e919829))
* add sanitized bambu 3mf open option ([0d8cd62](https://github.com/TautvydasDerzinskas/Thingport/commit/0d8cd62fa7837875591cad5bd58bd968bd7862e1))
* add setting to customize dashboard model thumbnail appearance ([163d73f](https://github.com/TautvydasDerzinskas/Thingport/commit/163d73f2a79b6e1a5c3721b996aef7c8310c93bf))
* add sorting and ect ([312c6be](https://github.com/TautvydasDerzinskas/Thingport/commit/312c6be706ec3f49356f71cb933bc78d0d64b71e))
* add tags route ([6990c2f](https://github.com/TautvydasDerzinskas/Thingport/commit/6990c2ff9f200ebd27c4deaafd47e0c3867b849c))
* add to collections modals ([1d8443e](https://github.com/TautvydasDerzinskas/Thingport/commit/1d8443e069a3bce13692f1d64cd071f8c6edf46c))
* add users activity page ([6533781](https://github.com/TautvydasDerzinskas/Thingport/commit/6533781a2141e720e953089a5fd55c2ddc5c4685))
* admin panel remake ([2bce5a2](https://github.com/TautvydasDerzinskas/Thingport/commit/2bce5a20497e8523f9d73fba83e30c3cb2f1917f))
* admin sidebar change and system health check view ([#48](https://github.com/TautvydasDerzinskas/Thingport/issues/48)) ([92161f8](https://github.com/TautvydasDerzinskas/Thingport/commit/92161f8cf801ea57ac229cf91e07190417e7b216))
* administration settings remake + OIDC support ([#49](https://github.com/TautvydasDerzinskas/Thingport/issues/49)) ([9a22386](https://github.com/TautvydasDerzinskas/Thingport/commit/9a2238691d8b079adf7bfb4becebc9cf01cb6cad))
* **admin:** manage user roles and delete users, with an instance owner ([9d41c4d](https://github.com/TautvydasDerzinskas/Thingport/commit/9d41c4dee3333677b964d2d0baede8ce45d5aa45))
* AI features split, categorisation UX updates ([e542cc4](https://github.com/TautvydasDerzinskas/Thingport/commit/e542cc4473cb57ad5281b06d15518e10ade8f843))
* **ai:** accept the provider base URL with or without /v1 ([29c54ba](https://github.com/TautvydasDerzinskas/Thingport/commit/29c54bac117077e9ee2dabed068baf6dfb56386b))
* **AI:** add improved descriptions ([97f17e4](https://github.com/TautvydasDerzinskas/Thingport/commit/97f17e4fa35aa03db4ce8ac17b8419100efc333c))
* allow bookmarking collections ([4f40803](https://github.com/TautvydasDerzinskas/Thingport/commit/4f408031b43d97e7040df21ddbbf259bfce65456))
* allow disabling registrations + invitation system ([91ffbf5](https://github.com/TautvydasDerzinskas/Thingport/commit/91ffbf5441dec0bedde4fd901c1bdca18a2b7267))
* allow downloading collection and tag models in bulk ([d3c651c](https://github.com/TautvydasDerzinskas/Thingport/commit/d3c651c05d2fa0e16f55546189cd5965997fd216))
* allow import thingiverse likes & collections ([ac32d03](https://github.com/TautvydasDerzinskas/Thingport/commit/ac32d03071d139ec4a8bdaed0017686cd68d700f))
* allow multiple meta category ids ([8450885](https://github.com/TautvydasDerzinskas/Thingport/commit/8450885ea19df6e505c6b3d5c0f3f061c462b09a))
* allow open in Cura slicer ([e84fbca](https://github.com/TautvydasDerzinskas/Thingport/commit/e84fbca5f9bfc2040c86cb07ffe421c75bffd212))
* allow toggling off author previews per user ([711ece0](https://github.com/TautvydasDerzinskas/Thingport/commit/711ece0f62bff1c93f951024f5f98bac582e7dd2))
* anable complex model simplification ([7464583](https://github.com/TautvydasDerzinskas/Thingport/commit/746458378052fa228465261cceca1a71dea58c34))
* **api-tokens:** add per-user API tokens with generation and revocation ([469641d](https://github.com/TautvydasDerzinskas/Thingport/commit/469641de181b76bf463357548fa314b777ab1f4d))
* **auth:** add password reset flow ([3a05fae](https://github.com/TautvydasDerzinskas/Thingport/commit/3a05fae555d3a553196487930f636ade4f9348e8))
* author linking and other minor author changes ([589a5f4](https://github.com/TautvydasDerzinskas/Thingport/commit/589a5f464abdd675afe1ef8f63fe2ed843823043))
* browse private collections functionality ([b619084](https://github.com/TautvydasDerzinskas/Thingport/commit/b619084be7ed060d02cd6ba473a196e7ba0859de))
* bulk feature changes ([7d18539](https://github.com/TautvydasDerzinskas/Thingport/commit/7d185395a355f327472652a054ba4a6a01800ba6))
* **categories:** add toggle between categories and folders ([33400fa](https://github.com/TautvydasDerzinskas/Thingport/commit/33400fa12803e1e7588a13fb200061b916062b80))
* **categories:** allow moving subcategories between parent categories ([172270f](https://github.com/TautvydasDerzinskas/Thingport/commit/172270fce81f4f713b295bde33e3bd853fcbc582))
* **categories:** allow unlimited depth of categories ([04f3106](https://github.com/TautvydasDerzinskas/Thingport/commit/04f3106ce84f94c92a08b42fa2546c4e050c1f98))
* categorize models with an OpenAI-compatible AI provider ([#11](https://github.com/TautvydasDerzinskas/Thingport/issues/11)) ([708a938](https://github.com/TautvydasDerzinskas/Thingport/commit/708a93822a40a69249232f52de8296006c33b7ae))
* chrome estensions Thingport grab ([7d53efb](https://github.com/TautvydasDerzinskas/Thingport/commit/7d53efb785469248b7d3be20fbf5af499a062090))
* collection impoort ([031cdf3](https://github.com/TautvydasDerzinskas/Thingport/commit/031cdf39902e212e24e0cb74d3cdbb8e7450a3a6))
* collection import pt2 ([f04ca0c](https://github.com/TautvydasDerzinskas/Thingport/commit/f04ca0c8b80bbc995084309c463896ffc32c7997))
* **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)
* **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))
* dashboard implementation ([cf5c8a9](https://github.com/TautvydasDerzinskas/Thingport/commit/cf5c8a958462bb0193379966696aa11935d72d1b))
* **dashboard:** add clock, weather, and featured-model widgets ([c71154a](https://github.com/TautvydasDerzinskas/Thingport/commit/c71154a83eb897122488a7c619cf38732eb4be44))
* **dashboard:** make dashboard panes toggleable ([3d1c851](https://github.com/TautvydasDerzinskas/Thingport/commit/3d1c851ad7baa007f883499d310c438f97c2b264))
* default categories for new users ([cefc27f](https://github.com/TautvydasDerzinskas/Thingport/commit/cefc27f23fd25e9693bcdc0f43b3e1b9c11f646c))
* edit model functionality ([37ac318](https://github.com/TautvydasDerzinskas/Thingport/commit/37ac318e40dff826d6081657cb59e4f3c30a4b5e))
* enable back flaresolverr ([ead9751](https://github.com/TautvydasDerzinskas/Thingport/commit/ead97510d4f4b39109e74f8921bc2b1fceb4dca3))
* extend dashboard settings with layouts ([2813237](https://github.com/TautvydasDerzinskas/Thingport/commit/2813237e037c9559b2d4beb161afffed5628c4b0))
* **extension:** improve loading messaging + make queue admin-only ([67a31cc](https://github.com/TautvydasDerzinskas/Thingport/commit/67a31cc94052fda9faf1daf831b6fbf5ce7b53e9))
* **flaresolverr:** make URL configurable in admin settings ([5fa6c40](https://github.com/TautvydasDerzinskas/Thingport/commit/5fa6c403247e497c0dece4e8e3e1d28d1e25b484))
* handle download limit error gracefully ([fd7c26a](https://github.com/TautvydasDerzinskas/Thingport/commit/fd7c26a760b82142b8be74634f1461e2007d5ab1))
* import all designer or all MakerWorld print profiles of a model ([101aa03](https://github.com/TautvydasDerzinskas/Thingport/commit/101aa03f9c7526287847afd60d8733dfb0125db5))
* import author details from makerworld ([b16c27b](https://github.com/TautvydasDerzinskas/Thingport/commit/b16c27bc1e4f107598824814a406043478ec609f))
* improve model details page ([d5db3d3](https://github.com/TautvydasDerzinskas/Thingport/commit/d5db3d3b18ca7844f4b2abda687b78757d8c0302))
* improve model details page ([05fae4c](https://github.com/TautvydasDerzinskas/Thingport/commit/05fae4c93fe9e466d3443f2a909df8c9298b7ee0))
* increase MakerWorld pacing ([fa75ae1](https://github.com/TautvydasDerzinskas/Thingport/commit/fa75ae1219334c98c675665ae5010d7c93cf176c))
* initial commit ([a8fef7d](https://github.com/TautvydasDerzinskas/Thingport/commit/a8fef7d4913d1096beaabc4cd78b9c3a6b7d3c86))
* 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))
* make print count be more interactive ([8e4f7dd](https://github.com/TautvydasDerzinskas/Thingport/commit/8e4f7ddf47de719b4da95753e1741e97f5de353c))
* make sure thingiverse token is verified ([9d07db9](https://github.com/TautvydasDerzinskas/Thingport/commit/9d07db9dc9c9cc3ef468ebdac96b9e2affe3132e))
* make ttl configurable in admin ([6c66e7b](https://github.com/TautvydasDerzinskas/Thingport/commit/6c66e7b615e4ebb8d18feea00330636b533fdad7))
* **notifications:** reinvent notifications ([1408b09](https://github.com/TautvydasDerzinskas/Thingport/commit/1408b09c5989499b38ee0effd1b7c29661a233a5))
* pause guided MakerWorld imports on a CAPTCHA, and fix localized and long collection imports ([627a442](https://github.com/TautvydasDerzinskas/Thingport/commit/627a442d53a709f41e42bc508af7305aca5578a1))
* printables importing ([47a0ddd](https://github.com/TautvydasDerzinskas/Thingport/commit/47a0dddf9337e2624505bc2acf3be5e6e9b1033a))
* rebrand from PrintStash to Thingport ([56de86d](https://github.com/TautvydasDerzinskas/Thingport/commit/56de86d5b5367fe593587bee73c1ca730e356ae5))
* **search:** add ability to load search active views ([90a9942](https://github.com/TautvydasDerzinskas/Thingport/commit/90a9942d1b9966bdcf0558e8d5b986af79a625bf))
* **search:** add option to see all results ([ad27e95](https://github.com/TautvydasDerzinskas/Thingport/commit/ad27e950a9048a4e50ab67196fbd42d61db86f89))
* show available models in model input ([8718d82](https://github.com/TautvydasDerzinskas/Thingport/commit/8718d82ab3b4afe0565e0d0a8dddb6de540493fc))
* show model usage in memory size ([2813d47](https://github.com/TautvydasDerzinskas/Thingport/commit/2813d47049817697e3c74ba0db82217c2912111d))
* support Markdown with embedded images in model descriptions ([97f0eea](https://github.com/TautvydasDerzinskas/Thingport/commit/97f0eea4c267612c8b78546d43129550dfac4dc8))
* **sync:** notify on enable, change defaults to daily and designer profiles ([9334438](https://github.com/TautvydasDerzinskas/Thingport/commit/9334438a521a2a5f9a39f6af4d892ac2465c02ce))
* **sync:** pause syncs while a provider isn't connected, and hand back models blocked by it ([6993a4c](https://github.com/TautvydasDerzinskas/Thingport/commit/6993a4c4231b9e80db9eb13c27ab97fc89e9ac01))
* 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))
* **tags:** add pagination, thumbnails, and tag deletion ([cdf0a53](https://github.com/TautvydasDerzinskas/Thingport/commit/cdf0a53251e1ef6d507b15735ad3cae7406b00de))
* various major UI & UX improvements ([7b1f718](https://github.com/TautvydasDerzinskas/Thingport/commit/7b1f718c74485b79c9117469ff35aa4c661f6829))

### Performance Improvements

* **tags:** render tag mosaics on the server and size pages to the screen ([eefbde1](https://github.com/TautvydasDerzinskas/Thingport/commit/eefbde1bb5c64bd0860e2613a79e768a0f0e6891))
2026-10-17 08:57:49 +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
Tautvydas Derzinskas 97f0eea4c2 feat: support Markdown with embedded images in model descriptions 2026-10-07 00:31:34 +02:00
Tautvydas Derzinskas 0d8cd62fa7 feat: add sanitized bambu 3mf open option 2026-09-30 08:31:16 +02:00
Tautvydas Derzinskas e111dc27d7 chore: update licence and perform comment clean up 2026-09-28 22:34:47 +02:00
Tautvydas Derzinskas 7464583780 feat: anable complex model simplification 2026-09-28 00:09:59 +02:00
Tautvydas Derzinskas 6a6a87e38d feat: add ability to enable catpcha 2026-09-27 19:53:39 +02:00
Tautvydas Derzinskas 56de86d5b5 feat: rebrand from PrintStash to Thingport 2026-09-10 07:08:51 +02:00
Tautvydas Derzinskas 8cb97bd315 fix: big collection import printables 2026-09-09 23:33:39 +02:00
Tautvydas Derzinskas 2bce5a2049 feat: admin panel remake 2026-09-09 10:22:34 +02:00
Tautvydas Derzinskas 51b56021c0 refactor: deal with few things 2026-09-08 16:57:27 +02:00
Tautvydas Derzinskas be45bacbea feat: add proper auth 2026-09-07 19:20:13 +02:00
Tautvydas Derzinskas a8fef7d491 feat: initial commit 2026-09-07 09:12:37 +02:00