How I Build €10,000Gallery Websites with AI

8th November 2026

Atelier Index gallery homepage design

Intro

My world was turned upside down at the start of this year, when I realized: Yo, I read 50 pages of a C++ book daily all summer long when I was 22. I learned and practiced programming and Web Development for 15 years. And now, anyone with a Claude / Codex subscription can do everything I do.

BUT, I can still do what I did all my life and much faster: Making professional Websites, for budgets of 10k€ (mostly). Just faster and smarter, but still as professional as before. And now I teach you how to do that too.

The concepts are universal. Depending on the project, you may need a different CMS, platform or workflow. This tutorial focuses on agentic website building with Lay Theme, a website builder built on top of WordPress.

But just to be clear: Lay Theme is still a good tool for creating simple websites without AI, but now it has become much more powerful.

Anyways, lets go.

Disclosure

Yes, I really built a €10,000 gallery website with AI. The website in this tutorial is not that client's website. It is an example website. I want to keep the client anonymous, and I do not want the project to be connected to the idea that it was generated quickly or made with less care. It was a professional project. The example website lets me show you the same workflow without using the client's content.

For the real client project, professional designers prepared the design in Figma. I only implemented it in Lay Theme. In this tutorial, I also describe Agentic Design for Figma simply because I find the approach interesting. That is not how the real client's design was created.

The real website also included a shop, and I migrated all of the data from the old website to the new one using AI.

I know that AI is creating real uncertainty and making it harder for many people in our industry to find work. This tutorial is not meant as a flex. I hope it can help designers and developers explore another workflow, learn something new and expand the possibilities available to them.

Enable AI Mode and connect with
Claude or ChatGPT

First, enable AI Mode in Lay Theme.

Enable AI Mode in Lay Options

Then connect Claude or ChatGPT to AI Mode.

The Sitemap

You know what they say, if you fail to plan, you plan to fail :D. While I'm not sure that's true, I do know it makes it a lot easier to just plan a little before diving in to create a website that is a little complex.

Just so we're on the same page, this will be the sitemap of the Gallery Website:

Sitemap for the gallery website

I made this with "FigJam" by Figma. Its really good to draw sitemaps during the concept phase.

The real website I built had more pages and also included a shop. I keep the sitemap smaller here so the tutorial doesn't become too complex.

If you want to add a shop to your own website, follow the Lay Theme Shop Setup / WooCommerce documentation. You can use AI Mode for the rest of the website and add the shop to the same project.

Agentic Design for Figma

AI should not be used to copy someone else's design. I use references to find a starting point, then change and develop the result until it becomes my own design.

I do think its best to have a design first, and not try to vibecode a design while building the site. Its just much faster to iterate on a design in Figma for example. When you can build a design that doesn't look generic and AI-made, I think that will become more and more valuable.

I'll build the basic design with AI.

First, I find a website that I like on browsingmode.com. In this tutorial, I call the reference website xxxxxx.it instead of naming the real website.

If you tell Figma make, Figma agents, or any AI tool that I found so far:

Go, build a gallery site inspired by the design language of xxxxxx.it

It will fail... It will just look generic and AI-made and look almost nothing like the reference website.

If you think about it, what does a webdesign largely consist of? It is the fonts, colors, spacing, grid, composition - the design system!

So the smart way to go about this is to open up Claude or Codex, then tell it:

Check out these pages: https://xxxxxx.it/archivio/ https://xxxxxx.it/about/ https://xxxxxx.it/membership/ https://xxxxxx.it/agenda/ Analyze the design system for it: fonts, text-styles, colors, spacing, grid, composition. Turn these into re-usable rules that you use to build a new website design. Then build a Gallery website in Figma: We need desktop and phone versions for these pages: Homepage, Artists Overview, Artists Single Page, Exhibitions Overview, Exhibitions Single Page, About Page

If you don't have the Figma plugin installed yet in your Claude / Codex it will lead you through it.

Once finished, I got this Design. I'm not fully happy with it, but its a good starting point:

Gallery homepage design in Figma Exhibition phone design in Figma Exhibition single page design in Figma Artist single page design in Figma

