Web Portfolio by Camilo Sarmiento, based on Astro template Zaggonaut π
π View the demo | π View the source code
Alternatively, you can create a new Astro project with Zaggonaut using:
# π pnpm
pnpm create astro@latest -- --template RATIU5/zaggonaut
# π pnpm (alternative)
pnpm create astro@latest --template RATIU5/zaggonaut
# π yarn
yarn create astro --template RATIU5/zaggonaut
# π bun
bun create astro@latest -- --template RATIU5/zaggonautβ
Dark & light mode
β
Customizable colors π¨
β
100 / 100 Lighthouse score β‘
β
Fully accessible βΏ
β
Fully responsive π±
β
Type-safe π‘οΈ
β
SEO-friendly π
The theme is set up to be easy to customize.
You can customize the theme colors by editing src/styles/global.css.
This file uses Tailwind CSS and CSS variables to define colors:
:root {
--color-zag-dark: #1a1a1a;
--color-zag-light: #ffffff;
--color-zag-dark-muted: rgba(26, 26, 26, 0.8);
--color-zag-light-muted: rgba(255, 255, 255, 0.8);
--color-zag-accent-light: #ff9800;
--color-zag-accent-light-muted: rgba(255, 152, 0, 0.8);
--color-zag-accent-dark: #ff5722;
--color-zag-accent-dark-muted: rgba(255, 87, 34, 0.8);
}Customize the text content by editing src/lib/variables.ts.
For example, to set your username:
export const GLOBAL = {
// Site metadata
username: "camilosar-123",
// Profile image
profileImage: "profile.webp",
// Menu items
menu: {
home: "/",
projects: "/projects",
blog: "/blog",
}
};You can customize your skills icons by adding .svg files to the src/icons folder.
In variables.ts, specify the SVG filename like this:
export const GLOBAL = {
// π Skills content
skills: [
{ name: "HTML", icon: "html_icon" },
],
};If you don't provide an icon, no problem! A default icon will be used.
Caution
If you are running the project while changing icons, you may encounter issues.
Restart the run command to see your changes. π
You can synchronize your Obsidian Vault with your Astro project to keep your projects, blog content, and images up to date.
The sync scripts are located in utils/ObsidianSync/ and utils/ImagesSync/:
- Linux/macOS:
sync.sh - Windows:
sync.ps1
Before running the script, you need to update the source and destination paths in the respective script.
Open utils/ObsidianSync/sync.sh and update these variables:
# Change these paths to match your setup
sourcePathProjects="$HOME/Documents/ObsidianVault/Portfolio/projects"
destinationPathProjects="$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\" && pwd)/../../src/pages/projects"
sourcePathBlog="$HOME/Documents/ObsidianVault/Portfolio/blog"
destinationPathBlog="$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\" && pwd)/../../src/pages/blog"Open utils/ObsidianSync/sync.ps1 and update these variables:
# Change these paths to match your setup
$sourceProjects = "$env:USERPROFILE\Documents\ObsidianVault\Portfolio\projects"
$destinationProjects = "$PSScriptRoot\..\..\src\pages\projects"
$sourceBlog = "$env:USERPROFILE\Documents\ObsidianVault\Portfolio\blog"
$destinationBlog = "$PSScriptRoot\..\..\src\pages\blog"In utils/ImagesSync/sync.py, you need to specify the location of your Obsidian Vault.
Open sync.py and update the attachments_dir variable to match your Obsidian Vault's directory:
# Paths
attachments_dir = "/home/YOUR_USER/Documents/Obsidian Vault/00 - Portfolio/images" # Update this path
posts_dir = os.path.join(script_dir, "../../src/pages/blog/")
static_images_dir = os.path.join(script_dir, "../../images/")Replace /home/YOUR_USER/Documents/Obsidian Vault/00 - Portfolio/images with the actual path of your Obsidian Vault directory.
The script supports two synchronization modes:
- Push (default): Syncs content from Obsidian to your Astro project.
- Pull: Syncs content from your Astro project to Obsidian.
Run the script from the project root:
bash utils/ObsidianSync/sync.sh push # Default mode
bash utils/ObsidianSync/sync.sh pull # Sync in reverseRun the script in PowerShell:
powershell -ExecutionPolicy Bypass -File utils/ObsidianSync/sync.ps1 -Mode push # Default mode
powershell -ExecutionPolicy Bypass -File utils/ObsidianSync/sync.ps1 -Mode pull # Sync in reverseTo fully synchronize your Obsidian content and images, run the global sync script:
bash utils/sync.sh push # Default mode
bash utils/sync.sh pull # Sync in reversepowershell -ExecutionPolicy Bypass -File utils/sync.ps1 -Mode push # Default mode
powershell -ExecutionPolicy Bypass -File utils/sync.ps1 -Mode pull # Sync in reverseThis will execute:
ObsidianSync/sync.shorsync.ps1(depending on the OS) to sync projects and blog content.ImagesSync/sync.pyto update images used in the Markdown files, converting them to WebP when Pillow is installed.
The image sync script (utils/ImagesSync/sync.py) processes images referenced in Markdown files and ensures they are saved in WebP format to optimize loading speed. If the required Pillow package is not installed, the script will fall back to using PNG format.
To enable WebP conversion, install Pillow:
pip install pillow-
Ensure the scripts have execution permissions (
chmod +x sync.shfor Linux/macOS). -
If PowerShell restricts execution, you may need to run:
Set-ExecutionPolicy Unrestricted -Scope Process
