# Website Template

A modern, clean website template with blog, cheatsheets, quick reference guides, search integration, and analytics. Built with pure HTML, CSS, and JavaScript - no frameworks, no build process, just code that works.

## Features

- **Homepage** - Dynamic time-based greetings and theme switcher
- **Complete Blog System** - Full blogging platform with RSS, reactions, and analytics
- **Quick Reference Guides** - Programming language refs (Bash, Python)
- **Cheatsheets** - Command-line and security tool cheatsheets (nmap, ssh)
- **Search Integration** - SearXNG theme customization
- **Privacy-Focused Analytics** - Self-hosted, no third-party tracking
- **Theme System** - Dark/light mode with smooth transitions
- **Fast & Lightweight** - Pure HTML/CSS/JS, no bloat

## File Structure

```
website-template/
├── README.md
├── index.html
├── 404.html
├── favicon.ico
├── assets/
│   ├── css/
│   ├── js/
│   ├── fonts/
│   └── icons/
├── blog/
│   ├── admin/            # Blog admin interface (protect this!)
│   │   ├── index.php     # Script to convert .md posts to JSON
│   │   └── example-post.md
│   ├── api/
│   ├── data/
│   └── js/
├── api/
├── analytics/
├── cheatsheets/
├── quickref/
├── search/
└── data/
    ├── analytics/
    └── reactions/
```

## Installation & Setup

### Step 1: Extract the Template

```bash
tar -xzf website-template.tar.gz
cd website-template
```

### Step 2: Set Up Your Web Server

#### Option A: Nginx (Recommended)

1. **Install Nginx and PHP:**

   **Debian/Ubuntu:**
   ```bash
   sudo apt update
   sudo apt install nginx php-fpm php-json php-mbstring
   ```

   **Fedora/RHEL/CentOS:**
   ```bash
   sudo dnf install nginx php-fpm php-json php-mbstring
   ```

   **Arch Linux:**
   ```bash
   sudo pacman -S nginx php-fpm php
   ```

   **openSUSE:**
   ```bash
   sudo zypper install nginx php-fpm php-json php-mbstring
   ```

   **Alpine Linux:**
   ```bash
   sudo apk add nginx php-fpm php-json php-mbstring
   ```

   **macOS (Homebrew):**
   ```bash
   brew install nginx php
   ```

   **FreeBSD:**
   ```bash
   sudo pkg install nginx php82 php82-json php82-mbstring
   ```

2. **Configure Nginx:**
   Create `/etc/nginx/sites-available/your-site` (or edit the default):
   ```nginx
   server {
       listen 80;
       server_name your-domain.com www.your-domain.com;
       root /var/www/html;
       index index.html;

       # PHP handling
       location ~ \.php$ {
           include snippets/fastcgi-php.conf;
           fastcgi_pass unix:/var/run/php/php-fpm.sock;
       }

       # Deny access to hidden files and data directories
       location ~ /\. {
           deny all;
       }
       
       location ~ /data/ {
           deny all;
       }

       # Main location
       location / {
           try_files $uri $uri/ =404;
       }
   }
   ```

3. **Enable the site:**

   **Debian/Ubuntu:**
   ```bash
   sudo ln -s /etc/nginx/sites-available/your-site /etc/nginx/sites-enabled/
   sudo nginx -t
   sudo systemctl reload nginx
   ```

   **Other Linux distributions:**
   ```bash
   # Edit /etc/nginx/nginx.conf directly or create config in /etc/nginx/conf.d/
   sudo nginx -t
   sudo systemctl reload nginx
   ```

   **macOS:**
   ```bash
   # Edit /usr/local/etc/nginx/nginx.conf
   brew services restart nginx
   ```

   **FreeBSD:**
   ```bash
   # Edit /usr/local/etc/nginx/nginx.conf
   sudo service nginx reload
   ```

