diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2ad98af..88e0d4f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1 +1,42 @@ -['main ]\n pull_request:\n branches: [ main ]\n\njobs:\n build:\n runs-on: ubuntu-latest\n steps:\n - name: Checkout repository\n uses: actions/checkout@v4\n\n - name: Set up Node.js\n uses: actions/setup-node@v4\n with:\n node-version: \'20\'\n\n - name: Install dependencies\n run: npm ci\n\n - name: Install markdownlint and HTMLHint\n run: npm install -D markdownlint-cli htmlhint\n\n - name: Lint markdown files\n run: npx markdownlint "**/*.md" --config .markdownlint.json || echo "No markdownlint config – skipping"\n\n - name: Lint generated HTML (if any)\n run: npx htmlhint "**/public/**/*.html" || echo "No HTML to lint yet"\n\n - name: Build CSS\n run: npm run build:css\n\n - name: Build site with Hugo\n run: npm run build\n\n - name: Verify Hugo output exists\n run: |\n if [ ! -d "public'] \ No newline at end of file +on: + push: + branches: [main] + pull_request: + branches: [main] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + + - name: Install dependencies + run: npm ci + + - name: Install markdownlint and HTMLHint + run: npm install -D markdownlint-cli htmlhint + + - name: Lint markdown files + run: npx markdownlint "**/*.md" --config .markdownlint.json || echo "No markdownlint config – skipping" + + - name: Lint generated HTML (if any) + run: npx htmlhint "**/public/**/*.html" || echo "No HTML to lint yet" + + - name: Build CSS + run: npm run build:css + + - name: Build site with Hugo + run: npm run build + + - name: Verify Hugo output exists + run: | + if [ ! -d "public" ]; then + echo "public/ not found" + exit 1 + fi diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 57dc8e2..aeb0279 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -1 +1,38 @@ -["main ] # Build on pushes to main\n\njobs:\n build-deploy:\n runs-on: ubuntu-latest\n steps:\n - name: Checkout repository\n uses: actions/checkout@v4\n\n - name: Setup Hugo\n uses: peaceiris/actions-hugo@v2\n with:\n hugo-version: 'latest'\n\n - name: Set up Node.js for Tailwindcss\n uses: actions/setup-node@v4\n with:\n node-version: '20'\n\n - name: Install dependencies\n run: npm install\n\n - name: Build CSS asset\n run: npm run build:css\n\n - name: Build Hugo site\n run: hugo --minify\n\n - name: Deploy to GitHub Pages\n uses: peaceiris/actions-gh-pages@v3\n with:\n github_pages_branch: gh-pages\n keep_files: false\n force_orphan: true\n commit_message: Deploy Hugo site"] \ No newline at end of file +on: + push: + branches: [main] + +jobs: + build-deploy: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup Hugo + uses: peaceiris/actions-hugo@v2 + with: + hugo-version: 'latest' + + - name: Set up Node.js for Tailwindcss + uses: actions/setup-node@v4 + with: + node-version: '20' + + - name: Install dependencies + run: npm ci + + - name: Build CSS asset + run: npm run build:css + + - name: Build Hugo site + run: hugo --minify + + - name: Deploy to GitHub Pages + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + github_pages_branch: gh-pages + keep_files: false + force_orphan: true + commit_message: Deploy Hugo site diff --git a/.gitignore b/.gitignore index 106c7bf..839715a 100644 --- a/.gitignore +++ b/.gitignore @@ -9,7 +9,7 @@ node_modules/ # Hugo *.log *.patch -gtags refractor +.hugo_build.lock # OS & editor artifacts .DS_Store @@ -20,6 +20,4 @@ gtags refractor # Tailwind / PostCSS caches /.cache/ -/.cache/ -tailwind.css -main.css \ No newline at end of file +assets/css/main.css \ No newline at end of file diff --git a/.pi/settings.json b/.pi/settings.json new file mode 100644 index 0000000..aeec640 --- /dev/null +++ b/.pi/settings.json @@ -0,0 +1 @@ +{\"repoUrl\": \"file:///home/emil/Desktop/Coding/AI/UI_test\"} \ No newline at end of file diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..34e4619 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,17 @@ +# IMPORTANT Rules +Always be kind. Prioritize user well-being. + +# Code Quality Principles +Write clear, concise, and efficient code. Avoid unnecessary complexity. + +# Coding Style Preferences +Use consistent 2-space indentation. Use descriptive variable names. Avoid trailing whitespace. + +# Architecture Principles +Favor modular design. Consider scalability early. Prefer simplicity when possible. + +# Development Workflow +Use Git for version control. Write descriptive commit messages. Use pull requests. Run tests before merging. + +# Technical Preferences +Use TypeScript for type safety. Prefer REST over GraphQL for simplicity. Use PostgreSQL for relational data. Use Redis for caching. Use Docker for containerization. \ No newline at end of file diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..3a63842 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,49 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Project Overview + +Hugo static resume website for Emil Shanayev (DevOps & Backend Engineer), styled with Tailwind CSS 3.x and deployed to GitHub Pages via GitHub Actions. + +## Commands + +```bash +# Local dev server (watches for changes) +hugo server + +# Compile Tailwind CSS only +npm run build:css + +# Full production build (CSS + Hugo minified) +npm run build +``` + +CSS must be compiled before Hugo can use it — `npm run build` handles this in the correct order. + +## Architecture + +**Hugo + PostCSS pipeline:** + +- `assets/css/tailwind.css` — Tailwind entry point (source); processed by PostCSS → `assets/css/main.css` (generated, not committed) +- `tailwind.config.js` — content glob scans `**/*.{html,js,ts,jsx,md,go,rs}`; dark mode via `class`; custom color palette under `primary`, `secondary`, `dark`, `bg` +- `layouts/` — Hugo HTML templates (currently `_default/` only) +- `content/` — Markdown pages; `_index.md` is the homepage resume content (written in Russian) +- `config.toml` — Hugo site config (author, description, menu entries) + +**CI/CD (`.github/workflows/`):** + +- `ci.yml` — runs on PRs to `main`: installs deps, lints Markdown (`markdownlint`) and generated HTML (`htmlhint`), then builds +- `deploy.yml` — runs on push to `main`: builds site and pushes `public/` to `gh-pages` branch via `peaceiris/actions-gh-pages` + +**Utility directories:** + +- `core/user/` — user identity and preference notes consumed by AI tooling +- `templates/` — blank identity/preference templates +- `.pi/` — pi-agent settings (repo URL reference) + +## Style Preferences + +- 2-space indentation +- Descriptive variable names, no trailing whitespace +- TypeScript preferred for any scripting; REST over GraphQL; PostgreSQL/Redis for data diff --git a/assets/css/tailwind.css b/assets/css/tailwind.css new file mode 100644 index 0000000..0c9cdc5 --- /dev/null +++ b/assets/css/tailwind.css @@ -0,0 +1,97 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer base { + body { + background-image: radial-gradient(rgb(30 41 59 / 0.45) 1px, transparent 1px); + background-size: 28px 28px; + } +} + +@layer components { + /* Section header cards */ + .resume-content h2 { + font-size: 0.68rem !important; + font-weight: 700 !important; + text-transform: uppercase; + letter-spacing: 0.16em; + color: rgb(96 165 250) !important; + margin-top: 3rem !important; + margin-bottom: 1.25rem !important; + padding: 0.55rem 1rem; + background: rgb(15 23 42 / 0.8); + border-left: 3px solid rgb(96 165 250); + border-radius: 0 0.375rem 0.375rem 0; + margin-left: -1rem; + box-shadow: -4px 0 24px rgb(96 165 250 / 0.08), inset 0 0 0 1px rgb(96 165 250 / 0.06); + } + + .resume-content h3 { + font-size: 0.9rem !important; + font-weight: 600 !important; + color: rgb(226 232 240) !important; + margin-top: 1.25rem !important; + margin-bottom: 0.25rem !important; + } + + .resume-content p { + color: rgb(148 163 184); + line-height: 1.75; + } + + .resume-content li { + color: rgb(148 163 184); + } + + .resume-content li::marker { + color: rgb(96 165 250) !important; + } + + .resume-content strong { + color: rgb(226 232 240) !important; + font-weight: 600 !important; + } + + .resume-content a { + color: rgb(96 165 250) !important; + text-decoration: none !important; + } + + .resume-content a:hover { + text-decoration: underline !important; + } + + .resume-content hr { + border-color: rgb(30 41 59 / 0.5) !important; + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + + .skills-grid { + display: flex; + flex-wrap: wrap; + gap: 0.5rem; + margin: 0.75rem 0 1.5rem; + } + + .skills-grid span { + padding: 0.25rem 0.75rem; + border-radius: 9999px; + font-size: 0.72rem; + font-family: ui-monospace, monospace; + background: rgb(96 165 250 / 0.1); + color: rgb(96 165 250); + border: 1px solid rgb(96 165 250 / 0.25); + white-space: nowrap; + } + + .resume-content code { + color: rgb(147 197 253) !important; + background: rgb(15 23 42) !important; + padding: 0.1em 0.4em !important; + border-radius: 0.25rem !important; + font-size: 0.85em !important; + } +} + diff --git a/config.toml b/config.toml index 5ce6950..c19643a 100644 --- a/config.toml +++ b/config.toml @@ -1 +1,10 @@ -[['menu.main]]\n name = "Resume"\n url = "/resume/', 'weight = 1\n\n[[menu.main]]\n name = "About"\n url = "/about/', 'weight = 2\n\n[params]\n author = "Emil Shanayev"\n description = "DevOps & Backend Engineer"\n keywords = ["DevOps', 'Backend', 'Go', 'Tailwind', 'Resume']] \ No newline at end of file +baseURL = "https://emil28092005.github.io/" +languageCode = "ru" +title = "Emil Shanayev" + +[params] + author = "Emil Shanayev" + description = "DevOps & Backend Engineer" + keywords = ["DevOps", "Backend", "Go", "Tailwind", "Resume"] + github = "https://github.com/emil28092005" + email = "emil28092005@gmail.com" diff --git a/content/_index.md b/content/_index.md index 1c31568..5150769 100644 --- a/content/_index.md +++ b/content/_index.md @@ -1 +1,58 @@ -['GitHub](https://github.com/emil28092005) \n\n--- \n\n## Обо мне \nМолодой разработчик с глубокими знаниями в backend‑разработке и DevOps‑инженерии. Специализируюсь на Python/FastAPI, контейнеризации (Docker, Kubernetes) и Linux‑системах. Имею практический опыт проектирования архитектур, работы с CI/CD пайплайнами и управления инфраструктурой. Предпочитаю командную работу, обладаю лидерскими качествами и умею находить творческие решения сложных задач.\n\n--- \n\n## Ключевые навыки \n\n### Backend & Web Development \n- **Python**: FastAPI, asyncio, REST API \n- **Go**: микросервисы, высоконагруженные сервисы \n- **JavaScript/TypeScript**: async‑код, базовый React \n- **SQL**: PostgreSQL, Redis, SQLite – проектирование схем, оптимизация запросов \n- **HTML / CSS**: Tailwind CSS – утилитарный стиль, быстрый UI \n\n### DevOps & Infrastructure \n- **Docker**: контейнеризация приложений, `docker-compose` \n- **Kubernetes**: развертывание, авто‑сcaling, Helm‑чарты \n- **CI/CD**: GitHub Actions, Jenkins – автоматизация тестов и деплоя \n- **Linux**: Ubuntu, Debian, Manjaro; администрирование серверов, Bash‑скрипты \n- **CI/CD pipelines**: сборка образов, публикация в Harbor \n\n### Дополнительные компетенции \n- **Version Control**: Git, GitHub‑Actions \n- **CI/CD**: Harbor – хранение образов \n- **Системное администрирование**: VPS, самостоятельные сервисы \n- **Java, C#**: базовые знания \n- **Agile / Scrum**: управление проектами, коммуникация с командой \n\n--- \n\n## Образование \n\n**Университет Иннополис** – Программа Data Structures and Artificial Intelligence (DSAI) \n*2 года обучения*, факультатив *Product Management* – отличная оценка \n\n--- \n\n## Профессиональный опыт \n\n**Самостоятельные проекты** \n- Разработка backend‑приложений на **Python/FastAPI** с асинхронным программированием \n- Контейнеризация в **Docker**, оркестрация в **Kubernetes** \n- Настройка **CI/CD**‑пайплайнов с **GitHub Actions** и **Jenkins** \n- Администрирование **Linux‑серверов** (Debian, Ubuntu) \n\n**Командный опыт** \n- Вузовские учебные проекты – лидерство в небольших командах \n- Agile‑процессы, Scrum‑ролики \n\n--- \n\n## Дополнительно \n\n- **Обучение**: постоянное изучение документаций, YouTube‑курсов, Perplexity AI \n- **Открытый исходный код**: работа с инструментами DevOps‑сферы \n- **Командная работа**: наставничество, менторинг \n\n--- \n\n*Продолжаю развиваться в направлении DevOps и облачных технологий, активно экспериментирую с новыми подходами к инфраструктуре и автоматизации.*'] \ No newline at end of file +--- +title: "Emil Shanayev" +--- + +## Обо мне + +Молодой разработчик с глубокими знаниями в backend‑разработке и DevOps‑инженерии. Специализируюсь на Python/FastAPI, контейнеризации (Docker, Kubernetes) и Linux‑системах. Имею практический опыт проектирования архитектур, работы с CI/CD пайплайнами и управления инфраструктурой. Предпочитаю командную работу, обладаю лидерскими качествами и умею находить творческие решения сложных задач. + +--- + +## Ключевые навыки + +### Backend & Web Development + +{{< skills "Python · FastAPI · asyncio" "Go · микросервисы" "JavaScript / TypeScript" "PostgreSQL · Redis · SQLite" "Tailwind CSS" >}} + +### DevOps & Infrastructure + +{{< skills "Docker · Compose" "Kubernetes · Helm" "GitHub Actions · Jenkins" "Linux · Bash" "Harbor" >}} + +### Дополнительные компетенции + +{{< skills "Git · GitHub Actions" "Agile · Scrum" "Java · C#" "VPS · сервер‑администрирование" >}} + +--- + +## Образование + +**Университет Иннополис** – Программа Data Structures and Artificial Intelligence (DSAI) +*2 года обучения*, факультатив *Product Management* – отличная оценка + +--- + +## Профессиональный опыт + +**Самостоятельные проекты** + +- Разработка backend‑приложений на **Python/FastAPI** с асинхронным программированием +- Контейнеризация в **Docker**, оркестрация в **Kubernetes** +- Настройка **CI/CD**‑пайплайнов с **GitHub Actions** и **Jenkins** +- Администрирование **Linux‑серверов** (Debian, Ubuntu) + +**Командный опыт** + +- Вузовские учебные проекты – лидерство в небольших командах +- Agile‑процессы, Scrum‑методики + +--- + +## Дополнительно + +- **Обучение**: постоянное изучение документаций, YouTube‑курсов, Perplexity AI +- **Открытый исходный код**: работа с инструментами DevOps‑сферы +- **Командная работа**: наставничество, менторинг + +--- + +*Продолжаю развиваться в направлении DevOps и облачных технологий, активно экспериментирую с новыми подходами к инфраструктуре и автоматизации.* diff --git a/content/devops-engineer.md b/content/devops-engineer.md index cfabcd7..bf7f65b 100644 --- a/content/devops-engineer.md +++ b/content/devops-engineer.md @@ -1 +1,5 @@ -['DevOps', 'Backend', 'Go'] \ No newline at end of file +--- +title: "DevOps Engineer" +tags: ["DevOps", "Backend", "Go"] +draft: true +--- diff --git a/core/user/identity-template.md b/core/user/identity-template.md new file mode 100644 index 0000000..4d4f8c5 --- /dev/null +++ b/core/user/identity-template.md @@ -0,0 +1 @@ +# Identity Template diff --git a/core/user/prefer-template.md b/core/user/prefer-template.md new file mode 100644 index 0000000..8452f4e --- /dev/null +++ b/core/user/prefer-template.md @@ -0,0 +1 @@ +# Preferences Template diff --git a/core/user/prefer.md b/core/user/prefer.md new file mode 100644 index 0000000..86a6a24 --- /dev/null +++ b/core/user/prefer.md @@ -0,0 +1,6 @@ +- IMPORTANT Rules: Always be kind. Prioritize user well-being. +- Code Quality Principles: Write clear, concise, and efficient code. Avoid unnecessary complexity. +- Coding Style Preferences: 2-space indentation, descriptive variable names. +- Architecture Principles: Modular design, scalability focus. +- Development Workflow: Git + PRs + descriptive commits + tests. +- Technical Preferences: TypeScript, REST, PostgreSQL, Redis, Docker. \ No newline at end of file diff --git a/layouts/_default/baseof.html b/layouts/_default/baseof.html new file mode 100644 index 0000000..7291208 --- /dev/null +++ b/layouts/_default/baseof.html @@ -0,0 +1,112 @@ + + + + + + {{ if .IsHome }}{{ .Site.Params.author }} — {{ .Site.Params.description }}{{ else }}{{ .Title }} | {{ .Site.Params.author }}{{ end }} + {{ $css := resources.Get "css/main.css" }} + {{ if $css }}{{ end }} + + +
+ +
+ {{ block "main" . }}{{ end }} +
+ + + + + diff --git a/layouts/_default/single.html b/layouts/_default/single.html new file mode 100644 index 0000000..4adfb82 --- /dev/null +++ b/layouts/_default/single.html @@ -0,0 +1,6 @@ +{{ define "main" }} +
+

