Update portfolio site with latest changes
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1 +0,0 @@
|
|||||||
.env
|
|
||||||
140
DEPLOY.md
Normal file
140
DEPLOY.md
Normal file
@@ -0,0 +1,140 @@
|
|||||||
|
# Portfolio Landing Page + Git Instance Visuals
|
||||||
|
|
||||||
|
## Architecture
|
||||||
|
|
||||||
|
- **Root domain** (`https://gabrielpereira.me/`) → Portfolio landing page
|
||||||
|
- **Git subdomain** (`https://git.gabrielpereira.me/`) → Gitea/Forgejo instance
|
||||||
|
|
||||||
|
This separation means visitors hit the curated portfolio first, then choose which repository to explore.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. Portfolio Landing Page
|
||||||
|
|
||||||
|
The file `index.html` is a self-contained, single-file portfolio landing page.
|
||||||
|
|
||||||
|
### Deployment: Static Host (Recommended)
|
||||||
|
|
||||||
|
**GitHub Pages**
|
||||||
|
- Create repo `gabrielpereira/gabrielpereira.me`
|
||||||
|
- Commit `index.html` as the repo root (or in `/docs` folder)
|
||||||
|
- Enable Pages → deploy from root (or `/docs`)
|
||||||
|
- In repo Settings → Pages, add custom domain `gabrielpereira.me`
|
||||||
|
- Add DNS A record pointing to GitHub Pages IPs
|
||||||
|
|
||||||
|
**Cloudflare Pages**
|
||||||
|
- Drag `index.html` into Cloudflare Pages dashboard
|
||||||
|
- Custom domain: `gabrielpereira.me`
|
||||||
|
|
||||||
|
**Netlify / Vercel**
|
||||||
|
- Drag the `portfolio/` folder into deploy UI
|
||||||
|
- Set custom domain to `gabrielpereira.me`
|
||||||
|
|
||||||
|
### Deployment: Self-Hosted (Nginx/Caddy)
|
||||||
|
|
||||||
|
Place `index.html` at:
|
||||||
|
```
|
||||||
|
/var/www/gabrielpereira.me/index.html
|
||||||
|
```
|
||||||
|
|
||||||
|
Nginx config:
|
||||||
|
```nginx
|
||||||
|
server {
|
||||||
|
listen 443 ssl;
|
||||||
|
server_name gabrielpereira.me;
|
||||||
|
root /var/www/gabrielpereira.me;
|
||||||
|
index index.html;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
try_files $uri $uri/ =404;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 443 ssl;
|
||||||
|
server_name git.gabrielpereira.me;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
proxy_pass http://localhost:3000; # your Gitea/Forgejo
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Caddyfile:
|
||||||
|
```
|
||||||
|
gabrielpereira.me {
|
||||||
|
root * /var/www/gabrielpereira.me
|
||||||
|
file_server
|
||||||
|
}
|
||||||
|
|
||||||
|
git.gabrielpereira.me {
|
||||||
|
reverse_proxy localhost:3000
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. Gitea / Forgejo Visual Improvements
|
||||||
|
|
||||||
|
The file `git-custom-header.html` contains both **CSS overrides** and an **HTML banner**.
|
||||||
|
|
||||||
|
### How to apply
|
||||||
|
|
||||||
|
**Forgejo / Gitea v1.20+ (Admin Panel)**
|
||||||
|
1. Log in as admin → Site Administration → Customizations
|
||||||
|
2. Paste the `<style>` block into "Custom Header" (or "Custom CSS" if available)
|
||||||
|
3. If your version supports HTML injection, also paste the banner `<div>` block
|
||||||
|
4. Save
|
||||||
|
|
||||||
|
**Direct file (self-hosted server access)**
|
||||||
|
Create the custom templates directory for your instance:
|
||||||
|
```bash
|
||||||
|
# For Gitea/Forgejo installed from package
|
||||||
|
sudo mkdir -p /etc/gitea/templates/custom
|
||||||
|
|
||||||
|
# Or if installed from binary in /opt
|
||||||
|
sudo mkdir -p /opt/gitea/custom/templates/custom
|
||||||
|
```
|
||||||
|
|
||||||
|
Create `header.tmpl`:
|
||||||
|
```bash
|
||||||
|
sudo tee /etc/gitea/templates/custom/header.tmpl << 'EOF'
|
||||||
|
{{/* Paste the contents of git-custom-header.html here */}}
|
||||||
|
EOF
|
||||||
|
```
|
||||||
|
|
||||||
|
Restart Gitea/Forgejo:
|
||||||
|
```bash
|
||||||
|
sudo systemctl restart gitea
|
||||||
|
# or
|
||||||
|
sudo systemctl restart forgejo
|
||||||
|
```
|
||||||
|
|
||||||
|
### What the CSS changes
|
||||||
|
- Darker, more cohesive color palette matching the portfolio page
|
||||||
|
- Repository cards with rounded corners and hover effects
|
||||||
|
- Better typography and spacing
|
||||||
|
- A subtle "Open Evidence" badge concept on the homepage
|
||||||
|
- Improved navbar and footer styling
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. DNS Configuration
|
||||||
|
|
||||||
|
| Record | Type | Target |
|
||||||
|
|--------|------|--------|
|
||||||
|
| `gabrielpereira.me` | A | Your static host IP (GitHub Pages / server / CDN) |
|
||||||
|
| `git.gabrielpereira.me` | CNAME or A | Your Gitea/Forgejo server |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Files
|
||||||
|
|
||||||
|
| File | Purpose |
|
||||||
|
|------|---------|
|
||||||
|
| `index.html` | Portfolio landing page (single file, no build step) |
|
||||||
|
| `git-custom-header.html` | CSS + HTML for Gitea/Forgejo customizations |
|
||||||
|
| `DEPLOY.md` | This file — deployment instructions |
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
version: "3.8"
|
|
||||||
|
|
||||||
services:
|
|
||||||
web:
|
|
||||||
image: nginx:alpine
|
|
||||||
ports:
|
|
||||||
- "8082:80"
|
|
||||||
volumes:
|
|
||||||
- ./:/usr/share/nginx/html:ro
|
|
||||||
restart: unless-stopped
|
|
||||||
|
|
||||||
tunnel:
|
|
||||||
image: cloudflare/cloudflared:latest
|
|
||||||
command: tunnel run
|
|
||||||
environment:
|
|
||||||
- TUNNEL_TOKEN=${TUNNEL_TOKEN}
|
|
||||||
restart: unless-stopped
|
|
||||||
193
git-custom-header.html
Normal file
193
git-custom-header.html
Normal file
@@ -0,0 +1,193 @@
|
|||||||
|
<!--
|
||||||
|
Add this to your Gitea/Forgejo Admin Panel → Customizations → Custom Header,
|
||||||
|
or place as custom/templates/custom/header.tmpl in your server config.
|
||||||
|
-->
|
||||||
|
<style>
|
||||||
|
/* ========== GITEA/FORGEJO LANDING PAGE ENHANCEMENTS ========== */
|
||||||
|
|
||||||
|
/* Only apply on the homepage / explore page */
|
||||||
|
body.page-home .ui.container:first-of-type,
|
||||||
|
body.page-explore .ui.container:first-of-type {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Hero banner above the repo list */
|
||||||
|
body.page-home .ui.container:first-of-type::before,
|
||||||
|
body.page-explore .ui.container:first-of-type::before {
|
||||||
|
content: '';
|
||||||
|
display: block;
|
||||||
|
background: linear-gradient(135deg, #161b22 0%, #0d1117 100%);
|
||||||
|
border: 1px solid #30363d;
|
||||||
|
border-radius: 12px;
|
||||||
|
padding: 32px;
|
||||||
|
margin-bottom: 24px;
|
||||||
|
color: #c9d1d9;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* We can't inject real HTML via CSS, so we style the existing elements */
|
||||||
|
|
||||||
|
/* Make the homepage heading more prominent */
|
||||||
|
body.page-home h2.ui.header,
|
||||||
|
body.page-explore h2.ui.header {
|
||||||
|
font-size: 28px !important;
|
||||||
|
font-weight: 700 !important;
|
||||||
|
letter-spacing: -0.02em !important;
|
||||||
|
color: #c9d1d9 !important;
|
||||||
|
border-bottom: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
body.page-home h2.ui.header::after,
|
||||||
|
body.page-explore h2.ui.header::after {
|
||||||
|
content: ' — Open evidence for technical review';
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 400;
|
||||||
|
color: #8b949e;
|
||||||
|
margin-left: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Improve repository cards */
|
||||||
|
.repo-list .item {
|
||||||
|
background: #161b22 !important;
|
||||||
|
border: 1px solid #30363d !important;
|
||||||
|
border-radius: 10px !important;
|
||||||
|
padding: 20px 24px !important;
|
||||||
|
margin-bottom: 12px !important;
|
||||||
|
transition: all 0.2s ease !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.repo-list .item:hover {
|
||||||
|
border-color: #58a6ff !important;
|
||||||
|
transform: translateY(-1px);
|
||||||
|
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.25);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Better repo titles */
|
||||||
|
.repo-list .repo-title {
|
||||||
|
font-size: 17px !important;
|
||||||
|
font-weight: 600 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.repo-list .repo-title a {
|
||||||
|
color: #58a6ff !important;
|
||||||
|
transition: opacity 0.2s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.repo-list .repo-title a:hover {
|
||||||
|
opacity: 0.8;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Description text */
|
||||||
|
.repo-list .description {
|
||||||
|
color: #8b949e !important;
|
||||||
|
font-size: 14px !important;
|
||||||
|
line-height: 1.6 !important;
|
||||||
|
margin-top: 8px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Topic tags */
|
||||||
|
.repo-list .repo-topic {
|
||||||
|
background: #1c2128 !important;
|
||||||
|
border: 1px solid #30363d !important;
|
||||||
|
color: #8b949e !important;
|
||||||
|
font-size: 12px !important;
|
||||||
|
font-weight: 500 !important;
|
||||||
|
padding: 3px 10px !important;
|
||||||
|
border-radius: 6px !important;
|
||||||
|
margin-right: 6px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.repo-list .repo-topic:hover {
|
||||||
|
background: #30363d !important;
|
||||||
|
color: #c9d1d9 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Stats line */
|
||||||
|
.repo-list .metas {
|
||||||
|
font-size: 13px !important;
|
||||||
|
color: #8b949e !important;
|
||||||
|
margin-top: 12px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.repo-list .metas .text.grey {
|
||||||
|
color: #6e7681 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Improve the overall background */
|
||||||
|
body {
|
||||||
|
background: #0d1117 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ui.segment {
|
||||||
|
background: #161b22 !important;
|
||||||
|
border-color: #30363d !important;
|
||||||
|
box-shadow: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Navbar */
|
||||||
|
.ui.menu {
|
||||||
|
background: #161b22 !important;
|
||||||
|
border-color: #30363d !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ui.menu .item {
|
||||||
|
color: #c9d1d9 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ui.menu .item:hover {
|
||||||
|
background: #1c2128 !important;
|
||||||
|
color: #58a6ff !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Footer */
|
||||||
|
.page-content > .footer {
|
||||||
|
border-top: 1px solid #30363d !important;
|
||||||
|
background: #0d1117 !important;
|
||||||
|
color: #8b949e !important;
|
||||||
|
margin-top: 48px !important;
|
||||||
|
padding: 32px 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.page-content > .footer a {
|
||||||
|
color: #58a6ff !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Add a subtle "portfolio" link in the navbar for visitors */
|
||||||
|
.ui.menu .right.menu::before {
|
||||||
|
content: 'Portfolio';
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
padding: 0 16px;
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 500;
|
||||||
|
color: #58a6ff;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<!-- Alternative: Real custom HTML banner (if your Gitea/Forgejo supports header injection) -->
|
||||||
|
<div class="portfolio-banner" style="display: none;">
|
||||||
|
<div style="
|
||||||
|
background: linear-gradient(135deg, #161b22 0%, #0d1117 100%);
|
||||||
|
border: 1px solid #30363d;
|
||||||
|
border-radius: 12px;
|
||||||
|
padding: 28px 32px;
|
||||||
|
margin: 0 0 24px 0;
|
||||||
|
max-width: 1100px;
|
||||||
|
">
|
||||||
|
<div style="font-size: 13px; font-weight: 500; color: #58a6ff; margin-bottom: 8px; text-transform: uppercase; letter-spacing: 0.05em;">
|
||||||
|
Open Evidence
|
||||||
|
</div>
|
||||||
|
<h1 style="font-size: 24px; font-weight: 700; color: #c9d1d9; margin: 0 0 8px 0; letter-spacing: -0.01em;">
|
||||||
|
Gabriel Pereira — AI & Data Architecture
|
||||||
|
</h1>
|
||||||
|
<p style="font-size: 14px; color: #8b949e; margin: 0; line-height: 1.6;">
|
||||||
|
Data & Analytics Solution Architect with 9 years at Siemens.
|
||||||
|
Each repository is a delivery narrative: architecture decisions, governance patterns,
|
||||||
|
and the boundary where manual work stops.
|
||||||
|
</p>
|
||||||
|
<div style="margin-top: 16px;">
|
||||||
|
<a href="https://linkedin.com/in/gabrielpereira-dev" style="color: #58a6ff; text-decoration: none; font-size: 13px; font-weight: 500; margin-right: 16px;">LinkedIn →</a>
|
||||||
|
<a href="mailto:gabriel.pereira@protonmail.com" style="color: #58a6ff; text-decoration: none; font-size: 13px; font-weight: 500;">Email →</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
25
index.html
25
index.html
@@ -361,7 +361,7 @@
|
|||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="section-header">
|
<div class="section-header">
|
||||||
<h2>Selected Case Studies</h2>
|
<h2>Selected Case Studies</h2>
|
||||||
<span class="count">3 public repositories</span>
|
<span class="count">4 public repositories</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="project-grid">
|
<div class="project-grid">
|
||||||
@@ -433,6 +433,29 @@
|
|||||||
View repository →
|
View repository →
|
||||||
</a>
|
</a>
|
||||||
</article>
|
</article>
|
||||||
|
|
||||||
|
<article class="project-card" onclick="window.open('https://git.gabrielpereira.me/gabspereira/workspace', '_blank')">
|
||||||
|
<div class="project-icon">🧪</div>
|
||||||
|
<h3>Workspace Experiments</h3>
|
||||||
|
<p>
|
||||||
|
Active experiments and utility scripts — smaller tools,
|
||||||
|
data processing pipelines, automation helpers, and
|
||||||
|
exploratory work that feeds into larger delivery patterns.
|
||||||
|
</p>
|
||||||
|
<div class="project-tags">
|
||||||
|
<span class="tag">Python</span>
|
||||||
|
<span class="tag">Scripts</span>
|
||||||
|
<span class="tag">Automation</span>
|
||||||
|
<span class="tag">PoCs</span>
|
||||||
|
</div>
|
||||||
|
<div class="project-stats">
|
||||||
|
<span>🔄 Evolving</span>
|
||||||
|
<span>📦 Utilities</span>
|
||||||
|
</div>
|
||||||
|
<a class="project-link" href="https://git.gabrielpereira.me/gabspereira/workspace" target="_blank">
|
||||||
|
View repository →
|
||||||
|
</a>
|
||||||
|
</article>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|||||||
Reference in New Issue
Block a user