Update Logs
View product update logs, including latest features and improvements.
Astrology Pro View and Share Polish - Julian Tarot
This release focuses on consistency for the pro chart view and a smoother share flow.
Chart Rendering
- Show major + minor aspects by default in both compact and expanded views with consistent stroke weight
- Post-process ASC/MC axis labels/lines to avoid overlapping zodiac text and keep optional DSC/IC labels
- Share cards now respect aspect/axis toggles for visual parity
Expanded Layout
- Desktop/tablet switch to a two-column layout with a scrollable settings panel and a scroll hint
- Mobile zoom hides the site header to keep share/close buttons accessible
Sharing + Localization
- Share modal now pulls copy and quotes from i18n
- Added zh-TW/en share card strings
Files Updated
src/app/[locale]/(landing)/astrology/_components/AstrologyChart.tsxsrc/app/[locale]/(landing)/astrology/_components/AstrologyResultPageClient.tsxsrc/app/[locale]/(landing)/astrology/_components/AstrologyShareCard.tsxsrc/app/[locale]/(landing)/astrology/_components/AstrologyShareModal.tsxsrc/config/locale/messages/en/landing.jsonsrc/config/locale/messages/zh-TW/landing.jsonsrc/config/style/global.csssrc/themes/default/blocks/header-lite.tsxcontent/logs/v2.1.5.mdxcontent/logs/v2.1.5.en.mdx
Database Hardening: Schema Migration - Julian Tarot
This release focuses on database hardening by shrinking the public schema exposure surface.
Database Hardening
- Migrated core tables from
publictoappto avoid default Data API exposure - Kept
publicas an empty outward-facing schema for future selective exposure
Environment Variables
- Added
DB_SCHEMA=appas the default query schema - Updated
.env.exampleand.env.local.exampleto prevent missing setup
Files Updated
.env.example.env.local.examplecontent/logs/v2.1.4.mdxcontent/logs/v2.1.4.en.mdx
Locale Cleanup & Prompt Consistency - Julian Tarot
This release simplifies locale support to match the current product scope and keeps AI prompts consistent with the user's question language.
Locale & Prompt Updates
- Reduced supported locales to
zh-TWandenacross prompts, safety messages, and spread configs - Normalized AI prompt locale to follow the question text language
- Mapped locale for region-aware prompts in intuitive reading
Type Safety & Cleanup
- Fixed spread name/position access typing in reading flows
- Corrected keywords access for non-general meanings
- Added missing
useRefimport in TopBanner - Fixed blog category filtering to avoid null category types
UI Copy & Social Updates
- Updated daily card CTA copy and standardized social proof display with monochrome iconography
- Reordered footer social links and set official Threads/Instagram/LINE destinations
- Swapped header CTA icon to a supported Lucide icon to avoid fallback question marks
- Added Threads icon support for shared icon rendering
- Backfilled English About page copy for newly added sections
- Updated About page privacy icon to a supported keyhole shield variant
- Removed markdown bold markers from About page text rendering
- Removed global
content-visibilitywrapping to restore smooth reveal animations
Content Locale Naming
- Use
zh-TWas the default language:.mdx= Traditional Chinese,.en.mdx= English - Aligned docs/logs/pages filenames to avoid mixed locale conventions
Accessibility & Performance
- Scoped
content-visibilityto the testimonials carousel to keep below-the-fold rendering light - Adjusted footer column headings to avoid skipped heading levels
- Improved browser locale detection by mapping
zh-*tozh-TW - Ensured the locale suggestion banner uses Chinese copy for zh-TW browsers
- Switched production builds to webpack to avoid Turbopack middleware trace issues on Vercel
SEO & Policy Updates
- Removed English blog URLs from the sitemap until translations are ready
- Rewrote privacy policy and terms with Julian Tarot branding
Content Assets
- Versioned blog images under
public/images/blogto avoid missing deploy assets
Cleanup
- Removed unused local scripts (
add_dates.js,scripts/validate-locale-detection.ts)
Homepage Counter Fix
- Added
/api/stats/readings-countto supply the homepage readings counter
Files Updated
src/lib/language-detector.tssrc/lib/ai-gemini.tssrc/lib/ai-prompts.tssrc/lib/safety.tssrc/app/api/reading/interpret/route.tssrc/app/api/intuitive/route.tssrc/app/[locale]/(default)/reading/ai-result/page.tsxsrc/app/[locale]/(default)/reading/result/page.tsxsrc/app/[locale]/(flow)/reading/prepare/page.tsxsrc/components/reading/CardMeaningDisplay.tsxsrc/shared/blocks/common/top-banner.tsxsrc/app/[locale]/(default)/daily-card/page.tsxsrc/app/[locale]/(landing)/about/page.tsxsrc/config/locale/messages/en/pages/daily-card.jsonsrc/config/locale/messages/zh-TW/pages/daily-card.jsonsrc/config/locale/messages/en/landing.jsonsrc/config/locale/messages/zh-TW/landing.jsonsrc/config/locale/messages/en/pages/about.jsonsrc/shared/blocks/common/smart-icon.tsxsrc/themes/default/blocks/testimonials.tsxsrc/themes/default/blocks/footer.tsxsrc/themes/default/pages/dynamic-page.tsxsrc/shared/blocks/common/locale-detector.tsxsrc/app/sitemap.tscontent/pages/privacy-policy.mdxcontent/pages/terms-of-service.mdxcontent/pages/privacy-policy.en.mdxcontent/pages/terms-of-service.en.mdxsrc/app/api/stats/readings-count/route.tspublic/images/blog/ziwei-vs-tarot/*.webp
Landing Performance Refactor - Julian Tarot
Refined the landing page rendering architecture to reduce first-load JavaScript and preserve visual polish.
Performance Architecture
- Split the hero into a server shell with a client island for input, validation, and hints
- Moved star background rendering to the server and kept CSS-only animations
- Replaced framer-motion entry animations with lightweight reveal/CSS transitions
Landing Interaction Updates
- Feature showcase uses links for spread entry and native details for toggles
- Readings count stays dynamic via a small client component
- Modal and rotating hints use CSS transitions instead of framer-motion
Files Updated
src/themes/default/blocks/tarot-hero.tsxsrc/themes/default/blocks/tarot-hero-client.tsxsrc/themes/default/blocks/feature-showcase.tsxsrc/themes/default/blocks/feature-showcase-count.tsxsrc/themes/default/blocks/trust-features.tsxsrc/themes/default/blocks/comparison.tsxsrc/themes/default/blocks/testimonials.tsxsrc/themes/default/blocks/cta-line.tsxsrc/shared/components/ui/reveal.tsxsrc/components/tarot-ui/StarBackground.tsxsrc/components/ui/RotatingHint.tsxsrc/components/ui/QuestionValidationModal.tsxsrc/config/style/global.css
Blog Admin Enhancements - Julian Tarot
Improved blog management and presentation with admin upgrades, layout tweaks, and maintenance scripts.
Admin Improvements
- Added keyword search for blog posts and categories
- Added tag editing on post add/edit screens
Blog Detail Layout
- Moved author name into the meta line with the publish date
- Removed the right-side author card to simplify the reading layout
Content Maintenance
- Added scripts to import blog content, redistribute dates, and sync dates back to
content/blog - Normalized publish dates across the past 6 months and placed 2026 content in December 2025
Files Updated
src/app/[locale]/(admin)/admin/posts/page.tsxsrc/app/[locale]/(admin)/admin/posts/add/page.tsxsrc/app/[locale]/(admin)/admin/posts/[id]/edit/page.tsxsrc/app/[locale]/(admin)/admin/categories/page.tsxsrc/shared/models/post.tsxsrc/shared/models/taxonomy.tssrc/themes/default/blocks/blog-detail.tsxscripts/import-blog.tsscripts/redistribute-blog-dates.tsscripts/sync-blog-dates-to-files.ts
Production Deployment - Julian Tarot
Successfully deployed Julian Tarot (朱莉安塔羅) to production on Vercel with custom domain configuration.
Deployment Summary
- Domain: juliantarot.com (via Namecheap)
- Platform: Vercel Edge Runtime
- AI Provider: OpenRouter (Gemini 2.5 Flash)
Key Changes
Edge Runtime API Key Fix
Fixed critical issue where AI functionality was not working in production. The root cause was that environment variables were being read at module load time (build time), resulting in empty API keys in Edge Runtime.
Before (incorrect):
export const OPENROUTER_API_KEY = process.env.OPENROUTER_API_KEY || "";After (correct):
export const getOpenRouterApiKey = () => process.env.OPENROUTER_API_KEY || "";Files Modified
src/lib/ai-gemini.ts- Changed to runtime function exportssrc/app/api/reading/interpret/route.ts- Runtime API key readingsrc/app/api/reading/followup/route.ts- Runtime API key readingsrc/app/api/validate-question/route.ts- Runtime API key reading
Environment Configuration
Required environment variables for production:
OPENROUTER_API_KEY- AI provider API keyDATABASE_URL- PostgreSQL connection stringAUTH_SECRET- Authentication encryption keyNEXT_PUBLIC_APP_URL- Production URL (https://juliantarot.com)
Verification
- Local and cloud codebase verified to be identical
- Environment variables are the only difference between environments
- AI streaming functionality confirmed working in production
ShipAny Two Released
ShipAny Two is based on the latest Next.js 16, offering significant improvements in compilation performance with faster local development and reduced memory usage.
Quick Start
git clone git@github.com:shipanyai/shipany-template-two.gitShipAny One Released
ShipAny is a NextJS-based AI SaaS development framework with built-in rich components and AI SDKs, helping you quickly complete AI SaaS project development.
Quick Start
git clone git@github.com:shipanyai/shipany-template-one.git