(projects: list[dict])
| 650 | |
| 651 | |
| 652 | def write_homepage(projects: list[dict]) -> None: |
| 653 | featured_numbers = {50, 51, 52, 53, 54} |
| 654 | featured = [ |
| 655 | project for project in projects if project["number"] in featured_numbers |
| 656 | ] |
| 657 | featured_cards = "\n".join(project_card(project) for project in featured) |
| 658 | start_cards = "\n".join(start_route_card(route) for route in START_ROUTES) |
| 659 | hero_routes = "\n".join(hero_route_link(route) for route in START_ROUTES) |
| 660 | content = f"""--- |
| 661 | title: DevOps Projects Student Portal |
| 662 | description: A clean DevOps learning portal with internal project pages, guided paths, and safety-first runbooks. |
| 663 | --- |
| 664 | |
| 665 | <section class="hero-lab"> |
| 666 | <div class="hero-copy"> |
| 667 | <p class="eyebrow">2026 DevOps portfolio lab</p> |
| 668 | <h1>Build DevOps labs at home. Show the proof.</h1> |
| 669 | <div class="hero-lede"> |
| 670 | A student-first portal for 54 hands-on DevOps projects across cloud, |
| 671 | containers, Kubernetes, CI/CD, DevSecOps, observability, and platform |
| 672 | engineering. |
| 673 | </div> |
| 674 | <div class="hero-actions"> |
| 675 | <a class="portal-button primary" href="{site_path('/catalog/start-here/')}">Start here</a> |
| 676 | <a class="portal-button secondary" href="{site_path('/projects/')}">Browse projects</a> |
| 677 | <a class="portal-button" href="{site_path('/runbooks/credentials-and-cost-safety/')}">Read the safety guide</a> |
| 678 | </div> |
| 679 | </div> |
| 680 | <div class="hero-metrics" aria-label="Start routes"> |
| 681 | <p class="hero-panel-label">Choose your route</p> |
| 682 | <div class="hero-route-list"> |
| 683 | {hero_routes} |
| 684 | </div> |
| 685 | <div class="tag-cloud compact"> |
| 686 | <span>54 projects</span><span>8 paths</span><span>5 modern labs</span><span>0 logins</span> |
| 687 | </div> |
| 688 | </div> |
| 689 | </section> |
| 690 | |
| 691 | ## Start Here |
| 692 | |
| 693 | <div class="start-route-grid"> |
| 694 | {start_cards} |
| 695 | </div> |
| 696 | |
| 697 | ## Current 2026 Home Labs |
| 698 | |
| 699 | <div class="project-grid"> |
| 700 | {featured_cards} |
| 701 | </div> |
| 702 | |
| 703 | ## How To Use This Portal |
| 704 | |
| 705 | <div class="step-grid"> |
| 706 | <div class="step-card"> |
| 707 | <strong>1. Pick</strong> |
| 708 | <p>Choose a project by cost, cloud, deployability, and outcome.</p> |
| 709 | </div> |
no test coverage detected