Manual release notes for the portfolio project.
Change Log
A dedicated timeline of implementation updates, fixes, and product polish added to this portfolio. Open each entry to read the full change summary.
Upgraded the blog article system into a more modular content structure.
Blog content can now be arranged as flexible content blocks instead of relying on a single rigid article-section pattern.
Added support for standalone headings, text-only content, image blocks, and mixed text-image layouts.
Image blocks now support captions and layout-ready aspect ratio handling for more polished presentation.
The blog rendering flow was updated so the new content structure can be displayed properly on public article pages.
Existing article content was also prepared to follow the new content structure more consistently.
Added a new part-time work experience entry for Satya Wacana Christian University and prepared the supporting database insert flow for the assistant lecturer history.
- Added a new employment type convention: PT for part-time work.
- Prepared Satya Wacana company data, five assistant lecturer detail entries, and fifteen timeline items based on the work notes.
- Adjusted part-time detail pages so empty detailed breakdown sections are hidden while the explore-more-projects section remains visible.
- Introduced the M timeline type as a marker item so celebration timeline cards can use party.svg without depending on title wording.
Added a dynamic `/sitemap.xml` endpoint that generates XML output from public portfolio routes and database-backed content so search engines can discover the site structure more reliably.
This setup keeps the sitemap current without needing a manually maintained static XML file while still exposing the standard `/sitemap.xml` URL expected by search engines and webmaster tools.
- Included static public routes such as home, work, work/projects, blog, change-log, about, and contact in the sitemap output.
- Included dynamic company, project, and blog article URLs in the sitemap using existing portfolio data queries.
- Added `lastmod` values to sitemap entries using available create and update timestamps.
- Added a root-level `robots.txt` file that points crawlers to the sitemap and blocks crawling for API, admin, and preview paths.
Added a dedicated backend-backed view counting flow for public blog article detail pages so article popularity can be tracked without relying on raw page hits.
The final behavior counts only one valid view per article per visitor per day. Refreshes or repeated visits on the same day no longer inflate the counter, while visits on the next day can be counted again.
- Created `log_article` as the validation and history table for counted views.
- Added `view_count` column to `blog_head` table as a fast display counter for listing and detail rendering.
- Implemented a deterministic daily `view_key` based on article ID, session ID, IP address, user agent, and current date.
- Added simple bot filtering by checking `bot`, `crawl`, and `spider` keywords in the request user agent.
- Skipped preview, admin, and internal reading flows from being counted so metrics stay focused on public visitors.
- Wrapped log insertion and counter increment in one database transaction to prevent partial updates.
- Added duplicate protection both in application logic and at the database level with a unique key on article ID and view key.