@seip/blue-bird 1.1.2 → 1.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/AGENTS.md CHANGED
@@ -251,4 +251,74 @@ await connection.transaction(async (tx) => {
251
251
  In production, Nginx is configured to explicitly cache static assets (`.js`, `.css`, `.jpg`, `.png`, etc.) in the user's browser with the `Cache-Control` header (valid for 1 month).
252
252
  HTML and API endpoints (`/api/*`) are not cached by Nginx to ensure they serve dynamic and up-to-date content, relying instead on the Node.js application and Redis for data-layer caching.
253
253
 
254
+ ## 13. VPS Permissions & Security Hardening
255
+
256
+ When deploying Blue Bird to Linux VPS servers using Docker Compose orchestration:
257
+
258
+ ### 1. FHS Deployment Standard
259
+ - **Avoid deploying inside `/home/user/`**: User home directories often enforce restrictive traversal permissions (`700`/`750`) or risk cross-user privilege escalation in multi-tenant environments.
260
+ - **Production Standard**: Always deploy in standard Filesystem Hierarchy Standard (FHS) locations:
261
+ - `/var/www/<project-name>` (Recommended for web applications)
262
+ - `/srv/<project-name>` (Alternative for site-specific service payloads)
263
+
264
+ ### 2. Permissions & Ownership Matrix
265
+
266
+ | Path / Target | Recommended Mode | Ownership | Description & Rationale |
267
+ |---|---|---|---|
268
+ | `/var/www/<project-name>` | `755` (`drwxr-xr-x`) | `$(whoami):$(whoami)` | Allows unprivileged Nginx container (`UID 101`) path traversal. |
269
+ | `frontend/` (directories) | `755` (`drwxr-xr-x`) | `$(whoami):$(whoami)` | Directory traversal for static web workers. |
270
+ | `frontend/` (files) | `644` (`-rw-r--r--`) | `$(whoami):$(whoami)` | Public read access for Nginx static serving. |
271
+ | `node_modules/` | Dirs `755`, Files `644` | `$(whoami):$(whoami)` | Strict security. Avoid blanket `chmod -R 755`. |
272
+ | `node_modules/.bin/` | `+x` (`chmod -R +x`) | `$(whoami):$(whoami)` | Preserves execution bits for CLI binaries and symlinks. |
273
+ | `.env` | `600` (`-rw-------`) | `$(whoami):$(whoami)` | Strict isolation for database credentials and JWT keys. Never `777`. |
274
+ | `database/` (SQLite) | Dir `755`, Files `644` | `$(whoami):$(whoami)` | Allows Node.js application process to read/write WAL journals. |
275
+
276
+ ### 3. Container-Level Hardening (Docker)
277
+ - Mount static assets as **read-only (`:ro`)** in `docker-compose.yml` for the Nginx service (e.g. `./frontend:/app/frontend:ro` or `/var/www/<project-name>/frontend:/app/frontend:ro`).
278
+ - Enforces the principle of least privilege: the web server worker cannot write or overwrite host assets even if compromised.
279
+
280
+ ### 4. Production Hardening Commands
281
+
282
+ ```bash
283
+ # 1. Set project ownership to current deploy user
284
+ sudo chown -R $(whoami):$(whoami) /var/www/<project-name>
285
+ cd /var/www/<project-name>
286
+
287
+ # 2. Ensure parent directory traversal permissions
288
+ chmod 755 /var /var/www /var/www/<project-name>
289
+
290
+ # 3. Set directory (755) and file (644) permissions for static frontend assets
291
+ find frontend -type d -exec chmod 755 {} +
292
+ find frontend -type f -exec chmod 644 {} +
293
+
294
+ # 4. Secure node_modules while preserving executable bits in .bin
295
+ find node_modules -type d -exec chmod 755 {} +
296
+ find node_modules -type f -exec chmod 644 {} +
297
+ chmod -R +x node_modules/.bin 2>/dev/null || true
298
+
299
+ # 5. Restrict environment credentials strictly to owner
300
+ chmod 600 .env
301
+
302
+ # 6. Set database permissions (for SQLite)
303
+ chmod 755 database 2>/dev/null || true
304
+ chmod 644 database/*.db 2>/dev/null || true
305
+ ```
306
+
307
+ ### 5. Failure Modes & Remediation Playbook
308
+ * **Error 13: Permission Denied on static assets (`stat() failed (13: Permission denied)`):**
309
+ - Cause: Nginx worker (`UID 101`) lacks path traversal (`+x`) or read (`+r`) permissions.
310
+ - Fix: `chmod 755 /var/www/<project-name> && find frontend -type d -exec chmod 755 {} + && find frontend -type f -exec chmod 644 {} +`
311
+ * **`sh: 1: blue-bird: Permission denied` on CLI:**
312
+ - Cause: Blanket `chmod 644` stripped execution permissions from binary links in `node_modules/.bin/`.
313
+ - Fix: `chmod -R +x node_modules/.bin` (or `npm rebuild`)
314
+ * **Docker Inode Desync (404 after `mv` / `rm -rf` directory):**
315
+ - Cause: Docker volume bind mounts bind to Linux filesystem inodes. Recreating the folder desynchronizes active mounts.
316
+ - Fix: `npx blue-bird docker stop && npx blue-bird docker start prod` (or `docker compose down && docker compose up -d`)
317
+ * **Real-time Diagnostics:**
318
+ - Nginx log stream: `docker compose logs -f nginx`
319
+ - Container visibility check: `docker exec -it <container_name>-nginx su -s /bin/sh nginx -c "ls -la /app/frontend"`
320
+ - Host path traversal audit: `namei -l /var/www/<project-name>/frontend/css/bluebird.css`
321
+
322
+ ---
323
+
254
324
  _This file can be retrieved by intelligent agents reading its absolute physical path during reasoning._
package/README.md CHANGED
@@ -504,6 +504,135 @@ To deploy via Docker:
504
504
  npx blue-bird docker start prod
505
505
  ```
506
506
 
507
+ ---
508
+
509
+ ### 🛡️ Production VPS Security & Permissions Hardening Guide
510
+
511
+ When deploying Blue Bird to a Linux VPS (Ubuntu, Debian, AlmaLinux, Rocky Linux), file permissions must strictly balance **least-privilege security** (preventing unauthorized read/write access to sensitive files) with **container accessibility** (allowing unprivileged container users like `nginx` to read static assets).
512
+
513
+ > [!CAUTION]
514
+ > **Never use `chmod -R 777` in production!** Giving full write permissions to all users creates severe security vulnerabilities, allowing compromised processes or unauthorized local users to modify application code, inject backdoors, or tamper with `.env` secrets.
515
+
516
+ #### 1. Deployment Directory (Filesystem Hierarchy Standard)
517
+
518
+ * ❌ **Avoid deploying inside `/home/user/`**: Deploying in home directories introduces security risks in multi-user environments and frequently causes `403 Forbidden` / `stat() failed (13: Permission denied)` errors due to restrictive default parent directory permissions (`700`/`750`). Recklessly loosening `/home/user/` exposes user SSH keys and profile data.
519
+ * ✅ **Recommended Production Standard**: Deploy in dedicated Filesystem Hierarchy Standard (FHS) system directories:
520
+ * `/var/www/<project-name>` (Standard for web applications and static content)
521
+ * `/srv/<project-name>` (Alternative standard for site-specific payloads)
522
+
523
+ #### 2. Recommended Permissions & Ownership Matrix
524
+
525
+ | Target Directory / File | Mode | Ownership | Description & Security Rationale |
526
+ |---|---|---|---|
527
+ | **Project Root** (`/var/www/<project-name>`) | `755` (`drwxr-xr-x`) | `$(whoami):$(whoami)` | Allows unprivileged container processes (`nginx` UID 101) to traverse down to the project tree. |
528
+ | **Static Frontend Dirs** (`frontend/`) | `755` (`drwxr-xr-x`) | `$(whoami):$(whoami)` | Grants traversal and read access for Nginx static serving. |
529
+ | **Static Frontend Files** (`frontend/**/*`) | `644` (`-rw-r--r--`) | `$(whoami):$(whoami)` | Read-only access for web server worker processes. |
530
+ | **Node Module Dirs** (`node_modules/`) | `755` (`drwxr-xr-x`) | `$(whoami):$(whoami)` | Standard directory access. Avoid blanket `chmod -R 755`. |
531
+ | **Node Module Files** (`node_modules/**/*`) | `644` (`-rw-r--r--`) | `$(whoami):$(whoami)` | Standard read-only permissions for non-binary dependencies. |
532
+ | **Executable Binaries** (`node_modules/.bin/`) | `+x` (`chmod -R +x`) | `$(whoami):$(whoami)` | Grants execution bit exclusively to CLI wrapper symlinks (`npx blue-bird`). |
533
+ | **Environment File** (`.env`) | `600` (`-rw-------`) | `$(whoami):$(whoami)` | Restricts database passwords, JWT secrets, and API keys exclusively to the owning user. Never `644` or `777`. |
534
+ | **Database Directory** (`database/` for SQLite) | `755` (dir) / `644` (file) | `$(whoami):$(whoami)` | Allows the Node.js application process inside the container to read and write WAL journal files. |
535
+
536
+ #### 3. Container-Level Hardening (Docker)
537
+
538
+ To enforce the principle of least privilege at the container boundary, explicitly mount static frontend assets in **read-only mode (`:ro`)** inside `docker-compose.yml` for the Nginx service:
539
+
540
+ ```yaml
541
+ services:
542
+ nginx:
543
+ image: nginx:alpine
544
+ volumes:
545
+ - ./frontend:/app/frontend:ro
546
+ - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
547
+ ```
548
+
549
+ This guarantees that even in the event of an Nginx worker compromise, static web assets cannot be overwritten or modified from within the container.
550
+
551
+ #### 4. Applying Secure Permissions on VPS
552
+
553
+ Run the following chained commands inside your VPS project directory:
554
+
555
+ ```bash
556
+ # 1. Set project ownership to current deploy user
557
+ sudo chown -R $(whoami):$(whoami) /var/www/<project-name>
558
+ cd /var/www/<project-name>
559
+
560
+ # 2. Ensure parent directory traversal permissions
561
+ chmod 755 /var /var/www /var/www/<project-name>
562
+
563
+ # 3. Apply safe permissions for static frontend assets
564
+ find frontend -type d -exec chmod 755 {} +
565
+ find frontend -type f -exec chmod 644 {} +
566
+
567
+ # 4. Secure node_modules while preserving executable bits in .bin
568
+ find node_modules -type d -exec chmod 755 {} +
569
+ find node_modules -type f -exec chmod 644 {} +
570
+ chmod -R +x node_modules/.bin 2>/dev/null || true
571
+
572
+ # 5. Lock down environment credentials
573
+ chmod 600 .env
574
+
575
+ # 6. Set database directory permissions (for SQLite)
576
+ chmod 755 database 2>/dev/null || true
577
+ chmod 644 database/*.db 2>/dev/null || true
578
+ ```
579
+
580
+ ---
581
+
582
+ ### 🔧 VPS Production Troubleshooting (Problems & Solutions)
583
+
584
+ #### 1. Static Assets Return 404 / 403 (`Permission denied`)
585
+ * **Symptom:** Opening pages returns 404 or missing CSS/JS (e.g. `/css/bluebird.css`, `/favicon.ico`), and `docker compose logs -f nginx` reports:
586
+ ```text
587
+ [crit] stat() "/app/frontend/css/bluebird.css" failed (13: Permission denied)
588
+ ```
589
+ * **Cause:** The Nginx container runs as an unprivileged user (`nginx`, UID 101 on Alpine). If parent directories lack traversal (`+x`) permissions, or files lack read (`+r`) permissions, Nginx is blocked from reading `/app/frontend`.
590
+ * **Solution:**
591
+ ```bash
592
+ # Grant traversal and read permissions:
593
+ chmod 755 /var/www/<project-name>
594
+ find frontend -type d -exec chmod 755 {} +
595
+ find frontend -type f -exec chmod 644 {} +
596
+ ```
597
+
598
+ #### 2. `npx blue-bird` fails with `sh: 1: blue-bird: Permission denied`
599
+ * **Symptom:** Running CLI commands like `npx blue-bird docker stop` or `npx blue-bird docker start prod` fails with permission errors.
600
+ * **Cause:** An overly aggressive global `find . -type f -exec chmod 644` stripped execution permissions from binary wrappers and symlinks in `node_modules/.bin/`.
601
+ * **Solution:**
602
+ ```bash
603
+ chmod -R +x node_modules/.bin
604
+ # Or rebuild native binaries:
605
+ npm rebuild
606
+ ```
607
+
608
+ #### 3. 404 Not Found after Folder Renaming or Moving (Docker Inode Desync)
609
+ * **Symptom:** Moving, replacing, or recreating the project folder (e.g. `mv project_old project` or `git clone` / `rm -rf`) while Docker containers were running leads to persistent 404 errors even though files exist on disk.
610
+ * **Cause:** Linux file descriptors and Docker volume mounts bind to disk **inodes**. When a directory is deleted and recreated, Docker mounts remain attached to the stale/dead inode until the container stack is restarted.
611
+ * **Solution:**
612
+ ```bash
613
+ docker compose down
614
+ docker compose up -d
615
+ # Or with Blue Bird CLI:
616
+ npx blue-bird docker stop
617
+ npx blue-bird docker start prod
618
+ ```
619
+
620
+ #### 4. Real-time Container Diagnostics
621
+ * **Inspect Nginx logs in real time:**
622
+ ```bash
623
+ docker compose logs -f nginx
624
+ ```
625
+ * **Test file visibility directly as the Nginx container user:**
626
+ ```bash
627
+ docker exec -it <container_name>-nginx su -s /bin/sh nginx -c "ls -la /app/frontend/css/bluebird.css"
628
+ ```
629
+ * **Inspect path traversal permissions on host:**
630
+ ```bash
631
+ namei -l /var/www/<project-name>/frontend/css/bluebird.css
632
+ ```
633
+
634
+ ---
635
+
507
636
  ### B. Standard Standalone PM2 / Node.js Runtime
508
637
 
509
638
  If you choose to run outside of Docker, you must set up the reverse proxy and databases manually. To deploy in a standard Linux environment using PM2:
@@ -1,108 +1,157 @@
1
- <!DOCTYPE html>
2
- <html lang="en" data-theme="dark">
3
-
4
- <head>
5
- <meta charset="UTF-8">
6
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
- <title>Blue Bird - About</title>
8
- <link rel="canonical" href="https://seip25.github.io/Blue-bird/" />
9
- <meta name="description" content="Blue Bird is a fast, structured, and opinionated Express.js framework for developers who want
10
- visual elegance and performance with raw HTML and CSS.">
11
- <meta name="keywords" content="">
12
- <meta name="author" content="Seip25">
13
- <link rel="icon" href="/images/favicon.ico" />
14
- <script src="/js/tailwind.js"></script>
15
- <script src="/js/utils.js"></script>
16
- <style type="text/tailwindcss">
17
- @custom-variant dark (&:where(.dark, .dark *));
18
- </style>
19
- </head>
20
-
21
- <body class="min-h-screen bg-slate-950 text-white font-sans antialiased selection:bg-blue-500 selection:text-white">
22
- <header class="sticky top-0 z-50 px-4 py-3">
23
- <div
24
- class="max-w-7xl mx-auto flex items-center justify-between backdrop-blur-md bg-slate-900/60 border border-white/10 rounded-2xl px-6 py-3 shadow-lg">
25
- <div class="flex items-center space-x-3">
26
- <div
27
- class="w-10 h-10 bg-gradient-to-tr from-blue-500 to-indigo-600 rounded-xl flex items-center justify-center shadow-md shadow-blue-500/30">
28
- <svg class="w-6 h-6 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
29
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
30
- d="M12 19l9 2-9-18-9 18 9-2zm0 0v-8" />
31
- </svg>
32
- </div>
33
- <span
34
- class="text-xl font-bold tracking-tight bg-gradient-to-r from-blue-400 via-indigo-200 to-white bg-clip-text text-transparent">Blue
35
- Bird</span>
36
- </div>
37
-
38
- <nav class="flex space-x-8 text-sm font-medium text-slate-300">
39
- <a href="/" class="hover:text-blue-400 transition-colors">Home</a>
40
- <a href="/about" class="hover:text-blue-400 transition-colors">About</a>
41
- </nav>
42
- </div>
43
- </header>
44
-
45
- <main class="max-w-7xl mx-auto px-4 pt-12 pb-24">
46
-
47
- <div
48
- class="relative py-16 px-6 md:px-12 rounded-3xl overflow-hidden bg-gradient-to-b from-blue-900/20 to-slate-950 border border-white/5 shadow-2xl mb-12">
49
- <div class="relative max-w-4xl mx-auto space-y-6 text-center">
50
- <h1
51
- class="text-4xl sm:text-5xl font-extrabold tracking-tight bg-gradient-to-r from-blue-400 via-indigo-300 to-white bg-clip-text text-transparent">
52
- About Blue Bird
53
- </h1>
54
- <p class="text-lg sm:text-xl text-slate-400 leading-relaxed max-w-2xl mx-auto">
55
- Built for performance, simplicity, and raw speed.
56
- </p>
57
- </div>
58
- </div>
59
-
60
- <section class="max-w-4xl mx-auto space-y-12">
61
- <article class="p-8 rounded-2xl bg-slate-900/40 border border-white/5 shadow-xl">
62
- <h2 class="text-2xl font-bold text-white mb-4">Our Philosophy</h2>
63
- <p class="text-slate-400 leading-relaxed mb-4">
64
- Blue Bird was born out of a desire for a clean, performance-first approach to web development. We
65
- believe in harnessing the raw power of Express.js and Nginx, stripping away unnecessary bloat, and
66
- providing developers with a robust foundation that just works.
67
- </p>
68
- <p class="text-slate-400 leading-relaxed">
69
- By separating the static frontend delivery (handled blazingly fast by Nginx) from the dynamic API
70
- layer (powered by Express and Redis), Blue Bird achieves unparalleled performance out of the box.
71
- </p>
72
- </article>
73
-
74
- <article class="p-8 rounded-2xl bg-slate-900/40 border border-white/5 shadow-xl">
75
- <h2 class="text-2xl font-bold text-white mb-4">Why Blue Bird?</h2>
76
- <ul class="space-y-3 text-slate-400">
77
- <li class="flex items-start">
78
- <span class="text-blue-500 mr-2">✓</span>
79
- <span><strong>Zero Config Docker:</strong> Go from development to production seamlessly.</span>
80
- </li>
81
- <li class="flex items-start">
82
- <span class="text-blue-500 mr-2">✓</span>
83
- <span><strong>Military Grade Security:</strong> Built-in AES-256-GCM JWT encryption.</span>
84
- </li>
85
- <li class="flex items-start">
86
- <span class="text-blue-500 mr-2">✓</span>
87
- <span><strong>High Performance:</strong> Redis caching for the data layer and Nginx static
88
- delivery.</span>
89
- </li>
90
- <li class="flex items-start">
91
- <span class="text-blue-500 mr-2">✓</span>
92
- <span><strong>Pure HTML/CSS:</strong> No bloated frontend frameworks. Write code close to the
93
- metal.</span>
94
- </li>
95
- </ul>
96
- </article>
97
- </section>
98
- </main>
99
-
100
- <footer class="border-t border-white/5 py-8 bg-slate-950 mt-16">
101
- <div class="max-w-7xl mx-auto px-4 text-center text-sm text-slate-500">
102
- <p>Powered by Blue Bird Framework. All rights reserved.</p>
103
- </div>
104
- </footer>
105
-
106
- </body>
107
-
1
+ <!DOCTYPE html>
2
+ <html lang="en" data-theme="dark">
3
+
4
+ <head>
5
+ <meta charset="UTF-8">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <title>Blue Bird - About</title>
8
+ <link rel="canonical" href="https://seip25.github.io/Blue-bird/" />
9
+ <meta name="description"
10
+ content="Blue Bird is a fast, structured, and opinionated Express.js framework for developers who want visual elegance and performance with raw HTML and CSS.">
11
+ <meta name="keywords" content="Blue Bird, Express.js, About, Semantic CSS, Architecture">
12
+ <meta name="author" content="Seip25">
13
+ <link rel="icon" href="/images/favicon.ico" />
14
+ <link rel="stylesheet" href="/css/bluebird.css" />
15
+ <script src="/js/bluebird.js"></script>
16
+ </head>
17
+
18
+ <body>
19
+ <header>
20
+ <nav>
21
+ <a href="/" class="flex items-center gap-2">
22
+ <svg width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
23
+ stroke-linecap="round" stroke-linejoin="round" class="text-blue">
24
+ <path d="M12 19l9 2-9-18-9 18 9-2zm0 0v-8" />
25
+ </svg>
26
+ <strong class="text-xl text-gradient">Blue Bird</strong>
27
+ </a>
28
+ </nav>
29
+ </header>
30
+
31
+ <main>
32
+ <aside>
33
+ <h4>Menu</h4>
34
+ <a href="/">Home</a>
35
+ <a href="/about" class="active badge badge-glow px-3 py-3">About</a>
36
+ <a href="https://seip25.github.io/Blue-bird-css/" target="_blank">Blue Bird CSS</a>
37
+ <a href="https://github.com/seip25/Blue-bird" target="_blank" role="button"
38
+ class="btn-sm outline">GitHub</a>
39
+ </aside>
40
+
41
+ <div>
42
+ <section class="hero ">
43
+ <h1 class="mt-3 text-gradient font-bold">About Blue Bird</h1>
44
+ <p class="lead">Built for performance, simplicity, and raw speed.</p>
45
+ </section>
46
+
47
+ <article class="mt-6 ">
48
+ <header>
49
+ <h2 class="text-gradient-blue font-semibold">Our Philosophy</h2>
50
+ </header>
51
+ <p>
52
+ Blue Bird was born out of a desire for a clean, performance-first approach to web development. We
53
+ believe in harnessing the raw power of Express.js and Nginx, stripping away unnecessary bloat, and
54
+ providing developers with a robust foundation that just works.
55
+ </p>
56
+ <p>
57
+ By separating the static frontend delivery (handled blazingly fast by Nginx) from the dynamic API
58
+ layer (powered by Express and Redis), Blue Bird achieves unparalleled performance out of the box.
59
+ </p>
60
+ </article>
61
+
62
+ <div class="px-4 py-4 mb-4">
63
+ <h2 class="text-gradient-blue font-semibold">Why Blue Bird?</h2>
64
+
65
+ <div class="grid cols-2 gap-4">
66
+ <div>
67
+ <details open>
68
+ <summary>Zero Config Docker</summary>
69
+ <p>Go from development to production seamlessly with ready-to-use
70
+ Docker orchestration for
71
+ SQLite, MySQL, PostgreSQL, and Redis.</p>
72
+ </details>
73
+ <details open>
74
+ <summary>Military Grade Security</summary>
75
+ <p>Built-in AES-256-GCM JWT encryption, secure HttpOnly cookie
76
+ sessions, helmet headers, and
77
+ route rate limiting.</p>
78
+ </details>
79
+ </div>
80
+ <div>
81
+ <details open>
82
+ <summary>High Performance Layer</summary>
83
+ <p>Redis caching for the data layer and Nginx static delivery with
84
+ 1-month browser asset
85
+ caching.</p>
86
+ </details>
87
+ <details open>
88
+ <summary>Pure Semantic HTML &amp; CSS</summary>
89
+ <p>No bloated frontend frameworks or heavy node compile steps. Write
90
+ clean, accessible code
91
+ close to the metal.</p>
92
+ </details>
93
+ </div>
94
+ </div>
95
+ </article>
96
+
97
+ <article class="">
98
+ <header>
99
+ <h2 class="text-gradient-blue font-semibold">Core Architecture Summary</h2>
100
+ </header>
101
+ <table class="table table-hover">
102
+ <thead>
103
+ <tr>
104
+ <th>Layer</th>
105
+ <th>Technology</th>
106
+ <th>Role</th>
107
+ </tr>
108
+ </thead>
109
+ <tbody>
110
+ <tr>
111
+ <td><strong>Frontend</strong></td>
112
+ <td>Pure Semantic HTML5 + <a href="https://seip25.github.io/Blue-bird-css/"
113
+ target="_blank">Blue Bird CSS</a></td>
114
+ <td>Static rendering served directly via Nginx</td>
115
+ </tr>
116
+ <tr>
117
+ <td><strong>Backend</strong></td>
118
+ <td>Node.js + Express + PM2</td>
119
+ <td>High-performance REST API services</td>
120
+ </tr>
121
+ <tr>
122
+ <td><strong>Cache</strong></td>
123
+ <td>Redis / In-Memory RAM</td>
124
+ <td>Sub-millisecond route &amp; query caching</td>
125
+ </tr>
126
+ <tr>
127
+ <td><strong>Database</strong></td>
128
+ <td>SQLite (WAL) / PostgreSQL / MySQL</td>
129
+ <td>Unified driver with connection pooling</td>
130
+ </tr>
131
+ </tbody>
132
+ </table>
133
+ </article>
134
+
135
+
136
+ </div>
137
+ </main>
138
+
139
+ <footer>
140
+ <div class="footer-content">
141
+ <p>Powered by <strong class="text-gradient">Blue Bird Framework</strong> &amp;
142
+ <strong class="text-gradient-blue">
143
+ <a href="https://seip25.github.io/Blue-bird-css/" target="_blank">Blue Bird
144
+ CSS</a>
145
+ </strong>.
146
+ </p>
147
+ <div class="lang-switcher">
148
+ <a href="/" class="lang-link">Home</a>
149
+ <a href="/about" class="lang-link">About</a>
150
+ <a href="https://github.com/seip25/Blue-bird" target="_blank" class="github-star mt-2">&#9733;
151
+ GitHub</a>
152
+ </div>
153
+ </div>
154
+ </footer>
155
+ </body>
156
+
108
157
  </html>