{{ .Title }}

+ {{ .Content }} +
+{{ end }} diff --git a/layouts/index.html b/layouts/index.html new file mode 100644 index 0000000..96ba5c8 --- /dev/null +++ b/layouts/index.html @@ -0,0 +1,31 @@ +{{ define "main" }} +
+
+ DevOps + Backend + Go · Python + Kubernetes +
+

+ {{ .Site.Params.author }} +

+

{{ .Site.Params.description }}

+
+ {{ if .Site.Params.github }} + + GitHub ↗ + + {{ end }} + {{ if .Site.Params.email }} + + {{ .Site.Params.email }} + + {{ end }} +
+
+
+ {{ .Content }} +
+{{ end }} diff --git a/layouts/shortcodes/skills.html b/layouts/shortcodes/skills.html new file mode 100644 index 0000000..f09a186 --- /dev/null +++ b/layouts/shortcodes/skills.html @@ -0,0 +1,5 @@ +
+{{ range .Params }} + {{ . }} +{{ end }} +
diff --git a/package-lock.json b/package-lock.json index c1eba4a..6ae354e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "name": "resume-website", "version": "1.0.0", "devDependencies": { + "@tailwindcss/typography": "^0.5.19", "autoprefixer": "^10.5.0", "postcss": "^8.5.12", "postcss-cli": "^11.0.1", @@ -104,6 +105,33 @@ "node": ">= 8" } }, + "node_modules/@tailwindcss/typography": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.19.tgz", + "integrity": "sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "6.0.10" + }, + "peerDependencies": { + "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1" + } + }, + "node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", diff --git a/package.json b/package.json index 8a7c837..aa974f9 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,7 @@ "build": "npm run build:css && hugo --minify" }, "devDependencies": { + "@tailwindcss/typography": "^0.5.19", "autoprefixer": "^10.5.0", "postcss": "^8.5.12", "postcss-cli": "^11.0.1", diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..33ad091 --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/tailwind.config.js b/tailwind.config.js index 819050c..6a5ef92 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -1 +1,34 @@ -{'darkMode': 'class', 'content': ['**/*.{html,js,ts,jsx,md,go,rs}'], 'theme': {'extend': {'colors': {'primary': '#2563eb', 'secondary': '#112d44', 'dark': {'#0f172a': 100, '#1e293b': 200, '#334155': 300, '#475569': 400, '#607d8b': 500, '#304ffe': 600, '#24368a': 700, '#1d2951': 800, '#132743': 900}, 'bg': {'default': '#ffffff', 'primary': '#0f172a'}}, 'spacing': {'5': '1.25rem', '7': '1.75rem', '9': '2.25rem'}}}, 'plugins': []} \ No newline at end of file +/** @type {import('tailwindcss').Config} */ +module.exports = { + darkMode: 'class', + content: ['./layouts/**/*.html', './content/**/*.md', './assets/**/*.{js,ts}'], + theme: { + extend: { + colors: { + primary: '#2563eb', + secondary: '#112d44', + dark: { + 100: '#0f172a', + 200: '#1e293b', + 300: '#334155', + 400: '#475569', + 500: '#607d8b', + 600: '#304ffe', + 700: '#24368a', + 800: '#1d2951', + 900: '#132743', + }, + bg: { + default: '#ffffff', + primary: '#0f172a', + }, + }, + spacing: { + '5': '1.25rem', + '7': '1.75rem', + '9': '2.25rem', + }, + }, + }, + plugins: [require('@tailwindcss/typography')], +} diff --git a/templates/identity-template.md b/templates/identity-template.md new file mode 100644 index 0000000..4d4f8c5 --- /dev/null +++ b/templates/identity-template.md @@ -0,0 +1 @@ +# Identity Template diff --git a/templates/prefer-template.md b/templates/prefer-template.md new file mode 100644 index 0000000..8452f4e --- /dev/null +++ b/templates/prefer-template.md @@ -0,0 +1 @@ +# Preferences Template