@php
$locale = app()->getLocale();
$isId = $locale === 'id';
$ogLocale = $isId ? 'id_ID' : 'en_US';
$ogLocaleAlt = $isId ? 'en_US' : 'id_ID';
$baseUrl = rtrim(url('/'), '/');
$cleanUrl = rtrim(url()->current(), '/');
if ($cleanUrl === '') {
$cleanUrl = $baseUrl;
}
if ($cleanUrl === $baseUrl) {
$cleanUrl = $baseUrl . '/';
}
$queryLang = request()->query('lang');
$canonicalUrl = in_array($queryLang, ['en', 'id'], true)
? $cleanUrl . '?lang=' . $queryLang
: $cleanUrl;
$hreflangEn = $cleanUrl . '?lang=en';
$hreflangId = $cleanUrl . '?lang=id';
$metaTitle = trim((string) ($seoTitle ?? $title ?? __('nav.title')));
$metaDesc = trim((string) ($seoDescription ?? __('nav.meta_desc')));
$metaKeywords = trim((string) ($seoKeywords ?? __('nav.meta_keywords')));
$metaType = (string) ($seoType ?? 'website');
$metaImage = (string) ($seoImage ?? asset('images/og-cover.png'));
$metaImageAlt = trim((string) ($seoImageAlt ?? $metaTitle));
$robotsDirective = (string) ($seoRobots ?? 'index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1');
$navSetting = $navbar ?? \App\Models\Setting::get('navbar', []);
$aboutSetting = $about ?? \App\Models\Setting::get('about', []);
$ctaSetting = $cta ?? \App\Models\Setting::get('cta', []);
$ctaEmail = (string) ($ctaSetting['email'] ?? 'cahya@example.com');
$sameAs = [];
foreach (($navSetting['socials'] ?? []) as $social) {
$sUrl = trim((string) ($social['url'] ?? ''));
if ($sUrl !== '' && $sUrl !== '#' && ! str_starts_with($sUrl, 'mailto:')) {
$sameAs[] = $sUrl;
}
}
$sameAs = array_values(array_unique($sameAs));
$knowsAbout = [];
foreach (($aboutSetting['stack']['chips'] ?? []) as $chip) {
if (! empty($chip['name'])) {
$knowsAbout[] = (string) $chip['name'];
}
}
foreach (($aboutSetting['modal']['categories'] ?? []) as $category) {
foreach (($category['items'] ?? []) as $item) {
if (! empty($item['name'])) {
$knowsAbout[] = (string) $item['name'];
}
}
}
if ($knowsAbout === []) {
$knowsAbout = [
'PHP', 'TypeScript', 'JavaScript', 'Python', 'Go (Golang)', 'Rust',
'Laravel', 'React', 'Next.js', 'Vue.js', 'Tailwind CSS', 'PostgreSQL',
'MySQL', 'Redis', 'Docker', 'Kubernetes', 'AWS', 'Google Cloud',
'Software Architecture', 'Full Stack Web Development', 'UI/UX Design Systems',
];
}
$knowsAbout = array_values(array_unique($knowsAbout));
$occupations = [];
foreach (($aboutSetting['exp']['items'] ?? []) as $expItem) {
$roleName = \App\Models\Setting::text($expItem['role'] ?? null, '');
if ($roleName !== '') {
$occupations[] = [
'@type' => 'Occupation',
'name' => $roleName,
];
}
}
$personName = (string) ($aboutSetting['name'] ?? 'Cahya Krisna');
$personDesc = \App\Models\Setting::text($aboutSetting['desc'] ?? null, __('home.about_desc'));
$graph = [
[
'@type' => 'Person',
'@id' => $baseUrl . '/#person',
'name' => $personName,
'alternateName' => ['Cahya', 'Cahya Krisna Software Engineer', 'Cahya Krisna Developer'],
'jobTitle' => 'Multi-Disciplinary Technologist & Senior Full Stack Software Engineer',
'description' => $personDesc,
'url' => $baseUrl . '/',
'image' => [
asset('images/og-cover.png'),
asset('foto.jpeg'),
asset('assets/cahya/cahya_char_full.png'),
],
'email' => 'mailto:' . $ctaEmail,
'nationality' => [
'@type' => 'Country',
'name' => 'Indonesia',
],
'knowsLanguage' => ['Indonesian', 'English'],
'knowsAbout' => $knowsAbout,
'hasOccupation' => $occupations,
'sameAs' => $sameAs,
],
[
'@type' => 'WebSite',
'@id' => $baseUrl . '/#website',
'url' => $baseUrl . '/',
'name' => 'Cahya Krisna - Portfolio & Selected Works',
'alternateName' => ['Portofolio Cahya Krisna', 'Cahya Krisna Official Website'],
'description' => $metaDesc,
'inLanguage' => ['en-US', 'id-ID'],
'author' => ['@id' => $baseUrl . '/#person'],
'publisher' => ['@id' => $baseUrl . '/#person'],
],
];
if (isset($project) && $project instanceof \App\Models\Project) {
$projectUrl = route('project.show', $project->slug);
$projectKeywords = array_values(array_unique(array_merge(
$project->tech_stack ?? [],
$project->badges ?? [],
['Cahya Krisna', $project->title]
)));
$graph[] = [
'@type' => 'WebPage',
'@id' => $projectUrl . '#webpage',
'url' => $projectUrl,
'name' => $metaTitle,
'description' => $metaDesc,
'isPartOf' => ['@id' => $baseUrl . '/#website'],
'about' => ['@id' => $baseUrl . '/#person'],
'inLanguage' => $isId ? 'id-ID' : 'en-US',
'datePublished' => optional($project->created_at)->toAtomString() ?? now()->toAtomString(),
'dateModified' => optional($project->updated_at)->toAtomString() ?? now()->toAtomString(),
];
$graph[] = [
'@type' => 'CreativeWork',
'@id' => $projectUrl . '#creativework',
'mainEntityOfPage' => ['@id' => $projectUrl . '#webpage'],
'headline' => $project->title . ' - ' . ($project->subtitle ?? ''),
'name' => $project->title,
'alternativeHeadline' => (string) ($project->subtitle ?? ''),
'description' => (string) ($project->summary ?? $metaDesc),
'text' => trim(implode("\n\n", array_filter([
$project->summary,
$project->challenge,
$project->solution,
]))),
'url' => $projectUrl,
'image' => [
$project->cover_url ?: asset('images/og-cover.png'),
route('seo.og.project', $project->slug),
],
'author' => ['@id' => $baseUrl . '/#person'],
'creator' => ['@id' => $baseUrl . '/#person'],
'publisher' => ['@id' => $baseUrl . '/#person'],
'keywords' => implode(', ', $projectKeywords),
'inLanguage' => $isId ? 'id-ID' : 'en-US',
'datePublished' => optional($project->created_at)->toAtomString() ?? now()->toAtomString(),
'dateModified' => optional($project->updated_at)->toAtomString() ?? now()->toAtomString(),
];
$graph[] =
Portofolio
/
Proyek
/
Fokus
Fokus - Portofolio Dark Mode Minimal untuk Developer
FOKUS
MINIMALIST PORTFOLIO
Ringkasan Proyek
Fokus dirancang khusus sebagai antarmuka portofolio bagi software engineer dan spesialis backend. Memprioritaskan keterbacaan kode, statistik repositori, dan rekam jejak teknis tanpa dekorasi yang tidak perlu.
Tantangan
Menghilangkan kompleksitas visual yang sering mengaburkan substansi teknis portofolio engineering, sekaligus menjaga tampilan tetap berkelas dan profesional.
Solusi & Arsitektur Teknis
Menggunakan arsitektur monokromatik terkalibrasi OLED dengan kontras tinggi, typography mono terintegrasi, dan komponen UI yang berorientasi pada data.
Skema warna Dark OLED yang dirancang untuk kenyamanan mata saat membaca dokumentasi.
Komponen Code Snippet interaktif dengan salin instan dan sintaks terformat rapi.
Integrasi GitHub API untuk menampilkan statistik kontribusi dan bintang repositori live.
Ukuran bundel ultra-kecil untuk waktu muat halaman di bawah 300ms.
Tertarik berkolaborasi atau mendiskusikan proyek baru?
Terbuka untuk kerja sama freelance, konsultasi arsitektur perangkat lunak, maupun posisi engineering.
© 2026 Cahya Krisna · Dibuat dengan presisi.