aboutsummaryrefslogtreecommitdiffstats
path: root/changelog
diff options
context:
space:
mode:
authorsillylaird <sillyfanboy@gmail.com>2026-09-03 00:33:59 +0000
committersillylaird <sillyfanboy@gmail.com>2026-09-03 00:33:59 +0000
commit898b52edcb47bcb3e9d6106e74ca73e74ea01e70 (patch)
tree85c6ee5ad58b860144551184d4cf86b560c62b91 /changelog
downloadwww-898b52edcb47bcb3e9d6106e74ca73e74ea01e70.tar.gz
www-898b52edcb47bcb3e9d6106e74ca73e74ea01e70.zip
import live www.sillylaird.ca webrootHEADmain
Diffstat (limited to 'changelog')
-rwxr-xr-xchangelog/2023-changelog.txt12
-rwxr-xr-xchangelog/2024-changelog.txt11
-rw-r--r--changelog/2026-changelog.txt72
-rwxr-xr-xchangelog/admin.php1
-rwxr-xr-xchangelog/api/latest.php37
-rwxr-xr-xchangelog/api/parser.php91
-rwxr-xr-xchangelog/auth.php4
-rwxr-xr-xchangelog/db.php4
-rw-r--r--changelog/feed.xml.php37
-rwxr-xr-xchangelog/index.php67
-rwxr-xr-xchangelog/index_jp.php71
-rwxr-xr-xchangelog/index_zh.php71
-rwxr-xr-xchangelog/latest.php34
-rwxr-xr-xchangelog/login.php18
-rwxr-xr-xchangelog/logout.php11
-rwxr-xr-xchangelog/rss.xml30
16 files changed, 571 insertions, 0 deletions
diff --git a/changelog/2023-changelog.txt b/changelog/2023-changelog.txt
new file mode 100755
index 0000000..5964e8b
--- /dev/null
+++ b/changelog/2023-changelog.txt
@@ -0,0 +1,12 @@
+**2023 ChangeLog**
+
+* 23 Dec 2023: Migrated to a Linux server again. chane some links to other section of the site. tor domain not working but i will set it up with a tor and i2pd. also removed links to other section of the site that were not in folders. of the root directory
+* 22 Oct 2023: Server may go offline for abit im trying to keep them on though my main source of income may go on strike. so I may not be able to keep this server/site online my sdf site will stay as long as I can.
+* 9 Sept 2023: trying to figure out what to update the site with next. I may learn Chinese better and make the cn.sillylaird.info better then before. I think that will be my next major update for the site. I also dont really keep track of version numbers as I find them irrelevent especially for a site like this. or any major site update.
+* 25 Aug 2023: Changing the GuestBook as it has a expliot a spammer can easily go through. I switched it with htmlcomment box for now. I will for now update the pre exisiting one with a simple captcha. I also restarted my server a few days ago. Sorry for the down time on the tor domain. I forget that my server os doesnt start tor automatically for the domain.
+* 10 July 2023: Brought the original tor domain back up.
+* 21 June 2023: Tor domain is down will get working on bringing it up. I just need to follow the instructions again. and re install.
+* 12 May 2023: Added a tor hidden service domain to the site. Now you can browse this site using tor!.
+* 11 April 2023: I archived Ulillillia Archive Youtube videos on cdn.sillylaird/videos/ so that they can be saved. Those are my most favorite videos I liked at the time of browsing youtube when youtube wasn't bad.
+* 22 March 2023: Added more menus and archived some stepmania files from izzy sm ftp/pub site. will end up archiving dtxmania then some swf files on swfarchive dot com.
+* 6 March 2023: Template for changelog 2023 Changelog.
diff --git a/changelog/2024-changelog.txt b/changelog/2024-changelog.txt
new file mode 100755
index 0000000..0934530
--- /dev/null
+++ b/changelog/2024-changelog.txt
@@ -0,0 +1,11 @@
+**2024 ChangeLog**
+
+* 9 Sept 2024: Added more programs to the site and added my own guestbook with captcha :) hope you enjoy this site update.
+* 1 August 2024: Fixing some links updating the site to work better added a new feature to the site. But it broke the mobile part of it so far. that will be fixed in the future.
+* 24 July 2024: Going to add some pages like runescape and special force a fps game from south korea. plan on updating more links.
+* 14 June 2024: successfully changed my host to sdf got secure web permission and ssl. feels good.
+* 11 June 2024: Changed my host to sdf will update links and so on.
+* 29 May 2024: Fixed some links added more content and so on.
+* 18 May 2024: Added more journals. fixed up the site and so on.
+* 4 May 2024: Change some links and audio files to be more in sync what happening in my life
+* 2 January 2024: Updated the site for 2024! Happy NewYear! I'll probably be updating the site later on. also I just notice i was on a webring for Chinese users on my friend site djlain happy to be one of the user of that community. :) thank you for this djlain and hope you all have a good day and happy late new year! \ No newline at end of file
diff --git a/changelog/2026-changelog.txt b/changelog/2026-changelog.txt
new file mode 100644
index 0000000..25b43a0
--- /dev/null
+++ b/changelog/2026-changelog.txt
@@ -0,0 +1,72 @@
+**2026 ChangeLog**
+
+* 21 August 2026: MOTD for the waifu XMPP bot. `/admin.php?section=motd` pins a
+ notice; waifu posts it in `based@conference.sillylaird.ca` on join, on change,
+ and via `!motd`. When `/motd/` changes, waifu posts it to the room. Public copy
+ lives at `/motd/`.
+* 23 July 2026: Ops, security, and visual cleanup pass. Fixed nightly backup and
+ uptime cron scripts (executable bits so maintenance actually runs); removed a
+ broken missing-script cron entry. Blocked public download of ops docs, tools,
+ and SQLite databases on the blog and changelog hosts; locked guestbook internal
+ PHP bootstrap files at the edge. Blog public pages no longer open a session for
+ anonymous readers; guestbook sessions start only when a form/captcha needs them.
+ Blog gained HSTS/CSP headers; legacy blog login redirects to the unified admin.
+ Friend/badge links that only work over plain HTTP (lolwut, 711chan, 9p.sdf, etc.)
+ use http:// so they stop looking “dead” under TLS. Homepage dropped the “more
+ links loading…” filler tiles; startpage now uses the shared site footer (comfort
+ spacing stays on the header control); collection empty photo slots and badge alts
+ tidied; guestbook form/comments pick up site mono fonts; admin panel styles moved
+ into a dedicated stylesheet; 404/50x got skip-to-content anchors; bbs.php permanently
+ redirects to the diary BBS. Locale key parity cleaned up. Link/html audits still green.
+* 12 July 2026: Hardening and hygiene. Admin password moved out of the web root
+ (supports password_hash + legacy sha256); robots.txt disallows admin/API/tools;
+ security headers are nginx-only (no PHP duplicates); homepage no longer sets a
+ session cookie for anonymous visitors. /mstartpage/ permanently redirects to
+ /startpage/. Shared head_meta on section indexes; locale dicts filled to parity;
+ image budget scans startpage/gaming/computers and oversized assets recompressed;
+ maintenance cron for backup, uptime, and audits; docs refreshed for the PHP layout.
+* 3 July 2026: Homepage polish pass III. Removed scanline screen textures in favour of soft radial ambient glows;
+ improved secondary text contrast, prose typography for blog/changelog panels, and section breathing room. The vibe
+ video placeholder now uses a terminal-style overlay; protocol pills gained a sidebar alt-nets nav; Friends, Countries,
+ and Buttons collapse into accordions on mobile. Images stay PNG — no WebP conversion.
+* 1 July 2026: Visual polish pass across the homepage and startpage. Added a hero block with the Lain avatar,
+ animated monospace tagline, and a more prominent "Where to start" card grid with emoji icons and neon accent
+ hovers. Introduced subtle CSS-only ambient background textures (soft radial glows in dark mode, paper grain in light mode),
+ section accent underlines, timeline-style update panels, guestbook card containers, and unified badge hover
+ styling for friends/country/tile grids. Protocol pills and theme toggle now have smoother transitions; the
+ footer gained a "made with ♥ on the small web" line. The startpage footer also picked up a comfort-spacing
+ toggle that widens line height on long card link lists (persisted in localStorage).
+* 17 June 2026: Footer and badge polish. Reworked the EFF "Free Speech Online" badge so it reads in both themes:
+ dark mode now shows it on a black tile with red lettering and the blue ribbon kept, while light mode keeps the snow/ice
+ white card with blue trim. Recoloured the ribbon image so its text shows on the dark background, dimmed the badge's red
+ border at rest (brightening on hover), and removed the stray red glow that popped up underneath it on hover. On hover the
+ light-mode badge now matches the other button tiles. Finally, lined the homepage footer up with the main content column so
+ it starts and ends where the page content does instead of drifting left.
+* 17 June 2026: Homepage structure pass. Promoted the Gemini, Gopher, Tor, and I2P links into coloured monospace
+ protocol pills in the header, collapsed the theme and language controls to icon buttons, and added a desktop homepage
+ sidebar for quick orientation. Reworked "Where to start" into compact entry cards, simplified the contact block with
+ Tor/I2P and alternate XMPP addresses folded into a details panel, and split the network area into clearer friends,
+ countries, games, and buttons groups. Country links now use lightweight emoji cards, and the mobile nav hidden state was
+ tightened so the drawer is actually removed when closed.
+* 9 June 2026: Spring cleaning. Pruned dead links (old dev subdomain, defunct mirror), repaired the startpage hockey links, and shrank the heaviest images to fit the 250 KB budget. The startpage's Source Code Pro font is now self-hosted instead of pulled from Google, and the site's security headers were tidied so nginx is the single source of CSP truth.
+* 9 June 2026: Small-web day. Brought the Gemini capsule and Gopher hole fully online — fixed the servers, set them to
+ start automatically with the box, and wrote a proper Gopher menu and Gemini index. The Gemini capsule now serves over
+ the real sillylaird.ca certificate. Added Gemini and Gopher buttons to the header across the whole site and every
+ subdomain, alongside the existing Tor and I2P links. Launched a gemlog (the Gemini name for a blog) at
+ gemini://sillylaird.ca/gemlog/, mirrored automatically from the web blog. Also tidied this changelog: removed a
+ duplicate copy on the homepage, fixed a truncated entry, and backfilled the real history of everything built this year.
+* 29 May 2026: Site refresh. Removed leftover test posts; reorganised the navigation into labelled categories and added a
+ "Where to start" section on the homepage. The Last.fm and radio widgets now fall back gracefully when offline or when
+ JavaScript is unavailable, and video embeds (YouTube, Vimeo, Dailymotion, Bilibili, Niconico) load on click for faster,
+ more private page loads. Tidied typography and mobile spacing throughout. Consolidated the blog, changelog, vibe, and
+ guestbook tools into a single admin panel. Explore the site for more features!
+* 20 May 2026: Went onto the alt-nets. The site now has a Tor onion service and an I2P mirror, plus onion- and
+ I2P-only contact addresses, so you can reach me without touching the clearnet.
+* 20 April 2026: Built a small-web bridge. Added a Gemini proxy and a Gemini search to the clearnet site so you
+ can browse Geminispace straight from the browser without a dedicated client.
+* 10 April 2026: Put a radio station online at radio.sillylaird.ca with a live now-playing feed wired into the
+ homepage widget.
+* 26 March 2026: Released wired.os, a Lain-themed browser desktop OS with its own little app environment. Boot it
+ up and poke around.
+* 20 March 2026: Dug a gopher hole. There is now a gopher://sillylaird.ca/ hole with a phlog for the retro crowd.
+* 16 March 2026: Planted a Gemini capsule. The site is now reachable over gemini:// as well as the web.
diff --git a/changelog/admin.php b/changelog/admin.php
new file mode 100755
index 0000000..095cf86
--- /dev/null
+++ b/changelog/admin.php
@@ -0,0 +1 @@
+<?php header("Location: /admin.php?section=changelog", true, 302); exit;
diff --git a/changelog/api/latest.php b/changelog/api/latest.php
new file mode 100755
index 0000000..fe0553b
--- /dev/null
+++ b/changelog/api/latest.php
@@ -0,0 +1,37 @@
+[
+ {
+ "title": "Site update",
+ "body": "Added more programs to the site and added my own guestbook with captcha :) hope you enjoy this site update.",
+ "year": 2024,
+ "month": 9,
+ "day": 9
+ },
+ {
+ "title": "Site update",
+ "body": "Fixing some links updating the site to work better added a new feature to the site. But it broke the mobile part of it so far. that will be fixed in the future.",
+ "year": 2024,
+ "month": 8,
+ "day": 1
+ },
+ {
+ "title": "Site update",
+ "body": "Going to add some pages like runescape and special force a fps game from south korea. plan on updating more links.",
+ "year": 2024,
+ "month": 7,
+ "day": 24
+ },
+ {
+ "title": "Site update",
+ "body": "successfully changed my host to sdf got secure web permission and ssl. feels good.",
+ "year": 2024,
+ "month": 6,
+ "day": 14
+ },
+ {
+ "title": "Site update",
+ "body": "Changed my host to sdf will update links and so on.",
+ "year": 2024,
+ "month": 6,
+ "day": 11
+ }
+]
diff --git a/changelog/api/parser.php b/changelog/api/parser.php
new file mode 100755
index 0000000..fe0dd85
--- /dev/null
+++ b/changelog/api/parser.php
@@ -0,0 +1,91 @@
+<?php
+/**
+ * Helper to parse changelog TXT files and render them as HTML.
+ */
+
+function get_changelog_entries($limit = null) {
+ $files = glob(dirname(__DIR__) . '/*-changelog.txt');
+ rsort($files); // Newest years first
+
+ $all_entries = [];
+ foreach ($files as $file) {
+ $content = file_get_contents($file);
+ $lines = explode("\n", $content);
+
+ // An entry starts on a "* <date>: ..." line; following lines that do
+ // not start with "*" are wrapped continuations of that same entry, so
+ // fold them back in instead of dropping them (which truncated the text).
+ $current = null;
+ $flush = function () use (&$current, &$all_entries) {
+ if ($current === null) return;
+ $current['text'] = trim(preg_replace('/\s+/', ' ', $current['text']));
+ $all_entries[] = $current;
+ $current = null;
+ };
+
+ foreach ($lines as $line) {
+ $line = rtrim($line);
+ if (str_starts_with(ltrim($line), '*')) {
+ $flush();
+ // Format: * 9 Sept 2024: Description
+ if (preg_match('/^\*\s*(\d+\s+\w+\s+(\d{4})):\s*(.*)$/', trim($line), $matches)) {
+ $date_str = $matches[1];
+ $entry_year = (int)$matches[2];
+
+ $timestamp = strtotime($date_str);
+ $iso_date = $timestamp ? date('Y-m-d', $timestamp) : '';
+ $display_date = $timestamp ? date('Y-m-d', $timestamp) : $date_str;
+
+ $current = [
+ 'year' => $entry_year,
+ 'date' => $iso_date,
+ 'display_date' => $display_date,
+ 'text' => $matches[3],
+ 'raw_date' => $date_str
+ ];
+ }
+ } elseif ($current !== null && trim($line) !== '') {
+ $current['text'] .= ' ' . trim($line);
+ }
+ }
+ $flush();
+ }
+
+ // Sort by date DESC
+ usort($all_entries, function($a, $b) {
+ return strcmp($b['date'], $a['date']);
+ });
+
+ if ($limit !== null) {
+ return array_slice($all_entries, 0, $limit);
+ }
+
+ return $all_entries;
+}
+
+function get_changelog_by_year() {
+ $entries = get_changelog_entries();
+ $by_year = [];
+ foreach ($entries as $e) {
+ $by_year[$e['year']][] = $e;
+ }
+ krsort($by_year);
+ return $by_year;
+}
+
+function render_changelog_list($entries) {
+ if (empty($entries)) return '<p class="muted">No entries yet.</p>';
+
+ $html = '<ul class="changelog-list">';
+ foreach ($entries as $e) {
+ $html .= '<li class="changelog-entry">';
+ if ($e['date']) {
+ $html .= '<time datetime="' . htmlspecialchars($e['date']) . '">' . htmlspecialchars($e['display_date']) . '</time>';
+ }
+ $html .= '<div class="text">' . htmlspecialchars($e['text']) . '</div>';
+ $html .= '<a class="changelog-more" href="https://www.sillylaird.ca/changelog/#year-' . (int)$e['year'] . '">more (' . (int)$e['year'] . ') &rarr;</a>';
+ $html .= '</li>';
+ }
+ $html .= '</ul>';
+ return $html;
+}
diff --git a/changelog/auth.php b/changelog/auth.php
new file mode 100755
index 0000000..8b822c1
--- /dev/null
+++ b/changelog/auth.php
@@ -0,0 +1,4 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>Deprecated — SillyLaird</title>
+<p>This legacy PHP helper is no longer used.</p>
diff --git a/changelog/db.php b/changelog/db.php
new file mode 100755
index 0000000..8b822c1
--- /dev/null
+++ b/changelog/db.php
@@ -0,0 +1,4 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>Deprecated — SillyLaird</title>
+<p>This legacy PHP helper is no longer used.</p>
diff --git a/changelog/feed.xml.php b/changelog/feed.xml.php
new file mode 100644
index 0000000..3a43e6a
--- /dev/null
+++ b/changelog/feed.xml.php
@@ -0,0 +1,37 @@
+<?php
+require_once __DIR__ . '/api/parser.php';
+
+header('Content-Type: application/atom+xml; charset=utf-8');
+header('Cache-Control: public, max-age=900');
+
+$entries = get_changelog_entries(50);
+$site = 'https://www.sillylaird.ca';
+$self = $site . '/changelog/feed.xml.php';
+$updated = $entries[0]['date'] ?? date('Y-m-d');
+
+function _xml(string $s): string {
+ return htmlspecialchars($s, ENT_XML1 | ENT_QUOTES, 'UTF-8');
+}
+
+echo '<?xml version="1.0" encoding="UTF-8"?>' . "\n";
+?>
+<feed xmlns="http://www.w3.org/2005/Atom">
+ <title>SillyLaird — Changelog</title>
+ <link href="<?= _xml($site) ?>/changelog/" />
+ <link rel="self" href="<?= _xml($self) ?>" />
+ <id><?= _xml($site) ?>/changelog/</id>
+ <updated><?= _xml($updated) ?>T00:00:00Z</updated>
+ <author><name>SillyLaird</name></author>
+<?php foreach ($entries as $e):
+ $id = $site . '/changelog/#' . ($e['date'] ?: $e['raw_date']);
+ $date = $e['date'] ?: date('Y-m-d');
+?>
+ <entry>
+ <title><?= _xml(mb_strimwidth($e['text'], 0, 80, '…', 'UTF-8')) ?></title>
+ <id><?= _xml($id) ?></id>
+ <updated><?= _xml($date) ?>T00:00:00Z</updated>
+ <link href="<?= _xml($site) ?>/changelog/" />
+ <summary type="text"><?= _xml($e['text']) ?></summary>
+ </entry>
+<?php endforeach; ?>
+</feed>
diff --git a/changelog/index.php b/changelog/index.php
new file mode 100755
index 0000000..bc011ac
--- /dev/null
+++ b/changelog/index.php
@@ -0,0 +1,67 @@
+<?php
+require_once __DIR__ . '/api/parser.php';
+$by_year = get_changelog_by_year();
+?>
+<!doctype html>
+<html lang="en">
+<head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width,initial-scale=1" />
+ <?php
+ $meta = [
+ 'lang' => 'en',
+ 'title' => 'ChangeLog -- SillyLaird',
+ 'desc' => 'SillyLaird change log.',
+ 'base' => 'changelog/index',
+ 'self_url' => 'https://www.sillylaird.ca/changelog/',
+ 'en_url' => 'https://www.sillylaird.ca/changelog/',
+ 'ja_url' => 'https://www.sillylaird.ca/changelog/index_jp.php',
+ 'zh_url' => 'https://www.sillylaird.ca/changelog/index_zh.php',
+ 'x_default' => 'https://www.sillylaird.ca/changelog/',
+ ];
+ include __DIR__ . '/../partials/head_meta.php';
+?>
+ <title>ChangeLog — SillyLaird</title>
+ <link rel="alternate" type="application/atom+xml" title="Changelog Atom feed" href="/changelog/feed.xml.php" />
+
+ <link rel="stylesheet" href="/assets/css/fonts.css" />
+ <link rel="stylesheet" href="/assets/css/site.css" />
+ <link rel="stylesheet" href="/assets/css/skeleton.css" />
+ <link rel="stylesheet" href="/assets/css/pages/changelog.css?v=<?= @filemtime(dirname(__DIR__)."/assets/css/pages/changelog.css") ?>" />
+</head>
+<body>
+ <a class="skip-link" href="#main">Skip to content</a>
+ <?php include '../partials/header.php'; ?>
+
+ <main id="main" class="wrap">
+ <section aria-labelledby="changelog-title">
+ <h1 id="changelog-title" class="changelog-title">ChangeLog</h1>
+ <p class="muted">All notes are copied verbatim.</p>
+
+ <?php foreach ($by_year as $year => $entries): ?>
+ <h2 id="year-<?= (int)$year ?>"><?= $year ?></h2>
+ <?= render_changelog_list($entries) ?>
+ <?php endforeach; ?>
+
+ <hr />
+ <section>
+ <h2>Raw Log Files</h2>
+ <ul class="changelog-files">
+ <?php
+ $files = glob(__DIR__ . '/*-changelog.txt');
+ rsort($files);
+ foreach ($files as $file):
+ $base = basename($file);
+ $size = filesize($file);
+ if ($size <= 0) continue;
+ ?>
+ <li><a href="https://www.sillylaird.ca/changelog/<?= htmlspecialchars($base) ?>"><?= htmlspecialchars($base) ?></a> (<?= $size ?> bytes)</li>
+ <?php endforeach; ?>
+ </ul>
+ </section>
+ </section>
+ </main>
+
+ <?php include '../partials/footer.php'; ?>
+</body>
+</html>
diff --git a/changelog/index_jp.php b/changelog/index_jp.php
new file mode 100755
index 0000000..1b7d0eb
--- /dev/null
+++ b/changelog/index_jp.php
@@ -0,0 +1,71 @@
+<?php
+require_once __DIR__ . '/api/parser.php';
+$by_year = get_changelog_by_year();
+?>
+<!doctype html>
+<html lang="ja">
+<head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width,initial-scale=1" />
+ <meta name="description" content="SillyLaird 更新履歴。" />
+ <meta property="og:title" content="更新履歴 — SillyLaird" />
+ <meta property="og:description" content="SillyLaird 更新履歴。" />
+ <meta property="og:image" content="https://www.sillylaird.ca/assets/img/lain.png" />
+ <meta property="og:type" content="website" />
+ <meta property="og:url" content="https://www.sillylaird.ca/changelog/index_jp.php" />
+ <meta property="og:locale" content="ja_JP" />
+ <meta property="og:locale:alternate" content="en_US" />
+ <meta property="og:locale:alternate" content="zh_CN" />
+ <meta name="twitter:card" content="summary_large_image" />
+ <meta name="twitter:title" content="更新履歴 — SillyLaird" />
+ <meta name="twitter:description" content="SillyLaird 更新履歴。" />
+ <meta name="twitter:image" content="https://www.sillylaird.ca/assets/img/lain.png" />
+ <link rel="canonical" href="https://www.sillylaird.ca/changelog/index_jp.php" />
+ <link rel="alternate" hreflang="x-default" href="https://www.sillylaird.ca/changelog/" />
+ <link rel="alternate" hreflang="en" href="https://www.sillylaird.ca/changelog/" />
+ <link rel="alternate" hreflang="zh" href="https://www.sillylaird.ca/changelog/index_zh.php" />
+ <link rel="alternate" hreflang="ja" href="https://www.sillylaird.ca/changelog/index_jp.php" />
+ <title>更新履歴 — SillyLaird</title>
+ <link rel="icon" href="https://www.sillylaird.ca/assets/img/lain.png" />
+
+ <link rel="stylesheet" href="/assets/css/fonts.css" />
+ <link rel="stylesheet" href="/assets/css/site.css" />
+ <link rel="stylesheet" href="/assets/css/skeleton.css" />
+ <link rel="stylesheet" href="/assets/css/pages/changelog.css?v=<?= @filemtime(dirname(__DIR__)."/assets/css/pages/changelog.css") ?>" />
+</head>
+<body>
+ <a class="skip-link" href="#main">メインコンテンツへ</a>
+ <?php include '../partials/header.php'; ?>
+
+ <main id="main" class="wrap">
+ <section aria-labelledby="changelog-title">
+ <h1 id="changelog-title" class="changelog-title">更新履歴 (ChangeLog)</h1>
+ <p class="muted">すべてのメモはそのままコピーされます。</p>
+
+ <?php foreach ($by_year as $year => $entries): ?>
+ <h2 id="year-<?= (int)$year ?>"><?= $year ?></h2>
+ <?= render_changelog_list($entries) ?>
+ <?php endforeach; ?>
+
+ <hr />
+ <section>
+ <h2>生のログファイル (Raw Log Files)</h2>
+ <ul class="changelog-files">
+ <?php
+ $files = glob(__DIR__ . '/*-changelog.txt');
+ rsort($files);
+ foreach ($files as $file):
+ $base = basename($file);
+ $size = filesize($file);
+ if ($size <= 0) continue;
+ ?>
+ <li><a href="https://www.sillylaird.ca/changelog/<?= htmlspecialchars($base) ?>"><?= htmlspecialchars($base) ?></a> (<?= $size ?> bytes)</li>
+ <?php endforeach; ?>
+ </ul>
+ </section>
+ </section>
+ </main>
+
+ <?php include '../partials/footer.php'; ?>
+</body>
+</html>
diff --git a/changelog/index_zh.php b/changelog/index_zh.php
new file mode 100755
index 0000000..7987a58
--- /dev/null
+++ b/changelog/index_zh.php
@@ -0,0 +1,71 @@
+<?php
+require_once __DIR__ . '/api/parser.php';
+$by_year = get_changelog_by_year();
+?>
+<!doctype html>
+<html lang="zh">
+<head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width,initial-scale=1" />
+ <meta name="description" content="SillyLaird 更新日志。" />
+ <meta property="og:title" content="更新日志 — SillyLaird" />
+ <meta property="og:description" content="SillyLaird 更新日志。" />
+ <meta property="og:image" content="https://www.sillylaird.ca/assets/img/lain.png" />
+ <meta property="og:type" content="website" />
+ <meta property="og:url" content="https://www.sillylaird.ca/changelog/index_zh.php" />
+ <meta property="og:locale" content="zh_CN" />
+ <meta property="og:locale:alternate" content="en_US" />
+ <meta property="og:locale:alternate" content="ja_JP" />
+ <meta name="twitter:card" content="summary_large_image" />
+ <meta name="twitter:title" content="更新日志 — SillyLaird" />
+ <meta name="twitter:description" content="SillyLaird 更新日志。" />
+ <meta name="twitter:image" content="https://www.sillylaird.ca/assets/img/lain.png" />
+ <link rel="canonical" href="https://www.sillylaird.ca/changelog/index_zh.php" />
+ <link rel="alternate" hreflang="x-default" href="https://www.sillylaird.ca/changelog/" />
+ <link rel="alternate" hreflang="en" href="https://www.sillylaird.ca/changelog/" />
+ <link rel="alternate" hreflang="zh" href="https://www.sillylaird.ca/changelog/index_zh.php" />
+ <link rel="alternate" hreflang="ja" href="https://www.sillylaird.ca/changelog/index_jp.php" />
+ <title>更新日志 — SillyLaird</title>
+ <link rel="icon" href="https://www.sillylaird.ca/assets/img/lain.png" />
+
+ <link rel="stylesheet" href="/assets/css/fonts.css" />
+ <link rel="stylesheet" href="/assets/css/site.css" />
+ <link rel="stylesheet" href="/assets/css/skeleton.css" />
+ <link rel="stylesheet" href="/assets/css/pages/changelog.css?v=<?= @filemtime(dirname(__DIR__)."/assets/css/pages/changelog.css") ?>" />
+</head>
+<body>
+ <a class="skip-link" href="#main">跳至内容</a>
+ <?php include '../partials/header.php'; ?>
+
+ <main id="main" class="wrap">
+ <section aria-labelledby="changelog-title">
+ <h1 id="changelog-title" class="changelog-title">更新日志 (ChangeLog)</h1>
+ <p class="muted">所有注释均逐字复制。</p>
+
+ <?php foreach ($by_year as $year => $entries): ?>
+ <h2 id="year-<?= (int)$year ?>"><?= $year ?></h2>
+ <?= render_changelog_list($entries) ?>
+ <?php endforeach; ?>
+
+ <hr />
+ <section>
+ <h2>原始日志文件 (Raw Log Files)</h2>
+ <ul class="changelog-files">
+ <?php
+ $files = glob(__DIR__ . '/*-changelog.txt');
+ rsort($files);
+ foreach ($files as $file):
+ $base = basename($file);
+ $size = filesize($file);
+ if ($size <= 0) continue;
+ ?>
+ <li><a href="https://www.sillylaird.ca/changelog/<?= htmlspecialchars($base) ?>"><?= htmlspecialchars($base) ?></a> (<?= $size ?> bytes)</li>
+ <?php endforeach; ?>
+ </ul>
+ </section>
+ </section>
+ </main>
+
+ <?php include '../partials/footer.php'; ?>
+</body>
+</html>
diff --git a/changelog/latest.php b/changelog/latest.php
new file mode 100755
index 0000000..434246a
--- /dev/null
+++ b/changelog/latest.php
@@ -0,0 +1,34 @@
+<?php
+require_once __DIR__ . '/api/parser.php';
+$latest = get_changelog_entries(5);
+?>
+<div class="changelog-container">
+ <?php foreach ($latest as $e): ?>
+ <div class="changelog-entry">
+ <b>Site update</b><br>
+ <span style="font-size:13px;">
+ <time datetime="<?= htmlspecialchars($e['date']) ?>"><?= htmlspecialchars($e['display_date']) ?></time>
+ </span><br>
+ <span class="text"><?= htmlspecialchars($e['text']) ?></span><br>
+ <a class="changelog-more" href="https://www.sillylaird.ca/changelog/#year-<?= (int)$e['year'] ?>">more (<?= (int)$e['year'] ?>) &rarr;</a>
+ </div>
+ <?php endforeach; ?>
+</div>
+
+<div class="changelog-files-section">
+ <p><strong>Raw Log Files:</strong></p>
+ <ul class="changelog-files">
+ <?php
+ $files = glob(__DIR__ . '/*-changelog.txt');
+ rsort($files);
+ foreach ($files as $file):
+ $base = basename($file);
+ $size = filesize($file);
+ if ($size <= 0) continue;
+ ?>
+ <li><a href="https://www.sillylaird.ca/changelog/<?= htmlspecialchars($base) ?>"><?= htmlspecialchars($base) ?></a> (<?= $size ?> bytes)</li>
+ <?php endforeach; ?>
+ </ul>
+</div>
+
+<a href="https://www.sillylaird.ca/changelog/">Full changelog &rarr;</a>
diff --git a/changelog/login.php b/changelog/login.php
new file mode 100755
index 0000000..021b3ce
--- /dev/null
+++ b/changelog/login.php
@@ -0,0 +1,18 @@
+<!doctype html>
+<html lang="en">
+<head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width,initial-scale=1" />
+ <title>Changelog Login (Disabled) — SillyLaird</title>
+ <link rel="stylesheet" href="/assets/css/fonts.css" />
+ <link rel="stylesheet" href="/assets/css/site.css" />
+ <link rel="stylesheet" href="/assets/css/skeleton.css" />
+</head>
+<body>
+ <main class="wrap">
+ <h1>Login Disabled</h1>
+ <p class="muted">The old PHP login flow has been removed from this static build.</p>
+ <p><a href="https://www.sillylaird.ca/changelog/">Go to changelog</a></p>
+ </main>
+</body>
+</html>
diff --git a/changelog/logout.php b/changelog/logout.php
new file mode 100755
index 0000000..4a08ce9
--- /dev/null
+++ b/changelog/logout.php
@@ -0,0 +1,11 @@
+<!doctype html>
+<html lang="en">
+<head>
+ <meta charset="utf-8" />
+ <meta http-equiv="refresh" content="0;url=https://www.sillylaird.ca/changelog/" />
+ <title>Redirecting — SillyLaird</title>
+</head>
+<body>
+ <p>Redirecting to <a href="https://www.sillylaird.ca/changelog/">/changelog/</a>...</p>
+</body>
+</html>
diff --git a/changelog/rss.xml b/changelog/rss.xml
new file mode 100755
index 0000000..7a72398
--- /dev/null
+++ b/changelog/rss.xml
@@ -0,0 +1,30 @@
+<?php
+require __DIR__ . '/db.html';
+header("Content-Type: application/rss+xml; charset=UTF-8");
+echo '<?xml version="1.0" encoding="UTF-8"?>';
+?>
+<rss version="2.0">
+<channel>
+<title>SillyLaird Changelog</title>
+<link>https://www.sillylaird.ca/changelog/</link>
+
+<?php
+$stmt = $db->query("
+ SELECT title, body, created_at
+ FROM changelog
+ ORDER BY created_at DESC
+ LIMIT 20
+");
+while ($e = $stmt->fetch(PDO::FETCH_ASSOC)):
+?>
+<item>
+<title><?= htmlspecialchars($e['title']) ?></title>
+<pubDate><?= date(DATE_RSS, strtotime($e['created_at'])) ?></pubDate>
+<description><![CDATA[
+<?= nl2br(htmlspecialchars($e['body'])) ?>
+]]></description>
+</item>
+<?php endwhile; ?>
+
+</channel>
+</rss>