Phase 2 of the plan in docs/design.md ("Next"): product info.
Drafts
A new upload is a draft. Only its creator and moderators can see it, and nobody can get or wear it.
After uploading, the website goes straight to the product's review page, where the creator checks its info and presses Publish.
Drafts not published within 30 days are deleted (checked every 10 minutes), and their catalogs get delete entries in their changes feed.
The console's overview shows a "Drafts" to-do.
Editing is a permission check now (product:edit, from #7)
Moderators can edit anyone's product. They must give a reason, which the creator sees.
Moderators can lock fields (product:lock). Once a field is locked, only people with product:edit-locked can change it, so the creator sees it greyed out with "Locked by a moderator."
Raising a rating to adult is immediate for anyone who can edit. Lowering it takes product:rate-lower (moderators), and is refused while any revision's files are rated adult. With cases (phase 3), a creator's request to lower it will open a rating review.
Info history
Every edit, publish, lock change and undo is recorded with who, when, what changed (before and after) and why.
It's shown on the edit page to the creator and moderators.
"Undo" puts back what an entry changed, as a new entry, by the same rules (a creator can't undo a moderator's change to a field that's now locked).
Moderator actions are also in the creator's audit log.
Unlisted products and tags
An unlisted product is left out of search, lists and creator pages, except for its creator. Its link still works and people can still get it.
Tags: up to 10 per product, lowercased.
/products filters by tag and catalog, and a product's tags link to the filtered list.
People who don't manage a product don't see its state labels (draft, unlisted, locks).
Console → Products
Lists your products with drafts included; moderators can switch to everyone's.
Filters: draft, published, unlisted, locked, deleted, removed, plus search.
Shows how many libraries each product is in, and an Edit or Review button.
Category
A product can be filed under a different IMVU category from its parent's.
The choices are every category path the hub has seen on any product's parent, plus each level of those paths. They're limited to the same top-level category as the parent's, so a product stays the same kind (clothing, furniture or rooms), which the proxy relies on for the shop and inventory tabs.
The list grows as products are uploaded. IMVU's own category tree, if it has a public one, would replace it.
Category works like the other info fields: it can be locked, it's in the history, and it can be undone. The product list's category filter, and everything that shows a product's categories (including what the proxy gets), use the chosen path.
Migration0011_product_info: new product columns and the product_info_change table. Existing products count as published (with published_at set from their creation date) and listed.
Compatibility
t5de-catalog needs no change: the hub's new draft field in the registration answer is ignored, and the website doesn't rely on it.
The proxy only loads products from libraries, and drafts can't be added to one.
Checks
44 API tests pass, including a new one for moderator edits, locks, history, undo, unlisted, tags, the console list and draft purging, and new checks for category choices.
Type checks pass.
On a local hub I loaded the pages as the creator, an admin, another person and a signed-out visitor.
I submitted the forms through the website, the way a browser does without JavaScript: save info, publish, choosing a category (and undoing it), a moderator's save with and without a reason, save locks, and undo, including a creator's undo refused by a lock. Each saved or refused correctly with the right message.
Not tried: the upload form's redirect after a real upload to a running catalog.
Phase 2 of the plan in `docs/design.md` ("Next"): product info.
**Drafts**
- A new upload is a draft. Only its creator and moderators can see it, and nobody can get or wear it.
- After uploading, the website goes straight to the product's review page, where the creator checks its info and presses Publish.
- Drafts not published within 30 days are deleted (checked every 10 minutes), and their catalogs get `delete` entries in their changes feed.
- The console's overview shows a "Drafts" to-do.
**Editing is a permission check now** (`product:edit`, from #7)
- Moderators can edit anyone's product. They must give a reason, which the creator sees.
- Moderators can lock fields (`product:lock`). Once a field is locked, only people with `product:edit-locked` can change it, so the creator sees it greyed out with "Locked by a moderator."
- Raising a rating to adult is immediate for anyone who can edit. Lowering it takes `product:rate-lower` (moderators), and is refused while any revision's files are rated adult. With cases (phase 3), a creator's request to lower it will open a rating review.
**Info history**
- Every edit, publish, lock change and undo is recorded with who, when, what changed (before and after) and why.
- It's shown on the edit page to the creator and moderators.
- "Undo" puts back what an entry changed, as a new entry, by the same rules (a creator can't undo a moderator's change to a field that's now locked).
- Moderator actions are also in the creator's audit log.
**Unlisted products and tags**
- An unlisted product is left out of search, lists and creator pages, except for its creator. Its link still works and people can still get it.
- Tags: up to 10 per product, lowercased.
- `/products` filters by `tag` and `catalog`, and a product's tags link to the filtered list.
- People who don't manage a product don't see its state labels (draft, unlisted, locks).
**Console → Products**
- Lists your products with drafts included; moderators can switch to everyone's.
- Filters: draft, published, unlisted, locked, deleted, removed, plus search.
- Shows how many libraries each product is in, and an Edit or Review button.
**Category**
- A product can be filed under a different IMVU category from its parent's.
- The choices are every category path the hub has seen on any product's parent, plus each level of those paths. They're limited to the same top-level category as the parent's, so a product stays the same kind (clothing, furniture or rooms), which the proxy relies on for the shop and inventory tabs.
- The list grows as products are uploaded. IMVU's own category tree, if it has a public one, would replace it.
- Category works like the other info fields: it can be locked, it's in the history, and it can be undone. The product list's category filter, and everything that shows a product's categories (including what the proxy gets), use the chosen path.
**Migration** `0011_product_info`: new product columns and the `product_info_change` table. Existing products count as published (with `published_at` set from their creation date) and listed.
**Compatibility**
- `t5de-catalog` needs no change: the hub's new `draft` field in the registration answer is ignored, and the website doesn't rely on it.
- The proxy only loads products from libraries, and drafts can't be added to one.
**Checks**
- 44 API tests pass, including a new one for moderator edits, locks, history, undo, unlisted, tags, the console list and draft purging, and new checks for category choices.
- Type checks pass.
- On a local hub I loaded the pages as the creator, an admin, another person and a signed-out visitor.
- I submitted the forms through the website, the way a browser does without JavaScript: save info, publish, choosing a category (and undoing it), a moderator's save with and without a reason, save locks, and undo, including a creator's undo refused by a lock. Each saved or refused correctly with the right message.
- Not tried: the upload form's redirect after a real upload to a running catalog.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
New uploads are drafts: only their creator and moderators see them, nobody can get or wear them, and they're
deleted if not published within 30 days (their catalogs get delete changes). The creator reviews the info and
publishes it.
Editing a product's info is a permission check now (product:edit): moderators can edit anyone's with a reason the
creator sees, lock fields (product:lock; locked fields need product:edit-locked) and lower ratings
(product:rate-lower, not below its files'). Every change is kept in the product's info history, with who and why,
and can be undone by the same rules.
Products can be unlisted (out of search and lists, the link still works) and tagged; lists filter by tag and
catalog. The console has a Products section (everyone's for moderators, by status) and a drafts to-do.
A product's own category is left for later: the hub has no list of IMVU's categories to pick from.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
A product can be filed under another IMVU category than its parent's: any category path the hub has seen on a
revision's parent (and each step of it), within the parent's top-level category, so it stays the same kind of
product (the proxy tells clothing, furniture and rooms apart by category). It's an info field like the others:
lockable, in the history, undone by the same rules. Lists filter by the chosen path, and products show it.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
dhkatz
changed title from feat: product drafts, moderator edits, info history, unlisted products and tags to feat: product drafts, moderator edits, info history, unlisted products, tags and categories2026-11-05 14:00:21 +00:00
dhkatz
merged commit e07a6c6dac into main2026-11-05 14:23:27 +00:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Phase 2 of the plan in
docs/design.md("Next"): product info.Drafts
deleteentries in their changes feed.Editing is a permission check now (
product:edit, from #7)product:lock). Once a field is locked, only people withproduct:edit-lockedcan change it, so the creator sees it greyed out with "Locked by a moderator."product:rate-lower(moderators), and is refused while any revision's files are rated adult. With cases (phase 3), a creator's request to lower it will open a rating review.Info history
Unlisted products and tags
/productsfilters bytagandcatalog, and a product's tags link to the filtered list.Console → Products
Category
Migration
0011_product_info: new product columns and theproduct_info_changetable. Existing products count as published (withpublished_atset from their creation date) and listed.Compatibility
t5de-catalogneeds no change: the hub's newdraftfield in the registration answer is ignored, and the website doesn't rely on it.Checks
🤖 Generated with Claude Code
feat: product drafts, moderator edits, info history, unlisted products and tagsto feat: product drafts, moderator edits, info history, unlisted products, tags and categories