6 updates · latest 1 Sept 2026

<FileImportButton>, next to each form's submit) loads a .md file as editor text; for admins it also accepts a .html file (max 1MB) whose raw text becomes the body — shown as an attachment card (<HtmlDocCard>) in place of the editor, since HTML is never hand-written or previewed. Wired into the thread forms and the Posts/Blogs managers; announcements untouched.<Content> renders markdown through react-markdown, and an html body by injecting it as-is — the backend only accepts the format from admins, so the page trusts what it reads. Forum snippets and meta descriptions strip tags (and style/script blocks) from HTML bodies; thumbnails read the first <img>.Post/Blog carry an optional format field ("markdown" | "html"), sent with every create/edit.27 Aug 2026

Changed
updated_at now means "last activity", not "row last edited". POST /api/post and PUT /api/post stamp the parent project through the new ProjectRepository.Touch, so /api/project?sort=updated ranks projects by their newest discussion and the frontend's "New" badge lights for projects the forum has been busy in. One single-column write per post, instead of the project list joining posts and taking a MAX(updated_at) per row on every request.internal/post declares the one-method ProjectToucher interface rather than importing internal/project, and registerPostRoutes now takes the project repository.?page= stays inside the same route segment, so app/loading.tsx never fired. <PendingList> (src/components/list/) now swaps the list for the shared <Spinner> while a pager link is in flight — on Forum, Projects, Blog and a project's Discussions — driven by Next 16's useLinkStatus() reported from each <Chip>.updated_at on every thread post or edit, which sorting, the badge and <MarkSeen> already read.Added
ProjectRepository.BackfillActivity(), run once at boot next to the existing fan-verification migration. It lifts any project whose newest discussion is more recent than its own updated_at, so existing rows rank correctly from the first deploy. Idempotent — once caught up the WHERE matches nothing, and a project edited after its last post is left alone rather than rolled back.<SortControls>, <Pagination> and <Chip> are plain links, so everything works without client JS, and the forum's project filter round-trips to the backend as ?project= so the pager counts the filtered set. URL helpers live in src/lib/query.ts.seen_<kind> cookie holds a unix-seconds updated_at watermark and isFresh() lights anything changed within 3 days after that mark; an edited thread, project or post lights up again. Old id-valued cookies are ignored.sort=updated&order=desc&page_size=1 lookup (Blog reuses /api/blog/recent), so an A–Z or page-2 view never badges the wrong row. Projects join Blog and Forum with <MarkSeen kind="projects"> and a header dot.14 Aug 2026

.svg file uploading..jpg, .jpeg, .png.1920x at most.Try upload an image when making posts :).
6 Aug 2026

4 Aug 2026

Hi all,
The number of members has just reached 21! Thanks for you registration. I have recently released the version 1.1 of this site. You can now experience the refactored UI and a brand new "forum" section where anyone can send message and interact. Blog section will be adding more tutorials!
Cheers, Zhouzhou
22 Mar 2026

This website is officially embracing its 1.0 version. Welcome join the community and discover our future opportunites.