In my experience, coming up with a good design, that is fully made with AI is pretty hard. I believe AI can help with the first structure and groundwork, but coming up with a great design requires you to do manual work. So feel free to tweak the design in Figma and talk to your client and see if they like it.

For the purposes of this tutorial, I'll just take the design as it is.

But if I was you, with the goal of building a 10k€> website, I would tweak the design more.

Once the design is finished, we can move on with the implementation.

New Post Types with AI

There will be Artists. And there will be Exhibitions. So, we're first going to tell our AI:

Create two new Custom Post Types: "Artists" and "Exhibitions"

And voilá:

Artists and Exhibitions in the WordPress admin

Refresh your wp-admin and you see two new Post Types: Artists and Exhibitions.

Now you can create any new Artist and Exhibition Posts, and they come with the Gridder (our Layout tool) included:

New Artist post with the Gridder

Now let's check out how we can create a relationship between them.

Create a Relationship

Let's check out an easy relationship that will be part of our Gallery Website:

Relationship between Artists and Exhibitions

Multiple artists can take part in an exhibition. Tell your AI:

Create a relationship field, where I can choose one or multiple Artists for each Exhibition.

And the result is:

Artists relationship field on an Exhibition

See, in the "Artists" Field you can now choose Artists that are part of that Exhibition.

But wait, we don't have any Artists to choose from. Right, that part comes next!

Batch create Posts & more Relationship work

Lets say the Gallery you're making the website for gave you a list of artists.

OR, they have an old website where all artists are listed.

You could just tell your AI:

Here is a list of all Artists: [ insert List, or File with List or Website of Artist List ] Create a new Artist post for each Artist!

And it creates all Artist posts:

Automatically created Artist posts

Now we can create an Exhibition and actually configure the relationship for it.

Artists selected for an Exhibition

See, I added two Artists to the Relationship field: "Imani Rook" and "Milo Arden".

Alright, lets move over to the design implementation part.

Custom Fields for the Artist Single View

Artist single view design

This is our Artist Single View, lets start with that. We got:

  • The Artist Name,
  • Country,
  • What "Art forms" they use (Installation, Film, Sound),
  • A Gallery / Slideshow of their work,
  • A bio,
  • A small CV text
  • A "Selected Exhibitions" list.

And of course underneath we got the footer. And all the way at the top we have the header that contains the site title and menu.

For an overview of all available field options, see Custom Field Types in the AI Mode tutorial.

This is what the edit-screen of our Artist post type looks like currently:

Artist edit screen before adding Custom Fields

Now, we'll build the fields that will hold the Artist's info! Let's tell our AI:

For the Artists post type, add the following content fields: - Text field for country - A gallery field - Bio field - CV field

Now when we look at the Artist Edit screen we see:

Custom Fields added to the Artist edit screen

New fields above the Gridder! The CV seems to be a file field. I'll fix this:

The CV field was supposed to be a Text Field.

Yea, thats better. By the way, lets say we want to put links into the Bio text. Tell your AI:

Make the bio textfield a wysiwyg field!

Looks better:

Artist Bio as a WYSIWYG field

Next up: Custom Taxonomies

Custom Taxonomies

Remember how Posts can also have custom taxonomies?

Taxonomies are things like "Category" or "Tags".

For the "Art forms" the artist works in, we could just use "Category". But just so you've seen it - Let's create a custom Taxonomy called "Art Forms".

Tell your AI:

For the Artists post type, create a new taxonomy called "Art Forms".

And here it is:

Art Forms taxonomy in WordPress

Every Artist can now have an "Art Form" Taxonomy applied to them.

Let's move to the exciting part: Implementing the Design for the Artist Single View.

Building the View, Design to Code

This is the exciting part.

First thing:

We need to fill out the custom fields for an artist.

We can do so using the fields we just created:

Artist content fields before they are filled

Or I tell my AI to do it for me:

Fill out the fields for this artist: http://gallery-ai-tutorial.local/wp-admin/post.php?post=7&action=edit For the Gallery, use 5 images from my downloads folder from July 7th

Of course your prompt would look a little different (different URL and different image location). Filled out, it looks like this:

Completed Artist fields and gallery

Now about the design to code:

