diff --git a/motolani-cv-template/README.md b/motolani-cv-template/README.md new file mode 100644 index 0000000..792e542 --- /dev/null +++ b/motolani-cv-template/README.md @@ -0,0 +1,85 @@ +# Motolani Olaiya CV Template + +Static HTML/SCSS resume project for Motolani Olaiya. The goal is a professional, editable CV that works both in the browser and as a print-friendly PDF. + +## Structure + +```text +motolani-cv-template/ +├── index.html +├── index-recruiter.html +├── index-eu-2page.html +├── assets/ +├── scss/ +│ └── styles.scss +├── css/ +│ ├── styles.css +│ └── print.css +└── README.md +``` + +## How to edit + +1. Update the full version in `index.html`. +2. Update the one-page recruiter version in `index-recruiter.html`. +3. Update the strict 2-page European version in `index-eu-2page.html`. +4. Adjust visual styles in `scss/styles.scss`. +5. Keep `css/styles.css` in sync with the SCSS source if you change styling. +6. Use `css/print.css` for PDF/export-specific layout changes. + +## Suggested content workflow + +- Keep the summary short and concrete. +- Prefer measurable platform/project outcomes over broad adjectives. +- Lead with achievements, architecture decisions, and delivery impact instead of responsibility-only wording. +- Tailor the top headline and project emphasis for each target role: + - Python Developer + - Django Developer + - Wagtail Developer + - Django Oscar Developer + - Backend Developer + - Full Stack Developer + - Ecommerce Developer + - Software Engineer + - Technical Founder + - Technical Consultant + +## Export to PDF + +### Browser method + +1. Open `index.html` in a browser. +2. Press `Cmd + P` on macOS or `Ctrl + P` on Windows/Linux. +3. Choose **Save as PDF**. +4. Keep background graphics enabled if the browser offers that option. + +### Print guidance + +- The layout already includes `@media print` support. +- Print output is designed for A4. +- If the content grows beyond two pages, reduce spacing or shorten project descriptions before exporting. + +## Recommended usage + +- Use `index-recruiter.html` as the primary one-page application version. +- Use `index-eu-2page.html` for senior European software roles that expect a fuller two-page CV. +- Use `index.html` when you want the fuller founder/platform narrative. + +## Suggested measurable outcomes to add later + +If you confirm them, these are the strongest metrics to add: + +- Number of client or internal projects onboarded through the platform +- Reduction in manual setup time for new projects +- Deployment frequency or deployment time improvement +- Number of reusable plugins or shared modules created +- Search relevance or search coverage improvements +- Number of staging or production environments managed +- Reduction in onboarding or deployment failures after platform fixes +- Size or scope of multilingual / ecommerce implementations delivered + +## Notes + +- This version avoids JavaScript on purpose. +- The structure is ATS-friendly: semantic headings, readable lists, and plain text sections. +- Unknown or role-specific personal details such as exact graduation years or certification issue dates can be filled in without changing the layout. diff --git a/motolani-cv-template/assets/.gitkeep b/motolani-cv-template/assets/.gitkeep new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/motolani-cv-template/assets/.gitkeep @@ -0,0 +1 @@ + diff --git a/motolani-cv-template/css/print.css b/motolani-cv-template/css/print.css new file mode 100644 index 0000000..af95604 --- /dev/null +++ b/motolani-cv-template/css/print.css @@ -0,0 +1,147 @@ +@page { + size: A4; + margin: 8mm; +} + +html, +body { + background: #ffffff !important; +} + +body { + color: #111111 !important; + font-size: 10.7pt; + line-height: 1.45; +} + +.resume, +.resume--compact, +.resume--two-page { + width: 100% !important; + margin: 0 !important; + padding: 0 !important; + border: 0 !important; + border-radius: 0 !important; + box-shadow: none !important; + background: #ffffff !important; +} + +.resume--compact { + font-size: 10.1pt !important; +} + +.resume--two-page { + font-size: 9.35pt !important; +} + +a { + color: #111111 !important; + text-decoration: none !important; +} + +.hero { + gap: 0.8rem !important; + padding-bottom: 0.8rem !important; + border-bottom: 1px solid #bdbdbd !important; +} + +.hero__identity h1 { + margin-bottom: 0.45rem !important; + font-size: 22pt !important; +} + +.resume--compact .hero__identity h1 { + font-size: 20pt !important; +} + +.headline, +.entry__org, +.entry__meta, +.stack-list dd, +.hero__meta li { + color: #111111 !important; +} + +.hero__meta, +.panel, +.callout { + background: transparent !important; + border: 1px solid #bdbdbd !important; +} + +.section { + padding-top: 0.9rem !important; +} + +.resume--compact .section { + padding-top: 0.65rem !important; +} + +.resume--two-page .section { + padding-top: 0.42rem !important; +} + +.section, +.panel, +.entry, +.callout, +.hero, +.section--grid { + break-inside: avoid !important; + page-break-inside: avoid !important; +} + +.section--grid { + gap: 0.65rem !important; +} + +.entry { + padding: 0.7rem 0 !important; +} + +.resume--compact .panel, +.resume--compact .callout, +.resume--compact .hero__meta { + padding: 0.7rem 0.8rem !important; +} + +.resume--two-page .panel, +.resume--two-page .callout, +.resume--two-page .hero__meta { + padding: 0.52rem 0.68rem !important; +} + +.resume--compact .entry { + padding: 0.5rem 0 !important; +} + +.resume--two-page .entry { + padding: 0.28rem 0 !important; +} + +.resume--compact .entry p, +.resume--compact .entry ul, +.resume--compact .plain-list li, +.resume--compact .stack-list dd { + line-height: 1.35 !important; +} + +.resume--two-page .entry p, +.resume--two-page .entry ul, +.resume--two-page .plain-list li, +.resume--two-page .stack-list dd { + line-height: 1.2 !important; +} + +.resume--two-page .section, +.resume--two-page .section--grid, +.resume--two-page .hero { + break-inside: auto !important; + page-break-inside: auto !important; +} + +.tag-list li { + background: transparent !important; + border-color: #999999 !important; + color: #111111 !important; +} diff --git a/motolani-cv-template/css/styles.css b/motolani-cv-template/css/styles.css new file mode 100644 index 0000000..f965f75 --- /dev/null +++ b/motolani-cv-template/css/styles.css @@ -0,0 +1,352 @@ +*, +*::before, +*::after { + box-sizing: border-box; +} + +html { + font-size: 16px; +} + +body { + margin: 0; + font-family: Inter, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; + color: #182131; + background: radial-gradient(circle at top left, rgba(35, 73, 182, 0.06), transparent 24rem), #eef2f7; + line-height: 1.6; + text-rendering: optimizeLegibility; +} + +a { + color: #2349b6; + text-decoration: none; + text-underline-offset: 0.16em; +} + +a:hover { + text-decoration: underline; +} + +p, +li, +dd { + max-width: 75ch; +} + +.resume { + width: min(1080px, calc(100% - 2rem)); + margin: 2rem auto; + padding: 2.35rem; + background: #ffffff; + border: 1px solid #d7deea; + border-radius: 18px; + box-shadow: 0 22px 54px rgba(16, 24, 40, 0.08); +} + +.resume--compact { + width: min(980px, calc(100% - 2rem)); + padding: 2rem 2.1rem; +} + +.resume--two-page { + width: min(1020px, calc(100% - 2rem)); + padding: 2.1rem 2.15rem; +} + +.hero { + display: grid; + grid-template-columns: minmax(0, 1.9fr) minmax(280px, 1fr); + gap: 1.75rem; + align-items: start; + padding-bottom: 1.8rem; + border-bottom: 1px solid #c7d1e1; +} + +.hero__identity h1 { + margin: 0.35rem 0 0.9rem; + font-size: clamp(2.15rem, 4vw, 3.15rem); + line-height: 1.02; + letter-spacing: -0.02em; +} + +.eyebrow { + margin: 0; + color: #2349b6; + font-size: 0.84rem; + font-weight: 700; + line-height: 1.45; + letter-spacing: 0.08em; + text-transform: uppercase; +} + +.headline { + margin: 0; + max-width: 58ch; + color: #5f6c83; + font-size: 1.05rem; + line-height: 1.68; +} + +.hero__meta { + display: grid; + gap: 0.55rem; + margin: 0; + padding: 1.1rem 1.15rem; + list-style: none; + background: linear-gradient(180deg, #f8fafc, #eef3ff); + border: 1px solid #d5def5; + border-radius: 14px; +} + +.hero__meta li { + max-width: none; + color: #182131; + font-size: 0.95rem; +} + +.section { + padding-top: 1.7rem; +} + +.section h2 { + margin: 0 0 0.95rem; + color: #23304a; + font-size: 0.88rem; + font-weight: 800; + letter-spacing: 0.11em; + text-transform: uppercase; +} + +.section--grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 1.2rem; +} + +.panel, +.callout { + padding: 1.15rem 1.2rem; + border: 1px solid #d7deea; + border-radius: 14px; + background: #f8fafc; +} + +.panel h2, +.callout h2 { + margin-top: 0; +} + +.tag-list, +.plain-list { + margin: 0; + padding-left: 1.1rem; +} + +.plain-list li + li { + margin-top: 0.35rem; +} + +.tag-list { + display: flex; + flex-wrap: wrap; + gap: 0.58rem; + padding-left: 0; + list-style: none; +} + +.tag-list li { + max-width: none; + padding: 0.42rem 0.76rem; + border: 1px solid #cfdaef; + border-radius: 999px; + background: #eef3ff; + color: #243657; + font-size: 0.91rem; + font-weight: 600; + line-height: 1.2; +} + +.stack-list { + margin: 0; +} + +.stack-list div + div { + margin-top: 0.8rem; + padding-top: 0.8rem; + border-top: 1px solid #e8edf5; +} + +.stack-list dt { + color: #243657; + font-weight: 700; +} + +.stack-list dd { + margin: 0.14rem 0 0; + color: #5f6c83; +} + +.entry { + padding: 1.05rem 0; + border-top: 1px solid #d7deea; +} + +.entry:first-of-type { + border-top: 0; + padding-top: 0.1rem; +} + +.entry h3 { + margin: 0; + font-size: 1.08rem; + line-height: 1.3; +} + +.entry p, +.entry ul { + margin: 0.5rem 0 0; +} + +.entry ul { + padding-left: 1.2rem; +} + +.entry li + li { + margin-top: 0.45rem; +} + +.entry__head { + display: flex; + justify-content: space-between; + gap: 1rem; + align-items: baseline; +} + +.entry__org { + margin-top: 0.2rem; + color: #5f6c83; + font-weight: 600; +} + +.entry__meta { + color: #5f6c83; + font-size: 0.94rem; + white-space: nowrap; +} + +.callout ul { + margin: 0; + padding-left: 1.15rem; +} + +.callout li + li { + margin-top: 0.45rem; +} + +.footer-meta { + border-top: 1px solid #d7deea; + margin-top: 1rem; +} + +.footer-meta p { + margin: 0; + max-width: none; + color: #5f6c83; + font-size: 0.95rem; +} + +.resume--compact .hero { + gap: 1.3rem; + padding-bottom: 1.45rem; +} + +.resume--compact .section { + padding-top: 1.35rem; +} + +.resume--compact .headline { + max-width: 50ch; + font-size: 1rem; +} + +.resume--compact .panel, +.resume--compact .callout { + padding: 1rem 1.05rem; +} + +.resume--compact .entry { + padding: 0.9rem 0; +} + +.resume--compact .entry li + li { + margin-top: 0.32rem; +} + +.resume--compact .footer-meta { + margin-top: 0.8rem; +} + +.resume--two-page .section { + padding-top: 1.45rem; +} + +.resume--two-page .panel, +.resume--two-page .callout { + padding: 1rem 1.05rem; +} + +.resume--two-page .entry { + padding: 0.88rem 0; +} + +.resume--two-page .entry li + li { + margin-top: 0.34rem; +} + +@media (max-width: 900px) { + .resume, + .resume--compact, + .resume--two-page { + width: min(100%, calc(100% - 1rem)); + margin: 0.5rem auto; + padding: 1.35rem; + border-radius: 14px; + } + + .hero, + .section--grid, + .entry__head { + grid-template-columns: 1fr; + display: grid; + } + + .hero { + gap: 1rem; + } + + .entry__head { + gap: 0.3rem; + } + + .entry__meta { + white-space: normal; + } +} + +@media (max-width: 560px) { + html { + font-size: 15px; + } + + .hero__identity h1 { + font-size: 2rem; + } + + .headline { + font-size: 0.98rem; + } + + .hero__meta { + padding: 0.9rem 1rem; + } +} diff --git a/motolani-cv-template/exports/motolani-olaiya-cv-eu-2page.pdf b/motolani-cv-template/exports/motolani-olaiya-cv-eu-2page.pdf new file mode 100644 index 0000000..2de66a3 Binary files /dev/null and b/motolani-cv-template/exports/motolani-olaiya-cv-eu-2page.pdf differ diff --git a/motolani-cv-template/exports/motolani-olaiya-cv-full.pdf b/motolani-cv-template/exports/motolani-olaiya-cv-full.pdf new file mode 100644 index 0000000..f2a7657 Binary files /dev/null and b/motolani-cv-template/exports/motolani-olaiya-cv-full.pdf differ diff --git a/motolani-cv-template/exports/motolani-olaiya-cv-recruiter.pdf b/motolani-cv-template/exports/motolani-olaiya-cv-recruiter.pdf new file mode 100644 index 0000000..cd729ce Binary files /dev/null and b/motolani-cv-template/exports/motolani-olaiya-cv-recruiter.pdf differ diff --git a/motolani-cv-template/index-eu-2page.html b/motolani-cv-template/index-eu-2page.html new file mode 100644 index 0000000..f8ea552 --- /dev/null +++ b/motolani-cv-template/index-eu-2page.html @@ -0,0 +1,212 @@ + + + + + + + Motolani Olaiya | Senior Django Developer | Backend & Platform Engineer + + + + + + +
+
+
+

