Hi! I'm Charlotte
About Me
-
I'm a cybersecurity student from the Northeast USA. I do security engineering at the Leahy Center in Burlington, VT. Currently my interests are in server management and SRE.
+
I'm a cybersecurity student from the Northeast USA. I do security engineering at the Leahy Center in Burlington, VT.
-
I use and advocate for FOSS in my personal life.
+
You can find most of my personal stuff on my
Codeberg
account.
From d1f04364a77ec48de9f4d955dafd8a9bc3ab30b2 Mon Sep 17 00:00:00 2001
From: Charlotte Croce
Date: Thu, 17 Apr 2025 19:51:02 -0400
Subject: [PATCH 06/10] 4-17
---
index.html | 262 ++++++---------
style.css | 934 ++++++++++++++++++++++-------------------------------
2 files changed, 487 insertions(+), 709 deletions(-)
diff --git a/index.html b/index.html
index bd01de2..a3de997 100644
--- a/index.html
+++ b/index.html
@@ -1,185 +1,133 @@
-
+
Charlotte Croce - ./charlotte.sh
- Skip to main content
-
-
-
-
- ./charlotte.sh
-
-
-
- GitHub
- (opens in new tab)
-
-
- Codeberg
- (opens in new tab)
-
-
- LinkedIn
- (opens in new tab)
-
-
-
-
-
-
-
-
@@ -75,6 +75,7 @@
BookWyrm
© Charlotte Croce
+ If you like the colors of this website, check out my VS Code Theme(opens in new tab)
diff --git a/style.css b/style.css
index e974468..db7d172 100644
--- a/style.css
+++ b/style.css
@@ -337,6 +337,12 @@ footer {
margin: 0 var(--space-xs);
}
+.theme-note {
+ margin-top: var(--space-md);
+ padding: var(--space-sm) var(--space-md);
+ display: inline-block;
+}
+
/* Dark mode */
.dark-mode {
--pink-50: #3A2A35;
From 8efa9abcc837152345b8ded608ca1f50889dbfb0 Mon Sep 17 00:00:00 2001
From: Charlotte Croce
Date: Sat, 19 Apr 2025 11:25:29 -0400
Subject: [PATCH 08/10] 4-19
---
index.html | 98 ++++++++-------------
resume/index.html | 179 ++++++++++++++++++++++++++++++++++++++
script.js | 49 +++++++++++
style.css | 212 +++++++++++++++++++++++++++++++++++++++++++---
4 files changed, 461 insertions(+), 77 deletions(-)
create mode 100644 resume/index.html
create mode 100644 script.js
diff --git a/index.html b/index.html
index 92c6309..462a401 100644
--- a/index.html
+++ b/index.html
@@ -1,5 +1,6 @@
+
@@ -11,21 +12,29 @@
Skip to main content
-
+
-
+
+
\ No newline at end of file
diff --git a/resume/index.html b/resume/index.html
new file mode 100644
index 0000000..a5518d2
--- /dev/null
+++ b/resume/index.html
@@ -0,0 +1,179 @@
+
+
+
+
+
+
+
+ Resume - Charlotte Croce
+
+
+
+
+
+ Skip to main content
+
+
+
+
+
+
+
+
+ Education
+
+
+
+
GPA: 3.97/4.0
+
+ Relevant Coursework: Network Security Controls, Web & Application Security, Database
+ Security, System Administration for Enterprise and Distributed Systems, Automation & Scripting
+
+
+
+
+
+ Experience
+
+
+
+
+ Maintained SIEM infrastructure, ensured uptime, and automated security operations
+ Optimized a threat detection engine to expand security coverage while reducing false positives
+
+ Developed an Elastic Stack dev environment for feature testing
+ Collaborated with analysts on alert response
+
+
+
+
+
+
+ Certifications
+
+
CompTIA CySA+
+
CompTIA Security+
+
CompTIA A+
+
+
+
+
+ Skills
+
+ Systems & Infrastructure
+
+
Active Directory
+
Debian Linux
+
Docker
+
RHEL Linux
+
VMWare
+
Windows Server
+
+
+ Security Tools & Frameworks
+
+
Elastic Stack
+
Firewalls
+
PKI
+
SIEM
+
Wireshark
+
+
+ Networking
+
+
+ Programming & Scripting
+
+
Ansible
+
Bash
+
Java
+
JavaScript
+
PowerShell
+
Python
+
SQL
+
+
+ Project Management
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/script.js b/script.js
new file mode 100644
index 0000000..e472fb0
--- /dev/null
+++ b/script.js
@@ -0,0 +1,49 @@
+// Initialize Lucide icons
+lucide.createIcons();
+
+// Update copyright year
+document.getElementById('current-year').textContent = new Date().getFullYear();
+
+// Theme toggle
+const themeToggle = document.querySelector('.theme-toggle');
+const moonIcon = document.getElementById('moon-icon');
+const sunIcon = document.getElementById('sun-icon');
+
+// Check for saved preference
+if (localStorage.getItem('darkMode') === 'true') {
+ document.body.classList.add('dark-mode');
+ moonIcon.style.display = 'none';
+ sunIcon.style.display = 'block';
+}
+
+themeToggle.addEventListener('click', () => {
+ document.body.classList.toggle('dark-mode');
+ const isDark = document.body.classList.contains('dark-mode');
+ moonIcon.style.display = isDark ? 'none' : 'block';
+ sunIcon.style.display = isDark ? 'block' : 'none';
+ localStorage.setItem('darkMode', isDark ? 'true' : 'false');
+});
+
+// Mobile menu
+const menuToggle = document.querySelector('.menu-toggle');
+const navLinks = document.querySelector('.nav-links');
+const menuIcon = document.getElementById('menu-icon');
+const closeIcon = document.getElementById('close-icon');
+
+menuToggle.addEventListener('click', () => {
+ const isExpanded = menuToggle.getAttribute('aria-expanded') === 'true';
+ menuToggle.setAttribute('aria-expanded', !isExpanded);
+ navLinks.classList.toggle('menu-open');
+ menuIcon.style.display = isExpanded ? 'block' : 'none';
+ closeIcon.style.display = isExpanded ? 'none' : 'block';
+});
+
+// Close menu when clicking outside
+document.addEventListener('click', (event) => {
+ if (!event.target.closest('.menu-toggle') && !event.target.closest('.nav-links') && navLinks.classList.contains('menu-open')) {
+ navLinks.classList.remove('menu-open');
+ menuToggle.setAttribute('aria-expanded', 'false');
+ menuIcon.style.display = 'block';
+ closeIcon.style.display = 'none';
+ }
+});
\ No newline at end of file
diff --git a/style.css b/style.css
index db7d172..cd8ac0f 100644
--- a/style.css
+++ b/style.css
@@ -7,24 +7,24 @@
--pink-300: #FF8AC8;
--pink-400: #F45D9E;
--pink-500: #D23B80;
-
+
/* Sage palette */
--sage-200: #D4E6D5;
--sage-300: #B5D4B7;
--sage-400: #8AB68C;
--sage-500: #6A9A6C;
-
+
/* Neutral palette */
--cream-50: #FFFEF5;
--cream-100: #FFF9F0;
-
+
/* Semantic colors */
--text: #4a4a4a;
--bg-primary: var(--pink-50);
--bg-secondary: white;
--accent-primary: var(--pink-400);
--accent-secondary: var(--sage-400);
-
+
/* Spacing */
--space-xs: 0.25rem;
--space-sm: 0.5rem;
@@ -32,10 +32,10 @@
--space-lg: 1.5rem;
--space-xl: 2rem;
--space-xxl: 3rem;
-
+
/* Container */
--container-max: 1200px;
-
+
/* Animation */
--transition: 0.2s ease;
}
@@ -97,7 +97,9 @@ body {
}
/* Typography */
-h1, h2, h3 {
+h1,
+h2,
+h3 {
line-height: 1.3;
margin-bottom: var(--space-md);
}
@@ -368,7 +370,7 @@ footer {
.menu-toggle {
display: flex;
}
-
+
.nav-links {
position: fixed;
top: 60px;
@@ -385,17 +387,17 @@ footer {
transition: transform var(--transition), opacity var(--transition);
z-index: 100;
}
-
+
.nav-links.menu-open {
transform: translateY(0);
opacity: 1;
pointer-events: auto;
}
-
+
.nav-links li {
width: 100%;
}
-
+
.nav-links a {
display: flex;
width: 100%;
@@ -403,14 +405,14 @@ footer {
margin-bottom: var(--space-xs);
transform: none;
}
-
+
.nav-links a:hover,
.nav-links a:focus {
transform: none;
box-shadow: none;
background-color: var(--pink-200);
}
-
+
.intro {
padding: var(--space-lg);
}
@@ -426,4 +428,188 @@ footer {
.project-grid {
grid-template-columns: repeat(3, 1fr);
}
+}
+
+
+
+
+/* Resume header and contact info */
+.resume-header {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-md);
+ margin-bottom: var(--space-xl);
+}
+
+.contact-info {
+ display: flex;
+ flex-wrap: wrap;
+ gap: var(--space-md);
+ font-size: 0.95rem;
+}
+
+/* Resume sections */
+.resume-section {
+ background-color: var(--bg-secondary);
+ border-radius: 0.75rem;
+ padding: var(--space-xl);
+ margin-bottom: var(--space-xl);
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05);
+ transition: transform var(--transition), box-shadow var(--transition);
+}
+
+.resume-section:hover {
+ box-shadow: 0 6px 16px rgba(0, 0, 0, 0.08);
+}
+
+.resume-section h2 {
+ position: relative;
+ margin-bottom: var(--space-lg);
+ display: flex;
+ align-items: center;
+}
+
+.resume-section h2::after {
+ content: '';
+ flex: 1;
+ height: 1px;
+ margin-left: var(--space-md);
+ background-color: var(--sage-200);
+}
+
+.dark-mode .resume-section h2::after {
+ background: linear-gradient(to right, var(--pink-400), transparent);
+}
+
+/* Education and experience items */
+.education-item,
+.experience-item {
+ margin-bottom: var(--space-lg);
+}
+
+.education-header,
+.experience-header {
+ display: flex;
+ justify-content: space-between;
+ flex-wrap: wrap;
+ margin-bottom: var(--space-xs);
+}
+
+.location {
+ color: var(--accent-primary);
+ font-weight: 500;
+}
+
+.date {
+ color: var(--text);
+ font-style: italic;
+}
+
+.degree,
+.job-title {
+ font-weight: 600;
+ color: var(--accent-secondary);
+}
+
+.gpa {
+ margin-bottom: var(--space-md);
+}
+
+.coursework {
+ margin-top: var(--space-sm);
+}
+
+.bullet-list {
+ padding-left: var(--space-xl);
+ margin-bottom: var(--space-md);
+}
+
+.bullet-list li {
+ margin-bottom: var(--space-xs);
+}
+
+/* Skills grid */
+.skills-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
+ gap: var(--space-md);
+}
+
+.skill-category {
+ display: flex;
+ align-items: center;
+ gap: var(--space-xs);
+}
+
+.skill-category::before {
+ content: '•';
+ color: var(--accent-primary);
+ font-size: 1.5rem;
+}
+
+/* Print styles */
+@media print {
+ body {
+ background-color: white;
+ }
+
+ header,
+ footer,
+ .theme-toggle,
+ .menu-toggle {
+ display: none;
+ }
+
+ .container {
+ max-width: 100%;
+ padding: 0;
+ }
+
+ .resume-section {
+ box-shadow: none;
+ page-break-inside: avoid;
+ margin-bottom: var(--space-lg);
+ }
+
+ .resume-section:hover {
+ transform: none;
+ box-shadow: none;
+ }
+}
+
+/* Skill category headings */
+.skill-heading {
+ font-size: 1.1rem;
+ color: var(--accent-primary);
+ margin-top: var(--space-lg);
+ margin-bottom: var(--space-sm);
+ border-bottom: 1px solid var(--sage-200);
+ padding-bottom: var(--space-xs);
+}
+
+/* Make the first skill heading not have extra top margin */
+.skill-heading:first-of-type {
+ margin-top: 0;
+}
+
+/* Dark mode styling for skill headings */
+.dark-mode .skill-heading {
+ border-bottom-color: var(--pink-300);
+}
+
+/* Responsive adjustments for resume */
+@media (max-width: 768px) {
+
+ .education-header,
+ .experience-header {
+ flex-direction: column;
+ }
+
+ .resume-section {
+ padding: var(--space-lg);
+ }
+
+ .skills-grid {
+ grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
+ }
}
\ No newline at end of file
From 294b80d468cd179e71258c38bf9fcda901314bb0 Mon Sep 17 00:00:00 2001
From: Charlotte Croce
Date: Sat, 19 Apr 2025 23:18:29 -0400
Subject: [PATCH 09/10] 4-19
---
.github/workflows/deploy.yml | 51 --------------------------------
CNAME | 1 -
index.html | 20 +++++++++----
resume/index.html => resume.html | 4 +--
4 files changed, 17 insertions(+), 59 deletions(-)
delete mode 100644 .github/workflows/deploy.yml
delete mode 100644 CNAME
rename resume/index.html => resume.html (98%)
diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
deleted file mode 100644
index 1c98084..0000000
--- a/.github/workflows/deploy.yml
+++ /dev/null
@@ -1,51 +0,0 @@
-name: Deploy to GitHub Pages
-
-on:
- # Trigger deployment on push to main branch
- push:
- branches: [ main ]
- # Allow manual trigger from Actions tab
- workflow_dispatch:
-
-# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
-permissions:
- contents: read
- pages: write
- id-token: write
-
-# Only allow one concurrent deployment
-concurrency:
- group: "pages"
- cancel-in-progress: true
-
-jobs:
- # Build job
- build:
- runs-on: ubuntu-latest
- steps:
- - name: Checkout
- uses: actions/checkout@v4
-
- - name: Create .nojekyll file
- run: touch .nojekyll
-
- - name: Setup Pages
- uses: actions/configure-pages@v4
-
- - name: Upload artifact
- uses: actions/upload-pages-artifact@v3
- with:
- # Upload entire repository
- path: '.'
-
- # Deployment job
- deploy:
- environment:
- name: github-pages
- url: ${{ steps.deployment.outputs.page_url }}
- runs-on: ubuntu-latest
- needs: build
- steps:
- - name: Deploy to GitHub Pages
- id: deployment
- uses: actions/deploy-pages@v4
\ No newline at end of file
diff --git a/CNAME b/CNAME
deleted file mode 100644
index f438fcd..0000000
--- a/CNAME
+++ /dev/null
@@ -1 +0,0 @@
-charlotte.sh
\ No newline at end of file
diff --git a/index.html b/index.html
index 462a401..b84af70 100644
--- a/index.html
+++ b/index.html
@@ -29,7 +29,7 @@
GitHub (opens in new tab)
- Codeberg Forgejo (opens in new tab)
LinkedIn About Me
I'm a cybersecurity student from the Northeast USA. I do security engineering at the Leahy Center in
Burlington, VT.
- You can find most of my personal stuff on my Codeberg(opens in new tab) account.
+ You can find most of my coding projects at git.charlotte.sh(opens in new tab)
My Projects
+
+
+ Fylgja SOC
+ A domain-specific language (DSL) for managing an ELK SIEM. Includes a CLI and SlackBot interface
+ Source Code(opens in new tab)
+
+
Champlain Tech Journals
Notes, code, and lab write-ups from my Champlain College courses
@@ -72,7 +81,7 @@
Nøkken Health
A Flutter app to track and analyze health data
- Source CodeSource Code(opens in new tab)
@@ -86,6 +95,7 @@
GitHub
Codeberg
+ Forgejo
LinkedIn
Mastodon
BookWyrm
diff --git a/resume/index.html b/resume.html
similarity index 98%
rename from resume/index.html
rename to resume.html
index a5518d2..478b042 100644
--- a/resume/index.html
+++ b/resume.html
@@ -6,7 +6,7 @@
Resume - Charlotte Croce
-
+
@@ -173,7 +173,7 @@
-
+