4. **Copy files and set permissions:**

   **Linux (most distributions):**
   ```bash
   sudo cp -r * /var/www/html/
   sudo chown -R www-data:www-data /var/www/html/  # or nginx:nginx on some systems
   sudo chmod -R 755 /var/www/html/
   sudo chmod 775 /var/www/html/data /var/www/html/data/analytics /var/www/html/data/reactions
   sudo chmod 775 /var/www/html/blog/data
   ```

   **macOS:**
   ```bash
   sudo cp -r * /usr/local/var/www/
   sudo chown -R _www:_www /usr/local/var/www/
   sudo chmod -R 755 /usr/local/var/www/
   sudo chmod 775 /usr/local/var/www/data /usr/local/var/www/data/analytics /usr/local/var/www/data/reactions
   sudo chmod 775 /usr/local/var/www/blog/data
   ```

   **FreeBSD:**
   ```bash
   sudo cp -r * /usr/local/www/nginx/
   sudo chown -R www:www /usr/local/www/nginx/
   sudo chmod -R 755 /usr/local/www/nginx/
   sudo chmod 775 /usr/local/www/nginx/data /usr/local/www/nginx/data/analytics /usr/local/www/nginx/data/reactions
   sudo chmod 775 /usr/local/www/nginx/blog/data
   ```

#### Option B: Apache

1. **Install Apache and PHP:**

   **Debian/Ubuntu:**
   ```bash
   sudo apt install apache2 libapache2-mod-php php-json php-mbstring
   ```

   **Fedora/RHEL/CentOS:**
   ```bash
   sudo dnf install httpd php php-json php-mbstring
   ```

   **Arch Linux:**
   ```bash
   sudo pacman -S apache php
   sudo systemctl enable --now httpd
   ```

   **openSUSE:**
   ```bash
   sudo zypper install apache2 php php-json php-mbstring
   ```

   **Alpine Linux:**
   ```bash
   sudo apk add apache2 php php-json php-mbstring
   ```

   **macOS (Homebrew):**
   ```bash
   brew install httpd php
   ```

   **FreeBSD:**
   ```bash
   sudo pkg install apache24 php82 php82-json php82-mbstring
   ```

2. **Enable PHP and mod_rewrite:**

   **Debian/Ubuntu:**
   ```bash
   sudo a2enmod php
   sudo a2enmod rewrite
   ```

   **Fedora/RHEL/CentOS/Arch/openSUSE/Alpine:**
   ```bash
   # PHP module is usually enabled by default
   # Enable rewrite module (method varies by distro)
   # Check your distribution's documentation for specific commands
   ```

   **macOS:**
   ```bash
   # Edit /usr/local/etc/httpd/httpd.conf
   # Uncomment: LoadModule rewrite_module lib/httpd/modules/mod_rewrite.so
   ```

   **FreeBSD:**
   ```bash
   # Edit /usr/local/etc/apache24/httpd.conf
   # Uncomment: LoadModule rewrite_module libexec/apache24/mod_rewrite.so
   ```

3. **Configure Apache:**
   Edit `/etc/apache2/sites-available/000-default.conf` (or create a new virtual host):
   ```apache
   <VirtualHost *:80>
       ServerName your-domain.com
       DocumentRoot /var/www/html
       
       <Directory /var/www/html>
           Options -Indexes +FollowSymLinks
           AllowOverride All
           Require all granted
       </Directory>
       
       # Protect data directories
       <Directory /var/www/html/data>
           Require all denied
       </Directory>
   </VirtualHost>
   ```