+ Senior Django Developer • Wagtail Developer • Backend Developer • + Platform Engineer +

+

Motolani Olaiya

+

+ Founder & Senior Python/Django Developer specializing in ecommerce + platforms, CMS systems, search infrastructure, CI/CD, deployment + automation, and reusable platform architecture. +

+
+ +
+ +
+

Professional Profile

+

+ Senior Python/Django developer with practical production experience + across Django 5, Wagtail, Django Oscar, PostgreSQL, Elasticsearch, + Jenkins, SaltStack, Linux, and Sentry. Built MandelBlog as a reusable + platform for client onboarding, multilingual websites, ecommerce + delivery, monitoring, and release workflows. Best aligned to senior + Django, Wagtail, backend, ecommerce, and platform engineering roles. +

+
+ +
+
+

Technical Skills

+
+
+
Backend
+
Python, Django 5, Django Oscar, REST APIs
+
+
+
CMS & Ecommerce
+
Wagtail, Django Oscar, Elasticsearch
+
+
+
DevOps & Platform
+
Jenkins, SaltStack, Linux, Sentry, CI/CD
+
+
+
Frontend
+
HTML, CSS, SCSS, Bootstrap 5
+
+
+
+ +
+

Strength Areas

+
    +
  • Python and Django platform delivery
  • +
  • Wagtail and Django Oscar implementation
  • +
  • Elasticsearch search infrastructure
  • +
  • Platform architecture and plugin reuse
  • +
  • CI/CD and deployment automation
  • +
  • Staging and production reliability
  • +