We could just tell our AI: "Build a stylish frontend for the Artist Pages based on the Custom Fields we have!" But it would come up with a generic Ai-looking design.

Since we already have our design, lets use that instead. In Figma, go to the Development mode. In the bar at the bottom, click the dev mode button, on the right.

Figma Dev Mode button

It leads you to dev mode. You'll need the figma subscription to use dev mode.

In dev mode, click on the Artboard of our Design.

Artist design selected in Figma Dev Mode

Copy the URL, for me, it is
https://www.figma.com/design/xUW4GWhELJtsl58DNqj0zn/Atelier-Index-%E2%80%94-Gallery-Website-System?node-id=7-64&m=dev

Lets tell our AI to build the frontend of the site (what the visitor will see) based on the design. But it shouldn't build the header and footer yet. This will be separate because those are the same for all pages.

So we tell it:

Build the frontend of the artist page, based on this figma design: https://www.figma.com/design/xUW4GWhELJtsl58DNqj0zn/Atelier-Index-%E2%80%94-Gallery-Website-System?node-id=7-64&m=dev Do not build the Site Header and Footer. Only the content. Use the fields we just created to fill the content. The Image in the middle is supposed to be the Gallery, so those can be multiple images. A click on the images makes it go to the next one. This slideshow should use the aspect ratio of the image you see there. But the images in the slideshow should be positioned as if they are object fit and centered. Make sure the frontend implementation is responsive. The texts' heights should adapt to the length of the texts, no fixed text heights.

As you can see, I'm telling the AI quite a lot about how things should work, how things are supposed to be sized, positioned and responsive. Currently, the figma dev mode creates pixel-perfect implementation since it gives the Ai all neccessary CSS values.

However, it does not create responsive designs and does dumb things like make texts fixed heights. So that's why I'm very descriptive here.

Ok lets check it out:

Finished Artist website frontend

This is the built website frontend!

It uses the fields we filled out for the artist. Pretty nice :))

Custom Elements in the Gridder

Just one thing: For the following we could have also just used a Custom View...as explained on the last page. But with Custom Elements you can be a little more flexible because they can be placed in the Gridder. Ok let's go:

In the last chapter we designed the individual page for an Artist and the individual page for an Exhibition.

Now I want to build the overview pages that list all Artists and Exhibitions. For this I use Custom Elements and content that updates automatically.

The term dynamic content sounds more technical than it is. It simply means that the page takes its information directly from WordPress. When I add or edit an Artist, the list on the website updates with it.

A Custom Element is a section of the website that can be designed once and placed anywhere in the Gridder. In this example, the complete Artists list is one Custom Element.

I call this element Artists Index. "Index" is simply the name for the complete overview list. The Exhibitions Index works in the same way for Exhibitions.

Place a Custom Element in the Gridder

Once a Custom Element has been created and published, I can place it in the Gridder like an image or a text element.

I open the page where I want to use it and click + Custom Elements in the Gridder toolbar.

The menu shows the available Custom Elements. I select Artists Index and it appears inside the Gridder, where I can position and resize it.

Custom Elements button in the Gridder

AI Mode can also insert the element on the page for me. The result is the same: the Custom Element becomes part of the Gridder layout and can be moved like the other elements on the page.

What does "loop through the posts" mean?

Each Artist and Exhibition we created earlier is stored as a separate entry in WordPress. You can think of them like individual cards in a collection.

The Custom Element goes through all these entries one by one and creates a row for each of them. Imagine placing a stack of Artist cards on a table, picking up each card and adding its name and country to the list. In programming this is often called a "loop".

For us it simply means that we do not have to type and link every row by hand. The information in each row comes from the fields we already created. For example, the Artist name comes from the title and Base comes from the Country field.

An Exhibition also has an Artists field where we select the participating Artists. Lay Theme calls this a Relationship field because it connects one piece of content with another.

The overview uses that connection to show the correct Artists beside each Exhibition.

When I add a new Artist later, the overview updates by itself. In the next chapter, I will use the Figma design to create the Artists Index and Exhibitions Index with AI Mode.

Building Automatic Overview Pages

The design has two overview screens. One lists all Artists with their base. The other lists Exhibitions with year, title, artists and type.

