Author: Mohammad Shirvani (Radikal) · License: MIT
🔗 Live demo / online preview: https://0xradikal.github.io/profile-card/ 📦 Repository: https://github.com/0xRadikal/profile-card
The Radikal Profile Card is a cyber‑minimal personal portfolio card built with pure HTML, CSS, and JavaScript, designed to showcase a developer or Web3 researcher profile in an interactive, accessible, and high‑performance format.
It’s built to be:
- Fast: No frameworks, no dependencies.
- Accessible: WCAG‑compliant and keyboard‑navigable.
- Modular: Fully theme‑aware (light/dark) and extendable.
- Interactive: Includes a custom command‑line interface (CLI) for fun user interaction.
- Installable: PWA + offline cache via Service Worker.
A visual-layer-only redesign (no runtime logic, security, or data changed):
- Design tokens + self-hosted fonts: full token system (color/space/type/
radius/elevation); Vazirmatn (fa/en) + JetBrains Mono (code) shipped locally
as
woff2withunicode-range— no font CDN, tighter CSP. - True RTL/LTR: directional layout migrated to CSS logical properties so Persian (RTL) and English (LTR) both render correctly.
- Calmer, accessible motion: RAF+lerp card tilt, softened decorative
animation, cross-document View Transitions — all respecting
prefers-reduced-motion. - Cohesive, AA-compliant palette: retired the old green-cyan/purple relic
colors to the accent tokens; fixed the
Radikal.ethlink contrast (was 1.84:1 on light, now ≥5:1). - PWA refresh: Service Worker cache bumped so installed users get the new look; precache list verified complete.
- Extended CLI (blog, skills, social, contact form, timeline, achievements, fetch, theme, easter‑egg).
- Command suggestions, tab auto‑complete, and persistent history.
- New pages:
blog.html,gallery.html,contact.html,timeline.html,skills.html. - Live GitHub stats, particles, 3D tilt, toast notifications, skeleton loaders.
- PWA manifest + Service Worker for offline read‑only experience.
profile-card/
│
├── index.html # Main HTML file (fa, dir=rtl)
├── profile-card.css # Core styling (v8.2 — redesigned, tokenized)
├── index.js # CLI logic (ES module; imports data/content.js)
├── favicon.svg # Site icon (SVG)
├── manifest.json # PWA manifest
├── sw.js # Service worker
│
├── data/
│ └── content.js # SINGLE SOURCE OF TRUTH for blog/skills/timeline/gallery
├── pages/ # External page modules (no inline scripts)
│ ├── theme.js # Shared theme bootstrap (was duplicated inline)
│ ├── blog.js skills.js timeline.js gallery.js contact.js projects.js
├── test/
│ ├── smoke.mjs # Headless Playwright smoke test (npm test)
│ └── server.mjs # Tiny static server (serves under /profile-card/)
│
├── blog.html skills.html timeline.html gallery.html contact.html projects.html
├── en/ # English mirrors (dir=ltr) of every page
│
├── plans/ # improve-skill handoff plans (audit trail)
└── README.md # Documentation (this file)
Architecture note: all page content is defined once in
data/content.js(locale-keyed for fa/en) and consumed by both the CLI (index.js) and the page modules underpages/. There are no inline<script>blocks — every page loads external ES modules under a strict CSP.
git clone https://github.com/0xradikal/profile-card.git
cd profile-cardBecause the site uses ES modules with absolute /profile-card/ paths, serve it
(don't open index.html from file://). A local server is included:
npm install # installs Playwright (dev-only, for tests)
npm run serve # serves http://127.0.0.1:3000/profile-card/A headless smoke test guards the runtime contract (every DOM id the CLI needs), asserts zero console errors, and checks there are no CSP violations across all fa + en pages:
npm test # → prints "SMOKE OK" on success- Ensure the repo is hosted under
/profile-card/path (or adjust links inmanifest.jsonand Service Worker). - Build step is not required; deploy static files as-is.
- Enable GitHub Pages (root of
mainbranch). Assets are <100KB gzip. - PWA: keep
httpsand scope/profile-card/for install prompt.
Edit the following section in index.html:
<h1 class="name">Your Name <span class="aka">(Alias)</span></h1>
<p class="role mono">Your Role • Skills</p>
<p class="ens mono">ENS or Handle</p>
<p class="meta">📍 Location • Your Position or Education</p>Badges (<section class="badges">) define your expertise.
Stats (<section class="stats">) highlight measurable achievements.
All colors are defined in the :root of profile-card.css.
You can adjust brand gradients, panel opacity, or shadow depth.
:root {
--brandA: #7c3aed;
--brandB: #06b6d4;
--brandC: color-mix(in oklab, #16a34a 80%, #000 20%);
}Replace the avatar image:
<img class="avatar" src="https://github.com/YOUR_GITHUB.png" alt="Your photo" />Edit index.js → files map or add new commands inside the handle() switch.
const files = new Map([
['resume', '/profile-card/YourCV.pdf'],
['projects', '/profile-card/projects.html'],
]);The embedded Radikal CLI lets users interact with your profile using typed commands.
| Command | Description |
|---|---|
help or h |
Show available commands |
ls |
List accessible files |
cat resume |
Open resume / GitHub profile |
cat projects |
Open project list |
blog |
List latest mock articles |
skills |
Render skills with progress bars |
social |
Social links (GitHub/X/Telegram/LinkedIn) |
contact |
Inline contact form with validation |
timeline |
Career timeline |
achievements |
Badges & awards |
fetch <url> |
Fetch JSON from a public API |
| `theme dark | light` |
easter-egg |
Hidden surprise |
r / p |
Shortcuts for resume / projects |
whoami |
Display profile summary |
status |
Show node/infrastructure metrics |
clear / c |
Clear CLI output |
The terminal automatically stores command history (localStorage) and supports arrow key navigation.
Each keystroke and CLI event triggers a soft WebAudio tick for tactile feedback.
- Audio context initializes on the first user gesture.
- You can toggle sound with the
mutebutton in the shell header.
To disable sound entirely, set:
let muted = true;Theme switching is handled via the button in the top‑right corner.
It respects both system preferences and manual user settings stored in localStorage.
const pref = localStorage.getItem('theme') || system;
document.documentElement.setAttribute('data-theme', pref);The layout adapts from desktop (960px card) down to mobile (<480px):
- Two-column layout becomes vertical.
- Stats grid collapses to 1–2 columns.
- Buttons stack vertically.
All animations are reduced automatically when prefers-reduced-motion is enabled.
- Semantic HTML (
<header>,<section>,<footer>) - Screen-reader text via
.sr-only - ARIA labels and
aria-liveupdates for CLI output - Contrast‑safe colors under both themes
| Feature | Supported Browsers |
|---|---|
| CSS color-mix / conic-gradient | Chrome 111+, Edge 111+, Safari 17+ |
| WebAudio API | All modern browsers |
| LocalStorage / MatchMedia | All modern browsers |
Fallbacks are included for older Safari versions.
- No external dependencies. All animations and effects are pure CSS or vanilla JS.
- Performance: Designed to stay <30KB gzip total (HTML+CSS+JS).
- Security: Zero inline scripts — all JS is external ES modules. Every page ships a strict
Content-Security-Policy(script-src 'self'), verified by an automated smoke test.
You can extend the CLI to support new commands like social, blog, or contact:
case 'social':
printHTML(`X: <a href='https://x.com/yourhandle'>@yourhandle</a>`, 'ok');
break;Or add new UI sections to the HTML (e.g., achievements, timeline, portfolio grid).
Built and maintained by Mohammad Shirvani (Radikal) Web3 Researcher & Security Engineer — DeFi • DAO • TON • NodeOps
This project is licensed under the MIT License — free for personal and commercial use.
MIT License
Copyright (c) 2025 Mohammad Shirvani (Radikal)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND.
نویسنده: محمد شیروانی (Radikal) · مجوز: MIT
🔗 دموی آنلاین / پیشنمایش زنده: https://0xradikal.github.io/profile-card/ 📦 مخزن: https://github.com/0xRadikal/profile-card
کارت پروفایل Radikal یک کارت شخصی سایبر-مینیمال برای معرفی حرفهای ساخته شده با HTML، CSS و JavaScript خالص است. هدف از آن نمایش هویت دیجیتال، رزومه و مهارتهای شما به شکلی مدرن، سریع و قابل تعامل است.
ویژگیهای کلیدی:
- سریع و سبک: بدون فریمورک و وابستگی خارجی.
- دسترسپذیر: سازگار با WCAG و پشتیبانی کامل از کیبورد و صفحهخوان.
- قابل توسعه: پشتیبانی از حالت روشن/تاریک، CLI داخلی و ساختار ماژولار.
- امن و سازگار: بدون هیچ اسکریپت درونخطی (همهٔ JS بهصورت ماژول خارجی)؛ هر صفحه یک
Content-Security-Policyسختگیرانه (script-src 'self') دارد که با تست خودکار تأیید میشود.
profile-card/
│
├── index.html # فایل اصلی HTML
├── profile-card.css # استایل اصلی (v8.2 — بازطراحیشده)
├── index.js # منطق JavaScript (تغییر تم + CLI)
├── favicon.svg # آیکون سایت (SVG)
# (og:image اکنون به آواتار گیتهاب اشاره میکند)
├── projects.html # صفحه پروژهها (اختیاری)
└── README.md # مستندات پروژه
git clone https://github.com/0xradikal/profile-card.git
cd profile-cardفایل index.html را مستقیماً باز کنید یا با یک سرور محلی اجرا کنید:
npx serveسپس به آدرس زیر بروید:
http://localhost:3000
در بخش <header> فایل index.html ویرایش کنید:
<h1 class="name">نام شما <span class="aka">(نام مستعار)</span></h1>
<p class="role mono">نقش یا تخصص شما • مهارتها</p>
<p class="ens mono">آدرس ENS یا شناسه کاربری</p>
<p class="meta">📍 موقعیت مکانی • موقعیت تحصیلی یا شغلی</p>در بخش <section class="badges"> مهارتها را وارد کنید و در <section class="stats"> شاخصهای عددی مثل اعضای کامیونیتی یا Uptime را تنظیم کنید.
در :root فایل CSS رنگهای برند را تنظیم کنید:
:root {
--brandA: #7c3aed;
--brandB: #06b6d4;
--brandC: color-mix(in oklab, #16a34a 80%, #000 20%);
}آدرس تصویر پروفایل را تغییر دهید:
<img class="avatar" src="https://github.com/YOUR_GITHUB.png" alt="تصویر شما" />در فایل index.js قسمت files یا تابع handle() را ویرایش کنید تا مسیرهای شخصی خود را اضافه کنید:
const files = new Map([
['resume', '/profile-card/YourCV.pdf'],
['projects', '/profile-card/projects.html'],
]);ترمینال داخلی یا Radikal CLI امکان تعامل با پروفایل را از طریق دستورات متنی فراهم میکند.
| دستور | توضیح |
|---|---|
help یا h |
نمایش لیست دستورات |
ls |
فهرست فایلها |
cat resume |
باز کردن رزومه / پروفایل گیتهاب |
cat projects |
باز کردن صفحه پروژهها |
blog |
نمایش لیست مقالات |
skills |
مهارتها به صورت progress bar |
social |
لینک شبکههای اجتماعی |
contact |
فرم تماس درون ترمینال |
timeline |
رویدادهای شغلی |
achievements |
نشانها و جوایز |
fetch <url> |
دریافت JSON از API |
| `theme dark | light` |
easter-egg |
ایستر اگ |
r / p |
میانبر رزومه / پروژهها |
whoami |
نمایش اطلاعات کاربر |
status |
نمایش وضعیت نودها و پاداشها |
clear یا c |
پاککردن خروجی ترمینال |
دستورات ذخیره میشوند و با کلیدهای جهتنما (↑↓) قابل مرورند.
برای هر رویداد ورودی یا دستور، یک صدای کوتاه از طریق WebAudio پخش میشود. میتوانید صدا را از دکمه mute در بالای ترمینال خاموش کنید.
برای غیرفعال کردن کامل صدا:
let muted = true;سیستم تم بهصورت خودکار با حالت سیستم کاربر همگام است و انتخاب کاربر در localStorage ذخیره میشود.
const pref = localStorage.getItem('theme') || system;
document.documentElement.setAttribute('data-theme', pref);طراحی کارت از دسکتاپ (960px) تا موبایل (<480px) بهصورت خودکار تنظیم میشود:
- ساختار دو ستونه به تکستونه تبدیل میشود.
- شبکه آمار از ۴ ستون به ۲ یا ۱ ستون کاهش مییابد.
- دکمهها در موبایل تمام عرض میشوند.
همچنین برای کاربران با prefers-reduced-motion انیمیشنها کاهش مییابند.
- استفاده از تگهای معنایی (
header,section,footer) - پشتیبانی از صفحهخوان با
.sr-only - تنظیمات ARIA برای وضعیت ترمینال
- رنگهای سازگار با WCAG AA در هر دو تم
| ویژگی | مرورگرهای پشتیبانیشده |
|---|---|
| color-mix / conic-gradient | Chrome 111+, Edge 111+, Safari 17+ |
| WebAudio API | تمامی مرورگرهای مدرن |
| LocalStorage / MatchMedia | تمامی مرورگرهای مدرن |
برای Safari قدیمی fallback رنگ در نظر گرفته شده است.
- بدون هیچ وابستگی خارجی.
- طراحیشده برای حجم کمتر از ۳۰ کیلوبایت gzip.
- دارای Content Security Policy سختگیرانه روی همهٔ صفحات (بدون اسکریپت درونخطی).
میتوانید فرمانهای جدید مثل social یا contact اضافه کنید:
case 'social':
printHTML(`X: <a href='https://x.com/yourhandle'>@yourhandle</a>`, 'ok');
break;یا بخشهای جدید به HTML بیفزایید (مثل سوابق، تایملاین یا نمونهکارها).
طراحی و توسعه توسط محمد شیروانی (Radikal) پژوهشگر Web3 و مهندس امنیت — DeFi • DAO • TON • NodeOps
این پروژه تحت مجوز MIT آزاد است — برای استفاده شخصی و تجاری.
MIT License
Copyright (c) 2025 Mohammad Shirvani (Radikal)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND.