4. **Copy files and set permissions:**

   **Linux (most distributions):**
   ```bash
   sudo cp -r * /var/www/html/
   sudo chown -R www-data:www-data /var/www/html/  # or httpd:httpd on some systems
   sudo chmod -R 755 /var/www/html/
   sudo chmod 775 /var/www/html/data /var/www/html/data/analytics /var/www/html/data/reactions
   sudo chmod 775 /var/www/html/blog/data
   ```

   **macOS:**
   ```bash
   sudo cp -r * /usr/local/var/www/
   sudo chown -R _www:_www /usr/local/var/www/
   sudo chmod -R 755 /usr/local/var/www/
   sudo chmod 775 /usr/local/var/www/data /usr/local/var/www/data/analytics /usr/local/var/www/data/reactions
   sudo chmod 775 /usr/local/var/www/blog/data
   ```

   **FreeBSD:**
   ```bash
   sudo cp -r * /usr/local/www/apache24/data/
   sudo chown -R www:www /usr/local/www/apache24/data/
   sudo chmod -R 755 /usr/local/www/apache24/data/
   sudo chmod 775 /usr/local/www/apache24/data/data /usr/local/www/apache24/data/data/analytics /usr/local/www/apache24/data/data/reactions
   sudo chmod 775 /usr/local/www/apache24/data/blog/data
   ```

5. **Restart Apache:**
   ```bash
   # Linux (systemd)
   sudo systemctl restart apache2    # Debian/Ubuntu
   sudo systemctl restart httpd     # Fedora/RHEL/Arch/openSUSE

   # macOS
   brew services restart httpd

   # FreeBSD
   sudo service apache24 restart
   ```

### Step 3: Configure PHP

Edit your PHP configuration to set the timezone:

```bash
# Find your php.ini location
php --ini

# Edit php.ini (location varies by OS and installation method)
# Common locations:
#   Linux: /etc/php/8.x/fpm/php.ini or /etc/php.ini
#   macOS: /usr/local/etc/php/8.x/php.ini
#   FreeBSD: /usr/local/etc/php.ini

# Set your timezone (replace with your actual timezone)
date.timezone = "America/New_York"

# Restart PHP-FPM (or PHP service)
# Linux (systemd):
sudo systemctl restart php-fpm  # or php8.x-fpm

# macOS:
brew services restart php

# FreeBSD:
sudo service php-fpm restart
```

### Step 4: Test It Out

1. **Start a local PHP server for testing:**
   ```bash
   cd /var/www/html
   php -S localhost:8000
   ```

2. **Visit in your browser:**
   - Homepage: `http://localhost:8000`
   - Blog: `http://localhost:8000/blog/index.html`
   - Analytics: `http://localhost:8000/analytics/index.html` (IP-restricted by default)

### Step 5: Secure the Admin Interface

**IMPORTANT:** The blog admin interface at `/blog/admin/` should be protected. Use one of these methods:

**Option 1: HTTP Basic Auth (Nginx)**
```nginx
location /blog/admin/ {
    auth_basic "Admin Area";
    auth_basic_user_file /etc/nginx/.htpasswd;
}
```

Create the password file:
```bash
sudo apt install apache2-utils
sudo htpasswd -c /etc/nginx/.htpasswd your-username
```

**Option 2: HTTP Basic Auth (Apache)**
Create `/var/www/html/blog/admin/.htaccess`:
```apache
AuthType Basic
AuthName "Admin Area"
AuthUserFile /var/www/html/blog/admin/.htpasswd
Require valid-user
```

Create the password file:
```bash
sudo htpasswd -c /var/www/html/blog/admin/.htpasswd your-username
```

## Adding Blog Posts

You have three options for adding blog posts:

### Option 1: Convert Markdown to JSON (Recommended)

The template includes a PHP script to convert markdown files to the JSON format used by the blog.

1. **Create a markdown file** following this format:
   ```markdown
   ---
   title: Your Amazing Blog Post Title
   excerpt: A brief excerpt that appears on the blog listing page
   ---

   This is your blog post content. You can write as much as you want here.

   Use double newlines to separate paragraphs. The script will handle the rest.
   ```

2. **Run the conversion script:**
   ```bash
   cd /var/www/html/blog/admin
   php index.php /path/to/your-post.md
   ```
   
   Or if you're in the blog/admin directory:
   ```bash
   php index.php your-post.md
   ```

   The script will:
   - Parse the frontmatter (title, excerpt)
   - Extract the content
   - Generate a unique ID
   - Add today's date
   - Append to `blog/data/posts.json`