Artists Overview in Figma Exhibitions Overview in Figma

Use Figma Dev Mode links

I open the screens in Figma Dev Mode and copy the Dev Mode links for the Desktop and Phone frames.

The links must come from Figma Dev Mode. A normal Figma link is not enough. The Dev Mode link gives the AI the exact selected frame and the design information it needs for the implementation. Then I send this prompt:

I want to build the Artists Overview and Exhibitions Overview screens from the Figma Dev Mode links below. [paste the Desktop and Phone Figma Dev Mode links here] Please inspect the Figma frames and the current Lay Theme setup first. Create and publish two Custom Elements: 1. Artists Index - Automatically show every published Artist. Published means the Artist is currently visible on the website. - Sort them alphabetically. - Show number, artist name and the Country field as Base. - Link every row to the individual Artist page. 2. Exhibitions Index - Automatically show every published Exhibition. - Sort them by date, newest first. - Show year, title, the Artists selected for this Exhibition and Exhibition Type. - Link every row to the individual Exhibition page. Use the existing Artists, Exhibitions and their fields as the source for the lists. Keep everything connected so the overview updates automatically when I edit or add content in WordPress. Match the typography, spacing, borders and columns from Figma. Create the appropriate layouts for Desktop, Tablet and Phone. Insert Artists Index on the Artists page and Exhibitions Index on the Exhibitions page. Inspect the current website setup before making changes. Then make the changes and check both pages afterwards.

AI Mode creates the two elements and inserts each one on the correct page.

I can now find them under AI Mode -> Custom Elements. The preview is useful because I can switch between Desktop, Tablet and Phone without opening the page every time.

The Artists Index in the Custom Elements Studio

The Artist names, countries and Exhibition Types still live in their normal WordPress fields. The Custom Element decides how this information is arranged on the page. I can continue editing the content in the familiar WordPress forms.

Fill missing content

My first result showed that several Artists had an empty Country field. I also only had two test Exhibitions. I used a second prompt to make the overview feel like a real website:

Please check the content used by the new Artists Index and Exhibitions Index. Fill only missing Artist Country fields with plausible example values. Preserve every value that already exists. Create enough example Exhibitions for a useful overview. Give them realistic titles, dates and Exhibition Types. In the Artists field of each Exhibition, select fitting Artists that already exist. Keep all new content editable through the normal WordPress fields. Check the overview pages when you are done.

This gives the design enough real content to judge the layout.

Automatic Artists Overview on the website Automatic Exhibitions Overview on the website

The overview pages now stay connected to WordPress. New Artists and Exhibitions automatically appear in the right place. In the next chapter, I will compare the result with the Phone design.

Responsive Layouts

The Artists and Exhibitions overview pages are working. Now I want to check how the same content behaves on smaller screens.

Use the Phone Figma Dev Mode link

The best way to build the Phone layout is to design it in Figma first. In Figma Dev Mode, select the Phone frame and copy its Dev Mode link, just like we did for the Desktop design.

I have a Phone frame for both overview pages. They use fewer columns and smaller type. The Exhibitions Overview drops the Type column so the title and artist still have enough room.

Artists Overview Phone design Exhibitions Overview Phone design

I send AI Mode the Desktop and Phone Dev Mode links:

Please compare the Artists and Exhibitions overview pages against these Figma Desktop and Phone frames: Artists Overview Desktop: [paste Figma Dev Mode link] Artists Overview Phone: [paste Figma Dev Mode link] Exhibitions Overview Desktop: [paste Figma Dev Mode link] Exhibitions Overview Phone: [paste Figma Dev Mode link] Use the existing Artists Index and Exhibitions Index Custom Elements. Keep the Header, Footer and the individual Artist and Exhibition pages untouched for now. Check the column widths, title size, line height, borders and space between the rows. Make sure long names still fit cleanly. On Phone, keep three columns for Artists: No., Artist and Base. On Phone, keep three columns for Exhibitions: YR, Title and Artist. Hide the Type column. Change only these two elements and check both screen sizes afterwards.

If you do not have a Phone design in Figma, you can also describe how you want the layout to work. Tell AI Mode which columns should remain visible, what should be hidden and how the content should be arranged. This can work, but a Phone design with a Figma Dev Mode link gives AI Mode a much clearer reference.

