π PANDUAN LENGKAP: Portfolio Terminal-Style dengan Blog, Comment, & CI/CD
Selamat! Anda sekarang memiliki portfolio website yang modern, interactive, dan professional. Panduan ini akan menjelaskan setiap fitur dan cara customize sesuai kebutuhan Anda.
π― Apa Yang Sudah Kami Setup?
1οΈβ£ Struktur Website
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/
βββ index.html # Homepage dengan typing animation
βββ blog/
β βββ index.html # Daftar blog posts
β βββ [posts]/ # Direktori untuk blog posts
βββ projects.html # Portfolio projects
βββ _posts/ # Markdown blog files
βββ _layouts/ # HTML templates
βββ _includes/ # Reusable components
βββ assets/
β βββ css/
β β βββ style.css # Main CSS (with colors & animations)
β βββ js/
β βββ typing.js # Typing animation
β βββ theme-toggle.js # Dark/Light mode
β βββ github-repos.js # GitHub API
βββ _data/
β βββ colors.json # Color palette
βββ _config.yml # Konfigurasi Jekyll
βββ Gemfile # Ruby dependencies
βββ .github/workflows/
βββ jekyll-build.yml # GitHub Actions CI/CD
2οΈβ£ Fitur Yang Sudah Diimplementasikan
β Terminal Aesthetic - CSS dengan color variables dan responsive design β Dark/Light Toggle - Theme persistence via localStorage β Typing Animation - Homepage intro dengan typewriter effect β GitHub API - Auto-display repos dari GitHub β Comment System - Utterances untuk GitHub Issues comments β Blog System - Jekyll collections dengan tagging & archives β CI/CD Pipeline - GitHub Actions untuk auto-deploy β SEO Optimization - Meta tags, sitemap, RSS feed β Responsive Design - Mobile, tablet, desktop
π STEP-BY-STEP CUSTOMIZATION
STEP 1: Update Basic Info
File: _config.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Ganti dengan info Anda
title: "Muhammad Sapuan" # Nama Anda
tagline: "$ whoami" # Tagline
description: "Web Developer & Linux Enthusiast | Terminal Portfolio"
url: "https://msapuan.github.io" # Domain Anda
email: "your-email@example.com"
author:
name: Muhammad Sapuan # Nama
email: "your-email@example.com"
twitter: "your_twitter_handle"
github: "msapuan" # GitHub username
linkedin: "your_linkedin"
bio: "Your bio here" # Bio singkat
Mengapa penting?
- Digunakan untuk meta tags & SEO
- Ditampilkan di footer & social media preview
- Membantu search engines memahami content
STEP 2: Customize Warna Tema
File: _data/colors.json
Current colors (terminal green):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
"dark": {
"bg": "#0a0e14", // Background gelap
"bg-secondary": "#1a1f2e", // Background secondary
"text": "#e0e0e0", // Text color
"green": "#33ff00", // Accent (terminal green)
"gray": "#888888", // Gray untuk text secondary
"cursor": "#33ff00" // Cursor color
},
"light": {
"bg": "#f5f5f5", // Background terang
"bg-secondary": "#ffffff",
"text": "#333333",
"green": "#006600", // Dark green
"gray": "#666666",
"cursor": "#006600"
}
}
Custom color examples:
Untuk blue theme:
1
2
3
4
5
6
7
{
"dark": {
"bg": "#0f1419",
"green": "#00d9ff", // Cyan
"accent": "#00e5ff"
}
}
Untuk purple theme:
1
2
3
4
5
6
7
{
"dark": {
"bg": "#1a0033",
"green": "#aa00ff", // Purple
"accent": "#ff00ff"
}
}
Tip: Test colors di https://htmlcolorcodes.com
STEP 3: Update Typing Animation
File: assets/js/typing.js
Edit fungsi getCommands() (sekitar line 13):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
getCommands() {
return [
{
command: 'whoami',
output: '<strong>Muhammad Sapuan</strong> | Web Developer & Linux Enthusiast'
},
{
command: 'cat skills.txt',
output: 'JavaScript β’ React β’ Node.js β’ Docker β’ AWS β’ Bash β’ Python'
},
{
command: 'cat bio.txt',
output: 'Passionate about building scalable web applications dan Linux automation'
},
{
command: 'echo "Welcome to my portfolio!"',
output: 'Welcome to my portfolio! π'
}
];
}
Kustomisasi:
command- command yang akan di-typeoutput- hasil/response dari command- Bisa pakai HTML tags seperti
<strong>,<em>, dll
STEP 4: Setup GitHub API Integration
File: assets/js/github-repos.js
Update username (line 12):
1
2
3
4
5
6
config: {
username: 'msapuan', // β Ganti dengan GitHub username Anda
outputContainerId: 'repos-output',
perPage: 12,
sortBy: 'updated'
}
Yang dilakukan script ini:
- Fetch repos dari GitHub API
- Display dengan stars, forks, language
- Responsive grid layout
- Error handling & loading state
Tips:
- Jika terlalu banyak request, tambah GitHub token
- Script akan cache data selama 1 jam
- Repos yang ditampilkan hanya yang public
STEP 5: Setup Comment System (Utterances)
Prerequisites:
- Repository GitHub sudah public
- Utterances GitHub App sudah installed
Setup:
- Pergi ke https://utteranc.es
- Scroll ke βConfigurationβ section
- Select repository:
yourusername/yourusername.github.io - Blog post βοΈ issue mapping: pilih
pathname - Copy script yang disediakan
Atau, langsung update config:
File: _config.yml
1
2
3
4
5
6
7
8
comments:
enabled: true
provider: utterances
utterances:
repo: yourusername/yourusername.github.io # β Ubah
issue_term: pathname
label: "π¬ comment"
theme: github-dark
Bagaimana cara kerjanya:
- Setiap blog post = 1 GitHub Issue
- Comments di blog = comments di issue
- Tidak perlu database terpisah!
Screenshot workflow:
1
2
3
4
5
6
7
8
9
10
11
User klik "Add Comment"
β
Utterances GitHub App intercept
β
Create/Find issue di repo
β
User comment di modal
β
Comment masuk ke GitHub Issues
β
Auto-display di blog
STEP 6: Membuat Blog Post Pertama
Struktur file:
1
2
3
4
_posts/
βββ 2025-01-15-getting-started.md (sudah ada - contoh)
βββ 2025-01-20-tutorial-jekyll.md (buat file baru)
βββ YYYY-MM-DD-title-in-kebab-case.md (format)
Create new file: _posts/2025-01-20-my-first-post.md
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
---
layout: post
title: "Judul Post Saya"
date: 2025-01-20
author: Muhammad Sapuan
categories: blog
tags: [web-development, jekyll, tutorial]
excerpt: "Ringkasan singkat post ini untuk preview di daftar blog"
---
## Heading 1
Ini adalah paragraf pertama dengan **bold**, *italic*, dan `inline code`.
### Subheading
Lebih banyak konten di sini.
### Code Example
\`\`\`javascript
console.log('Hello World');
function myFunction() {
return "This is code";
}
\`\`\`
### List
- Item 1
- Item 2
- Item 3
### Link
[Kunjungi Google](https://google.com)
### Image

---
## Kesimpulan
Tuliskan kesimpulan post di sini.
Front Matter Explanation:
| Key | Value | Keterangan |
|---|---|---|
| layout | post |
Selalu post untuk blog |
| title | String | Judul post |
| date | YYYY-MM-DD | Tanggal publish |
| author | String | Nama author |
| tags | Array | Tag untuk filtering & archive |
| excerpt | String | Preview di blog list |
| categories | Array | Kategori post |
Tips Menulis:
- Gunakan Markdown syntax
- Tambah images untuk visual
- Structure dengan headings (h2, h3)
- Tambah code blocks untuk contoh
- Jangan lupa add excerpt untuk preview
STEP 7: Setup Custom Domain (Optional)
Jika mau pakai domain custom (bukan github.io):
Step 1: DNS Setup
Pergi ke domain provider, edit DNS records:
1
2
3
Type: CNAME
Name: www
Value: yourusername.github.io
Atau untuk apex domain:
1
2
3
4
5
6
Type: A
Name: @
Value: 185.199.108.153
185.199.109.153
185.199.110.153
185.199.111.153
Step 2: GitHub Settings
- Repository β Settings β Pages
- Custom domain:
yourdomain.com - Enable HTTPS (automatic)
Step 3: Update _config.yml
1
url: "https://yourdomain.com"
STEP 8: Local Development Setup
Untuk develop secara local sebelum push:
1
2
3
4
5
6
7
8
9
10
# Navigate ke project directory
cd msapuan.github.io
# Install dependencies (first time only)
bundle install
# Run server
bundle exec jekyll serve --livereload
# Open http://localhost:4000
Live reload = Auto-refresh browser saat ada perubahan file
STEP 9: GitHub Actions (Auto-Deploy)
Sudah setup! Tapi cara kerjanya:
File: .github/workflows/jekyll-build.yml
Workflow ini:
- Trigger saat ada push ke
mainbranch - Install Ruby & Jekyll
- Build site β generate
_site/folder - Deploy ke GitHub Pages
Proses:
1
2
3
4
5
6
7
8
9
10
11
12
13
You: git push
β
GitHub detect push
β
GitHub Actions trigger workflow
β
Bundle install (gems)
β
jekyll build (compile markdown β HTML)
β
Deploy _site/ ke GitHub Pages
β
Website live! π
Check status: Repository β Actions β lihat workflow runs
π¨ Design Customization
Change Font
File: assets/css/style.css
Search untuk font-family:
Current:
1
font-family: 'Fira Code', 'Cascadia Code', 'Monaco', monospace;
Alternatif monospace fonts:
'Courier New''IBM Plex Mono''Source Code Pro''JetBrains Mono'
Import dari Google Fonts:
File: _includes/head.html
1
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;700&display=swap" rel="stylesheet">
Add Social Media Links
File: _includes/footer.html
1
2
3
4
5
6
7
8
9
<footer>
<p>Β© 2025 <strong>Muhammad Sapuan</strong></p>
<p>
<a href="/feed.xml">RSS Feed</a> |
<a href="https://github.com/msapuan" target="_blank">GitHub</a> |
<a href="https://twitter.com/handle" target="_blank">Twitter</a> |
<a href="https://linkedin.com/in/profile" target="_blank">LinkedIn</a>
</p>
</footer>
Add Custom Navigation
File: _layouts/home.html
Update nav section:
1
2
3
4
5
6
7
8
<nav>
<a href="/" class="active">home</a>
<a href="/blog/">blog</a>
<a href="/projects.html">projects</a>
<a href="/about.html">about</a>
<a href="https://github.com/msapuan" target="_blank">github</a>
<a href="/contact.html">contact</a>
</nav>
π SEO Best Practices
1. Meta Descriptions
Edit post front matter:
1
excerpt: "Deskripsi singkat yang menarik (max 160 chars)"
2. Internal Linking
Dalam post:
1
Lihat juga [post tentang topic](/blog/YYYY/MM/post-title/)
3. Keywords
Gunakan keywords natural dalam:
- Title
- Excerpt
- Heading (h2, h3)
- Content
4. Image ALT Text
1

π Security Best Practices
- β
Jangan commit
.envfile (sudah di.gitignore) - β Jangan share GitHub tokens public
- β Gunakan HTTPS (auto on GitHub Pages)
- β
Keep dependencies updated:
bundle update
π Monitoring & Analytics
Enable Google Analytics (Optional)
Step 1: Setup GA
- Pergi ke Google Analytics
- Create property untuk website
- Copy Measurement ID (G-XXXXXXX)
Step 2: Add to site
File: _includes/head.html
1
2
3
4
5
6
7
8
<!-- Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-YOUR_ID"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-YOUR_ID');
</script>
π Troubleshooting
Problem: Build error βBundler not foundβ
1
2
gem install bundler
bundle install
Problem: CSS tidak update
- Clear cache:
rm -rf .jekyll-cache _site - Restart server:
Ctrl+Cβbundle exec jekyll serve
Problem: GitHub API rate limit
Add GitHub personal token (optional):
File: assets/js/github-repos.js
1
2
3
4
5
6
7
async fetchRepos() {
const headers = {
'Authorization': 'token YOUR_GITHUB_TOKEN',
'Accept': 'application/vnd.github.v3+json'
};
// ...
}
Problem: Comments tidak muncul
- Check Utterances installed di repo
- Verify repo setting allow issues
- Check browser console untuk errors
π Next Steps & Ideas
Content Ideas untuk Blog
- Tutorial: βSetup Jekyll di [OS]β
- Project showcase: βBehind the scenes project Xβ
- Tips & tricks: βLinux productivity tipsβ
- Code snippets: βUseful bash commandsβ
- Lessons learned: βWhat I learned building Xβ
Feature Additions
- Search bar - Lunr.js untuk full-text search
- Newsletter - Mailchimp integration
- Analytics dashboard - Show blog stats
- Dark mode auto-detect - System preference
- Reading time - Auto-calculate dari content
Integration Ideas
- Connect dengan Dev.to (cross-post)
- Twitter bot (auto-share posts)
- Discord webhook (notify followers)
- Slack integration (notif on comments)
π Learning Resources
- Jekyll Docs: https://jekyllrb.com/docs/
- Markdown Guide: https://www.markdownguide.org/
- GitHub Pages: https://docs.github.com/en/pages
- Web Dev Learning: https://developer.mozilla.org/
πͺ Motivasi!
Sekarang Anda punya:
- β Professional portfolio website
- β Interactive blog dengan comments
- β Auto-deploy dengan GitHub Actions
- β SEO-optimized untuk search engines
- β Responsive di semua devices
- β Modern terminal aesthetic
Selanjutnya?
- Update content Anda
- Add blog posts regularly
- Share di social media
- Network dengan dev community
- Build lebih banyak projects!
Happy coding! π
Kalau ada pertanyaan atau stuck, feel free reach out! Atau check existing documentation di /SETUP_GUIDE.md
Last Updated: November 11, 2025