--------------------------------------------------------------------------------
/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 |
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 |
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 | 
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 | 
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 | 
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 | 
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 | 
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 |
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 |
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 |
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 |
39 |
40 |
41 |
42 | {/* Windows instructions */}
43 |
44 |
45 |
46 |
47 | {/* Linux instructions */}
48 |
49 |
50 |
51 |
52 | {/* Cloud instructions */}
53 |
54 |
55 |
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 |