I also ask it to check long names. A layout can look correct with short example content and still break when a real Artist or Exhibition has a longer name.

Change History

Every group of changes made through AI Mode appears in AI Mode -> Change History. If something went wrong, you can use the Undo button to undo the newest change, as long as the same content has not been edited afterwards.

Custom Element changes in AI Mode Change History

Developing Locally

I normally build a new website locally with Local. This gives me a complete WordPress installation on my computer, so I can develop and test everything locally before moving the website to a staging server.

While I am building the website, I usually upload the current local version to a staging server about once a week. I then show the client what is new and explain the current state of the project in a call or by email. This is my preferred way of working instead of developing directly on an online website.

To move a website between the local installation and a staging or production server, you can use a migration plugin. I like WP Migrate Lite. You can also browse other migration plugins in the WordPress Plugin Directory or follow the Lay Theme moving guide.

Local development sites, for example websites created with Local, do not count toward your Lay Theme project limit. You can activate your Lay Theme license key locally while developing without using one of the website projects included in your license.

Updates and Keeping Client Websites Stable

For large and important client websites, I usually disable Lay Theme updates after launch. Every update can introduce a new bug, and a production website should not change unexpectedly. Lay Theme is mature now, so fundamental changes and update-related problems are much less common than they used to be. The goal is not to never update. It is to update deliberately instead of changing the website whenever a new update appears.

Go to Lay Options -> Updates and enable Disable Updates for Lay Theme. See the Lay Theme update settings documentation for the complete explanation.

Disable Updates for Lay Theme setting in Lay Options

I recommend agreeing on paid maintenance with the client once or twice a year. During a maintenance session, create a fresh backup, check that the website works before making changes, review which updates are actually useful or necessary, apply them under your supervision and test everything again afterwards.

Check the important pages on Desktop and Phone, test the WordPress editing workflow, forms, navigation, media and any custom functionality. If an update causes a problem, you can fix it immediately, restore the backup or ask me for help in the Lay Theme Support Forum. This is much safer than the client or developer installing individual updates every few weeks without checking the complete website.

Tell the client not to install Lay Theme, addon or plugin updates on their own. You take responsibility for the maintenance, test it properly and charge for that work. If there is an urgent security issue, handle it sooner. Otherwise, keep updates inside the planned maintenance schedule.

WordPress normally installs security and maintenance releases automatically, so you usually do not need to install every WordPress core update manually right away. These security fixes are more important than constantly installing every feature update. Also keep the website's PHP version on a currently supported version, because PHP updates are an important part of hosting security.

When handing the website over, you can also enable Client Mode with define( 'LAY_CLIENT_MODE', true ); in wp-config.php. Client Mode keeps content editing available, but hides and blocks site-wide Lay Theme settings. It also disables updates for Lay Theme and Lay Theme addons, so the client cannot accidentally change these parts of the website.

Backups

Regular Backups after Launch

For an important WordPress website, I always set up automatic backups that are stored outside of the website's own server. I use UpdraftPlus and connect it to Dropbox or Google Drive.

Depending on how often the website changes, I schedule a complete backup every week or every month. The backup should include the database, plugins, themes, uploads, the complete Media Library and any other files needed to restore the website. Do not keep the only backup on the same server as the website. If that server fails or is compromised, the backup could disappear with it.

Attackers are also getting better with the help of AI, so you should always assume that a WordPress website could eventually be hacked. A recent complete backup can turn a serious incident into a manageable restore. Without one, cleaning and rebuilding the website can take a professional web developer a long time and can quickly cost €500 or more.

After setting it up, run a manual backup once and check that every part arrives in the connected cloud storage. A backup plan is only useful when you know the files are actually there and can be restored.

Backups during Development

Database backups are also useful while you are developing the website. The Custom Elements, configurations and other changes created through AI Mode are stored in the WordPress database. If a large change goes wrong, a recent database backup gives you another way to return to a working state.

Do not rely completely on Change History. Before asking AI Mode to make a large or complex change, create a database backup with UpdraftPlus or another backup plugin. You can find more options in the WordPress Plugin Directory.

