├── .ddev └── config.yaml ├── .editorconfig ├── .env.example ├── .github ├── CODEOWNERS └── workflows │ └── test.yml ├── .gitignore ├── .nvmrc ├── .prettierignore ├── .prettierrc ├── .textlintrc ├── .vscode ├── extensions.json └── settings.json ├── LICENSE ├── README.md ├── astro.config.mjs ├── package-lock.json ├── package.json ├── postcss.config.cjs ├── public ├── .well-known │ └── funding-manifest-urls ├── _redirects ├── favicon │ ├── android-chrome-192x192.png │ ├── android-chrome-512x512.png │ ├── apple-touch-icon.png │ ├── browserconfig.xml │ ├── favicon-16x16.png │ ├── favicon-32x32.png │ ├── favicon.ico │ ├── icon.svg │ ├── mstile-144x144.png │ ├── mstile-150x150.png │ ├── mstile-310x150.png │ ├── mstile-310x310.png │ ├── mstile-70x70.png │ ├── safari-pinned-tab.svg │ ├── site.webmanifest │ └── type-only.svg ├── img │ ├── advisory-group-call.png │ ├── avatar │ │ ├── alberto.png │ │ ├── bernardo.png │ │ ├── lasse.jpg │ │ ├── matt.png │ │ ├── sergey.jpg │ │ └── stasadev.jpg │ ├── blog │ │ ├── 2018 │ │ │ ├── 10 │ │ │ │ └── john-carlisle-539580-unsplash-e1539785420243.jpg │ │ │ ├── 11 │ │ │ │ ├── marius-masalar-410695-unsplash-e1543521725507.jpg │ │ │ │ └── will-echols-539053-unsplash-e1542746009659.jpg │ │ │ ├── 12 │ │ │ │ └── marvin-ronsdorf-196913-unsplash-e1544104467254.jpg │ │ │ └── 05 │ │ │ │ ├── maxime-le-conte-des-floris-151374-unsplash-e1526982174493.jpg │ │ │ │ └── screen-shot-2020-08-11-at-7.17.40-pm.png │ │ ├── 2019 │ │ │ ├── 01 │ │ │ │ ├── author-matt-glaman-e1548869414810.jpg │ │ │ │ └── mike-enerio-87665-unsplash-e1548857780487.jpg │ │ │ ├── 02 │ │ │ │ └── jantine-doornbos-711322-unsplash-e1551235015756.jpg │ │ │ ├── 03 │ │ │ │ └── github-checks-running.png │ │ │ ├── 05 │ │ │ │ └── home-umami.png │ │ │ └── 08 │ │ │ │ └── oh-my-zsh.png │ │ ├── 2020 │ │ │ ├── 11 │ │ │ │ ├── apple-ddev.jpg │ │ │ │ └── screen-shot-2020-11-22-at-12.38.30-pm.png │ │ │ ├── 12 │ │ │ │ ├── casual-diy-webhosting.png │ │ │ │ ├── ddevdocker.png │ │ │ │ ├── juggler-2329843-1280-e1607477143481.jpg │ │ │ │ └── screen-shot-2020-12-28-at-12.49.31-pm.png │ │ │ ├── 03 │ │ │ │ ├── ngrok-page.png │ │ │ │ └── secure-cert.png │ │ │ ├── 04 │ │ │ │ ├── Dockerfile.cron.png │ │ │ │ ├── chromebook-3.jpg │ │ │ │ ├── d8composer-phpmyadmin.png │ │ │ │ ├── hostswitchplus.png │ │ │ │ └── installing-typo3-cms.png │ │ │ ├── 05 │ │ │ │ └── signing.png │ │ │ ├── 06 │ │ │ │ └── phpstorm-debugging.png │ │ │ ├── 08 │ │ │ │ ├── screen-shot-2020-08-04-at-11.30.47-am-1.png │ │ │ │ ├── screen-shot-2020-08-04-at-5.27.30-pm-1.png │ │ │ │ └── screen-shot-2020-08-04-at-5.33.27-pm.png │ │ │ └── 09 │ │ │ │ ├── ddev-laravel.png │ │ │ │ └── screen-shot-on-2020-09-24-at-19-18-06-e1600975374486.png │ │ ├── 2021 │ │ │ └── 07 │ │ │ │ ├── drupal-9-drush-install-times-seconds-less-is-better.png │ │ │ │ ├── drupal-9-mutagen-sync-time-seconds.png │ │ │ │ └── drupal-9-web-install-times-seconds-less-is-better.png │ │ ├── 2022 │ │ │ ├── 10 │ │ │ │ ├── dall-e-2022-10-30-10.10.42.png │ │ │ │ └── whats-so-different.jpg │ │ │ ├── 12 │ │ │ │ └── macos-m1-vs.-drupal-10-web-install.svg │ │ │ ├── 03 │ │ │ │ └── macos-m1-vs.-drupal-drush-install-seconds.png │ │ │ ├── 05 │ │ │ │ └── ddev-platformsh.jpg │ │ │ └── 06 │ │ │ │ └── plumbing-g6c1b9a8f3-1920.jpg │ │ ├── 2023 │ │ │ ├── 10 │ │ │ │ └── stas-bench-cropped.jpg │ │ │ ├── 11 │ │ │ │ ├── Docker_Whale_in_Container.jpg │ │ │ │ ├── WSL2_Docker_Platform.png │ │ │ │ ├── d10_web_install_mutagen.svg │ │ │ │ ├── d10_web_install_no_mutagen.svg │ │ │ │ ├── ddev-ama-blog-0-feature.png │ │ │ │ ├── ddev-ama-blog-1-project-created.png │ │ │ │ ├── ddev-ama-blog-2-d9-acli-created.png │ │ │ │ ├── ddev-ama-blog-3-site-install-complete.png │ │ │ │ ├── ddev-ama-blog-4-ama-is-ready.png │ │ │ │ ├── ddev-ama-blog-5-ama-check-and-ready.png │ │ │ │ ├── ddev-ama-blog-6-ama-dashboard.png │ │ │ │ ├── ddev-ama-blog-7-ama-finished.png │ │ │ │ ├── macOS_Docker_Platform.png │ │ │ │ ├── whale-race.jpg │ │ │ │ └── working-with-vite-in-ddev.png │ │ │ ├── 12 │ │ │ │ └── randy-tandem.jpg │ │ │ ├── 05 │ │ │ │ └── diverse-group-of-people-sitting-at-table-working.jpg │ │ │ ├── 06 │ │ │ │ ├── 2023-06-05-aaron-winborn-award.jpg │ │ │ │ ├── arriving-at-conference.jpg │ │ │ │ ├── c-and-o-canal.jpg │ │ │ │ └── paw-paw-tunnel.jpg │ │ │ └── 08 │ │ │ │ ├── cloudflare-deploying-pages.png │ │ │ │ ├── contributors-working.png │ │ │ │ ├── google-deepmind-ebMFfR2uuJ0-unsplash.jpg │ │ │ │ └── intel-on-apple.png │ │ ├── 2024 │ │ │ ├── 10 │ │ │ │ ├── DDEV-v1.23.5.png │ │ │ │ ├── ddev-debug-test-banner.png │ │ │ │ ├── drupalcon-barcelona-mentors.jpg │ │ │ │ ├── github-actions-tmate-debugging.png │ │ │ │ └── mount-garfield-palisade.jpg │ │ │ ├── 11 │ │ │ │ ├── CMS-project-types.png │ │ │ │ ├── Commands.png │ │ │ │ ├── RouterUsage.png │ │ │ │ ├── UsersbyTimezone.png │ │ │ │ ├── WSL2DockerProvider.png │ │ │ │ ├── add-ons-excluding-phpmyadmin.png │ │ │ │ ├── ddev-environment-usage.png │ │ │ │ ├── ddev-pull-commands.png │ │ │ │ ├── ddev-versions.png │ │ │ │ ├── macOSDockerProvider.png │ │ │ │ ├── macOS_UsagebyArchitecture.png │ │ │ │ ├── palisade-november-bookcliffs.jpg │ │ │ │ └── windows-install-blog-logos.png │ │ │ ├── 12 │ │ │ │ ├── DockerProviderVSElapsed.svg │ │ │ │ ├── ElapsedVSDatabaseVersion.svg │ │ │ │ ├── MySQL8.0ImportTimeV1.24.1VSHEAD.svg │ │ │ │ ├── nancy_lewis_colorado_river.jpg │ │ │ │ ├── opensourcepledge-logo-horiz-color-opengraph.svg │ │ │ │ └── php-logo.svg │ │ │ ├── 02 │ │ │ │ ├── ddev-contributors.jpg │ │ │ │ ├── ddev-usage-pie-chart-20240229.png │ │ │ │ └── developers-happy.png │ │ │ ├── 03 │ │ │ │ ├── 2024-ddev.png │ │ │ │ ├── 501c3.png │ │ │ │ ├── Go-Logo_Aqua.svg │ │ │ │ ├── database-backup.png │ │ │ │ ├── ddev-name-resolution.png │ │ │ │ ├── new-developer-brings-ddev.png │ │ │ │ └── uncle-sam-501c3.png │ │ │ ├── 04 │ │ │ │ └── xz-backdoor.png │ │ │ ├── 05 │ │ │ │ ├── golang-nerd-banner.png │ │ │ │ ├── local-environment-tools.png │ │ │ │ ├── platform.sh-booth-with-ddev-block.png │ │ │ │ └── xdebug_logo.png │ │ │ ├── 06 │ │ │ │ ├── blue-whale-building-a-building.png │ │ │ │ ├── container-diagram.png │ │ │ │ └── weeping-sea-lion.png │ │ │ ├── 07 │ │ │ │ ├── add-on-puzzle-pieces.png │ │ │ │ ├── image-maintenance.png │ │ │ │ ├── technote.png │ │ │ │ ├── test-runners-randys-house.jpg │ │ │ │ └── traefik.logo.png │ │ │ ├── 08 │ │ │ │ ├── camera-and-laptop.jpeg │ │ │ │ ├── dismantled-camera.jpeg │ │ │ │ └── elephant-walking-backwards.png │ │ │ └── 09 │ │ │ │ ├── ddev-blog.png │ │ │ │ ├── goland-debug-image.png │ │ │ │ ├── goland-run-image.png │ │ │ │ └── maintaining-tests.png │ │ └── 2025 │ │ │ ├── 01 │ │ │ └── mtgarfield.jpg │ │ │ ├── 02 │ │ │ ├── ddev-2025-plans.png │ │ │ ├── nancy-lewis-winter-scene.jpg │ │ │ └── open-source-mutagen-docker-banner.jpeg │ │ │ ├── 03 │ │ │ ├── ddev-addon-comment.gif │ │ │ ├── ddev-addon-registry.png │ │ │ ├── ddev-addon-search.gif │ │ │ ├── ddev-addon-sort.gif │ │ │ ├── ddev-addon-type.gif │ │ │ ├── ddev-github-sponsors.png │ │ │ ├── palisade-vinelands.jpg │ │ │ └── the-drop-times-promotion.png │ │ │ ├── 04 │ │ │ ├── apple-silicon-intel.png │ │ │ ├── ddev-add-on-registry.png │ │ │ ├── ddev-router-traefik.png │ │ │ ├── nancy-lewis-my-first-painting-in-palisade.jpg │ │ │ ├── randy-mentoring-drupalcon-atlanta.jpg │ │ │ ├── sample-wordpress-grav-page-render.png │ │ │ ├── stas-sort-of-at-drupalcon-atlanta.png │ │ │ ├── typo3-xhgui.png │ │ │ └── wordpress-offramp.png │ │ │ └── 05 │ │ │ ├── museums-victoria-Di7WfLcrJ_I-unsplash.jpg │ │ │ └── rattlesnake-arches.jpg │ ├── discord.png │ ├── edit-docs.png │ ├── generic-thumbnail.png │ ├── og-default.png │ ├── og-support.png │ ├── open-in-gitpod.svg │ └── pr.png └── logos │ ├── 1xinternet-square.svg │ ├── 1xinternet.svg │ ├── OSP_logo_black_RGB.svg │ ├── OSP_logo_white_RGB.svg │ ├── affinity-bridge-dark.svg │ ├── affinity-bridge-square.svg │ ├── affinity-bridge.svg │ ├── agaric-square.svg │ ├── agaric.svg │ ├── amazee-io-Mirantis-Logo-Black-White-IO.svg │ ├── amazee-io-mirantis-darkmode.svg │ ├── amazee-io-square.svg │ ├── anwesoft-square.png │ ├── anwesoft.svg │ ├── apache.svg │ ├── b13-darkmode.svg │ ├── b13.svg │ ├── backdrop.svg │ ├── centarro-logo-dark.svg │ ├── centarro-logo-light.svg │ ├── centarro-logo-text-dark.svg │ ├── centarro-logo-text-light.svg │ ├── centarro-square.svg │ ├── centarro.svg │ ├── craft-cms-square.svg │ ├── craft-cms.svg │ ├── craft.svg │ ├── dark-ddev.svg │ ├── dark-i-gelb.svg │ ├── dark-lullabot.svg │ ├── dark-mac-stadium.svg │ ├── dark-redfin-solutions.svg │ ├── dark-tag1.svg │ ├── ddev-mark.svg │ ├── ddev.png │ ├── ddev.svg │ ├── drupal.svg │ ├── drupaleasy-darkmode.png │ ├── drupaleasy-square.svg │ ├── drupaleasy.png │ ├── fame-darkmode.svg │ ├── fame-logo.svg │ ├── fame-square.svg │ ├── gizra.svg │ ├── i-gelb-square.svg │ ├── i-gelb.svg │ ├── jetbrains-dark.svg │ ├── jetbrains-square.svg │ ├── jetbrains.svg │ ├── laravel.svg │ ├── logo-cambrico-color-dark-mode_con-nombre.svg │ ├── logo-cambrico-color-light-mode_con-nombre.svg │ ├── lullabot-square.svg │ ├── lullabot.svg │ ├── mac-stadium-square.svg │ ├── mac-stadium.svg │ ├── magento.svg │ ├── memcached.svg │ ├── mobilistics-dark.svg │ ├── mobilistics-square.svg │ ├── mobilistics.svg │ ├── mysql.svg │ ├── nginx.svg │ ├── node.svg │ ├── oliver-wand.jpg │ ├── optasy-darkmode.svg │ ├── optasy-full.svg │ ├── optasy-square.svg │ ├── php.svg │ ├── platform.sh-darkmode.svg │ ├── platform.sh-square.svg │ ├── platform.sh.svg │ ├── postgresql.png │ ├── powershell.svg │ ├── redfin-solutions-square.svg │ ├── redfin-solutions.svg │ ├── redis.svg │ ├── tag1-square.svg │ ├── tag1.svg │ ├── tux.svg │ ├── typo3.svg │ ├── undpaul-darkmode.svg │ ├── undpaul-square.svg │ ├── undpaul.svg │ ├── webikon.com-dark.svg │ ├── webikon.com.svg │ └── wordpress.svg ├── src ├── components │ ├── AnimatedTerminal.astro │ ├── AppLogos.astro │ ├── Badge.astro │ ├── Benefits.astro │ ├── BlogFeatures.astro │ ├── BlogPostCard.astro │ ├── BlogPostFooter.astro │ ├── Contributors.astro │ ├── CtaButton.astro │ ├── FeatureImage.astro │ ├── FeaturedSponsors.astro │ ├── Features.astro │ ├── Footer.astro │ ├── Header.astro │ ├── Heading.astro │ ├── Hero.astro │ ├── Icon.astro │ ├── Paging.astro │ ├── PlatformPicker.astro │ ├── PostBody.astro │ ├── PostUpdate.astro │ ├── RepoCard.astro │ ├── SoftwareLogos.astro │ ├── Sponsors.astro │ ├── SponsorsBanner.astro │ ├── Tabs.astro │ ├── Terminal.astro │ ├── meta │ │ ├── Icons.astro │ │ └── StructuredData.astro │ └── quickstart │ │ ├── Cloud.astro │ │ ├── CommunityCTA.astro │ │ ├── Examples.astro │ │ ├── Linux.astro │ │ ├── Mac.astro │ │ └── Windows.astro ├── const.ts ├── content.config.ts ├── content │ ├── authors │ │ ├── alberto-g-viu.md │ │ ├── bernardo-martinez.md │ │ ├── garvin-hicking.md │ │ ├── heather-mcnamee.md │ │ ├── j-minder.md │ │ ├── jeffrey-a-mcguire.md │ │ ├── jeremy-gonyea.md │ │ ├── jochen-roth.md │ │ ├── lasse-blomenkemper.md │ │ ├── matt-stein.md │ │ ├── matthias-andrasch.md │ │ ├── randy-fay.md │ │ ├── rick-manelius.md │ │ ├── sergey-fayngold.md │ │ ├── stas-zhuk.md │ │ ├── tony-groff.md │ │ └── yuri-gerasymov.md │ └── blog │ │ ├── 2023-review.md │ │ ├── 2024-plans.md │ │ ├── 2025-plans.md │ │ ├── 501c3.md │ │ ├── advanced-add-on-contributor-training.md │ │ ├── amd64-on-apple-silicon-ddev.md │ │ ├── amd64-with-rosetta-on-macos.md │ │ ├── amplitude-ddev-analytics-contributor-training.md │ │ ├── anatomy-advanced-ddev-addon.md │ │ ├── arm64-apple-silicon-m1-ddev-local-what-does-it-all-mean.md │ │ ├── beware-of-dirty-pipes-and-docker-desktop-on-windows.md │ │ ├── building-offramp-from-wordpress-with-ddev.md │ │ ├── contributor-training.md │ │ ├── controlling-cms-settings-files-in-ddev-local.md │ │ ├── customizing-ddev-local-images-with-a-custom-dockerfile.md │ │ ├── database-improvements.md │ │ ├── ddev-add-on-maintenance-guide.md │ │ ├── ddev-addon-registry-introduction.md │ │ ├── ddev-and-docker-healthchecks-technote.md │ │ ├── ddev-and-xz-backdoor.md │ │ ├── ddev-april-2025-newsletter.md │ │ ├── ddev-backups.md │ │ ├── ddev-debug-test-contributor-training.md │ │ ├── ddev-dec-2024-newsletter.md │ │ ├── ddev-diffy-introduction.md │ │ ├── ddev-docker-architecture.md │ │ ├── ddev-docker-chromebook.md │ │ ├── ddev-docker-desktop-and-colima-benchmarking-updated-dec-2022.md │ │ ├── ddev-docker-image-maintenance.md │ │ ├── ddev-expose-node-app-on-subdomain.md │ │ ├── ddev-feb-2025-newsletter.md │ │ ├── ddev-in-gitlab-ci.md │ │ ├── ddev-jan-2025-newsletter.md │ │ ├── ddev-local-and-phpstorm-debugging-with-wsl2.md │ │ ├── ddev-local-automated-testing.md │ │ ├── ddev-local-database-management.md │ │ ├── ddev-local-for-laravel-teams.md │ │ ├── ddev-local-phpstorm-and-xdebug-debugging.md │ │ ├── ddev-local-trusted-https-certificates.md │ │ ├── ddev-march-2025-newsletter.md │ │ ├── ddev-may-2025-newsletter.md │ │ ├── ddev-name-resolution-wildcards.md │ │ ├── ddev-nov-2024-newsletter.md │ │ ├── ddev-oct-2024-newsletter.md │ │ ├── ddev-website-for-contributors.md │ │ ├── debugging-docker-on-windows-mac-and-linux.md │ │ ├── docker-desktop-alternatives-arrive-for-ddev-colima.md │ │ ├── docker-performance-2023.md │ │ ├── docker-providers.md │ │ ├── drupal7-drupal9-migration-ddev-acquia-migrate-accelerate.md │ │ ├── drupalcon-atlanta-2025.md │ │ ├── drupalcon-barcelona-2024.md │ │ ├── drupalcon-pittsburgh.md │ │ ├── drupalcon-portland-wrapup.md │ │ ├── eight-more-ways-to-get-the-most-out-of-ddev-local.md │ │ ├── expanding-ddev-maintainer-team.md │ │ ├── extending-ddev-commands-with-scripts.md │ │ ├── getting-started-with-ddev-and-composer.md │ │ ├── golang-debugging.md │ │ ├── how-to-give-and-get-community-support.md │ │ ├── introducing-maintainer-stas.md │ │ ├── legacy-projects-with-unsupported-php-and-mysql-using-ddev.md │ │ ├── lets-fund-stas-maintainer.md │ │ ├── maintaining-ddev-tests-contributor-training.md │ │ ├── mariadb-dump-breaking-change.md │ │ ├── moving-cms-sites-around-local-servers.md │ │ ├── oh-my-zsh-using-custom-commands-and-other-goodies-to-add-to-ddev.md │ │ ├── open-source-collaboration-signing-tools-for-macos-catalina.md │ │ ├── open-source-for-the-win.md │ │ ├── open-source-pledge.md │ │ ├── platform-sh-becomes-a-lead-sponsor-of-ddev.md │ │ ├── platform-sh-ddev-funding-changes.md │ │ ├── randy-in-patagonia.md │ │ ├── recruiting-maintainers.md │ │ ├── release-v1.23.5-auto-port-assignment.md │ │ ├── release-v1.24.0-php8.4.md │ │ ├── save-as-you-go-and-make-backups-in-a-jiffy-with-ddev-local.md │ │ ├── setting-up-a-go-development-environment.md │ │ ├── sharing-a-ddev-local-project-with-other-collaborators.md │ │ ├── sponsor-thanks.md │ │ ├── stats-on-ddev-usage-nov-2024.md │ │ ├── supercharge-your-ddev-performance-with-mutagen.md │ │ ├── ten-more-ways-to-increase-your-efficiency-with-ddev-local.md │ │ ├── test-driven-development-with-ddev-and-drupal.md │ │ ├── tmate-github-actions-contributor-training.md │ │ ├── traefik-configuration-contributor-training.md │ │ ├── unleashing-php-development-with-ddev.md │ │ ├── using-ddev-to-teach-open-source-web-development.md │ │ ├── watch-ddev-local-from-scratch-with-macos.md │ │ ├── watch-ddev-local-from-scratch-with-windows-wsl2.md │ │ ├── watch-ddev-local-new-casual-webhosting-feature.md │ │ ├── watch-ddev-local-on-arm64-raspberry-pi.md │ │ ├── whats-so-different-about-ddev-local.md │ │ ├── why-use-ddev-local-instead-of-rolling-your-own-docker-based-local-dev-solution.md │ │ ├── windows-ddev-setup.md │ │ ├── working-with-vite-in-ddev.md │ │ ├── xdebug-debugging.md │ │ └── xhgui-feature.md ├── env.d.ts ├── featured-sponsors.json ├── layouts │ └── Layout.astro ├── lib │ ├── api.ts │ ├── remark-reading-time.mjs │ └── search-index.js ├── pages │ ├── 404.astro │ ├── about.astro │ ├── blog │ │ ├── [id].astro │ │ ├── [page].astro │ │ ├── author │ │ │ └── [id].astro │ │ ├── authors.astro │ │ ├── category │ │ │ └── [slug].astro │ │ ├── feed.json.js │ │ ├── index.astro │ │ └── rss.xml.js │ ├── contact.astro │ ├── foundation.astro │ ├── get-started.astro │ ├── index.astro │ ├── newsletter.astro │ ├── resources │ │ ├── featured-sponsors-darkmode.svg.js │ │ └── featured-sponsors.svg.js │ ├── search.astro │ ├── support-ddev.astro │ └── survey.astro ├── scripts │ └── giscus-comments.js └── styles │ └── global.css ├── tailwind.config.cjs └── tsconfig.json /.ddev/config.yaml: -------------------------------------------------------------------------------- 1 | name: ddev.com 2 | type: php 3 | docroot: dist 4 | php_version: "8.1" 5 | webserver_type: nginx-fpm 6 | xdebug_enabled: false 7 | additional_hostnames: [] 8 | additional_fqdns: [] 9 | use_dns_when_possible: true 10 | composer_version: "2" 11 | web_environment: [] 12 | # nodejs_version auto reads from the .nvmrc 13 | nodejs_version: "auto" 14 | omit_containers: ["db"] 15 | disable_upload_dirs_warning: true 16 | web_extra_exposed_ports: 17 | - name: astro-dev 18 | container_port: 4321 19 | http_port: 4322 20 | https_port: 4321 21 | # The extra -- in `npm run dev -- --host` is a Vite requirement 22 | # https://github.com/vitejs/vite/discussions/3396 23 | web_extra_daemons: 24 | - name: astro-dev-daemon 25 | command: bash -c 'npm install && touch /var/tmp/npminstalldone && npm run dev -- --host' 26 | directory: /var/www/html 27 | hooks: 28 | post-start: 29 | - exec: bash -c 'while [ ! -f /var/tmp/npminstalldone ]; do sleep 1; done' 30 | - exec: bash -c 'if [ ! -d /var/www/html/dist ]; then npm run build; fi' 31 | - exec: echo -e " NOTICE \n 32 | =================================================================================\n 33 | =================================================================================\n 34 | The Astro dev container is ready \n 35 | Hot Module Reloadin (HMR) is avaliable at \e[32m${DDEV_PRIMARY_URL}:4321\e[0m \n 36 | To troubleshoot any isues run \e[35mddev describe\e[0m or \e[35mddev logs --follow --time\e[0m \n" 37 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | indent_size = 2 7 | indent_style = space 8 | insert_final_newline = true 9 | trim_trailing_whitespace = false 10 | -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | # Token to authenticate GitHub REST and GraphQL API calls (and avoid narrow rate limiting) 2 | GITHUB_TOKEN= -------------------------------------------------------------------------------- /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | @mattstein 2 | @rfay 3 | @bmartinez287 4 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: Test 2 | on: 3 | push: 4 | branches: [main] 5 | pull_request: 6 | branches: [main] 7 | workflow_dispatch: 8 | 9 | # Allow this job to clone the repo and create a page deployment 10 | permissions: 11 | contents: read 12 | 13 | env: 14 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 15 | NODE_VERSION: 20 16 | 17 | jobs: 18 | build: 19 | timeout-minutes: 15 20 | runs-on: ubuntu-24.04 21 | steps: 22 | - uses: actions/checkout@v4 23 | - uses: actions/setup-node@v4 24 | with: 25 | node-version: ${{ env.NODE_VERSION }} 26 | - name: Install dependencies 27 | run: npm ci 28 | - name: Lint 29 | run: npm run textlint 30 | - name: Prettier 31 | run: npx prettier --check . 32 | - name: Install, build, and upload your site output 33 | uses: withastro/action@v2 34 | with: 35 | node-version: ${{ env.NODE_VERSION }} 36 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # vscode project settings 2 | .vscode/**/* 3 | !/.vscode/settings.json 4 | !/.vscode/extensions.json 5 | 6 | 7 | # build output 8 | dist/ 9 | .output/ 10 | cache/ 11 | 12 | # dependencies 13 | node_modules/ 14 | 15 | # logs 16 | npm-debug.log* 17 | yarn-debug.log* 18 | yarn-error.log* 19 | pnpm-debug.log* 20 | 21 | 22 | # environment variables 23 | .env 24 | .env.production 25 | 26 | # macOS-specific files 27 | .DS_Store 28 | 29 | .astro 30 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | v20 2 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | .ddev/ 2 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "semi": false, 3 | "singleQuote": false, 4 | "trailingComma": "es5" 5 | } 6 | -------------------------------------------------------------------------------- /.textlintrc: -------------------------------------------------------------------------------- 1 | { 2 | "filters": { 3 | "comments": true 4 | }, 5 | "rules": { 6 | "no-todo": true, 7 | "terminology": { 8 | "defaultTerms": true, 9 | "skip": ["Code", "Image"], 10 | "terms": [ 11 | "AMD64", 12 | "ARM64", 13 | "Basg", 14 | "Docker", 15 | "Drush", 16 | "Git", 17 | "Mutagen", 18 | "MySQL", 19 | "phpMyAdmin", 20 | "Xdebug", 21 | ["(\\s)ddev", "DDEV"], 22 | ["(\\s)http", "HTTP"], 23 | ["(\\s)https", "HTTPS"], 24 | ["(\\s)SSH", "SSH"], 25 | ["web-?server", "web server"] 26 | ], 27 | "exclude": [ 28 | "back[- ]end(\\w*)", 29 | "command ?line", 30 | "front[- ]end(\\w*)", 31 | "web[- ]?site(s)?" 32 | ] 33 | }, 34 | "stop-words": { 35 | "defaultWords": false, 36 | "words": [ 37 | ["simply"] 38 | ], 39 | } 40 | } 41 | } -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "esbenp.prettier-vscode", 4 | "EditorConfig.EditorConfig", 5 | "astro-build.astro-vscode" 6 | ] 7 | } 8 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.defaultFormatter": "esbenp.prettier-vscode", 3 | "editor.formatOnSave": true 4 | } 5 | -------------------------------------------------------------------------------- /astro.config.mjs: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "astro/config" 2 | import { plainTextPlugin } from "@barnabask/astro-minisearch" 3 | import { remarkReadingTime } from "./src/lib/remark-reading-time.mjs" 4 | import prefetch from "@astrojs/prefetch" 5 | import react from "@astrojs/react" 6 | import rehypeAstroRelativeMarkdownLinks from "astro-rehype-relative-markdown-links" 7 | import robotsTxt from "astro-robots-txt" 8 | import searchIndex from "./src/lib/search-index.js" 9 | import sitemap from "@astrojs/sitemap" 10 | import tailwindcss from "@tailwindcss/vite" 11 | import widont from "rehype-widont" 12 | 13 | // https://astro.build/config 14 | export default defineConfig({ 15 | site: "https://ddev.com", 16 | vite: { 17 | server: { 18 | allowedHosts: ["." + process.env.DDEV_TLD], // leave this unchanged for DDEV! 19 | }, 20 | // Configure CORS for the dev server (security) 21 | cors: { origin: process.env.DDEV_PRIMARY_URL }, 22 | plugins: [tailwindcss()], 23 | }, 24 | integrations: [ 25 | react(), 26 | sitemap({ 27 | serialize(item) { 28 | if ( 29 | item.url.endsWith(".json/") || 30 | item.url.endsWith(".svg/") || 31 | item.url.endsWith(".xml/") 32 | ) { 33 | // Don’t index sitemaps or generated SVG, which come with `/` route endings here 34 | return undefined 35 | } 36 | return item 37 | }, 38 | }), 39 | robotsTxt({ 40 | sitemap: true, 41 | }), 42 | searchIndex({ 43 | output: "search.json", 44 | }), 45 | prefetch(), 46 | ], 47 | markdown: { 48 | syntaxHighlight: "shiki", 49 | // https://github.com/shikijs/shiki/blob/main/docs/languages.md 50 | shikiConfig: { 51 | theme: "nord", 52 | }, 53 | remarkPlugins: [remarkReadingTime], 54 | rehypePlugins: [ 55 | widont, 56 | plainTextPlugin({ 57 | contentKey: "plainText", 58 | removeEmoji: false, 59 | headingTags: ["h2", "h3"], 60 | }), 61 | rehypeAstroRelativeMarkdownLinks, 62 | ], 63 | }, 64 | image: { 65 | domains: ["avatars.githubusercontent.com"], 66 | }, 67 | }) 68 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@ddev/ddev.com-astro", 3 | "type": "module", 4 | "version": "1.0.0", 5 | "private": true, 6 | "scripts": { 7 | "dev": "astro dev", 8 | "start": "astro dev", 9 | "build": "astro build", 10 | "preview": "astro preview", 11 | "astro": "astro", 12 | "textlint": "./node_modules/.bin/textlint 'src/content/**'", 13 | "textlint:fix": "./node_modules/.bin/textlint 'src/content/**' --fix" 14 | }, 15 | "dependencies": { 16 | "@astrojs/prefetch": "^0.4.1", 17 | "@astrojs/react": "^4.3.0", 18 | "@astrojs/rss": "^4.0.11", 19 | "@astrojs/sitemap": "^3.4.0", 20 | "@barnabask/astro-minisearch": "^2.1.1", 21 | "@heroicons/react": "^2.0.13", 22 | "@octokit/auth-app": "^7.1.4", 23 | "@tailwindcss/typography": "^0.5.16", 24 | "@tailwindcss/vite": "^4.0.3", 25 | "@types/react": "^18.2.23", 26 | "@types/react-dom": "^18.2.8", 27 | "astro": "^5.8.1", 28 | "astro-rehype-relative-markdown-links": "^0.17.3", 29 | "astro-robots-txt": "^1.0.0", 30 | "astro-seo": "^0.8.0", 31 | "autoprefixer": "^10.4.16", 32 | "github-slugger": "^2.0.0", 33 | "glob": "^10.3.10", 34 | "image-size": "^1.2.1", 35 | "linkedom": "^0.15.3", 36 | "marked": "^9.0.3", 37 | "mdast-util-to-string": "^4.0.0", 38 | "nanoid": "^5.0.1", 39 | "octokit": "^4.1.1", 40 | "postcss-import": "^15.1.0", 41 | "postcss-nested": "^6.0.0", 42 | "react": "^18.2.0", 43 | "react-dom": "^18.2.0", 44 | "reading-time": "^1.5.0", 45 | "rehype-widont": "^0.1.1", 46 | "sanitize-html": "^2.11.0", 47 | "sass": "^1.68.0", 48 | "sharp": "^0.32.6", 49 | "tailwindcss": "^4.0.3" 50 | }, 51 | "devDependencies": { 52 | "@types/marked": "^4.0.8", 53 | "dotenv": "^16.3.1", 54 | "textlint": "^13.0.5", 55 | "textlint-filter-rule-comments": "^1.2.2", 56 | "textlint-rule-no-todo": "^2.0.1", 57 | "textlint-rule-stop-words": "^4.0.0", 58 | "textlint-rule-terminology": "^4.0.0" 59 | }, 60 | "optionalDependencies": { 61 | "@tailwindcss/oxide-linux-x64-gnu": "^4.0.1", 62 | "lightningcss-linux-x64-gnu": "^1.29.1" 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /postcss.config.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: [require("autoprefixer")], 3 | } 4 | -------------------------------------------------------------------------------- /public/.well-known/funding-manifest-urls: -------------------------------------------------------------------------------- 1 | https://github.com/ddev/ddev/raw/refs/heads/main/funding.json 2 | https://github.com/ddev/ddev/blob/main/funding.json 3 | https://raw.githubusercontent.com/ddev/ddev/refs/heads/main/funding.json 4 | https://raw.githubusercontent.com/ddev/ddev/main/funding.json 5 | -------------------------------------------------------------------------------- /public/_redirects: -------------------------------------------------------------------------------- 1 | /install.sh https://raw.githubusercontent.com/ddev/ddev/main/scripts/install_ddev.sh 302 2 | /s/port-conflict https://ddev.readthedocs.io/en/stable/users/usage/troubleshooting/#web-server-ports-already-occupied 301 3 | /s/discord https://discord.com/invite/5wjP76mBJD 301 4 | /ddev-local/ddev-wsl2-getting-started/ https://ddev.readthedocs.io/en/stable/users/install/ddev-installation/#windows 301 5 | /ddev-local/apache-solr-with-drupal-8-and-search-api-solr/ https://github.com/ddev/ddev-drupal9-solr 301 6 | /ddev-local/ddev-local-web-container-customization-in-v1-8-0/ https://ddev.readthedocs.io/en/stable/users/extend/customizing-images/ 301 7 | /ddev-local/ddev-local-nfs-mounting-setup-macos/ https://ddev.readthedocs.io/en/stable/users/install/performance/#nfs 301 8 | /ddev-local /blog 301 9 | /ddev-local/ /blog 301 10 | /meet-the-team /blog/authors 301 11 | /meet-the-team/ /blog/authors 301 12 | /author/heather /blog/author/heather-mcnamee 301 13 | /author/rfay /blog/author/randy-fay 301 14 | /author/rmanelius /blog/author/rick-manelius 301 15 | /ddev-local/:slug /blog/:slug 301 16 | /ddev-local/:slug/ /blog/:slug 301 17 | /s/divide-and-conquer https://www.fldrupal.camp/session/divide-and-conquer-systematic-approach-troubleshooting-issues 301 18 | /s/divide-and-conquer-drupal4gov https://docs.google.com/presentation/d/1_OyAwQGTtz9xv1e_Qzau4Rarum5xQpPy0uS7ntA9leI/edit?usp=sharing 301 19 | -------------------------------------------------------------------------------- /public/favicon/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/favicon/android-chrome-192x192.png -------------------------------------------------------------------------------- /public/favicon/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/favicon/android-chrome-512x512.png -------------------------------------------------------------------------------- /public/favicon/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/favicon/apple-touch-icon.png -------------------------------------------------------------------------------- /public/favicon/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | #00325a 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /public/favicon/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/favicon/favicon-16x16.png -------------------------------------------------------------------------------- /public/favicon/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/favicon/favicon-32x32.png -------------------------------------------------------------------------------- /public/favicon/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/favicon/favicon.ico -------------------------------------------------------------------------------- /public/favicon/icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/favicon/mstile-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/favicon/mstile-144x144.png -------------------------------------------------------------------------------- /public/favicon/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/favicon/mstile-150x150.png -------------------------------------------------------------------------------- /public/favicon/mstile-310x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/favicon/mstile-310x150.png -------------------------------------------------------------------------------- /public/favicon/mstile-310x310.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/favicon/mstile-310x310.png -------------------------------------------------------------------------------- /public/favicon/mstile-70x70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/favicon/mstile-70x70.png -------------------------------------------------------------------------------- /public/favicon/site.webmanifest: -------------------------------------------------------------------------------- 1 | { 2 | "name": "", 3 | "short_name": "", 4 | "icons": [ 5 | { 6 | "src": "/favicon/android-chrome-192x192.png", 7 | "sizes": "192x192", 8 | "type": "image/png" 9 | }, 10 | { 11 | "src": "/favicon/android-chrome-512x512.png", 12 | "sizes": "512x512", 13 | "type": "image/png" 14 | } 15 | ], 16 | "theme_color": "#5bbad5", 17 | "background_color": "#00325a", 18 | "display": "standalone" 19 | } 20 | -------------------------------------------------------------------------------- /public/favicon/type-only.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/img/advisory-group-call.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/advisory-group-call.png -------------------------------------------------------------------------------- /public/img/avatar/alberto.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/avatar/alberto.png -------------------------------------------------------------------------------- /public/img/avatar/bernardo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/avatar/bernardo.png -------------------------------------------------------------------------------- /public/img/avatar/lasse.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/avatar/lasse.jpg -------------------------------------------------------------------------------- /public/img/avatar/matt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/avatar/matt.png -------------------------------------------------------------------------------- /public/img/avatar/sergey.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/avatar/sergey.jpg -------------------------------------------------------------------------------- /public/img/avatar/stasadev.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/avatar/stasadev.jpg -------------------------------------------------------------------------------- /public/img/blog/2018/05/maxime-le-conte-des-floris-151374-unsplash-e1526982174493.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2018/05/maxime-le-conte-des-floris-151374-unsplash-e1526982174493.jpg -------------------------------------------------------------------------------- /public/img/blog/2018/05/screen-shot-2020-08-11-at-7.17.40-pm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2018/05/screen-shot-2020-08-11-at-7.17.40-pm.png -------------------------------------------------------------------------------- /public/img/blog/2018/10/john-carlisle-539580-unsplash-e1539785420243.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2018/10/john-carlisle-539580-unsplash-e1539785420243.jpg -------------------------------------------------------------------------------- /public/img/blog/2018/11/marius-masalar-410695-unsplash-e1543521725507.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2018/11/marius-masalar-410695-unsplash-e1543521725507.jpg -------------------------------------------------------------------------------- /public/img/blog/2018/11/will-echols-539053-unsplash-e1542746009659.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2018/11/will-echols-539053-unsplash-e1542746009659.jpg -------------------------------------------------------------------------------- /public/img/blog/2018/12/marvin-ronsdorf-196913-unsplash-e1544104467254.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2018/12/marvin-ronsdorf-196913-unsplash-e1544104467254.jpg -------------------------------------------------------------------------------- /public/img/blog/2019/01/author-matt-glaman-e1548869414810.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2019/01/author-matt-glaman-e1548869414810.jpg -------------------------------------------------------------------------------- /public/img/blog/2019/01/mike-enerio-87665-unsplash-e1548857780487.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2019/01/mike-enerio-87665-unsplash-e1548857780487.jpg -------------------------------------------------------------------------------- /public/img/blog/2019/02/jantine-doornbos-711322-unsplash-e1551235015756.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2019/02/jantine-doornbos-711322-unsplash-e1551235015756.jpg -------------------------------------------------------------------------------- /public/img/blog/2019/03/github-checks-running.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2019/03/github-checks-running.png -------------------------------------------------------------------------------- /public/img/blog/2019/05/home-umami.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2019/05/home-umami.png -------------------------------------------------------------------------------- /public/img/blog/2019/08/oh-my-zsh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2019/08/oh-my-zsh.png -------------------------------------------------------------------------------- /public/img/blog/2020/03/ngrok-page.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2020/03/ngrok-page.png -------------------------------------------------------------------------------- /public/img/blog/2020/03/secure-cert.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2020/03/secure-cert.png -------------------------------------------------------------------------------- /public/img/blog/2020/04/Dockerfile.cron.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2020/04/Dockerfile.cron.png -------------------------------------------------------------------------------- /public/img/blog/2020/04/chromebook-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2020/04/chromebook-3.jpg -------------------------------------------------------------------------------- /public/img/blog/2020/04/d8composer-phpmyadmin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2020/04/d8composer-phpmyadmin.png -------------------------------------------------------------------------------- /public/img/blog/2020/04/hostswitchplus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2020/04/hostswitchplus.png -------------------------------------------------------------------------------- /public/img/blog/2020/04/installing-typo3-cms.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2020/04/installing-typo3-cms.png -------------------------------------------------------------------------------- /public/img/blog/2020/05/signing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2020/05/signing.png -------------------------------------------------------------------------------- /public/img/blog/2020/06/phpstorm-debugging.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2020/06/phpstorm-debugging.png -------------------------------------------------------------------------------- /public/img/blog/2020/08/screen-shot-2020-08-04-at-11.30.47-am-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2020/08/screen-shot-2020-08-04-at-11.30.47-am-1.png -------------------------------------------------------------------------------- /public/img/blog/2020/08/screen-shot-2020-08-04-at-5.27.30-pm-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2020/08/screen-shot-2020-08-04-at-5.27.30-pm-1.png -------------------------------------------------------------------------------- /public/img/blog/2020/08/screen-shot-2020-08-04-at-5.33.27-pm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2020/08/screen-shot-2020-08-04-at-5.33.27-pm.png -------------------------------------------------------------------------------- /public/img/blog/2020/09/ddev-laravel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2020/09/ddev-laravel.png -------------------------------------------------------------------------------- /public/img/blog/2020/09/screen-shot-on-2020-09-24-at-19-18-06-e1600975374486.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2020/09/screen-shot-on-2020-09-24-at-19-18-06-e1600975374486.png -------------------------------------------------------------------------------- /public/img/blog/2020/11/apple-ddev.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2020/11/apple-ddev.jpg -------------------------------------------------------------------------------- /public/img/blog/2020/11/screen-shot-2020-11-22-at-12.38.30-pm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2020/11/screen-shot-2020-11-22-at-12.38.30-pm.png -------------------------------------------------------------------------------- /public/img/blog/2020/12/casual-diy-webhosting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2020/12/casual-diy-webhosting.png -------------------------------------------------------------------------------- /public/img/blog/2020/12/ddevdocker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2020/12/ddevdocker.png -------------------------------------------------------------------------------- /public/img/blog/2020/12/juggler-2329843-1280-e1607477143481.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2020/12/juggler-2329843-1280-e1607477143481.jpg -------------------------------------------------------------------------------- /public/img/blog/2020/12/screen-shot-2020-12-28-at-12.49.31-pm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2020/12/screen-shot-2020-12-28-at-12.49.31-pm.png -------------------------------------------------------------------------------- /public/img/blog/2021/07/drupal-9-drush-install-times-seconds-less-is-better.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2021/07/drupal-9-drush-install-times-seconds-less-is-better.png -------------------------------------------------------------------------------- /public/img/blog/2021/07/drupal-9-mutagen-sync-time-seconds.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2021/07/drupal-9-mutagen-sync-time-seconds.png -------------------------------------------------------------------------------- /public/img/blog/2021/07/drupal-9-web-install-times-seconds-less-is-better.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2021/07/drupal-9-web-install-times-seconds-less-is-better.png -------------------------------------------------------------------------------- /public/img/blog/2022/03/macos-m1-vs.-drupal-drush-install-seconds.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2022/03/macos-m1-vs.-drupal-drush-install-seconds.png -------------------------------------------------------------------------------- /public/img/blog/2022/05/ddev-platformsh.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2022/05/ddev-platformsh.jpg -------------------------------------------------------------------------------- /public/img/blog/2022/06/plumbing-g6c1b9a8f3-1920.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2022/06/plumbing-g6c1b9a8f3-1920.jpg -------------------------------------------------------------------------------- /public/img/blog/2022/10/dall-e-2022-10-30-10.10.42.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2022/10/dall-e-2022-10-30-10.10.42.png -------------------------------------------------------------------------------- /public/img/blog/2022/10/whats-so-different.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2022/10/whats-so-different.jpg -------------------------------------------------------------------------------- /public/img/blog/2023/05/diverse-group-of-people-sitting-at-table-working.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2023/05/diverse-group-of-people-sitting-at-table-working.jpg -------------------------------------------------------------------------------- /public/img/blog/2023/06/2023-06-05-aaron-winborn-award.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2023/06/2023-06-05-aaron-winborn-award.jpg -------------------------------------------------------------------------------- /public/img/blog/2023/06/arriving-at-conference.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2023/06/arriving-at-conference.jpg -------------------------------------------------------------------------------- /public/img/blog/2023/06/c-and-o-canal.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2023/06/c-and-o-canal.jpg -------------------------------------------------------------------------------- /public/img/blog/2023/06/paw-paw-tunnel.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2023/06/paw-paw-tunnel.jpg -------------------------------------------------------------------------------- /public/img/blog/2023/08/cloudflare-deploying-pages.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2023/08/cloudflare-deploying-pages.png -------------------------------------------------------------------------------- /public/img/blog/2023/08/contributors-working.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2023/08/contributors-working.png -------------------------------------------------------------------------------- /public/img/blog/2023/08/google-deepmind-ebMFfR2uuJ0-unsplash.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2023/08/google-deepmind-ebMFfR2uuJ0-unsplash.jpg -------------------------------------------------------------------------------- /public/img/blog/2023/08/intel-on-apple.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2023/08/intel-on-apple.png -------------------------------------------------------------------------------- /public/img/blog/2023/10/stas-bench-cropped.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2023/10/stas-bench-cropped.jpg -------------------------------------------------------------------------------- /public/img/blog/2023/11/Docker_Whale_in_Container.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2023/11/Docker_Whale_in_Container.jpg -------------------------------------------------------------------------------- /public/img/blog/2023/11/WSL2_Docker_Platform.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2023/11/WSL2_Docker_Platform.png -------------------------------------------------------------------------------- /public/img/blog/2023/11/ddev-ama-blog-0-feature.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2023/11/ddev-ama-blog-0-feature.png -------------------------------------------------------------------------------- /public/img/blog/2023/11/ddev-ama-blog-1-project-created.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2023/11/ddev-ama-blog-1-project-created.png -------------------------------------------------------------------------------- /public/img/blog/2023/11/ddev-ama-blog-2-d9-acli-created.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2023/11/ddev-ama-blog-2-d9-acli-created.png -------------------------------------------------------------------------------- /public/img/blog/2023/11/ddev-ama-blog-3-site-install-complete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2023/11/ddev-ama-blog-3-site-install-complete.png -------------------------------------------------------------------------------- /public/img/blog/2023/11/ddev-ama-blog-4-ama-is-ready.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2023/11/ddev-ama-blog-4-ama-is-ready.png -------------------------------------------------------------------------------- /public/img/blog/2023/11/ddev-ama-blog-5-ama-check-and-ready.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2023/11/ddev-ama-blog-5-ama-check-and-ready.png -------------------------------------------------------------------------------- /public/img/blog/2023/11/ddev-ama-blog-6-ama-dashboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2023/11/ddev-ama-blog-6-ama-dashboard.png -------------------------------------------------------------------------------- /public/img/blog/2023/11/ddev-ama-blog-7-ama-finished.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2023/11/ddev-ama-blog-7-ama-finished.png -------------------------------------------------------------------------------- /public/img/blog/2023/11/macOS_Docker_Platform.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2023/11/macOS_Docker_Platform.png -------------------------------------------------------------------------------- /public/img/blog/2023/11/whale-race.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2023/11/whale-race.jpg -------------------------------------------------------------------------------- /public/img/blog/2023/11/working-with-vite-in-ddev.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2023/11/working-with-vite-in-ddev.png -------------------------------------------------------------------------------- /public/img/blog/2023/12/randy-tandem.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2023/12/randy-tandem.jpg -------------------------------------------------------------------------------- /public/img/blog/2024/02/ddev-contributors.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2024/02/ddev-contributors.jpg -------------------------------------------------------------------------------- /public/img/blog/2024/02/ddev-usage-pie-chart-20240229.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2024/02/ddev-usage-pie-chart-20240229.png -------------------------------------------------------------------------------- /public/img/blog/2024/02/developers-happy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2024/02/developers-happy.png -------------------------------------------------------------------------------- /public/img/blog/2024/03/2024-ddev.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2024/03/2024-ddev.png -------------------------------------------------------------------------------- /public/img/blog/2024/03/501c3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2024/03/501c3.png -------------------------------------------------------------------------------- /public/img/blog/2024/03/Go-Logo_Aqua.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 13 | 14 | 15 | 16 | 17 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 48 | 49 | 50 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /public/img/blog/2024/03/database-backup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2024/03/database-backup.png -------------------------------------------------------------------------------- /public/img/blog/2024/03/ddev-name-resolution.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2024/03/ddev-name-resolution.png -------------------------------------------------------------------------------- /public/img/blog/2024/03/new-developer-brings-ddev.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2024/03/new-developer-brings-ddev.png -------------------------------------------------------------------------------- /public/img/blog/2024/03/uncle-sam-501c3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2024/03/uncle-sam-501c3.png -------------------------------------------------------------------------------- /public/img/blog/2024/04/xz-backdoor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2024/04/xz-backdoor.png -------------------------------------------------------------------------------- /public/img/blog/2024/05/golang-nerd-banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2024/05/golang-nerd-banner.png -------------------------------------------------------------------------------- /public/img/blog/2024/05/local-environment-tools.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2024/05/local-environment-tools.png -------------------------------------------------------------------------------- /public/img/blog/2024/05/platform.sh-booth-with-ddev-block.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2024/05/platform.sh-booth-with-ddev-block.png -------------------------------------------------------------------------------- /public/img/blog/2024/05/xdebug_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2024/05/xdebug_logo.png -------------------------------------------------------------------------------- /public/img/blog/2024/06/blue-whale-building-a-building.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2024/06/blue-whale-building-a-building.png -------------------------------------------------------------------------------- /public/img/blog/2024/06/container-diagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2024/06/container-diagram.png -------------------------------------------------------------------------------- /public/img/blog/2024/06/weeping-sea-lion.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2024/06/weeping-sea-lion.png -------------------------------------------------------------------------------- /public/img/blog/2024/07/add-on-puzzle-pieces.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2024/07/add-on-puzzle-pieces.png -------------------------------------------------------------------------------- /public/img/blog/2024/07/image-maintenance.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2024/07/image-maintenance.png -------------------------------------------------------------------------------- /public/img/blog/2024/07/technote.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2024/07/technote.png -------------------------------------------------------------------------------- /public/img/blog/2024/07/test-runners-randys-house.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2024/07/test-runners-randys-house.jpg -------------------------------------------------------------------------------- /public/img/blog/2024/07/traefik.logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2024/07/traefik.logo.png -------------------------------------------------------------------------------- /public/img/blog/2024/08/camera-and-laptop.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2024/08/camera-and-laptop.jpeg -------------------------------------------------------------------------------- /public/img/blog/2024/08/dismantled-camera.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2024/08/dismantled-camera.jpeg -------------------------------------------------------------------------------- /public/img/blog/2024/08/elephant-walking-backwards.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2024/08/elephant-walking-backwards.png -------------------------------------------------------------------------------- /public/img/blog/2024/09/ddev-blog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2024/09/ddev-blog.png -------------------------------------------------------------------------------- /public/img/blog/2024/09/goland-debug-image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2024/09/goland-debug-image.png -------------------------------------------------------------------------------- /public/img/blog/2024/09/goland-run-image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2024/09/goland-run-image.png -------------------------------------------------------------------------------- /public/img/blog/2024/09/maintaining-tests.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2024/09/maintaining-tests.png -------------------------------------------------------------------------------- /public/img/blog/2024/10/DDEV-v1.23.5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2024/10/DDEV-v1.23.5.png -------------------------------------------------------------------------------- /public/img/blog/2024/10/ddev-debug-test-banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2024/10/ddev-debug-test-banner.png -------------------------------------------------------------------------------- /public/img/blog/2024/10/drupalcon-barcelona-mentors.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2024/10/drupalcon-barcelona-mentors.jpg -------------------------------------------------------------------------------- /public/img/blog/2024/10/github-actions-tmate-debugging.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2024/10/github-actions-tmate-debugging.png -------------------------------------------------------------------------------- /public/img/blog/2024/10/mount-garfield-palisade.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2024/10/mount-garfield-palisade.jpg -------------------------------------------------------------------------------- /public/img/blog/2024/11/CMS-project-types.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2024/11/CMS-project-types.png -------------------------------------------------------------------------------- /public/img/blog/2024/11/Commands.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2024/11/Commands.png -------------------------------------------------------------------------------- /public/img/blog/2024/11/RouterUsage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2024/11/RouterUsage.png -------------------------------------------------------------------------------- /public/img/blog/2024/11/UsersbyTimezone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2024/11/UsersbyTimezone.png -------------------------------------------------------------------------------- /public/img/blog/2024/11/WSL2DockerProvider.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2024/11/WSL2DockerProvider.png -------------------------------------------------------------------------------- /public/img/blog/2024/11/add-ons-excluding-phpmyadmin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2024/11/add-ons-excluding-phpmyadmin.png -------------------------------------------------------------------------------- /public/img/blog/2024/11/ddev-environment-usage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2024/11/ddev-environment-usage.png -------------------------------------------------------------------------------- /public/img/blog/2024/11/ddev-pull-commands.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2024/11/ddev-pull-commands.png -------------------------------------------------------------------------------- /public/img/blog/2024/11/ddev-versions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2024/11/ddev-versions.png -------------------------------------------------------------------------------- /public/img/blog/2024/11/macOSDockerProvider.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2024/11/macOSDockerProvider.png -------------------------------------------------------------------------------- /public/img/blog/2024/11/macOS_UsagebyArchitecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2024/11/macOS_UsagebyArchitecture.png -------------------------------------------------------------------------------- /public/img/blog/2024/11/palisade-november-bookcliffs.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2024/11/palisade-november-bookcliffs.jpg -------------------------------------------------------------------------------- /public/img/blog/2024/11/windows-install-blog-logos.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2024/11/windows-install-blog-logos.png -------------------------------------------------------------------------------- /public/img/blog/2024/12/nancy_lewis_colorado_river.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2024/12/nancy_lewis_colorado_river.jpg -------------------------------------------------------------------------------- /public/img/blog/2025/01/mtgarfield.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2025/01/mtgarfield.jpg -------------------------------------------------------------------------------- /public/img/blog/2025/02/ddev-2025-plans.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2025/02/ddev-2025-plans.png -------------------------------------------------------------------------------- /public/img/blog/2025/02/nancy-lewis-winter-scene.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2025/02/nancy-lewis-winter-scene.jpg -------------------------------------------------------------------------------- /public/img/blog/2025/02/open-source-mutagen-docker-banner.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2025/02/open-source-mutagen-docker-banner.jpeg -------------------------------------------------------------------------------- /public/img/blog/2025/03/ddev-addon-comment.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2025/03/ddev-addon-comment.gif -------------------------------------------------------------------------------- /public/img/blog/2025/03/ddev-addon-registry.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2025/03/ddev-addon-registry.png -------------------------------------------------------------------------------- /public/img/blog/2025/03/ddev-addon-search.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2025/03/ddev-addon-search.gif -------------------------------------------------------------------------------- /public/img/blog/2025/03/ddev-addon-sort.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2025/03/ddev-addon-sort.gif -------------------------------------------------------------------------------- /public/img/blog/2025/03/ddev-addon-type.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2025/03/ddev-addon-type.gif -------------------------------------------------------------------------------- /public/img/blog/2025/03/ddev-github-sponsors.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2025/03/ddev-github-sponsors.png -------------------------------------------------------------------------------- /public/img/blog/2025/03/palisade-vinelands.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2025/03/palisade-vinelands.jpg -------------------------------------------------------------------------------- /public/img/blog/2025/03/the-drop-times-promotion.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2025/03/the-drop-times-promotion.png -------------------------------------------------------------------------------- /public/img/blog/2025/04/apple-silicon-intel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2025/04/apple-silicon-intel.png -------------------------------------------------------------------------------- /public/img/blog/2025/04/ddev-add-on-registry.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2025/04/ddev-add-on-registry.png -------------------------------------------------------------------------------- /public/img/blog/2025/04/ddev-router-traefik.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2025/04/ddev-router-traefik.png -------------------------------------------------------------------------------- /public/img/blog/2025/04/nancy-lewis-my-first-painting-in-palisade.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2025/04/nancy-lewis-my-first-painting-in-palisade.jpg -------------------------------------------------------------------------------- /public/img/blog/2025/04/randy-mentoring-drupalcon-atlanta.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2025/04/randy-mentoring-drupalcon-atlanta.jpg -------------------------------------------------------------------------------- /public/img/blog/2025/04/sample-wordpress-grav-page-render.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2025/04/sample-wordpress-grav-page-render.png -------------------------------------------------------------------------------- /public/img/blog/2025/04/stas-sort-of-at-drupalcon-atlanta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2025/04/stas-sort-of-at-drupalcon-atlanta.png -------------------------------------------------------------------------------- /public/img/blog/2025/04/typo3-xhgui.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2025/04/typo3-xhgui.png -------------------------------------------------------------------------------- /public/img/blog/2025/04/wordpress-offramp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2025/04/wordpress-offramp.png -------------------------------------------------------------------------------- /public/img/blog/2025/05/museums-victoria-Di7WfLcrJ_I-unsplash.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2025/05/museums-victoria-Di7WfLcrJ_I-unsplash.jpg -------------------------------------------------------------------------------- /public/img/blog/2025/05/rattlesnake-arches.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/blog/2025/05/rattlesnake-arches.jpg -------------------------------------------------------------------------------- /public/img/discord.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/discord.png -------------------------------------------------------------------------------- /public/img/edit-docs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/edit-docs.png -------------------------------------------------------------------------------- /public/img/generic-thumbnail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/generic-thumbnail.png -------------------------------------------------------------------------------- /public/img/og-default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/og-default.png -------------------------------------------------------------------------------- /public/img/og-support.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/og-support.png -------------------------------------------------------------------------------- /public/img/pr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/img/pr.png -------------------------------------------------------------------------------- /public/logos/1xinternet-square.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/logos/1xinternet.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/logos/affinity-bridge-square.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /public/logos/amazee-io-square.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | 11 | 13 | 15 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /public/logos/anwesoft-square.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/logos/anwesoft-square.png -------------------------------------------------------------------------------- /public/logos/b13-darkmode.svg: -------------------------------------------------------------------------------- 1 | 2 | 15 | 17 | 35 | 37 | 40 | 41 | 46 | 50 | 54 | 55 | 56 | -------------------------------------------------------------------------------- /public/logos/b13.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/logos/backdrop.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/logos/centarro-logo-dark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /public/logos/centarro-logo-light.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /public/logos/centarro-square.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/logos/centarro.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/logos/craft-cms-square.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/logos/craft.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/logos/dark-ddev.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/logos/dark-tag1.svg: -------------------------------------------------------------------------------- 1 | 2 | 12 | 14 | 32 | 36 | 41 | 46 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /public/logos/ddev-mark.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/logos/ddev.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/logos/ddev.png -------------------------------------------------------------------------------- /public/logos/ddev.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/logos/drupal.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/logos/drupaleasy-darkmode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/logos/drupaleasy-darkmode.png -------------------------------------------------------------------------------- /public/logos/drupaleasy-square.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/logos/drupaleasy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/logos/drupaleasy.png -------------------------------------------------------------------------------- /public/logos/fame-square.svg: -------------------------------------------------------------------------------- 1 | 2 | 15 | 17 | 35 | 39 | 40 | -------------------------------------------------------------------------------- /public/logos/i-gelb-square.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/logos/jetbrains-square.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /public/logos/laravel.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/logos/lullabot-square.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/logos/mac-stadium-square.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/logos/magento.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/logos/memcached.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/logos/mobilistics-square.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/logos/nginx.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/logos/oliver-wand.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/logos/oliver-wand.jpg -------------------------------------------------------------------------------- /public/logos/php.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/logos/platform.sh-square.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/logos/postgresql.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddev/ddev.com/00dd14f922c54c3fc80dd4cfc9eedf08cc69fd66/public/logos/postgresql.png -------------------------------------------------------------------------------- /public/logos/powershell.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/logos/redfin-solutions-square.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/logos/tag1-square.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/logos/tag1.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /public/logos/typo3.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/logos/undpaul-square.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/logos/undpaul.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/logos/wordpress.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/components/AppLogos.astro: -------------------------------------------------------------------------------- 1 | --- 2 | /** 3 | * Supported framework names and logos used on the homepage. 4 | */ 5 | const logos = [ 6 | { name: "Drupal", src: "/logos/drupal.svg", extraClasses: [] }, 7 | { name: "WordPress", src: "/logos/wordpress.svg", extraClasses: [] }, 8 | { name: "TYPO3 CMS", src: "/logos/typo3.svg", extraClasses: [] }, 9 | { name: "Magento", src: "/logos/magento.svg", extraClasses: [] }, 10 | { name: "Backdrop CMS", src: "/logos/backdrop.svg", extraClasses: [] }, 11 | { name: "Craft CMS", src: "/logos/craft.svg", extraClasses: ["w-7"] }, 12 | { name: "Laravel", src: "/logos/laravel.svg", extraClasses: ["w-7"] }, 13 | ] 14 | --- 15 | 16 |
17 |
18 |
19 | { 20 | logos.map((logo) => ( 21 |
22 | {`${logo.name} 27 |
28 | )) 29 | } 30 |
31 |
32 |
33 | -------------------------------------------------------------------------------- /src/components/Badge.astro: -------------------------------------------------------------------------------- 1 |
2 | 3 |
-------------------------------------------------------------------------------- /src/components/Benefits.astro: -------------------------------------------------------------------------------- 1 | --- 2 | /** 3 | * Benefit breakdown used on the homepage. 4 | */ 5 | 6 | import { CheckIcon } from "@heroicons/react/24/solid/index.js" 7 | 8 | const features = [ 9 | { 10 | name: "Efficient Onboarding", 11 | description: 12 | "Fast spinup and easy sharing let everyone skip the devops and get back to the code.", 13 | }, 14 | { 15 | name: "Identical Environments", 16 | description: 17 | "Use the exact same setup across machines, team members, and even hosted environments.", 18 | }, 19 | { 20 | name: "Tailored Projects", 21 | description: 22 | "Focus on the software you need for each project without installing anything on your workstation.", 23 | }, 24 | { 25 | name: "Proven Support & Maintenance", 26 | description: 27 | "Agencies, enterprise businesses, and open source communities have trusted and shaped DDEV’s evolution for years.", 28 | }, 29 | { 30 | name: "Wholesome Ingredients", 31 | description: 32 | "Built on sturdy, industry-standard technologies, including open source projects like Docker and Go.", 33 | }, 34 | { 35 | name: "Quick and Capable", 36 | description: 37 | "Opinionated architecture focused on daily use, and highly adaptable when you need more.", 38 | }, 39 | ] 40 | --- 41 | 42 |
43 |
44 |
45 |

Benefits

46 |

47 | Made for people that make websites. 48 |

49 |

50 | DDEV handles Docker so you and your team can focus on your work. 51 |

52 |
53 |
56 | { 57 | features.map((feature) => ( 58 |
59 |
60 |
68 |
69 | {feature.description} 70 |
71 |
72 | )) 73 | } 74 |
75 |
76 |
77 | -------------------------------------------------------------------------------- /src/components/BlogFeatures.astro: -------------------------------------------------------------------------------- 1 | --- 2 | /** 3 | * Cards for the three most recent blog posts, shown on the homepage. 4 | */ 5 | 6 | import BlogPostCard from "./BlogPostCard.astro" 7 | import { getCollection } from "astro:content" 8 | 9 | const posts = await getCollection("blog") 10 | const recentPosts = posts 11 | .sort((a, b) => { 12 | return new Date(a.data.pubDate) > new Date(b.data.pubDate) ? -1 : 1 13 | }) 14 | .slice(0, 3) 15 | --- 16 | 17 |
18 |
19 |
20 |

21 | Latest Blog Posts 22 |

23 |
24 |
25 | {recentPosts.map((post) => )} 26 |
27 |
28 |
29 | -------------------------------------------------------------------------------- /src/components/BlogPostFooter.astro: -------------------------------------------------------------------------------- 1 | --- 2 | export interface Props { 3 | activeSlug: string 4 | } 5 | 6 | const { activeSlug } = Astro.props 7 | import { getCollection } from "astro:content" 8 | 9 | let next, prev 10 | 11 | const posts = await getCollection("blog") 12 | const orderedPosts = posts.sort((a, b) => { 13 | return new Date(a.data.pubDate) > new Date(b.data.pubDate) ? -1 : 1 14 | }) 15 | 16 | orderedPosts.forEach((post, index) => { 17 | if (post.id === activeSlug) { 18 | if (posts[index - 1]) { 19 | prev = posts[index - 1] 20 | } 21 | 22 | if (posts[index + 1]) { 23 | next = posts[index + 1] 24 | } 25 | } 26 | }) 27 | --- 28 | 29 | 67 | -------------------------------------------------------------------------------- /src/components/Contributors.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { getContributors } from "../lib/api.js" 3 | import { Image } from 'astro:assets'; 4 | 5 | import FeaturedSponsors from "./FeaturedSponsors.astro" 6 | import Sponsors from "./Sponsors.astro" 7 | 8 | const contributors = await getContributors() 9 | --- 10 | 11 |
12 |
13 |
14 |

15 | Our Wonderful Supporters 16 |

17 |
18 | 19 |

20 | GitHub Contributors 21 |

22 |
23 | { 24 | contributors.map((contributor) => ( 25 | 31 | {`${contributor.login} 38 | 39 | )) 40 | } 41 |
42 | 43 |

44 | Featured Sponsors 45 |

46 |
47 | 48 |
49 | 50 |

51 | GitHub Sponsors 52 |

53 |
54 | 55 |
56 |
57 |
58 | -------------------------------------------------------------------------------- /src/components/CtaButton.astro: -------------------------------------------------------------------------------- 1 | --- 2 | export interface Props { 3 | text: string 4 | href: string 5 | type?: string 6 | target?: string 7 | } 8 | 9 | const typeClasses = { 10 | default: `border border-transparent text-white bg-blue-650 hover:bg-blue-800`, 11 | hollow: `border border-blue-650 text-blue-650 hover:border-blue-800 hover:text-blue-800 dark:hover:text-blue-500 hover:border-blue-500`, 12 | } 13 | 14 | const { text, href, type = "default", target } = Astro.props 15 | --- 16 | 17 | 24 | {text} 25 | 26 | -------------------------------------------------------------------------------- /src/components/FeatureImage.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { marked } from "marked" 3 | import { Picture } from 'astro:assets' 4 | 5 | export interface Props { 6 | src: string 7 | alt: string 8 | caption?: string 9 | credit?: string 10 | shadow?: boolean 11 | } 12 | 13 | const { src, alt, caption = "", credit, shadow = false } = Astro.props 14 | --- 15 | 16 |
17 | { 18 | src.includes(".svg") ? ( 19 | {alt} 20 | ) : ( 21 |
26 | 33 |
34 | ) 35 | } 36 | { 37 | (caption || credit) && ( 38 |
39 | {caption && } 40 | {credit && ( 41 | 42 | {caption && } 43 | 44 | 45 | )} 46 |
47 | ) 48 | } 49 |
50 | -------------------------------------------------------------------------------- /src/components/FeaturedSponsors.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import featuredSponsors from "../featured-sponsors.json" 3 | 4 | /** 5 | * Sketchy array of classes that should be applied to specific logos 6 | * in this context. Match the name from `featured-sponsors.json` if 7 | * you need to add one. 8 | */ 9 | const nudges = { 10 | Tag1: "h-9 self-center", // Added self-center to align it vertically 11 | "Oliver Wand": "h-12 w-12", 12 | DrupalEasy: "h-10", 13 | "Redfin Solutions": "h-16 w-16", 14 | MacStadium: "h-15", 15 | Lullabot: "h-9", 16 | "Craft CMS": "h-11", 17 | undpaul: "h-9", 18 | "1xINTERNET": "h-11", 19 | } 20 | 21 | // Separate lead sponsors from regular sponsors 22 | const leadSponsors = featuredSponsors.filter(sponsor => sponsor.isLeading === true) 23 | const regularSponsors = featuredSponsors.filter(sponsor => sponsor.isLeading !== true) 24 | 25 | // Add class property to relevant sponsor objects 26 | regularSponsors.map((sponsor) => { 27 | if (sponsor.name in nudges) { 28 | sponsor.class = nudges[sponsor.name] 29 | } 30 | }) 31 | --- 32 | 33 |
34 | {/* Lead Sponsors Section */} 35 | {leadSponsors.length > 0 && ( 36 |
37 | {leadSponsors.map((sponsor) => ( 38 | 44 | 45 | 48 | {`${sponsor.name} 53 | 54 | 55 | ))} 56 |
57 | )} 58 | 59 | {/* Regular Sponsors Section */} 60 |
63 | {regularSponsors.map((sponsor) => ( 64 | 73 | 74 | 77 | {`${sponsor.name} 82 | 83 | 84 | ))} 85 |
86 |
-------------------------------------------------------------------------------- /src/components/Hero.astro: -------------------------------------------------------------------------------- 1 | --- 2 | /** 3 | * The large, leading copy and image used on the homepage. 4 | */ 5 | import Badge from "@components/Badge.astro" 6 | import CtaButton from "@components/CtaButton.astro" 7 | import Icon from "@components/Icon.astro" 8 | import AnimatedTerminal from "./AnimatedTerminal.astro" 9 | import { CloudIcon } from "@heroicons/react/24/solid/index.js" 10 | --- 11 | 12 |
13 |
14 |
15 |

16 | Docker-based PHP development environments. 17 |

18 |

19 | Container superpowers with zero required Docker skills: environments in 20 | minutes, multiple concurrent projects, and less time to deployment. 21 |

22 | 23 |
26 | 27 | 33 |
34 |
35 | 36 |
37 |
    38 |
  • 39 | 41 | 42 | macOS M SeriesIntel 43 |
  • 44 |
  • 45 | 47 | Windows 48 |
  • 49 |
  • 50 | 52 | Linux 53 |
  • 54 |
  • 55 | 57 | Cloud 58 | Codespaces 59 |
  • 60 |
61 |
62 |
63 | 64 |
65 |
66 | 67 |
68 |
69 |
70 | -------------------------------------------------------------------------------- /src/components/Paging.astro: -------------------------------------------------------------------------------- 1 | --- 2 | /** 3 | * Simple back/next paging for blog post listings. 4 | */ 5 | import { 6 | ArrowLeftIcon, 7 | ArrowRightIcon, 8 | } from "@heroicons/react/24/solid/index.js" 9 | 10 | export interface Props { 11 | nextURL?: string 12 | prevURL?: string 13 | nextLabel?: string 14 | prevLabel?: string 15 | } 16 | 17 | const { 18 | nextURL, 19 | prevURL, 20 | nextLabel = "Older Posts", 21 | prevLabel = "Newer Posts", 22 | } = Astro.props 23 | --- 24 | 25 | 53 | -------------------------------------------------------------------------------- /src/components/PostBody.astro: -------------------------------------------------------------------------------- 1 | --- 2 | /** 3 | * A wrapper that adds `.prose` for post content. 4 | */ 5 | --- 6 | 7 |
8 | 9 |
10 | -------------------------------------------------------------------------------- /src/components/PostUpdate.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { marked } from "marked" 3 | import { formatDate } from "src/lib/api" 4 | 5 | export interface Props { 6 | date: string 7 | comment?: string 8 | } 9 | 10 | const { date, comment } = Astro.props 11 | --- 12 | 13 | 18 | 19 | 27 | -------------------------------------------------------------------------------- /src/components/RepoCard.astro: -------------------------------------------------------------------------------- 1 | --- 2 | /** 3 | * A single card used for displaying repository details, including 4 | * auto-fetched stargazer count. 5 | */ 6 | import { StarIcon } from "@heroicons/react/24/outline/index.js" 7 | import { getRepoDetails } from "../lib/api" 8 | 9 | export interface Props { 10 | name: string 11 | description: string 12 | } 13 | 14 | const { name, description } = Astro.props 15 | 16 | const repoData = await getRepoDetails(name) 17 | --- 18 | 19 | 23 |
24 |
25 |

{name}

26 |
27 | {" "} 31 | {parseInt(repoData.stargazers_count || 0).toLocaleString("en-US")} 32 |
33 |
34 |

35 | {description} 36 |

37 |
38 |
39 | -------------------------------------------------------------------------------- /src/components/SoftwareLogos.astro: -------------------------------------------------------------------------------- 1 | --- 2 | --- 3 | 4 |
5 |
6 |
7 |
8 | PHP logo 9 |
10 |
11 | Node.js logo 12 |
13 |
14 | MySQL logo 15 |
16 |
17 | PostgreSQL logo 22 |
23 |
24 | nginx logo 25 |
26 |
27 | Apache logo 28 |
29 |
30 | Redis logo 31 |
32 |
33 | Memcached logo 34 |
35 |
36 |
37 |
38 | -------------------------------------------------------------------------------- /src/components/Tabs.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { customAlphabet } from "nanoid/non-secure" 3 | 4 | export interface Props { 5 | order: string[] 6 | } 7 | 8 | const { order } = Astro.props 9 | 10 | const getId = () => { 11 | const nanoid = customAlphabet("1234567890abcdefghijklmnopqrstuvwxyz", 6) 12 | return nanoid() 13 | } 14 | 15 | const slotNames = Object.entries(Astro.slots).map(([name]) => { 16 | return name 17 | }) 18 | 19 | let tabs: object[] = [] 20 | 21 | order.map((label) => { 22 | if (slotNames.includes(label)) { 23 | tabs.push({ 24 | label: label, 25 | uid: getId(), 26 | }) 27 | } 28 | }) 29 | --- 30 | 31 | 73 | 74 | 75 |
76 | 91 | 92 |
93 | { 94 | tabs.map(async (tab, index) => ( 95 |
101 | )) 102 | } 103 |
104 |
105 | 106 | -------------------------------------------------------------------------------- /src/components/Terminal.astro: -------------------------------------------------------------------------------- 1 | --- 2 | /** 3 | * This is a visual wrapper that puts simple terminal GUI around a code block 4 | * to help convey that it’s depicting a terminal session and not code. 5 | */ 6 | 7 | import { 8 | XMarkIcon, 9 | MinusIcon, 10 | StopIcon, 11 | } from "@heroicons/react/24/outline/index.js" 12 | import { Code } from "astro/components" 13 | 14 | export interface Props { 15 | code: string 16 | codeTheme?: string 17 | type?: 18 | | "default" 19 | | "powershell" 20 | | "powershell-ubuntu" 21 | | "admin-powershell" 22 | | "windows-terminal" 23 | | "ubuntu" 24 | } 25 | 26 | const { code, codeTheme = "nord", type = "default" } = Astro.props 27 | 28 | const promptSymbols = { 29 | default: '→', 30 | powershell: '>', 31 | "powershell-ubuntu": '$', 32 | "admin-powershell": '>', 33 | "windows-terminal": '>', 34 | ubuntu: '$', 35 | } 36 | 37 | /** 38 | * Wraps each instance of the symbol appearing as the first character of a line in a code snippet. 39 | */ 40 | const wrapPromptSymbol = (code: string, symbol: string) => { 41 | // Escape the dollar sign 42 | let searchSymbol = (symbol === '$') ? '\\$' : symbol; 43 | 44 | const search = new RegExp(`^${searchSymbol} `, "gm") 45 | return code.replaceAll(search, `${symbol} `) 46 | } 47 | --- 48 | 49 |
50 |
51 | {(type == "default" || type == "ubuntu") && ( 52 |
53 |
54 |
55 | )} 56 | {type == "powershell" && ( 57 | 58 |
59 |
60 |
61 |
62 |
63 | )} 64 | {type == "powershell-ubuntu" && ( 65 | 66 |
67 |
68 |
69 |
70 |
71 | )} 72 |
73 |
74 |
75 |
76 |
77 | -------------------------------------------------------------------------------- /src/components/meta/Icons.astro: -------------------------------------------------------------------------------- 1 | 6 | 12 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/components/meta/StructuredData.astro: -------------------------------------------------------------------------------- 1 | --- 2 | export interface Props { 3 | data: object 4 | } 5 | 6 | const { data } = Astro.props 7 | const dataString = JSON.stringify(data) 8 | --- 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/components/quickstart/Cloud.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Terminal from "@components/Terminal.astro" 3 | import Tabs from "@components/Tabs.astro" 4 | import { Code } from "astro/components" 5 | import CommunityCTA from "./CommunityCTA.astro" 6 | import Examples from "./Examples.astro" 7 | 8 | export interface Props { 9 | latestVersion: string 10 | } 11 | 12 | const { latestVersion } = Astro.props 13 | --- 14 | 15 |
16 |

17 | 1/2Launch a 18 | Provider & Install DDEV 19 |

20 | 21 | 22 | 23 |
24 |
    25 |
  1. 26 | Create a new codespace for your project or open an existing one. 30 |
  2. 31 |
  3. 32 | Edit the project’s .devcontainer/devcontainer.json file: 33 | 44 |
  4. 45 |
  5. 46 | Save the file and rebuild the container by running VS Code’s 47 | “Codespaces: Rebuild Container” action. ( + SHIFT + P on a Mac or CTRL + SHIFT + P on Windows, then search for “rebuild”.) 52 |
  6. 53 |
54 |
55 | Open in GitHub Codespaces 63 | 64 |
65 |
66 | 67 |

Confirm that you’ve now got DDEV installed: 🎉

68 | 69 | 70 |
71 | 72 | 73 | 74 |
75 | 76 |
77 | -------------------------------------------------------------------------------- /src/components/quickstart/CommunityCTA.astro: -------------------------------------------------------------------------------- 1 |
2 |

Join the DDEV Community

3 |

4 | DDEV is an open source project with a growing community, and there are lots 5 | of ways to get involved! 6 |

7 |
8 | -------------------------------------------------------------------------------- /src/const.ts: -------------------------------------------------------------------------------- 1 | export const SITE_TITLE = "DDEV" 2 | export const SITE_DESCRIPTION = 3 | "Docker-based local PHP+Node.js web development environments." 4 | export const STORE_URL = "https://ddev.threadless.com" 5 | export const BLUESKY_URL = "https://bsky.app/profile/ddev.bsky.social" 6 | export const LINKEDIN_URL = "https://www.linkedin.com/company/ddev-foundation" 7 | export const GITHUB_REPO = "ddev/ddev" 8 | export const GITHUB_URL = "https://github.com/ddev/ddev" 9 | export const GITHUB_URL_WEBSITE = 10 | "https://github.com/ddev/ddev.com/tree/main/src/content/blog" 11 | export const GITHUB_ISSUES_URL = "https://github.com/ddev/ddev/issues" 12 | export const DOCUMENTATION_URL = "https://ddev.readthedocs.io/" 13 | export const ADDON_REGISTRY_URL = "https://addons.ddev.com/" 14 | export const DISCORD_URL = "/s/discord" 15 | export const EMAIL_URL = "mailto:support%40ddev.com" 16 | export const MEETING_URL = "https://cal.com/randyfay/30min" 17 | export const COPYRIGHT_HOLDER = "DDEV Foundation" 18 | export const MASTODON_URL = "https://fosstodon.org/@ddev" 19 | export const ORG_STREET = "848 Montclair Dr" 20 | export const ORG_CITY = "Palisade" 21 | export const ORG_STATE = "Colorado" 22 | export const ORG_STATE_ABBR = "CO" 23 | export const ORG_POSTAL_CODE = "81526" 24 | export const ORG_COUNTRY = "USA" 25 | export const ORG_NAME = "DDEV Foundation" 26 | export const ORG_EMAIL = "support@localdev.foundation" 27 | export const ORG_PHONE = "+1 970 462-7450" 28 | export const ORG_FOUNDED = "2021-09-02" 29 | export const ORG_SAME_AS = [ 30 | "https://github.com/ddev", 31 | "https://localdev.foundation", 32 | ] 33 | export const BLOG_DESCRIPTION = `Posts about DDEV, Docker, and local development.` 34 | -------------------------------------------------------------------------------- /src/content.config.ts: -------------------------------------------------------------------------------- 1 | import { defineCollection, z } from "astro:content" 2 | import fs2 from "fs" 3 | import { glob as oldglob } from "glob" 4 | import { glob as contentGlob } from "astro/loaders" 5 | 6 | const allowedCategories = [ 7 | "Announcements", 8 | "Community", 9 | "DevOps", 10 | "Performance", 11 | "Guides", 12 | "TechNotes", 13 | "Training", 14 | "Videos", 15 | ] 16 | 17 | /** 18 | * Quick and dirty method that returns full names of all existing authors. 19 | * @returns array of `name` values from author entry frontmatter 20 | */ 21 | const getAuthorNames = () => { 22 | const files = oldglob.sync(`./src/content/authors/*.md`) 23 | const authorNames = files.map((file) => { 24 | const contents = fs2.readFileSync(file, "utf-8") 25 | const result = contents.match(new RegExp("name: (.*)")) 26 | return result[1] 27 | }) 28 | 29 | return authorNames 30 | } 31 | 32 | /** 33 | * Below we’re defining schemas for our Content Collections so their 34 | * frontmatter can be validated. 35 | * 36 | * Feature: https://docs.astro.build/en/guides/content-collections/ 37 | * Validation library: https://zod.dev/ 38 | */ 39 | 40 | const authorCollection = defineCollection({ 41 | loader: contentGlob({ 42 | pattern: "**/[^_]*.md", 43 | base: "./src/content/authors", 44 | }), 45 | schema: z.object({ 46 | name: z.string(), 47 | firstName: z.string(), 48 | avatarUrl: z.string().optional(), 49 | }), 50 | }) 51 | 52 | const blogCollection = defineCollection({ 53 | loader: contentGlob({ pattern: "**/[^_]*.md", base: "./src/content/blog" }), 54 | schema: z.object({ 55 | title: z.string(), 56 | summary: z.string().optional(), 57 | pubDate: z.date(), 58 | modifiedDate: z.date().optional(), 59 | modifiedComment: z.string().optional(), 60 | author: z.enum(getAuthorNames()), 61 | featureImage: z 62 | .object({ 63 | src: z.string(), 64 | alt: z.nullable(z.string()), 65 | caption: z.nullable(z.string()).optional(), 66 | credit: z.nullable(z.string()).optional(), 67 | shadow: z.boolean().optional(), 68 | hide: z.boolean().optional(), 69 | }) 70 | .optional(), 71 | categories: z.array(z.enum(allowedCategories)), 72 | }), 73 | }) 74 | 75 | export const collections = { 76 | blog: blogCollection, 77 | authors: authorCollection, 78 | } 79 | -------------------------------------------------------------------------------- /src/content/authors/alberto-g-viu.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Alberto G. Viu 3 | firstName: Alberto 4 | avatarUrl: /img/avatar/alberto.png 5 | --- 6 | 7 | Alberto is passionate about technology in general and software development in particular. He worked as IT Specialist before switching to development because he wanted to create programs and websites. 8 | After many years building Drupal-related sites in both commercial and personal projects, he started moving out of the island looking for new adventures. He's now focused in becoming a great Go + Flutter engineer. 9 | -------------------------------------------------------------------------------- /src/content/authors/bernardo-martinez.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bernardo Martinez 3 | firstName: Bernardo 4 | avatarUrl: /img/avatar/bernardo.png 5 | --- 6 | 7 | [Bernardo](https://github.com/bmartinez287) has worked as a web developer for HigherEd, Government, and Nonprofits. His computer science background triggers his curiosity to explore a different aspects of software engineering from devOps/sysadmin to mobile development. However, his specialty for the past 5 years has been with Drupal and WordPress. In his free time, he enjoys CrossFit, running, and other outdoor adventures. After years of Drupal work, he is delighted to increase his open source contributions and empower others to do so. 8 | -------------------------------------------------------------------------------- /src/content/authors/garvin-hicking.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Garvin Hicking 3 | firstName: Garvin 4 | avatarUrl: https://0.gravatar.com/avatar/c796fffa839dbc5b435bcba90a5d6df19a20d66be817405ceddafda8679be05a?size=512&d=initials 5 | --- 6 | 7 | [Garvin Hicking](https://garv.in) is a PHP and TYPO3 webdeveloper in Cologne, Germany. He is an OpenSource contributor to the [TYPO3](https://typo3.org) project, and formerly worked on [Serendipity](https://s9y.org) and [phpMyAdmin](https://phpmyadmin.net). 8 | -------------------------------------------------------------------------------- /src/content/authors/heather-mcnamee.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Heather McNamee 3 | firstName: Heather 4 | avatarUrl: https://0.gravatar.com/avatar/3ea636a8e0af50ed4329205c93b7f1c3?s=96&d=mm&r=g 5 | --- 6 | 7 | Heather McNamee, Open Strategy Partners, is a technical communications and marketing professional with an MSc in Learning and Technology. She uses marketing skills for good, enabling the right audiences to find, learn, and get the most out of products they love. Her more than 15 years in open source technologies and associated start-ups started with using Drupal in 2002 in a not-for-profit. She’s developed hundreds of hours of learning and certification materials to facilitate open source technology and product adoption. As a contributor, she has helped run and promote events, especially in the Irish Drupal community. 8 | -------------------------------------------------------------------------------- /src/content/authors/j-minder.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: J. Minder 3 | firstName: J. 4 | avatarUrl: https://www.gravatar.com/avatar/b666ac0fd7d5938a7079a64c2d5ef932 5 | --- 6 | 7 | [ayalon](https://www.drupal.org/u/ayalon) is a software developer and architect at [Liip](https://liip.ch). Mainly focuses on PHP (Drupal) and TypeScript (Nuxt, Vue). 8 | 9 | Building large websites leveraging the new editor experience with [blokk.li](https://blokk.li) for Drupal. 10 | -------------------------------------------------------------------------------- /src/content/authors/jeffrey-a-mcguire.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Jeffrey A. McGuire 3 | firstName: Jeffrey 4 | avatarUrl: https://2.gravatar.com/avatar/22d3c6830b0808b37a8d97b6eb8b7255?s=96&d=mm&r=g 5 | --- 6 | 7 | Jeffrey A. “jam” McGuire, Partner at Open Strategy Partners – In demand as a global keynote speaker and communications expert, he has built a strong following at the intersection of open source software, business, and culture. Over the last decade, while helping Acquia grow from 18 to 800 employees, he created value-multiplying connections between people, companies, and projects in the open source, government, and business worlds. His unique approach to content marketing–making human stories out of complex technology solutions and celebrating the expertise and success of their creators–left its mark on the company and the open source communities around it. 8 | -------------------------------------------------------------------------------- /src/content/authors/jeremy-gonyea.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Jeremy Gonyea 3 | firstName: Jeremy 4 | avatarUrl: https://avatars.githubusercontent.com/u/1057441 5 | --- 6 | 7 | [Jeremy](https://github.com/jgonyea) is the CTO/ CISO for a local programming company. He lives a simple life with lots of technology added. 8 | -------------------------------------------------------------------------------- /src/content/authors/jochen-roth.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Jochen Roth 3 | firstName: Jochen 4 | avatarUrl: https://avatars.githubusercontent.com/u/4623070 5 | --- 6 | 7 | Jochen works at B13 creating websites based on TYPO3. 8 | -------------------------------------------------------------------------------- /src/content/authors/lasse-blomenkemper.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Lasse Blomenkemper 3 | firstName: Lasse 4 | avatarUrl: /img/avatar/lasse.jpg 5 | --- 6 | 7 | Lasse Blomenkemper is the Chief Technology Officer at [i-gelb](https://i-gelb.net) located in Cologne. He has a passion for solving all kinds of problems, mostly using code. 8 | -------------------------------------------------------------------------------- /src/content/authors/matt-stein.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Matt Stein 3 | firstName: Matt 4 | avatarUrl: /img/avatar/matt.png 5 | --- 6 | 7 | [Matt](https://github.com/mattstein) is a designer that’s been doing CMS-based development for clients using PHP, Twig, and different front-end frameworks. He's fond of writing, documentation, and content strategy. 8 | -------------------------------------------------------------------------------- /src/content/authors/matthias-andrasch.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Matthias Andrasch 3 | firstName: Matthias 4 | avatarUrl: https://0.gravatar.com/avatar/5d11527ed305d67836412fae4c956111b5833820aa49636391fe87497ff1a929?size=128 5 | --- 6 | 7 | [Matthias](https://mandrasch.dev/) is a web developer who is interested in climate and social justice. He likes to share and discuss experiments within the DDEV community and improve the daily life of developers. 8 | -------------------------------------------------------------------------------- /src/content/authors/randy-fay.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Randy Fay 3 | firstName: Randy 4 | avatarUrl: https://2.gravatar.com/avatar/eaa4a82dca6b5d2d0b58e784231caf3a?s=96&d=mm&r=g 5 | --- 6 | 7 | Randy loves dueling with computers and his career has spanned Apple ][ home automation, Unix/Linux kernel driver development, Windows, Drupal, and loads of fun system administration and DevOps work. After years of Drupal work he's delighted to be working on DDEV-Local, which provides an easy way to do web development locally. 8 | -------------------------------------------------------------------------------- /src/content/authors/rick-manelius.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Rick Manelius 3 | firstName: Rick 4 | --- 5 | 6 | Rick graduated from MIT with a BS and PhD in Materials Science and Engineering (where he also coached track and field) and quickly became a valued member of the team shortly after joining newmedia in 2012. If you ever want to know about the quantum electrodynamic interactions of carbon nanotube systems, he’s your guy! In addition to his considerable talent in all things technical, his specific expertise is in understanding the big picture, and helping identify challenges and provide solutions long before a problem has a chance to develop. His analogous nickname here is the Swiss Army Knife. Rick’s a software developer, media technologist and project manager, but please don’t ask him to design anything. We all have our limits. Rick loves to learn, share, and connect with like-minded people, and he lives in the greater Denver area with his wife Emily and their dog Linus. 7 | -------------------------------------------------------------------------------- /src/content/authors/sergey-fayngold.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Sergey Fayngold 3 | firstName: Sergey 4 | avatarUrl: /img/avatar/sergey.jpg 5 | --- 6 | 7 | [Sergey Fayngold](https://github.com/NBZ4live) is Head of Web Development at [MY.GAMES](https://my.games/) in Amsterdam and [contributed to DDEV](https://github.com/ddev/ddev/releases/tag/v1.15.0) by adding explicit Laravel support. 8 | -------------------------------------------------------------------------------- /src/content/authors/stas-zhuk.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Stas Zhuk 3 | firstName: Stas 4 | avatarUrl: /img/avatar/stasadev.jpg 5 | --- 6 | 7 | [Stas](https://github.com/stasadev) has a background in PHP Laravel development and is known for maintaining DDEV and exploring Arch-based systems. He enjoys experimenting with cutting-edge software, embracing the occasional breakage. When not immersed in code, Stas enjoys playing chess. 8 | -------------------------------------------------------------------------------- /src/content/authors/tony-groff.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Tony Groff 3 | firstName: Tony 4 | avatarUrl: https://0.gravatar.com/avatar/9161de1c0e26f072027556f27df02a3f6abba5693bf6f6585e10b23d7e92182e?size=128 5 | --- 6 | 7 | [Tony](https://www.drupal.org/u/rowbotony) has been an _Ambitious Site Builder_ since his career began in the late '90s at a wireless broadband startup working with Perl and PHP on Unix systems. He began freelancing in 2003. His first website launched in 1997, and by 2010, he was proficient in Drupal, completing an impactful non-profit project. He admires Drupal's adaptability, versatility, and longevity as a web platform. 8 | -------------------------------------------------------------------------------- /src/content/authors/yuri-gerasymov.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Yuri Gerasymov 3 | firstName: Yuri 4 | avatarUrl: https://0.gravatar.com/userimage/34709762/22e7c17fdf0b855378ae3082f902037b.jpeg?size=128 5 | --- 6 | 7 | [Yuri](https://www.drupal.org/u/ygerasimov) is a software developer, entrepreneur. Mainly focuses on PHP (Drupal, WordPress, Symfony) and JavaScript (Node, Vue). Public speaker (over a dozen of DrupalCon presentations). Runs SaaS platform https://diffy.website for visual regression testing. 8 | -------------------------------------------------------------------------------- /src/content/blog/501c3.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "DDEV Foundation gets US nonprofit status (501(c)(3))" 3 | pubDate: 2024-03-31 4 | #modifiedDate: 2024-03-03 5 | summary: The US has granted the DDEV Foundation nonprofit status (501(c)(3)) 6 | author: Randy Fay 7 | featureImage: 8 | src: /img/blog/2024/03/uncle-sam-501c3.png 9 | alt: DDEV receives 501(c)(3) status from US Government 10 | credit: "Ideogram.ai: Uncle Sam, the quintessential symbol of the United States, proudly presenting a scroll to a representative of the DDEV Foundation." 11 | categories: 12 | - Announcements 13 | --- 14 | 15 | The DDEV Foundation is now officially a US Nonprofit (501(c)(3)) organization. 16 | 17 | This is great for DDEV because we can receive grants or other benefits that are allowed only for nonprofits. 18 | 19 | It's great for a some US individuals and companies because donations to the DDEV Foundation may be tax-deductible. 20 | 21 | Companies providing support to DDEV do not normally get much benefit from this, because DDEV support is usually an expense which counts against their income. However, there may be some donation situations where a company would want the tax deduction instead (although it usually has less value than reporting an expense). 22 | 23 | US individuals providing direct support to the DDEV Foundation can write off the donation on their federal income tax return. However, to do I think the support must be provided directly to the DDEV Foundation, and not via GitHub. 24 | 25 | Thanks to all of you for working toward realizing our goal of a sustainable project! For more information about how you can support the project, the various ways are explained in [sponsors page](https://github.com/sponsors/ddev). See more about our long-term financial goals at [Expanding the DDEV maintainer team - how we'll fund it](expanding-ddev-maintainer-team.md). 26 | 27 | ![US 501(c)(3) non-profit](/img/blog/2024/03/501c3.png) 28 | -------------------------------------------------------------------------------- /src/content/blog/ddev-addon-registry-introduction.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "DDEV Add-on Registry Introduction" 3 | pubDate: 2025-03-03 4 | #modifiedDate: 2025-03-03 5 | summary: Introducing addons.ddev.com website 6 | author: Stas Zhuk 7 | featureImage: 8 | src: /img/blog/2025/03/ddev-addon-registry.png 9 | alt: DDEV Add-on Registry website 10 | categories: 11 | - Announcements 12 | --- 13 | 14 | ## Welcome to the DDEV Add-on Registry 15 | 16 | We're excited to introduce , a central hub where the community can explore, contribute to, and enhance the collection of DDEV add-ons. 17 | 18 | The source code is available and your contributions are encouraged at . 19 | 20 | ## Search the Add-ons 21 | 22 | Need to find a specific add-on? Use the search field, and watch results update in real-time as you type. 23 | 24 | ![DDEV Add-on Search](/img/blog/2025/03/ddev-addon-search.gif) 25 | 26 | ## Sorting the Add-ons 27 | 28 | Click on a column title to organize the entries based on that field. A second click will reverse the sort order, and a third click resets it back. 29 | 30 | ![DDEV Add-on Sort](/img/blog/2025/03/ddev-addon-sort.gif) 31 | 32 | ## Add-on Types 33 | 34 | Add-ons fall into two categories: **Official** add-ons, which are supported by the DDEV team, and **Contrib** add-ons, which are supported by the community. 35 | 36 | ![DDEV Add-on Type](/img/blog/2025/03/ddev-addon-type.gif) 37 | 38 | ## Engage by Leaving Comments 39 | 40 | Want to share your thoughts or feedback on an add-on? Scroll to the bottom of an add-on's page and click "Sign in with GitHub". We use [giscus](https://giscus.app/) to manage comments, making it easy to join the conversation by authorizing your GitHub account. You can also react to other comments or add your own insights. 41 | 42 | ![DDEV Add-on Comment](/img/blog/2025/03/ddev-addon-comment.gif) 43 | 44 | ## What's Next? 45 | 46 | The DDEV Add-on Registry is a living project, and we're eager to involve the community in its future. If you have suggestions or want to contribute, head over to . We look forward to your feedback and collaboration! 47 | 48 | Want to keep up as the month goes along? Follow us on 49 | 50 | - [blog](https://ddev.com/blog/) 51 | - [LinkedIn](https://www.linkedin.com/company/ddev-foundation) 52 | - [Mastodon](https://fosstodon.org/@ddev) 53 | - [Bluesky](https://bsky.app/profile/ddev.bsky.social) 54 | - and join our community on [Discord](/s/discord) 55 | -------------------------------------------------------------------------------- /src/content/blog/ddev-debug-test-contributor-training.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Contributor Training: Using `ddev debug test` to support others" 3 | pubDate: 2024-10-12 4 | # modifiedDate: 2024-10-12 5 | summary: Contributor training - interpreting and using `ddev debug test` to support others. 6 | author: Randy Fay 7 | featureImage: 8 | src: /img/blog/2024/10/ddev-debug-test-banner.png 9 | alt: Using `ddev debug test` to support others 10 | categories: 11 | - Training 12 | - Guides 13 | --- 14 | 15 | Here's our October 9, 2024 [Contributor Training](/blog/category/training) on using `ddev debug test` to help other users: 16 | 17 |
18 | 19 |
20 | 21 | ## What is `ddev debug test` anyway? 22 | 23 | `ddev debug test` is really just a [shell script](https://github.com/ddev/ddev/blob/main/cmd/ddev/cmd/scripts/test_ddev.sh) embedded in the `ddev` binary that tries to answer all the questions we've learned to ask in support sessions in our [DDEV Discord channel](/s/discord) and the [issue queue](https://github.com/ddev/ddev/issues). There are so many different things that can affect people's DDEV experience, and asking the questions one by one is hard. So when people just run that one command and we can read through the results, it's a big win. 24 | 25 | ## What does it check? 26 | 27 | - DDEV version, architecture 28 | - Docker provider and configuration 29 | - Operating system and context 30 | - Project configuration and specialized configuration 31 | - Network connectivity inside and outside the container, and DNS name lookup 32 | 33 | `ddev debug test` will often suggest what's going wrong with a person's DDEV/Docker/OS setup, making sure we know what version they're using and what context they're using it in. 34 | 35 | ## How can I contribute to it? 36 | 37 | Add to the script with a PR. Make sure you've manually tested it. 38 | 39 | ## Contributions welcome! 40 | 41 | Your suggestions to improve this blog are welcome. You can do a PR to this blog adding your techniques. Info and a training session on how to do a PR to anything in ddev.com is at [DDEV Website For Contributors](ddev-website-for-contributors.md). 42 | 43 | Join us for the next [DDEV Live Contributor Training](/blog/contributor-training/). Use the [contact](/contact) link to ask for a calendar invitation. 44 | -------------------------------------------------------------------------------- /src/content/blog/ddev-diffy-introduction.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Introduction: The Diffy DDEV plugin" 3 | pubDate: 2024-08-09 4 | modifiedDate: 2025-04-16 5 | summary: Visual regression testing tool Diffy got DDEV integration! 6 | author: Yuri Gerasymov 7 | featureImage: 8 | src: /img/blog/2024/08/camera-and-laptop.jpeg 9 | alt: "Microsoft image creator: camera and laptop" 10 | credit: "Microsoft image creator: camera and laptop" 11 | categories: 12 | - Announcements 13 | --- 14 | 15 | [Diffy](https://diffy.website) is a visual regression testing tool that allows you to take screenshots of your website from different environments and compare them. For example, you can visually compare your production vs. development. Or your local environment vs development. 16 | 17 | We help developers see how their code changes affect the site visually, quickly, and on multiple pages. 18 | 19 | As it is essential to spot the changes as early as possible, we built an integration with DDEV so you can take screenshots from your local environment. 20 | 21 | For that you need a few steps: 22 | 23 | - create an account in Diffy, create a project, API key 24 | - add a DDEV add-on `ddev add-on get diffywebsite/ddev-diffy` and run `ddev restart` 25 | - set API key, project ID in `.ddev/diffy-worker/.env` file 26 | - run screenshots from local environment with `ddev screenshot` and see them uploaded to Diffy 27 | 28 | Once you have screenshots uploaded you can compare them to any other set of screenshots. For example with screenshots from production. 29 | 30 | Here is a [video walkthrough](https://www.loom.com/share/a3b750e32581458f9d2271969bba1bb8) for the comparing local environment with your production with the integration. 31 | -------------------------------------------------------------------------------- /src/content/blog/ddev-in-gitlab-ci.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Using DDEV in GitLab CI Tests" 3 | pubDate: 2024-09-11 4 | #modifiedDate: 2024-09-06 5 | summary: Run DDEV within your GitLab CI pipeline. 6 | author: Jochen Roth 7 | featureImage: 8 | src: /img/blog/2024/09/ddev-blog.png 9 | alt: DDEV running in the GitLab Pipeline 10 | credit: "[Milad Fakurian](https://unsplash.com/de/@fakurian) (Background)" 11 | categories: 12 | - DevOps 13 | --- 14 | 15 | Now you can use DDEV for CI on Gitlab. Spin up your entire tech stack including services (e.g. Solr, RabbitMQ) 16 | required to run the Website within the CI. Even e2e testing is easily possible (e.g. Cypress, Playwright). 17 | 18 | The same DDEV config can be used locally (shared across the team) and within the GitLab CI. 19 | 20 | # How can I run DDEV in GitLab CI? 21 | 22 | GitLab CI can use Docker in Docker (DinD). With DinD, Docker can run inside 23 | the GitLab Runner using the Docker executor. With this setup, you can use DDEV in your GitLab CI setup. 24 | 25 | **([ddev/ddev-gitlab-ci](https://github.com/ddev/ddev-gitlab-ci))** provides the needed Docker image and instructions; 26 | Some additional configuration may be required required. 27 | 28 | Depending on your setup it requires different steps. 29 | 30 | - **gitlab.com** works with no additional configuration. 31 | - **Self-hosted GitLab** requires additional configuration for the Runner (`/etc/gitlab-runner/config.toml`). 32 | 33 | On [ddev/ddev-gitlab-ci](https://github.com/ddev/ddev-gitlab-ci), you'll find tested configuration examples for 34 | 35 | - [gitlab.com](https://github.com/ddev/ddev-gitlab-ci/blob/main/docs/gitlab-com.md) 36 | - [Docker in Docker](https://github.com/ddev/ddev-gitlab-ci/blob/main/docs%2Fdocker.md) 37 | - [Docker in Podman](https://github.com/ddev/ddev-gitlab-ci/blob/main/docs/podman.md) 38 | 39 | Once the runner is configured correctly and you have extended the `.gitlab-ci.yml` with a dedicated 40 | DDEV job you are good to go. 41 | 42 | The [GitLab project template for TYPO3](https://gitlab.com/gitlab-org/project-templates/typo3-distribution/-/blob/main/.template/gitlab-ci-project-template.yml?ref_type=heads#L10-42) 43 | is using DDEV in CI already. 44 | 45 | **Note**: On **GitHub Actions** you can do these things using [ddev/github-action-setup-ddev](https://github.com/ddev/github-action-setup-ddev). 46 | -------------------------------------------------------------------------------- /src/content/blog/ddev-local-trusted-https-certificates.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "DDEV Trusted HTTPS Certificates" 3 | pubDate: 2019-05-23 4 | summary: The importance of local HTTPS, and how to take advantage of it with v1.8.0+. 5 | author: Randy Fay 6 | featureImage: 7 | src: /img/blog/2019/05/home-umami.png 8 | alt: Screenshot of a browser showing a DDEV project with a secure HTTPS connection 9 | shadow: true 10 | categories: 11 | - Guides 12 | --- 13 | 14 | Security is critical on the modern web, and so all sites should ideally be developed, tested, and deployed with HTTPS. But it has been hard to do that in your local development environment. 15 | 16 | With [DDEV](http://github.com/ddev/ddev) you can use the HTTPS version of your project in a browser that trusts your project and you don’t have to click through the nasty security warning this had triggered previously. 17 | 18 | HTTPS with DDEV now works… 19 | 20 | - On macOS, Windows, and Linux 21 | - On Firefox, Chrome, Chromium, Safari 22 | - With curl on the host (macOS and Linux, not Windows) 23 | - With curl inside the web container 24 | 25 | There is a tiny bit of one-time setup to get your OS and browser to trust the root certificate authority that DDEV uses. The 3-minute screencast below shows how installation and setup works on all 3 platforms. 26 | 27 | **macOS**: After installing DDEV v1.8.0 and running `ddev stop --all`, run `mkcert -install` and provide your password at the sudo prompt. 28 | 29 | **Linux**: After installing DDEV v1.8.0 and `ddev stop --all`, run `mkcert -install` and follow the instructions given. You’ll likely have to install the libnss3-tools package (Debian/Ubuntu `apt-get install -y libnss3-tools`). Add /usr/sbin to your path, and `mkcert -install` again. 30 | 31 | **Windows**: After installing DDEV v1.8.0 and `ddev stop --all`, run `mkcert -install` and accept the dialog that pops up. 32 | 33 | This entire feature is made possible by the outstanding [mkcert](https://github.com/FiloSottile/mkcert) project, another major triumph of open-source and open-source collaboration. Thanks to [@FiloSottile](https://github.com/FiloSottile) for an outstanding project. 34 | 35 | The [DDEV Installation Documentation](https://ddev.readthedocs.io/en/stable/#installation) has full details about mkcert operation. 36 | -------------------------------------------------------------------------------- /src/content/blog/ddev-may-2025-newsletter.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "DDEV May 2025 Newsletter" 3 | pubDate: 2025-05-06 4 | #modifiedDate: 2025-04-07 5 | summary: "Highlights: special-networking guides, add-on maintenance tips, community tool highlights, and Randy’s bikepacking plans." 6 | author: Randy Fay 7 | featureImage: 8 | src: /img/blog/2025/05/rattlesnake-arches.jpg 9 | alt: Rattlesnake Arches, western Colorado 10 | credit: "Photo by Randy Fay" 11 | categories: 12 | - Community 13 | --- 14 | 15 | **Welcome to the May 2025 DDEV Newsletter** 16 | This month: special-networking guides, add-on maintenance tips, community tool highlights, and Randy’s bikepacking plans. 17 | 18 | --- 19 | 20 | ## What’s New 21 | 22 | - **Special Network Configurations** 23 | Handling packet-inspection VPNs (Zscaler, GlobalProtect) → [Read more↗](https://ddev.readthedocs.io/en/latest/users/usage/networking/) 24 | - **Add-On Maintenance Guide** by @stasadev → [Read more↗](https://ddev.com/blog/ddev-add-on-maintenance-guide) 25 | - **AMD64 on Apple Silicon** → [Read more↗](https://ddev.com/blog/amd64-with-rosetta-on-macos/) 26 | 27 | ## Community Tutorials 28 | 29 | - **Drupal Modern Tooling** by Andrey Yurtaev → [Read more↗](https://iamdroid.net/blog/dev-tools) 30 | - **VS Code in DDEV Web Container** by Michael Anello → [Read more↗](https://www.drupaleasy.com/blogs/ultimike/2025/04/drupal-development-using-visual-studio-code-connected-directly-ddevs-web) 31 | - **TYPO3 in 8 Steps** → [Read more↗](https://t3planet.de/blog/install-typo3-with-ddev/) 32 | 33 | ## Events & Talks 34 | 35 | - **Drupal4Gov**: “Divide and Conquer: A Systematic Approach to Troubleshooting” → [Watch on YouTube↗](https://www.youtube.com/watch?v=zliDmAUBwrQ) 36 | - **Backdrop Live**: migrating from Lando to DDEV (not recorded) 37 | 38 | ## Governance & Roadmap 39 | 40 | - **Apache-style PMC Exploration** 41 | We'll be exploring an Apache-style "Project Management Committee" model for DDEV governance → [Details↗](https://www.apache.org/foundation/governance/pmcs) 42 | 43 | ## Your Input Requested! 44 | 45 | - **Q3 TYPO3 Budget Ideas** - We'd like to propose something useful to all and also attractive to the TYPO3 Community for the [TYPO3 Q3 Call for Community Budget Ideas↗](https://typo3.org/article/call-for-community-budget-ideas-q3-2025). Please let us know your suggestions! 46 | 47 | --- 48 | 49 | > **Heads-Up:** Randy will be out bikepacking **May 23–June 23**, so updates may be limited; Stas will keep things moving! 50 | 51 | --- 52 | 53 | ## Sponsorship Status 54 | 55 | - **Monthly average income** up from $7,639 to $7,659 (64% of $12,000 goal) → [Become a sponsor↗](https://github.com/sponsors/ddev) 56 | 57 | ## Stay Connected 58 | 59 | - [Blog↗](https://ddev.com/blog/) 60 | - [LinkedIn↗](https://www.linkedin.com/company/ddev-foundation) 61 | - [Mastodon↗](https://fosstodon.org/@ddev) 62 | - [Bluesky↗](https://bsky.app/profile/ddev.bsky.social) 63 | - [Discord↗](/s/discord) 64 | -------------------------------------------------------------------------------- /src/content/blog/open-source-collaboration-signing-tools-for-macos-catalina.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Open source collaboration: signing_tools for macOS" 3 | pubDate: 2020-05-13 4 | summary: The tools behind DDEV’s code signing on macOS. 5 | author: Randy Fay 6 | featureImage: 7 | src: /img/blog/2020/05/signing.png 8 | alt: Partially-redacted terminal screenshot of macOS signing process, with emphasis on “Package Approved” 9 | categories: 10 | - DevOps 11 | --- 12 | 13 | As Apple has ratcheted up the pressure on developers with new security requirements, we wanted the users of DDEV to have command-line tools they could depend on without macOS randomly disabling them and making life difficult. It’s been a challenging task, with Apple first requiring code signing and then later increasing the requirement to notarization (actually submitting the binary to Apple for review). 14 | 15 | Along the way, we noticed that we needed to do the exact same thing for our DDEV binaries, and we noticed that it was getting more and more complex. So we split out the logic scripts into their own repository, [ddev/signing_tools](https://github.com/ddev/signing%5Ftools), and fashioned our build processes to use that for signing and notarization. 16 | 17 | If you have binaries that you need to run on macOS Catalina and above, you can use these same tools. [macos_sign.sh](https://github.com/ddev/signing%5Ftools/blob/master/macos%5Fsign.sh) and [macos_notarize.sh](https://github.com/ddev/signing%5Ftools/blob/master/macos%5Fnotarize.sh) do the job shown, and can be incorporated into most any CI/CD system. 18 | 19 | The [README](https://github.com/ddev/signing%5Ftools/blob/master/README.md) explains all the gory details behind these tools, including Apple’s policies. And you probably need to have a basic understanding of the big picture to use these tools successfully. But you don’t have to write your own process! 20 | 21 | (We’ve also been signing our DDEV Windows binary and installer for a really long time. That was an easier process, but we expect to incorporate that process into signing_tools as well in the future.) 22 | 23 | DDEV stands on the shoulders of open-source giants, from Linux to Go to Lets Encrypt, there are hundreds of projects we rely on every day. We’re happy to share one of our pieces of work to make things easier on macOS Catalina and beyond. We invite your participation in [signing_tools](https://github.com/ddev/signing%5Ftools), and would love to hear your experiences. 24 | -------------------------------------------------------------------------------- /src/content/blog/open-source-for-the-win.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Open Source for the Win!" 3 | pubDate: 2025-02-26 4 | #modifiedDate: 2025-02-26 5 | summary: Open Source for the Win! How the DDEV community reported a problem early, and open-source maintainers responded, meaning people don't have to encounter it. 6 | author: Randy Fay 7 | featureImage: 8 | src: /img/blog/2025/02/open-source-mutagen-docker-banner.jpeg 9 | alt: Open Source for the Win! 10 | categories: 11 | - Community 12 | --- 13 | 14 | ## DDEV v1.24.3 Release 15 | 16 | Today we released [DDEV v1.24.3](https://github.com/ddev/ddev/releases/tag/v1.24.3) ahead of schedule because of a wonderful set of open-source interactions. (There's other important stuff in the release, but I'll cover that later.) 17 | 18 | **We would appreciate it if you could upgrade soon, especially if you're on macOS or traditional Windows, so that we don't have to answer questions about this when it starts to hit users.** 19 | 20 | ## Mutagen Problem Report 21 | 22 | On Monday, two days ago, @LoganHornbuckle reported [a problem](https://github.com/ddev/ddev/issues/7015) (apparently with Mutagen or Docker) we had never seen before. They helped extensively with followup, and it turned out that they had done a `colima update` and as a result gotten the new Docker/Moby Engine version 28.0.0. 23 | 24 | The update exposed an incompatibility between Mutagen and Docker 28, which showed up as a fatal error, completely breaking DDEV's Mutagen support for Docker 28. 25 | 26 | Once we understood the situation, we were able to reproduce the problem, and assumed it was a problem with Docker 28. 27 | 28 | ## The Fix to Mutagen 29 | 30 | We contacted @xenoscopic (Jacob Howard), the maintainer of Mutagen (now with Docker), and he was able to reproduce it immediately. By the end of the day, he had diagnosed it and provided a new release! (It turned out to be a place where Mutagen had worked around a Docker Engine quirk, and the Docker quirk got fixed, breaking Mutagen.) 31 | 32 | So here we are just two days later with a pre-emptive DDEV release v1.24.3 that should prevent most people from ever seeing the Mutagen problem. 33 | 34 | ## THANKS! 35 | 36 | Thanks to @LoganHornbuckle and the community for keeping in touch, reporting, and helping to sort out problems. Amazing thanks to @xenoscopic for the quick diagnosis and fix. And thanks to Docker, Inc. for the wonderful open-source Docker project that underlies all of the available Docker providers, not just Docker Desktop. And of course thanks for supporting @xenoscopic's ongoing maintenance of Mutagen. 37 | 38 | Open source software is amazing! 39 | 40 | Want to keep up as the month goes along? Follow on 41 | 42 | - [blog](https://ddev.com/blog/) 43 | - [LinkedIn](https://www.linkedin.com/company/ddev-foundation) 44 | - [Mastodon](https://fosstodon.org/@ddev) 45 | - [Bluesky](https://bsky.app/profile/ddev.bsky.social) 46 | - and join our community on [Discord](/s/discord) 47 | -------------------------------------------------------------------------------- /src/content/blog/platform-sh-ddev-funding-changes.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Changes in Platform.sh Funding of DDEV" 3 | pubDate: 2025-01-06 4 | #modifiedDate: 2024-09-06 5 | summary: Changes in Platform.sh Funding of DDEV 6 | author: Randy Fay 7 | featureImage: 8 | src: "/img/blog/2022/05/ddev-platformsh.jpg" 9 | alt: "DDEV + Platform.sh" 10 | categories: 11 | - Community 12 | --- 13 | 14 | As many of you know, [Platform.sh](https://platform.sh) is a key supporter and funder of DDEV. They generously stepped in to become the lead sponsor of DDEV and rescue the "DDEV" trademark and its use [in 2022](platform-sh-becomes-a-lead-sponsor-of-ddev.md). 15 | 16 | Of course, time moves along and sometimes organizations have to change their priorities, and in 2025 Platform.sh has decided to change its approach, but still remains a generous lead sponsor at the _partner_ level. (Your organization can join them!) 17 | 18 | - Instead of funding maintainer Randy Fay as an employee, Platform.sh will fund the DDEV Foundation with a generous €3000/month. 19 | - Platform.sh will transfer the "DDEV" trademark and control of the `ddev.com` and `ddev.site` domain names to the DDEV Foundation. 20 | - We'll continue to maintain the [ddev-platformsh](https://github.com/ddev/ddev-platformsh) add-on and explore an [Upsun](https://upsun.com) add-on. 21 | 22 | We don't want to sugar-coat this too much. On the one hand, this is a reduction of about 60% in Platform's support of DDEV, and it will be an ongoing challenge to replace it. But on the other hand, Platform's generous ongoing support will still amount to about 50% of our total income. 23 | 24 | We'll be preparing updated financial plans for 2025 to adjust to this change, and continue to be enormously thankful for the support of Platform.sh! 25 | 26 | This change in funding mode does give DDEV more flexibility in use of funds, and with the flexibility we can hope to move toward [full support for Stas Zhuk](lets-fund-stas-maintainer.md). The obvious problem is that now we have to budget for both Stas and Randy, with less resources. 27 | 28 | As many of you know, though, times are tight in the agency world, and funding for DDEV has actually declined in other ways over the last year, with several key sponsors having to back away. We hope you and your organization are coming up with new plans to support DDEV. 29 | 30 | **THANKS to all of you who are supporting DDEV’s path to sustainability** and who have gotten your organizations to do so. 31 | 32 | **Stop by and thank Platform.sh** for their generous ongoing support of DDEV! See their [contact page](https://platform.sh/contact/) or join their [Discord](https://discord.gg/platformsh). 33 | 34 | Want to keep up as the month goes along? Follow on 35 | 36 | - [blog](https://ddev.com/blog/) 37 | - [LinkedIn](https://www.linkedin.com/company/ddev-foundation) 38 | - [Mastodon](https://fosstodon.org/@ddev) 39 | - [Bluesky](https://bsky.app/profile/ddev.bsky.social) 40 | - and join our community on [Discord](/s/discord) 41 | -------------------------------------------------------------------------------- /src/env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /src/lib/remark-reading-time.mjs: -------------------------------------------------------------------------------- 1 | import getReadingTime from "reading-time" 2 | import { toString } from "mdast-util-to-string" 3 | 4 | /** 5 | * Injects `minutesRead` into frontmatter processed by Remark. 6 | */ 7 | export function remarkReadingTime() { 8 | return function (tree, { data }) { 9 | const textOnPage = toString(tree) 10 | const readingTime = getReadingTime(textOnPage) 11 | // readingTime.text will give us minutes read as a friendly string, 12 | // i.e. "3 min read" 13 | data.astro.frontmatter.minutesRead = readingTime.text 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/pages/404.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Layout from "../layouts/Layout.astro" 3 | import PostBody from "../components/PostBody.astro" 4 | 5 | const title = `404` 6 | --- 7 | 8 | 9 |
10 |

{title}

11 | 12 |

The page you’re looking for doesn’t exist. :(

13 |
14 |
15 |
16 | -------------------------------------------------------------------------------- /src/pages/blog/[page].astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Layout from "../../layouts/Layout.astro" 3 | import BlogPostCard from "../../components/BlogPostCard.astro" 4 | import Heading from "../../components/Heading.astro" 5 | import Paging from "../../components/Paging.astro" 6 | import { getCollection } from "astro:content" 7 | 8 | /** 9 | * Tell Astro to build routes for paginated blog post listings. 10 | * https://docs.astro.build/en/reference/api-reference/#getstaticpaths 11 | */ 12 | export async function getStaticPaths({ paginate }) { 13 | const posts = await getCollection("blog") 14 | const allPosts = posts.sort((a, b) => { 15 | return new Date(a.data.pubDate) > new Date(b.data.pubDate) ? -1 : 1 16 | }) 17 | 18 | // Generate pages from our array of astronauts, with 6 to a page 19 | return paginate(allPosts, { pageSize: 6 }) 20 | } 21 | 22 | const { page } = Astro.props 23 | 24 | const title = `Blog Posts` 25 | --- 26 | 27 | 28 |
29 | 30 |
33 | {page.data.map((post) => )} 34 |
35 |
36 | 37 |
38 | -------------------------------------------------------------------------------- /src/pages/blog/author/[id].astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { getCollection, render } from "astro:content" 3 | import Layout from "../../../layouts/Layout.astro" 4 | import BlogPostCard from "../../../components/BlogPostCard.astro" 5 | 6 | /** 7 | * Tell Astro to build routes using our author ids. 8 | * https://docs.astro.build/en/reference/api-reference/#getstaticpaths 9 | */ 10 | export async function getStaticPaths() { 11 | const authors = await getCollection("authors") 12 | const posts = await getCollection("blog") 13 | 14 | return authors.map((author) => { 15 | const authorPosts = posts 16 | .filter((post) => post.data.author === author.data.name) 17 | .sort((a, b) => { 18 | return new Date(a.data.pubDate) > new Date(b.data.pubDate) ? -1 : 1 19 | }) 20 | 21 | return { 22 | params: { id: author.id }, 23 | props: { 24 | author: author, 25 | posts: authorPosts, 26 | }, 27 | } 28 | }) 29 | } 30 | 31 | const { author, posts } = Astro.props 32 | 33 | const title = `Posts by ${author.data.name}` 34 | const { Content } = await render(author) 35 | --- 36 | 37 | 41 |
42 |
43 |

{author.data.name}

44 |
45 | 46 |
47 |
48 | 49 |

50 | {author.data.firstName || author.data.name}’s { 51 | posts.length == 1 ? `Post` : `Posts` 52 | } 53 |

54 | 55 |
58 | {posts.map((post) => )} 59 |
60 |
61 |
62 | -------------------------------------------------------------------------------- /src/pages/blog/authors.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { getCollection } from "astro:content" 3 | import Layout from "../../layouts/Layout.astro" 4 | import Heading from "../../components/Heading.astro" 5 | 6 | const authors = await getCollection("authors") 7 | const posts = await getCollection("blog") 8 | 9 | // Filter out authors without any posts 10 | const activeAuthors = authors.filter((author) => { 11 | const authorPosts = posts.filter( 12 | (post) => post.data.author === author.data.name 13 | ) 14 | 15 | return authorPosts.length > 0 16 | }) 17 | 18 | const title = `Blog Authors` 19 | --- 20 | 21 | 22 |
23 | 24 |
27 | { 28 | activeAuthors.map((author) => ( 29 |
30 | {author.data.name} 31 |
32 | )) 33 | } 34 |
35 |
36 |
37 | -------------------------------------------------------------------------------- /src/pages/blog/category/[slug].astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { getSlug } from "../../../lib/api" 3 | import { getCollection } from "astro:content" 4 | import Layout from "../../../layouts/Layout.astro" 5 | import BlogPostCard from "../../../components/BlogPostCard.astro" 6 | 7 | /** 8 | * Tell Astro to build routes using our category slugs. 9 | * https://docs.astro.build/en/reference/api-reference/#getstaticpaths 10 | */ 11 | export async function getStaticPaths() { 12 | const posts = await getCollection("blog") 13 | const categories = [ 14 | ...new Set(posts.map((post) => post.data.categories).flat()), 15 | ] 16 | 17 | return categories.map((category) => { 18 | return { 19 | params: { 20 | slug: getSlug(category), 21 | }, 22 | props: { 23 | name: category, 24 | posts: posts 25 | .filter((post) => post.data.categories.includes(category)) 26 | .sort((a, b) => { 27 | return new Date(a.data.pubDate) > new Date(b.data.pubDate) ? -1 : 1 28 | }), 29 | }, 30 | } 31 | }) 32 | } 33 | 34 | const { name, posts } = Astro.props 35 | 36 | const title = `Posts in “${name}”` 37 | --- 38 | 39 | 43 |
44 |
45 |

Posts in “{name}”

46 |
47 | 48 |
51 | {posts.map((post) => )} 52 |
53 |
54 |
55 | -------------------------------------------------------------------------------- /src/pages/blog/feed.json.js: -------------------------------------------------------------------------------- 1 | import { getCollection } from "astro:content" 2 | import { marked } from "marked" 3 | import { BLOG_DESCRIPTION } from "../../const" 4 | import sanitizeHtml from "sanitize-html" 5 | 6 | const baseUrl = import.meta.env.SITE 7 | const blogUrl = `${baseUrl}/blog` 8 | 9 | const posts = await getCollection("blog") 10 | 11 | // Get the 50 most recent blog posts 12 | const recentPosts = posts 13 | .sort((a, b) => { 14 | return new Date(a.data.pubDate) > new Date(b.data.pubDate) ? -1 : 1 15 | }) 16 | .slice(0, 50) 17 | 18 | const feedItems = recentPosts.map((post) => { 19 | return { 20 | id: `${blogUrl}/${post.id}`, 21 | url: `${blogUrl}/${post.id}`, 22 | title: post.data.title, 23 | content_html: sanitizeHtml(marked.parse(post.body)), 24 | } 25 | }) 26 | 27 | const feed = { 28 | version: "https://jsonfeed.org/version/1.1", 29 | title: `DDEV Blog`, 30 | description: BLOG_DESCRIPTION, 31 | home_page_url: blogUrl, 32 | feed_url: `${blogUrl}/feed.json`, 33 | items: feedItems, 34 | } 35 | 36 | export async function GET(context) { 37 | return Response.json({ 38 | success: true, 39 | result: feed, 40 | }) 41 | } 42 | -------------------------------------------------------------------------------- /src/pages/blog/index.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { getCollection } from "astro:content" 3 | import Layout from "../../layouts/Layout.astro" 4 | import BlogPostCard from "../../components/BlogPostCard.astro" 5 | import Heading from "../../components/Heading.astro" 6 | import Paging from "../../components/Paging.astro" 7 | import { BLOG_DESCRIPTION } from "src/const" 8 | 9 | const posts = await getCollection("blog") 10 | const recentPosts = posts 11 | .sort((a, b) => { 12 | return new Date(a.data.pubDate) > new Date(b.data.pubDate) ? -1 : 1 13 | }) 14 | .slice(0, 6) 15 | 16 | const title = `Blog Posts` 17 | const rssUrl = new URL(`/blog/rss.xml`, Astro.site).toString() 18 | const jsonUrl = new URL(`/blog/feed.json`, Astro.site).toString() 19 | --- 20 | 21 | 29 |
30 | 31 |
34 | {recentPosts.map((post) => )} 35 |
36 |
37 | 38 |
39 | -------------------------------------------------------------------------------- /src/pages/blog/rss.xml.js: -------------------------------------------------------------------------------- 1 | import { getCollection } from "astro:content" 2 | import { marked } from "marked" 3 | import { BLOG_DESCRIPTION } from "../../const" 4 | import rss from "@astrojs/rss" 5 | 6 | const baseUrl = import.meta.env.SITE 7 | const blogUrl = `${baseUrl}/blog` 8 | const posts = await getCollection("blog") 9 | 10 | /** 11 | * Replace root-relative links with absolute ones. 12 | * @param text 13 | * @returns 14 | */ 15 | const ensureAbsoluteUrls = (text) => { 16 | return text 17 | .replaceAll('href="/', `href="${baseUrl}/`) 18 | .replaceAll('src="/', `src="${baseUrl}/`) 19 | } 20 | 21 | // Get the 50 most recent blog posts 22 | const recentPosts = posts 23 | .sort((a, b) => { 24 | return new Date(a.data.pubDate) > new Date(b.data.pubDate) ? -1 : 1 25 | }) 26 | .slice(0, 50) 27 | 28 | const items = recentPosts.map((post) => { 29 | let postContent = "" 30 | 31 | if (post.data.featureImage) { 32 | postContent += ensureAbsoluteUrls( 33 | `${
34 |         post.data.featureImage.alt ?? ` 36 | ) 37 | } 38 | 39 | postContent += ensureAbsoluteUrls(marked.parse(post.body)) 40 | 41 | return { 42 | link: `${blogUrl}/${post.id}`, 43 | title: post.data.title, 44 | description: post.data.summary, 45 | categories: post.data.categories, 46 | content: postContent, 47 | pubDate: post.data.pubDate, 48 | } 49 | }) 50 | 51 | const buildDate = new Date().toUTCString() 52 | 53 | export async function GET(context) { 54 | return rss({ 55 | title: `DDEV Blog`, 56 | description: BLOG_DESCRIPTION, 57 | site: blogUrl, 58 | items: items, 59 | xmlns: { 60 | webfeeds: "http://webfeeds.org/rss/1.0", 61 | atom: "http://www.w3.org/2005/Atom", 62 | }, 63 | customData: ` 64 | en-us 65 | 66 | ${buildDate} 67 | ${baseUrl}/favicon/icon.svg 68 | 69 | 02A8E2 70 | ${baseUrl}/favicon/type-only.svg 71 | `, 72 | }) 73 | } 74 | -------------------------------------------------------------------------------- /src/pages/contact.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Layout from "../layouts/Layout.astro" 3 | import Heading from "../components/Heading.astro" 4 | import PostBody from "../components/PostBody.astro" 5 | 6 | import { 7 | ORG_NAME, 8 | ORG_STREET, 9 | ORG_CITY, 10 | ORG_STATE_ABBR, 11 | ORG_POSTAL_CODE, 12 | ORG_COUNTRY, 13 | ORG_PHONE, 14 | EMAIL_URL, 15 | MEETING_URL, 16 | } from "../const" 17 | 18 | const title = `Contact Us` 19 | --- 20 | 21 | 24 |
25 | 26 |
27 |
28 | 29 |

Easy Contact Info

30 |

31 | We're delighted to talk with you any time! 32 |

33 | 34 | 38 | 39 |

Snail Mail and Phone:

40 | 41 | {ORG_NAME}
42 | {ORG_STREET}
43 | {ORG_CITY}, {ORG_STATE_ABBR} {ORG_POSTAL_CODE}  {ORG_COUNTRY}
44 | {ORG_PHONE}
45 | 46 |
47 |
48 |
49 |
50 |
51 | -------------------------------------------------------------------------------- /src/pages/foundation.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Layout from "../layouts/Layout.astro" 3 | import Heading from "../components/Heading.astro" 4 | import PostBody from "../components/PostBody.astro" 5 | 6 | import { 7 | ORG_NAME, 8 | ORG_STREET, 9 | ORG_CITY, 10 | ORG_STATE_ABBR, 11 | ORG_POSTAL_CODE, 12 | ORG_COUNTRY, 13 | ORG_PHONE, 14 | EMAIL_URL, 15 | } from "../const" 16 | 17 | const title = `DDEV Foundation` 18 | --- 19 | 20 | 23 |
24 | 25 |
26 |
27 | 28 |

29 | The DDEV Foundation, a Colorado (USA) nonprofit corporation, is the developer of DDEV. It was formerly named the Localdev Foundation. It serves as the fiscal entity for the project and owns the bank account, etc. For more, see About DDEV. 30 |

31 |

32 | The DDEV Foundation is a US 501(c)(3) non-profit. 33 |

34 | 35 |

Where does the money go?

36 | 37 |

38 | DDEV Foundation funds are used for infrastructure costs and to pay part-time and full-time maintainers. Lead Maintainer Randy Fay does not receive any of the funds as his salary is paid by lead sponsor Platform.sh. 39 |

40 | 41 |

Contact the DDEV Foundation

42 | 43 |

Contact support.

44 | 45 |

Snail Mail and Phone:

46 | 47 | {ORG_NAME}
48 | {ORG_STREET}
49 | {ORG_CITY}, {ORG_STATE_ABBR} {ORG_POSTAL_CODE}  {ORG_COUNTRY}
50 | {ORG_PHONE}
51 | 52 |

Colorado nonprofit corporation registration

53 |

54 | Review our Colorado nonprofit corporation registration. 55 |

56 | 57 |
58 |
59 |
60 |
61 |
62 | -------------------------------------------------------------------------------- /src/pages/get-started.astro: -------------------------------------------------------------------------------- 1 | --- 2 | /** 3 | * This page is meant to be the quickest-possible way to help someone 4 | * install and try DDEV. If you make any changes to it, make sure you: 5 | * 6 | * - Assume they don’t have Docker installed and have never used DDEV. 7 | * - Are able to complete all critical steps without leaving the page. 8 | * - Only require decision-making when it’s unavoidable. 9 | * - Gently link to documentation that elaborates or further explains 10 | * what’s going on—**NOT** providing additional steps that should be 11 | * detailed here. 12 | */ 13 | import { getLatestReleaseVersion } from "../lib/api" 14 | import Cloud from "@components/quickstart/Cloud.astro" 15 | import Heading from "@components/Heading.astro" 16 | import Layout from "@layouts/Layout.astro" 17 | import Linux from "@components/quickstart/Linux.astro" 18 | import Mac from "@components/quickstart/Mac.astro" 19 | import PlatformPicker from "@components/PlatformPicker.astro" 20 | import Windows from "@components/quickstart/Windows.astro" 21 | 22 | const title = "Get Started" 23 | const latestRelease = await getLatestReleaseVersion() 24 | --- 25 | 26 | 30 |
31 | 32 |
33 | 34 |
35 | 36 |
37 | {/* Mac instructions */} 38 | 41 | 42 | {/* Windows instructions */} 43 | 46 | 47 | {/* Linux instructions */} 48 | 51 | 52 | {/* Cloud instructions */} 53 | 56 |
57 |
58 |
59 | -------------------------------------------------------------------------------- /src/pages/index.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import AppLogos from "@components/AppLogos.astro" 3 | import Benefits from "@components/Benefits.astro" 4 | import BlogFeatures from "@components/BlogFeatures.astro" 5 | import Contributors from "@components/Contributors.astro" 6 | import Features from "@components/Features.astro" 7 | import Hero from "@components/Hero.astro" 8 | import Layout from "../layouts/Layout.astro" 9 | import RepoCard from "@components/RepoCard.astro" 10 | import SoftwareLogos from "@components/SoftwareLogos.astro" 11 | import { GITHUB_REPO } from "../const" 12 | 13 | const rssUrl = new URL(`/blog/rss.xml`, Astro.site).toString() 14 | const jsonUrl = new URL(`/blog/feed.json`, Astro.site).toString() 15 | --- 16 | 17 | 25 |
26 | 27 | 28 |
29 | 30 |
31 | 32 | 33 | 34 | 35 | 36 | 37 |
38 |
39 |
42 | 46 | 50 | 54 |
55 |
56 |
57 |
58 |
59 | -------------------------------------------------------------------------------- /src/pages/newsletter.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Layout from "../layouts/Layout.astro" 3 | import Heading from "../components/Heading.astro" 4 | 5 | const title = `Newsletter` 6 | 7 | // To update with new form contents: 8 | // * replace the contents starting with 25 | 26 | 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /src/pages/survey.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Layout from "../layouts/Layout.astro" 3 | import Heading from "../components/Heading.astro" 4 | 5 | const title = `Survey` 6 | --- 7 | 8 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | -------------------------------------------------------------------------------- /src/scripts/giscus-comments.js: -------------------------------------------------------------------------------- 1 | class GiscusComments extends HTMLElement { 2 | constructor() { 3 | super() 4 | this.iframe = null 5 | } 6 | 7 | connectedCallback() { 8 | if (typeof window === "undefined") return 9 | if (this.querySelector("iframe.giscus-frame")) return 10 | 11 | // Helper function to get the theme based on system preference 12 | const getTheme = () => 13 | window.matchMedia("(prefers-color-scheme: dark)").matches 14 | ? "dark_dimmed" 15 | : "light" 16 | 17 | const setTheme = () => { 18 | const theme = getTheme() 19 | 20 | const script = document.createElement("script") 21 | script.src = "https://giscus.app/client.js" 22 | script.setAttribute("data-repo", "ddev/giscus-comments") 23 | script.setAttribute("data-repo-id", "R_kgDON5ODtA") 24 | script.setAttribute("data-category", "ddev.com comments") 25 | script.setAttribute("data-category-id", "DIC_kwDON5ODtM4CnDbQ") 26 | script.setAttribute("data-mapping", "title") 27 | script.setAttribute("data-strict", "1") 28 | script.setAttribute("data-reactions-enabled", "1") 29 | script.setAttribute("data-emit-metadata", "0") 30 | script.setAttribute("data-input-position", "top") 31 | script.setAttribute("data-theme", theme) 32 | script.setAttribute("data-lang", "en") 33 | script.setAttribute("data-loading", "lazy") 34 | script.crossOrigin = "anonymous" 35 | script.async = true 36 | 37 | this.innerHTML = "" 38 | this.appendChild(script) 39 | 40 | script.onload = () => { 41 | // Store iframe reference once script has loaded 42 | this.iframe = this.querySelector("iframe.giscus-frame") 43 | this.updateTheme(theme) 44 | } 45 | } 46 | 47 | // Initial theme setup 48 | setTheme() 49 | 50 | // Listen for theme changes 51 | window 52 | .matchMedia("(prefers-color-scheme: dark)") 53 | .addEventListener("change", () => { 54 | const newTheme = getTheme() 55 | this.updateTheme(newTheme) 56 | }) 57 | } 58 | 59 | updateTheme(theme) { 60 | if (!this.iframe || !this.iframe.contentWindow) return 61 | 62 | // Post the theme update message to the iframe content window 63 | this.iframe.contentWindow.postMessage( 64 | { giscus: { setConfig: { theme } } }, 65 | "https://giscus.app" 66 | ) 67 | } 68 | } 69 | 70 | customElements.define("giscus-comments", GiscusComments) 71 | -------------------------------------------------------------------------------- /tailwind.config.cjs: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | module.exports = { 3 | content: ["./src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}"], 4 | theme: { 5 | extend: { 6 | colors: { 7 | blue: { 8 | 50: "#73dafe", 9 | 100: "#73dafe", 10 | 200: "#50d1fd", 11 | 300: "#2dc7fd", 12 | 400: "#0abefd", 13 | 500: "#02a8e2", 14 | 600: "#0293c6", 15 | 650: "#027ba7", 16 | 700: "#01698d", 17 | 800: "#015471", 18 | 900: "#013f55", 19 | }, 20 | navy: { 21 | 50: "#62b9ff", 22 | 100: "#2da2ff", 23 | 200: "#0089f8", 24 | 300: "#006cc3", 25 | 400: "#004f8f", 26 | 500: "#00325a", 27 | 600: "#002c4f", 28 | 700: "#002544", 29 | 800: "#001f38", 30 | 900: "#00192d", 31 | }, 32 | code: { 33 | light: "#818b981f", 34 | dark: "#2e3440ff", 35 | }, 36 | }, 37 | typography: { 38 | DEFAULT: { 39 | css: { 40 | // remove automatic quote marks from blockquotes 41 | "blockquote p:first-of-type::before": null, 42 | "blockquote p:last-of-type::after": null, 43 | // remove automatic backticks that surround inline code blocks 44 | "code::before": null, 45 | "code::after": null, 46 | }, 47 | code: {}, 48 | }, 49 | }, 50 | }, 51 | }, 52 | plugins: [ 53 | require("@tailwindcss/typography"), 54 | function ({ addBase, theme }) { 55 | addBase({ 56 | // GitHub style for inline code blocks 57 | code: { 58 | padding: ".2em .4em", 59 | margin: "0", 60 | borderRadius: "6px", 61 | fontWeight: "500 !important", 62 | backgroundColor: theme("colors.code.light"), 63 | }, 64 | "@media (prefers-color-scheme: dark)": { 65 | code: { 66 | backgroundColor: theme("colors.code.dark"), 67 | }, 68 | }, 69 | }) 70 | }, 71 | ], 72 | } 73 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "astro/tsconfigs/strict", 3 | "compilerOptions": { 4 | "jsx": "react-jsx", 5 | "jsxImportSource": "react", 6 | "baseUrl": ".", 7 | "paths": { 8 | "@layouts/*": ["./src/layouts/*"], 9 | "@components/*": ["./src/components/*"] 10 | } 11 | } 12 | } 13 | --------------------------------------------------------------------------------