+
+
+ +
+

Professional Experience

+ +
+
+
+

Founder & Lead Developer

+

MandelBlog

+
+ +
+
    +
  • + Built a reusable Django/Wagtail/Django Oscar platform that + accelerated website and ecommerce delivery through shared + architecture and automation. +
  • +
  • + Built an onboarding system that provisions repositories, Jenkins + jobs, staging environments, SSL, and deployment tracking with + minimal manual intervention. +
  • +
  • + Standardized staging and production deployment using Jenkins, + SaltStack, Linux, release workflows, and rollback-aware + verification. +
  • +
+
+ +
+
+
+

Internship / Developer Experience

+

+ Highbiza +

+
+ +
+
    +
  • + Gained real-world Django, Wagtail, Django Oscar, plugin, and + ecommerce platform experience in a production-oriented setting. +
  • +
  • + Built practical exposure to delivery workflows and engineering + standards that later informed MandelBlog platform work. +
  • +
+
+
+ +
+

Selected Projects

+
+

MandelBlog Platform

+

+ Centralized Django, Wagtail, Django Oscar, plugin reuse, CI/CD, and + deployment automation into a reusable engineering baseline. +

+
+
+

Customer Onboarding Platform

+

+ Automated the path from project creation to staging readiness by + connecting repository provisioning, Jenkins job generation, staging + setup, SSL issuance, and deployment state tracking. +