3. **Example:**
   ```bash
   # Create a post
   nano my-new-post.md
   
   # Convert it
   php index.php my-new-post.md
   
   # Done! Your post is now in the blog
   ```

### Option 2: Edit JSON Directly

Edit `blog/data/posts.json` directly. Each post needs:
- `id`: Unique number (increment from existing posts)
- `title`: Post title
- `date`: Date in `YYYY-MM-DD` format
- `excerpt`: Short description for listings
- `content`: Full post content (use `\n\n` for paragraph breaks)

Example:
```json
{
  "id": 1,
  "title": "My Second Post",
  "date": "2025-01-15",
  "excerpt": "This is what shows up on the blog listing",
  "content": "This is the full content of my post.\n\nThis is a second paragraph."
}
```

### Option 3: Use the Admin Interface

Visit `/blog/admin/` in your browser (after securing it) and use the web interface.

## Security Checklist

- [ ] Protect `/blog/admin/` with authentication (see Step 5 above)
- [ ] Set proper file permissions (755 for directories, 644 for files, 775 for data dirs)
- [ ] Use HTTPS (Let's Encrypt is free and easy)
- [ ] Analytics is already IP-restricted to local networks (check `api/analytics.php`)
- [ ] Review and customize CSP headers in HTML files if needed
- [ ] Don't expose `/data/` directory in web server config
- [ ] Keep PHP updated

## Customization

### Change Colors

Edit `assets/css/style.css` and modify the CSS variables:
```css
:root {
    --bg-primary: #your-color;
    --text-primary: #your-color;
    /* ... etc */
}
```

### Update Site Information

- **RSS Feed:** Edit `blog/api/feed.php` - change domain and title
- **Homepage Links:** Edit `index.html` - customize the link sections
- **ASCII Art Logo:** Replace the logo in all HTML files (search for the ASCII art)

### Timezone

The site uses the user's local timezone for display. Server-side PHP uses UTC by default - adjust in:
- `api/analytics.php`
- `api/track.php`
- `blog/api/feed.php`

Set your server's timezone in `php.ini` (see Step 3).

## Requirements

- **Web Server:** Nginx (recommended) or Apache
- **PHP:** 7.4+ with `php-json` and `php-mbstring` extensions
- **Browser:** Modern browser
- **Permissions:** Write access to `data/` and `blog/data/` directories

## Troubleshooting

**Blog posts not loading?**
- Make sure PHP is running: `sudo systemctl status php-fpm`
- Check file permissions: `ls -la blog/data/posts.json`
- Verify PHP can read the file: `php -r "echo file_exists('blog/data/posts.json') ? 'OK' : 'NOT FOUND';"`
- Check browser console for JavaScript errors

**Analytics not working?**
- Analytics is IP-restricted by default (local networks only)
- Check `api/analytics.php` for IP filtering rules
- Verify `data/analytics/` directory is writable

**404 errors?**
- Check web server configuration
- Verify file paths are correct
- Make sure mod_rewrite is enabled (Apache) or try_files is configured (Nginx)

**PHP errors?**
- Check PHP error logs: `/var/log/php-fpm/error.log` or Apache error log
- Verify PHP extensions are installed: `php -m | grep json`
- Check file permissions

## What Makes This Special

- **No frameworks** - Pure, readable code
- **No build process** - Edit files, refresh browser, done
- **Privacy-first** - Self-hosted analytics, no third-party tracking
- **Actually organized** - Clean structure that makes sense, I don't want to talk about how we got there.
- **JSON-based storage** - Blog posts and data stored in JSON files

## License

This project is licensed under the GNU General Public License v3.0. See [LICENSE.md](LICENSE.md) for details.

---

**Built with a healthy dose of cynicism.**

Extract it. Deploy it. Make it yours.
