update
|
|
@ -0,0 +1,52 @@
|
||||||
|
# ── HTTPS Redirect ──────────────────────────────────────────────────────────
|
||||||
|
RewriteEngine On
|
||||||
|
RewriteCond %{HTTPS} off
|
||||||
|
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
|
||||||
|
|
||||||
|
# ── Security Headers ─────────────────────────────────────────────────────────
|
||||||
|
# HSTS: tell browsers to always use HTTPS (1 year). Add "; preload" and submit
|
||||||
|
# to https://hstspreload.org once you're confident HTTPS is permanent.
|
||||||
|
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
|
||||||
|
|
||||||
|
# Prevent MIME-type sniffing
|
||||||
|
Header always set X-Content-Type-Options "nosniff"
|
||||||
|
|
||||||
|
# Block this site from being embedded in iframes
|
||||||
|
Header always set X-Frame-Options "DENY"
|
||||||
|
|
||||||
|
# Control how much referrer info is sent to external sites
|
||||||
|
Header always set Referrer-Policy "strict-origin-when-cross-origin"
|
||||||
|
|
||||||
|
# Disable browser features not used by this site
|
||||||
|
Header always set Permissions-Policy "camera=(), microphone=(), geolocation=(), payment=(), usb=(), interest-cohort=()"
|
||||||
|
|
||||||
|
# Prevent cross-origin window attacks
|
||||||
|
Header always set Cross-Origin-Opener-Policy "same-origin"
|
||||||
|
|
||||||
|
# Restrict cross-origin resource loading
|
||||||
|
Header always set Cross-Origin-Resource-Policy "same-origin"
|
||||||
|
|
||||||
|
# Content Security Policy
|
||||||
|
# - script/style 'unsafe-inline' required for inline blocks in both pages
|
||||||
|
# - fonts.googleapis.com for Google Fonts CSS; fonts.gstatic.com for font files
|
||||||
|
# - ki5bhv.com for the profile photo
|
||||||
|
Header always set Content-Security-Policy "default-src 'none'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com; img-src 'self' https://ki5bhv.com data:; connect-src 'none'; frame-src 'none'; object-src 'none'; base-uri 'self'; form-action 'none'; upgrade-insecure-requests"
|
||||||
|
|
||||||
|
# ── Strip Server Info ─────────────────────────────────────────────────────────
|
||||||
|
Header always unset X-Powered-By
|
||||||
|
Header always unset Server
|
||||||
|
|
||||||
|
# ── security.txt: also serve from /.well-known/ per RFC 9116 ─────────────────
|
||||||
|
RedirectMatch 301 ^/.well-known/security.txt$ /security.txt
|
||||||
|
|
||||||
|
# ── Sitemap ───────────────────────────────────────────────────────────────────
|
||||||
|
# Declared here so crawlers that read robots.txt can find it
|
||||||
|
# (also declared in robots.txt if you add one)
|
||||||
|
|
||||||
|
# ── Disable directory listing ─────────────────────────────────────────────────
|
||||||
|
Options -Indexes
|
||||||
|
|
||||||
|
# ── Protect dotfiles ──────────────────────────────────────────────────────────
|
||||||
|
<FilesMatch "^\.">
|
||||||
|
Require all denied
|
||||||
|
</FilesMatch>
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
{
|
||||||
|
"CurrentProjectSetting": null
|
||||||
|
}
|
||||||
|
|
@ -1,68 +1,68 @@
|
||||||
# k5bss.com
|
# k5bss.com
|
||||||
|
|
||||||
Personal portfolio and ham radio station site for Justin Frasier — IT Support Analyst and amateur radio operator (K5BSS, General Class).
|
Personal portfolio and ham radio station site for Justin Frasier — IT Support Analyst and amateur radio operator (K5BSS, General Class).
|
||||||
|
|
||||||
Live at: [k5bss.com](https://k5bss.com)
|
Live at: [k5bss.com](https://k5bss.com)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Overview
|
## Overview
|
||||||
|
|
||||||
Two static pages with a dark terminal aesthetic. No frameworks or build tools — just HTML, CSS, and vanilla JavaScript.
|
Two static pages with a dark terminal aesthetic. No frameworks or build tools — just HTML, CSS, and vanilla JavaScript.
|
||||||
|
|
||||||
- **[index.html](index.html)** — Resume/portfolio page
|
- **[index.html](index.html)** — Resume/portfolio page
|
||||||
- **[k5bss.html](k5bss.html)** — Ham radio station dashboard and logbook
|
- **[k5bss.html](k5bss.html)** — Ham radio station dashboard and logbook
|
||||||
|
|
||||||
## Structure
|
## Structure
|
||||||
|
|
||||||
```
|
```
|
||||||
k5bss.com/
|
k5bss.com/
|
||||||
├── index.html # Resume/portfolio page
|
├── index.html # Resume/portfolio page
|
||||||
├── k5bss.html # Ham radio station dashboard
|
├── k5bss.html # Ham radio station dashboard
|
||||||
├── Justin_Frasier_Resume.pdf # Downloadable resume
|
├── Justin_Frasier_Resume.pdf # Downloadable resume
|
||||||
├── css/
|
├── css/
|
||||||
│ └── style.css # Styles for index.html
|
│ └── style.css # Styles for index.html
|
||||||
├── favicon.ico
|
├── favicon.ico
|
||||||
├── favicon-32x32.png
|
├── favicon-32x32.png
|
||||||
├── favicon-64x64.png
|
├── favicon-64x64.png
|
||||||
└── favicon-256x256.png
|
└── favicon-256x256.png
|
||||||
```
|
```
|
||||||
|
|
||||||
## Pages
|
## Pages
|
||||||
|
|
||||||
### Resume / Portfolio (`index.html`)
|
### Resume / Portfolio (`index.html`)
|
||||||
|
|
||||||
- **About** — summary, tags, and certifications at a glance
|
- **About** — summary, tags, and certifications at a glance
|
||||||
- **Experience** — work history (Margaritaville, Boomtown, xententLABS)
|
- **Experience** — work history (Margaritaville, Boomtown, xententLABS)
|
||||||
- **Technical Skills** — languages, OS, hardware, tools, networking, IT support, security
|
- **Technical Skills** — languages, OS, hardware, tools, networking, IT support, security
|
||||||
- **Education** — BPCC A.A.S. Cyber Technology, Northwood High School
|
- **Education** — BPCC A.A.S. Cyber Technology, Northwood High School
|
||||||
- **Certifications** — CompTIA A+, PCPro, Udemy courses, amateur radio, locomotive
|
- **Certifications** — CompTIA A+, PCPro, Udemy courses, amateur radio, locomotive
|
||||||
- **Contact** — email, phone, address, GitHub, LinkedIn, self-hosted Git
|
- **Contact** — email, phone, address, GitHub, LinkedIn, self-hosted Git
|
||||||
|
|
||||||
Fonts: [IBM Plex Mono](https://fonts.google.com/specimen/IBM+Plex+Mono) and [IBM Plex Sans](https://fonts.google.com/specimen/IBM+Plex+Sans) via Google Fonts. Sticky sidebar with scroll-spy nav via `IntersectionObserver`.
|
Fonts: [IBM Plex Mono](https://fonts.google.com/specimen/IBM+Plex+Mono) and [IBM Plex Sans](https://fonts.google.com/specimen/IBM+Plex+Sans) via Google Fonts. Sticky sidebar with scroll-spy nav via `IntersectionObserver`.
|
||||||
|
|
||||||
### Ham Radio Station Dashboard (`k5bss.html`)
|
### Ham Radio Station Dashboard (`k5bss.html`)
|
||||||
|
|
||||||
Three-tab single-page app for station stats and the contact logbook:
|
Three-tab single-page app for station stats and the contact logbook:
|
||||||
|
|
||||||
- **Dashboard** — QSO count, DXCC entities, states worked; bar charts for modes and bands; top countries list; monthly QSO activity canvas chart
|
- **Dashboard** — QSO count, DXCC entities, states worked; bar charts for modes and bands; top countries list; monthly QSO activity canvas chart
|
||||||
- **Logbook** — searchable, filterable, paginated contact log (callsign, name, country, QTH, LoTW status)
|
- **Logbook** — searchable, filterable, paginated contact log (callsign, name, country, QTH, LoTW status)
|
||||||
- **About** — station info and operating preferences
|
- **About** — station info and operating preferences
|
||||||
|
|
||||||
Fonts: [Share Tech Mono](https://fonts.google.com/specimen/Share+Tech+Mono), [Orbitron](https://fonts.google.com/specimen/Orbitron), and [Barlow](https://fonts.google.com/specimen/Barlow) via Google Fonts. Styles and JavaScript are self-contained within the file.
|
Fonts: [Share Tech Mono](https://fonts.google.com/specimen/Share+Tech+Mono), [Orbitron](https://fonts.google.com/specimen/Orbitron), and [Barlow](https://fonts.google.com/specimen/Barlow) via Google Fonts. Styles and JavaScript are self-contained within the file.
|
||||||
|
|
||||||
## Responsive Design
|
## Responsive Design
|
||||||
|
|
||||||
`index.html` adapts across three breakpoints defined in `css/style.css`:
|
`index.html` adapts across three breakpoints defined in `css/style.css`:
|
||||||
|
|
||||||
| Breakpoint | Behavior |
|
| Breakpoint | Behavior |
|
||||||
|---|---|
|
|---|---|
|
||||||
| `≤1024px` (tablet) | Sidebar narrows from 280px to 230px; main content padding reduced |
|
| `≤1024px` (tablet) | Sidebar narrows from 280px to 230px; main content padding reduced |
|
||||||
| `≤768px` (mobile) | Sidebar unsticks and stacks above content; nav links reflow into a horizontal wrapping row; contact grid collapses to one column |
|
| `≤768px` (mobile) | Sidebar unsticks and stacks above content; nav links reflow into a horizontal wrapping row; contact grid collapses to one column |
|
||||||
| `≤480px` (small phone) | Tighter padding and font sizes; skills grid columns shrink to `minmax(140px, 1fr)` |
|
| `≤480px` (small phone) | Tighter padding and font sizes; skills grid columns shrink to `minmax(140px, 1fr)` |
|
||||||
|
|
||||||
All other components — tags, socials, and the skills grid — use `flex-wrap` or `auto-fill` and reflow fluidly without breakpoints.
|
All other components — tags, socials, and the skills grid — use `flex-wrap` or `auto-fill` and reflow fluidly without breakpoints.
|
||||||
|
|
||||||
## Deployment
|
## Deployment
|
||||||
|
|
||||||
Static files — drop the repo contents onto any web server or host (Nginx, Apache, Caddy, GitHub Pages, etc.). No build step required.
|
Static files — drop the repo contents onto any web server or host (Nginx, Apache, Caddy, GitHub Pages, etc.). No build step required.
|
||||||
|
|
|
||||||
|
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 3.1 KiB |
|
Before Width: | Height: | Size: 473 B After Width: | Height: | Size: 473 B |
|
Before Width: | Height: | Size: 826 B After Width: | Height: | Size: 826 B |
|
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 4.3 KiB |
|
|
@ -0,0 +1,29 @@
|
||||||
|
-----BEGIN PGP SIGNED MESSAGE-----
|
||||||
|
Hash: SHA256
|
||||||
|
|
||||||
|
#Generated by https://github.com/gitaware/securitytxtgenerator
|
||||||
|
|
||||||
|
# If you would like to report a security issue, please contact us at:
|
||||||
|
Contact: justin@k5bss.com
|
||||||
|
Expires: 2027-04-20T01:14:00Z
|
||||||
|
Preferred-Languages: en
|
||||||
|
Canonical: https://k5bss.com/security.txt
|
||||||
|
Encryption: https://k5bss.com/pgp-key.asc
|
||||||
|
|
||||||
|
-----BEGIN PGP SIGNATURE-----
|
||||||
|
|
||||||
|
wsFzBAEBCAAnBYJp5onuCZB2Xap8YgdeNhYhBK0QLg9LuG9EuLvfkHZdqnxi
|
||||||
|
B142AAAlIw//Y//VEh32G+tXnamBIuYq4W+vdBlwZuKGeW/IwObedw89bGwo
|
||||||
|
/xSPGWUh0mPKKLof1MtLWNObUUCBscRZiLArExFzw/OZy2J3VuAH5qBrl2am
|
||||||
|
D8dnl/6CbqdrpEI3cinrzgDoa1Z4F15wF5lLNlvYHCGkXFIpNFsd8H6P9/UZ
|
||||||
|
v0jM6l93wDWbEZR1rHIxvtoUQd8gfPwksGa+osj6QkpP7XBRRly6nAihk8u7
|
||||||
|
r+aZ1Sh+YfWiVH966mxmV0x9N2ihYgYmwPMPUNCSRgpDZgM3EEKZWHryuPu2
|
||||||
|
Sp5q3bxa6BahAEXFhYaJKinkL5O95vaxiJcsaqPRhlR2xHXLoQj9Ot5v5E9c
|
||||||
|
uUc2P0v4M/VLFFTWwnu+3z72V/sj32biRJ70hvH/bb58oOm7YAcOCERyFsY+
|
||||||
|
4Drcnt2Am7QDEojhdg3GYf9pJs0tsyvmTZsmpYN8pv3lfzUzEW2YUOdWjMOf
|
||||||
|
nLmeqipVA0tSC3QhK3EMqbgtNpJqR/TpbfyWd9EFLS/Jc/kCkAbJlSDOi9ud
|
||||||
|
FkbnWBMiTtSPOiDwWMswbOdMTwHu+GxnAbB5+lQghxuEOTTmOPvEQ6DtYhpn
|
||||||
|
3+YIf0oDqeptjd+VE5Tx59CMV1RsZkbTVRJanBuLp339Kb/dfQi/G7mIkRne
|
||||||
|
hxUZ/Nx9LjsFxlcJRLnAnmtr5qfHeamo7ME=
|
||||||
|
=o+Va
|
||||||
|
-----END PGP SIGNATURE-----
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
||||||
|
|
||||||
|
<url>
|
||||||
|
<loc>https://k5bss.com/</loc>
|
||||||
|
<lastmod>2026-04-20</lastmod>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>1.0</priority>
|
||||||
|
</url>
|
||||||
|
|
||||||
|
<url>
|
||||||
|
<loc>https://k5bss.com/k5bss.html</loc>
|
||||||
|
<lastmod>2026-04-20</lastmod>
|
||||||
|
<changefreq>weekly</changefreq>
|
||||||
|
<priority>0.8</priority>
|
||||||
|
</url>
|
||||||
|
|
||||||
|
</urlset>
|
||||||