+
+
+

Ecommerce & Search Platform

+

+ Combined Django Oscar ecommerce engineering with Elasticsearch-based + product, category, and content discovery. +

+
+
+

Deployment Platform

+

+ Built deployment infrastructure using Jenkins, SaltStack, Linux, and + release-based workflows to improve consistency, traceability, and + rollback capability. +

+
+
+ +
+
+

Education

+
    +
  • Diploma in Computer Engineering — Ukraine
  • +
+
+ +
+

Certifications

+

+ Project Management, Human Resources, Business Administration, + Python Programming, Sales Management, Fitness Coaching, HACCP, Web + Accessibility, and HubSpot Content Marketing. +

+
+
+ + +
+ + diff --git a/motolani-cv-template/index-recruiter.html b/motolani-cv-template/index-recruiter.html new file mode 100644 index 0000000..2a2fab0 --- /dev/null +++ b/motolani-cv-template/index-recruiter.html @@ -0,0 +1,148 @@ + + + + + + Motolani Olaiya | Senior Python/Django Developer + + + + + +
+
+
+

Senior Django Developer • Senior Python Developer • Platform Engineer

+

Motolani Olaiya

+

+ Founder & Senior Python/Django Developer specializing in ecommerce + platforms, CMS systems, platform engineering, search + infrastructure, deployment automation, and scalable web + applications. +

