This commit is contained in:
Justin Frasier 2026-04-27 19:12:07 -05:00
parent 97de4bca88
commit 2d8b0c6e8f
13 changed files with 170 additions and 68 deletions

52
.htaccess Normal file
View File

@ -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>

3
.vs/ProjectSettings.json Normal file
View File

@ -0,0 +1,3 @@
{
"CurrentProjectSetting": null
}

0
Justin_Frasier_Resume.pdf Normal file → Executable file
View File

136
README.md Normal file → Executable file
View File

@ -1,68 +1,68 @@
# k5bss.com
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)
---
## Overview
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
- **[k5bss.html](k5bss.html)** — Ham radio station dashboard and logbook
## Structure
```
k5bss.com/
├── index.html # Resume/portfolio page
├── k5bss.html # Ham radio station dashboard
├── Justin_Frasier_Resume.pdf # Downloadable resume
├── css/
│ └── style.css # Styles for index.html
├── favicon.ico
├── favicon-32x32.png
├── favicon-64x64.png
└── favicon-256x256.png
```
## Pages
### Resume / Portfolio (`index.html`)
- **About** — summary, tags, and certifications at a glance
- **Experience** — work history (Margaritaville, Boomtown, xententLABS)
- **Technical Skills** — languages, OS, hardware, tools, networking, IT support, security
- **Education** — BPCC A.A.S. Cyber Technology, Northwood High School
- **Certifications** — CompTIA A+, PCPro, Udemy courses, amateur radio, locomotive
- **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`.
### Ham Radio Station Dashboard (`k5bss.html`)
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
- **Logbook** — searchable, filterable, paginated contact log (callsign, name, country, QTH, LoTW status)
- **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.
## Responsive Design
`index.html` adapts across three breakpoints defined in `css/style.css`:
| Breakpoint | Behavior |
|---|---|
| `≤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 |
| `≤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.
## Deployment
Static files — drop the repo contents onto any web server or host (Nginx, Apache, Caddy, GitHub Pages, etc.). No build step required.
# k5bss.com
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)
---
## Overview
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
- **[k5bss.html](k5bss.html)** — Ham radio station dashboard and logbook
## Structure
```
k5bss.com/
├── index.html # Resume/portfolio page
├── k5bss.html # Ham radio station dashboard
├── Justin_Frasier_Resume.pdf # Downloadable resume
├── css/
│ └── style.css # Styles for index.html
├── favicon.ico
├── favicon-32x32.png
├── favicon-64x64.png
└── favicon-256x256.png
```
## Pages
### Resume / Portfolio (`index.html`)
- **About** — summary, tags, and certifications at a glance
- **Experience** — work history (Margaritaville, Boomtown, xententLABS)
- **Technical Skills** — languages, OS, hardware, tools, networking, IT support, security
- **Education** — BPCC A.A.S. Cyber Technology, Northwood High School
- **Certifications** — CompTIA A+, PCPro, Udemy courses, amateur radio, locomotive
- **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`.
### Ham Radio Station Dashboard (`k5bss.html`)
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
- **Logbook** — searchable, filterable, paginated contact log (callsign, name, country, QTH, LoTW status)
- **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.
## Responsive Design
`index.html` adapts across three breakpoints defined in `css/style.css`:
| Breakpoint | Behavior |
|---|---|
| `≤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 |
| `≤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.
## Deployment
Static files — drop the repo contents onto any web server or host (Nginx, Apache, Caddy, GitHub Pages, etc.). No build step required.

0
css/style.css Normal file → Executable file
View File

0
favicon-256x256.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

0
favicon-32x32.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 473 B

After

Width:  |  Height:  |  Size: 473 B

0
favicon-64x64.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 826 B

After

Width:  |  Height:  |  Size: 826 B

0
favicon.ico Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 4.3 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

0
index.html Normal file → Executable file
View File

0
k5bss.html Normal file → Executable file
View File

29
security.txt Executable file
View File

@ -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-----

18
sitemap.xml Executable file
View File

@ -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>