You do not need to create a complete backup after every small edit. But before major structural work, save a database backup and give it a clear name or date so you know which version you can restore.

Client Handoff

Before handing over a website, I recommend creating documentation for the client. It should show where they log in, where each type of content lives, which fields they need to fill out, how they replace images and which parts of the website they should leave untouched. This gives the client one clear place to look whenever they forget how something works.

You can let AI create most of this documentation. Ask it to go through the finished WordPress and Lay Theme admin, follow the actual editing workflow, take screenshots and explain step by step where the client enters each kind of content. It can then organize everything into a clear documentation website. The result should describe the real website and its specific fields instead of becoming a generic Lay Theme manual.

You can host the documentation website on Cloudflare or Railway and protect it with a password. Cloudflare offers free hosting for static HTML websites. On Railway, hosting a small documentation website can cost only a few cents per month, depending on usage. Setting up Cloudflare or Railway can be a little complicated at first, but AI can also guide you through the setup, deployment and password protection step by step.

This keeps the instructions private while making them easy for the client to access and update later. Do not include WordPress passwords, hosting credentials, API keys or other secrets in the documentation itself.

Planning and Consulting

You can hire me to help plan a larger Lay Theme project. I can review the brief or Figma design, check the technical feasibility, create diagrams for the content structure and recommend which Lay Theme and WordPress features to use for each part.

See Building Complex WordPress Websites with AI for a complete content-model example. For consulting and project planning, email me at info@laytheme.com.

Vibe Coding with Lay Theme

AI Mode is a way to vibe code inside an established WordPress system. Instead of asking AI to invent an entire content management system, it can configure WordPress, create Custom Post Types, Custom Fields, Taxonomies and Relationships, and then build the frontend with HTML, CSS, JavaScript and Liquid.

Liquid is the open-source templating language also used by Shopify themes. In Lay Theme, Liquid connects the design to content stored in WordPress. One template can automatically render many Artists, Exhibitions or Projects while every entry remains editable through its own content fields.

This gives vibe coding a structured foundation. WordPress handles the database, media, users and editing interface, while Liquid renders the dynamic frontend. You still need to plan the content structure, review the result and test the website, but you do not need to build the complete CMS and admin interface from scratch.

JavaScript, Animation and 3D

Every Custom Element and Custom View can contain its own HTML and Liquid, responsive CSS and JavaScript. This means they are not limited to static layouts. They can include animations, interactive interfaces, WebGL or 3D experiences and other custom behaviour. The creative possibilities are extremely broad.

For a complicated element, it can be easier to build and test the idea outside of Lay Theme first. Ask your AI to create it as a standalone HTML prototype. Work on it until the Desktop, Tablet and Phone versions are finished and the animation, interaction, JavaScript or 3D behaviour works exactly as intended.

Once you are happy with the prototype, give the finished files to AI Mode and ask it to turn them into a Custom Element or Custom View. The frontend can stay as it is, while the content becomes editable through Custom Fields and Liquid.

I finished this standalone HTML prototype. Turn it into a Custom Element for Lay Theme. Preserve the finished Desktop, Tablet and Phone layouts, animations, interactions, JavaScript and 3D behaviour. Move the content that should be editable into appropriate Custom Fields and connect those fields to the frontend. Keep the current design and behaviour intact. Check the result on Desktop, Tablet and Phone when you are done.

Use a Custom Element when you want to place the result freely in the Gridder. Use a Custom View when it should become the automatic frontend for a Post Type, post, taxonomy or term.

Conclusion

The gallery website is not completely finished. It still needs the final content, testing, design polish and a Site Title, Navigation and Footer. AI Mode can also build these parts as completely custom elements, independently of the existing Lay Theme settings.

You now know the core workflow: plan the structure, create Custom Post Types, Fields, Taxonomies and Relationships, turn a Figma design into editable pages, build automatic overview pages and create responsive layouts.

You also know how WordPress and Liquid work together, how to prototype JavaScript, animation or 3D, and how to deliver the website professionally with local development, Change History, backups, controlled updates and clear client documentation.

From here, you can build on this structure and add whatever your own project needs.

More Tutorials