+
+ +
+ +
+

Value Statement

+

+ Experienced in building scalable ecommerce platforms, CMS systems, + deployment infrastructure, onboarding automation, search platforms, + and reusable software architectures using Python, Django, Wagtail, + Django Oscar, Elasticsearch, Jenkins, and SaltStack. +

+
+ +
+
+

Technical Skills

+
+
+
Backend
+
Python, Django 5, Django Oscar, REST APIs
+
+
+
CMS & Ecommerce
+
Wagtail, Django Oscar, Elasticsearch
+
+
+
DevOps & Platform
+
Jenkins, SaltStack, Linux, Sentry, CI/CD
+
+
+
Frontend
+
HTML, CSS, SCSS, Bootstrap 5
+
+
+
+ +
+

Strength Areas

+
    +
  • Python and Django platform delivery
  • +
  • Wagtail and Django Oscar implementation
  • +
  • Elasticsearch search infrastructure
  • +
  • Platform architecture and plugin reuse
  • +
  • CI/CD and deployment automation
  • +
  • Staging and production reliability
  • +
+
+
+ +
+

Core Experience

+
+
+
+

Founder & Lead Developer

+

MandelBlog

+
+ +
+
    +
  • + Built a reusable Django/Wagtail/Django Oscar platform that + accelerated client website and ecommerce delivery through shared + architecture and automation. +
  • +
  • + Built an automated onboarding system that provisions repositories, + Jenkins jobs, staging environments, SSL certificates, and + deployment tracking with minimal manual intervention. +
  • +
  • + Implemented Elasticsearch-powered search infrastructure for + products, categories, and content. +
  • +
  • + Designed deployment infrastructure using Jenkins, SaltStack, and + Linux to improve deployment consistency, traceability, and + rollback capability across staging and production. +
  • +
+
+ +
+
+
+

Internship / Developer Experience

+

+ Highbiza +

+
+ +
+
    +
  • + Gained real-world Django, Wagtail, Django Oscar, plugin, and + ecommerce platform experience in a production-oriented setting. +
  • +
  • + Built practical exposure to project delivery workflows that later + informed MandelBlog platform engineering and deployment thinking. +
  • +
+
+
+ + +
+ + diff --git a/motolani-cv-template/index.html b/motolani-cv-template/index.html new file mode 100644 index 0000000..25b3de7 --- /dev/null +++ b/motolani-cv-template/index.html @@ -0,0 +1,361 @@ + + + + + + + Motolani Olaiya | Founder & Senior Python/Django Developer | Platform Engineer + + + + + + +
+
+
+

+ Founder & Senior Python/Django Developer | Platform Engineer | + Ecommerce & CMS Specialist +

+

Motolani Olaiya

+

+ Experienced in building scalable ecommerce platforms, CMS systems, + deployment infrastructure, onboarding automation, search platforms, + and reusable software architectures using Python, Django, Wagtail, + Django Oscar, Elasticsearch, Jenkins, and SaltStack. +

+
+ +
+ +
+

Professional Summary

+

+ Founder and senior Python/Django developer with production experience + building backend systems, ecommerce platforms, CMS products, search + infrastructure, deployment workflows, and shared engineering tooling. + Strongest fit is in senior Django, Python, platform engineering, + ecommerce engineering, Wagtail, and technical consulting roles that + need practical architecture ownership and hands-on delivery. +

+

+ Built MandelBlog as a reusable multi-project platform rather than a + single-codebase product, enabling faster client onboarding, + repeatable deployment workflows, reusable plugin composition, + multilingual website delivery, search integration, monitoring, and + production support with minimal manual intervention. +

+
+ +
+
+

Technical Skills

+
+
+
Backend
+
Python, Django 5, Django Oscar, REST APIs
+
+
+
CMS & Ecommerce
+
Wagtail, Django Oscar, Elasticsearch
+
+
+
DevOps & Platform
+
Jenkins, SaltStack, Linux, Sentry, CI/CD
+
+
+
Frontend
+
HTML, CSS, SCSS, Bootstrap 5
+
+
+
Infrastructure & Security
+
OAuth2, OpenID Connect, Git, Private Gitea
+
+
+
+ +
+

