@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 +70 -0
- package/README.md +129 -0
- package/frontend/about.html +156 -107
- package/frontend/css/bluebird.css +9852 -0
- package/frontend/index.html +144 -144
- package/frontend/js/bluebird.js +897 -0
- package/package.json +1 -1
- package/frontend/js/tailwind.js +0 -8
- package/frontend/js/utils.js +0 -558
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:
|
package/frontend/about.html
CHANGED
|
@@ -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"
|
|
10
|
-
|
|
11
|
-
<meta name="keywords" content="">
|
|
12
|
-
<meta name="author" content="Seip25">
|
|
13
|
-
<link rel="icon" href="/images/favicon.ico" />
|
|
14
|
-
<
|
|
15
|
-
<script src="/js/
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
<
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
<
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
</
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
<
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
<
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
</
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
</
|
|
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 & 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 & 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> &
|
|
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">★
|
|
151
|
+
GitHub</a>
|
|
152
|
+
</div>
|
|
153
|
+
</div>
|
|
154
|
+
</footer>
|
|
155
|
+
</body>
|
|
156
|
+
|
|
108
157
|
</html>
|