Priority Roles

+
    +
  • Senior Django Developer
  • +
  • Senior Python Developer
  • +
  • Platform Engineer
  • +
  • Django Oscar Ecommerce Developer
  • +
  • Wagtail Developer
  • +
  • Technical Consultant
  • +
  • Technical Founder
  • +
  • Backend Developer
  • +
  • Full Stack Developer
  • +
  • DevOps / CI-CD Engineer
  • +
+
+
+ +
+

Work Experience

+ +
+
+
+

Founder & Lead Developer

+

MandelBlog

+
+ +
+
    +
  • + Designed and developed a reusable Django/Wagtail/Django Oscar + platform used to accelerate client website and ecommerce delivery + through reusable architecture, plugin composition, and automation. +
  • +
  • + Built an automated onboarding system that provisions repositories, + Jenkins jobs, staging environments, SSL certificates, and + deployment tracking with minimal manual intervention. +
  • +
  • + Designed deployment infrastructure using Jenkins, SaltStack, + Linux, and release-based deployment workflows to improve + deployment consistency, traceability, rollback capability, and + runtime verification. +
  • +
  • + Delivered multilingual Wagtail and Django Oscar implementations + with attention to SEO consistency, canonical correctness, cookie + compliance, and maintainable admin workflows. +
  • +
  • + Strengthened platform reliability by resolving onboarding, + staging, and production blockers across Sentry, template + generation, Jenkins handoff, SSL, package compatibility, runtime + provisioning, and deployment truthfulness. +
  • +
+
+ +
+
+
+

Python / Django Developer

+

Independent Product & Client Delivery Work

+
+ +
+
    +
  • + Built backend and full-stack web solutions focused on ecommerce, + CMS delivery, search, admin usability, and reliable deployment + into staging and production environments. +
  • +
  • + Worked end to end across application code, infrastructure, + monitoring, CI/CD, plugin integration, and live debugging rather + than treating backend development and operations as separate + silos. +
  • +
  • + Applied OpenAI integrations to product-oriented use cases such as + translation, product description workflows, and content + enrichment, with emphasis on practical output rather than demo + features. +
  • +
+
+ +
+
+
+

Internship / Developer Experience

+

+ Highbiza +

+
+ +
+
    +
  • + Gained real-world development experience in Django, Wagtail, + Django Oscar, reusable plugins, ecommerce platforms, and + production-oriented workflows. +
  • +
  • + Worked within an existing delivery environment where CMS, + ecommerce, and plugin-based architecture were applied to real + project needs rather than isolated tutorial work. +
  • +
  • + Built practical exposure to platform structure, project + implementation standards, and day-to-day engineering execution + that later informed the MandelBlog platform approach. +
  • +
+
+
+ +
+

Platform Engineering & Architecture

+
+
    +
  • + Designed reusable plugin architecture supporting multiple + websites and ecommerce projects. +
  • +
  • + Standardized project templates, package baselines, onboarding + workflows, and deployment verification logic. +
  • +
  • + Built CI/CD processes and operational tooling around Jenkins, + SaltStack, Linux, Gitea, and Sentry. +
  • +
  • + Managed staging and production environments with attention to + rollback, health checks, traceability, and deployment safety. +
  • +
  • + Defined technical standards for future projects through reusable + platform decisions instead of one-off project fixes. +
  • +
+
+
+ +
+

Selected Projects

+ +
+

MandelBlog Platform

+

+ Built a shared delivery platform that reduced repeated project + setup work by centralizing Django, Wagtail, Django Oscar, + plugin-driven architecture, CI/CD, and deployment automation into a + reusable engineering baseline. +

+
+ +
+

Customer Onboarding Platform

+

+ Automated the path from project creation to staging readiness by + connecting repository provisioning, Jenkins job generation, staging + environment setup, SSL issuance, and deployment state tracking + while keeping production approval-gated. +

+
+ +
+

Ecommerce Platform

+

+ Led Django Oscar-based ecommerce engineering across search, + catalogue structure, B2B-friendly workflows, and plugin-driven + feature composition for reusable commerce delivery. +

+
+ +
+

AI Product Description System

+

+ Built AI-assisted content generation and product enrichment + workflows to support ecommerce operations with editable, + business-focused output. +

+
+ +
+

Search Platform

+

+ Implemented Elasticsearch-powered search infrastructure for + products, categories, and content, improving discoverability and + search relevance across ecommerce and CMS use cases. +

+
+ +
+

Deployment Platform

+

+ Standardized staging and production delivery through Jenkins, + SaltStack, Linux, and release-based workflows that improved + deployment consistency, traceability, environment provisioning, and + rollback capability. +

+
+
+ +
+
+

Education

+
    +
  • Diploma in Computer Engineering — Ukraine
  • +
+
+ +
+

Certifications

+
    +
  • Diploma in Project Management
  • +
  • Diploma in Human Resources
  • +
  • Diploma in Business Administration
  • +
  • Diploma in Python Programming
  • +
  • Diploma in Sales Management
  • +
  • Diploma in Fitness Coaching, Gym Workouts & Bodybuilding
  • +
  • Diploma in HACCP
  • +
  • Diploma in Web Accessibility
  • +
  • HubSpot Content Marketing Certification
  • +
+
+
+ +
+
+

Languages

+
    +
  • English — Fluent
  • +
  • Russian — Intermediate
  • +
  • Dutch — Basic / Working proficiency
  • +
+
+ +
+

Links

+ +
+
+
+ + diff --git a/motolani-cv-template/scss/styles.scss b/motolani-cv-template/scss/styles.scss new file mode 100644 index 0000000..98dc713 --- /dev/null +++ b/motolani-cv-template/scss/styles.scss @@ -0,0 +1,438 @@ +$bg: #eef2f7; +$surface: #ffffff; +$surface-soft: #f8fafc; +$text: #182131; +$muted: #5f6c83; +$line: #d7deea; +$line-strong: #c7d1e1; +$accent: #2349b6; +$accent-soft: #eef3ff; +$shadow: 0 22px 54px rgba(16, 24, 40, 0.08); +$print-text: #111111; + +*, +*::before, +*::after { + box-sizing: border-box; +} + +html { + font-size: 16px; +} + +body { + margin: 0; + font-family: Inter, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; + color: $text; + background: + radial-gradient(circle at top left, rgba(35, 73, 182, 0.06), transparent 24rem), + $bg; + line-height: 1.6; + text-rendering: optimizeLegibility; +} + +a { + color: $accent; + text-decoration: none; + text-underline-offset: 0.16em; + + &:hover { + text-decoration: underline; + } +} + +p, +li, +dd { + max-width: 75ch; +} + +.resume { + width: min(1080px, calc(100% - 2rem)); + margin: 2rem auto; + padding: 2.35rem; + background: $surface; + border: 1px solid $line; + border-radius: 18px; + box-shadow: $shadow; +} + +.resume--compact { + width: min(980px, calc(100% - 2rem)); + padding: 2rem 2.1rem; +} + +.resume--two-page { + width: min(1020px, calc(100% - 2rem)); + padding: 2.1rem 2.15rem; +} + +.hero { + display: grid; + grid-template-columns: minmax(0, 1.9fr) minmax(280px, 1fr); + gap: 1.75rem; + align-items: start; + padding-bottom: 1.8rem; + border-bottom: 1px solid $line-strong; +} + +.hero__identity h1 { + margin: 0.35rem 0 0.9rem; + font-size: clamp(2.15rem, 4vw, 3.15rem); + line-height: 1.02; + letter-spacing: -0.02em; +} + +.eyebrow { + margin: 0; + color: $accent; + font-size: 0.84rem; + font-weight: 700; + line-height: 1.45; + letter-spacing: 0.08em; + text-transform: uppercase; +} + +.headline { + margin: 0; + max-width: 58ch; + color: $muted; + font-size: 1.05rem; + line-height: 1.68; +} + +.hero__meta { + display: grid; + gap: 0.55rem; + margin: 0; + padding: 1.1rem 1.15rem; + list-style: none; + background: linear-gradient(180deg, $surface-soft, $accent-soft); + border: 1px solid #d5def5; + border-radius: 14px; +} + +.hero__meta li { + max-width: none; + color: $text; + font-size: 0.95rem; +} + +.section { + padding-top: 1.7rem; +} + +.section h2 { + margin: 0 0 0.95rem; + color: #23304a; + font-size: 0.88rem; + font-weight: 800; + letter-spacing: 0.11em; + text-transform: uppercase; +} + +.section--grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 1.2rem; +} + +.panel, +.callout { + padding: 1.15rem 1.2rem; + border: 1px solid $line; + border-radius: 14px; + background: $surface-soft; +} + +.panel h2, +.callout h2 { + margin-top: 0; +} + +.tag-list, +.plain-list { + margin: 0; + padding-left: 1.1rem; +} + +.plain-list li + li { + margin-top: 0.35rem; +} + +.tag-list { + display: flex; + flex-wrap: wrap; + gap: 0.58rem; + padding-left: 0; + list-style: none; +} + +.tag-list li { + max-width: none; + padding: 0.42rem 0.76rem; + border: 1px solid #cfdaef; + border-radius: 999px; + background: $accent-soft; + color: #243657; + font-size: 0.91rem; + font-weight: 600; + line-height: 1.2; +} + +.stack-list { + margin: 0; +} + +.stack-list div + div { + margin-top: 0.8rem; + padding-top: 0.8rem; + border-top: 1px solid #e8edf5; +} + +.stack-list dt { + color: #243657; + font-weight: 700; +} + +.stack-list dd { + margin: 0.14rem 0 0; + color: $muted; +} + +.entry { + padding: 1.05rem 0; + border-top: 1px solid $line; +} + +.entry:first-of-type { + border-top: 0; + padding-top: 0.1rem; +} + +.entry h3 { + margin: 0; + font-size: 1.08rem; + line-height: 1.3; +} + +.entry p, +.entry ul { + margin: 0.5rem 0 0; +} + +.entry ul { + padding-left: 1.2rem; +} + +.entry li + li { + margin-top: 0.45rem; +} + +.entry__head { + display: flex; + justify-content: space-between; + gap: 1rem; + align-items: baseline; +} + +.entry__org { + margin-top: 0.2rem; + color: $muted; + font-weight: 600; +} + +.entry__meta { + color: $muted; + font-size: 0.94rem; + white-space: nowrap; +} + +.callout ul { + margin: 0; + padding-left: 1.15rem; +} + +.callout li + li { + margin-top: 0.45rem; +} + +.footer-meta { + border-top: 1px solid $line; + margin-top: 1rem; +} + +.footer-meta p { + margin: 0; + max-width: none; + color: $muted; + font-size: 0.95rem; +} + +.resume--compact { + .hero { + gap: 1.3rem; + padding-bottom: 1.45rem; + } + + .section { + padding-top: 1.35rem; + } + + .headline { + max-width: 50ch; + font-size: 1rem; + } + + .panel, + .callout { + padding: 1rem 1.05rem; + } + + .entry { + padding: 0.9rem 0; + } + + .entry li + li { + margin-top: 0.32rem; + } + + .footer-meta { + margin-top: 0.8rem; + } +} + +.resume--two-page { + .section { + padding-top: 1.45rem; + } + + .panel, + .callout { + padding: 1rem 1.05rem; + } + + .entry { + padding: 0.88rem 0; + } + + .entry li + li { + margin-top: 0.34rem; + } +} + +@media (max-width: 900px) { + .resume, + .resume--compact, + .resume--two-page { + width: min(100%, calc(100% - 1rem)); + margin: 0.5rem auto; + padding: 1.35rem; + border-radius: 14px; + } + + .hero, + .section--grid, + .entry__head { + grid-template-columns: 1fr; + display: grid; + } + + .hero { + gap: 1rem; + } + + .entry__head { + gap: 0.3rem; + } + + .entry__meta { + white-space: normal; + } +} + +@media (max-width: 560px) { + html { + font-size: 15px; + } + + .hero__identity h1 { + font-size: 2rem; + } + + .headline { + font-size: 0.98rem; + } + + .hero__meta { + padding: 0.9rem 1rem; + } +} + +@media print { + body { + background: #ffffff; + color: $print-text; + font-size: 10.7pt; + line-height: 1.45; + } + + a { + color: $print-text; + text-decoration: none; + } + + .resume, + .resume--compact, + .resume--two-page { + width: 100%; + margin: 0; + padding: 0; + border: 0; + border-radius: 0; + box-shadow: none; + } + + .hero { + gap: 0.8rem; + padding-bottom: 0.8rem; + } + + .hero__identity h1 { + margin-bottom: 0.45rem; + font-size: 22pt; + } + + .headline, + .entry__org, + .entry__meta, + .stack-list dd { + color: $print-text; + } + + .hero__meta, + .panel, + .callout { + background: transparent; + border: 1px solid #bdbdbd; + } + + .section { + padding-top: 0.9rem; + } + + .section, + .panel, + .entry, + .callout, + .hero { + break-inside: avoid; + page-break-inside: avoid; + } + + .tag-list li { + background: transparent; + border-color: #999999; + color: $print-text; + } +}