# Overview
New: your site's AI assistant now lives in Telegram
Describe your business.
Get a working website.
Tell the built-in AI what you do — it designs the site, writes the content, finds the photos and answers your visitors. You run everything from a simple panel, or straight from Telegram. No template look, no agencies, no code.
Start Free Trial
See How It Works
AI mode
Expert
AI-Powered
|
Telegram-Native
|
Multilingual
|
No Lock-in
Everything your business needs online. Nothing you have to learn.
Pubner gives a small business a real website: its own design, content in several languages, contact forms — and an AI that keeps it all going. You talk to it like to an employee; it does the clicking. And if you ever bring in a developer, they get full access to clean code.
Inquiries from the site land straight in your Telegram
Content, photos and translations — the AI takes them on
Your own domain and full site export — never locked in
15 min
From an idea to a live website
100%
Yours — design, content and data, export anytime
Built-in AI
One AI. Two superpowers.
It builds your site when you start — and helps you run it every day after. Prefer doing things yourself? Everything works by hand too.
AI Builder
Describe what you need in plain words — the AI designs and builds it: structure, styles, texts, photos. Don't like something? Just say what to change.
Create a tennis court booking site with a modern design
Build a product catalog page with grid layout, category filters, and pagination
Design a coffee shop landing page with online ordering
AI Assistant
A copilot inside your panel — and in your Telegram. It writes posts, translates, tidies up content and replies to inquiries. It sees your real site and acts on it, never on its own without your OK.
Write a news post about our spring sale
Assign categories across these products
Translate the latest news post into English
Fix the dates in the post about the summer sale
Reply to yesterday's inquiry
Find a photo for the article and add it
Runs itself
A website that works while you don't.
Pubner is the CMS you can run from your pocket: it pings you in Telegram, you answer it there — done.
Telegram assistant
A new inquiry is in your Telegram before the visitor closes the tab. Reply, update the site, send photos or voice notes — the assistant does the clicking.
Content autopilot
Set a schedule — “a post about coffee every Friday” — and wake up to fresh drafts waiting for your approval.
AI chat for your visitors
A small chat on your site answers visitors 24/7 — about your services, hours and prices, in their language, from your real content.
Weekly pulse
Built-in visitor stats and a Monday digest in Telegram: visits, inquiries, top pages. You always know your site is alive.
Everything included. Nothing to assemble.
The tools a small business actually needs — working out of the box, no plugins to hunt for.
A design of your own
The AI builds a site that looks like your business — not like a template a thousand others use. Any detail changes by asking.
Found on Google — and in AI
Sitemap, meta tags and llms.txt out of the box. Your site is readable for search engines and for the AI assistants people ask for recommendations.
Any content, not just posts
News, menu, services, portfolio, team — create the sections your business needs, with exactly the fields you want.
Speaks your customers' languages
Add a language in one click — the AI translates your content and keeps every version in sync. No clunky plugins.
Clean code under the hood
Unlike visual builders, the AI writes real, tidy code. Any developer you ever hire can open it and keep going — no vendor traps.
All your sites in one place
Run one site or ten: one login, clear billing, team access with the right permissions for each person.
Your business deserves its own website.
Launch it today with a 14-day free trial. No card required, no template look, no agencies.
Create My Website
Sign up in under a minute — with Google or your email.
---
# Features
Platform Features
A real website for a small business: built by AI, run from a simple panel or Telegram — with clean code inside for whenever you bring a developer.
home.twig
{% for post in records({'area': 'blog'}).get() %}
{{ post.title }}
{{ post.excerpt }}
{% endfor %}
No template trap
A real site with clean code inside.
Site builders lock you into their blocks and their look. Pubner's pages are real, readable code — the AI writes it tidy, and you own every line. Your site can grow in any direction, with or without us.
Clean, semantic pages
Great for Google and accessibility — nothing bloated hiding under your design.
Full code access when you want it
If you (or your developer) want full control — the built-in cloud editor gives it, with loops, conditions and live preview.
Your content
Not just posts — your business, structured.
A café has a menu, a salon has services and masters, a studio has a portfolio. Pubner doesn't force any of it into “blog posts” — build the sections your business really has.
Custom Collections
Menu, services, portfolio, team, reviews — each with its own place.
Dynamic Fields
Prices, dates, photos, badges — exactly the fields each section needs.
Block Content Editor
Author rich content in a clean block editor — headings, lists, images — with a separate version for every language.
Create area
Save area
Name: EN *
Real Estate
Slug
real-estate
Extra fields inside «Records»
Photo
Content
Meta title
Excerpt
AI Assistant
Add a contact form to the About page
Done — I created a contact form and wired it into the About page.
edited about.twig · created contact-form.twig
Built-in AI
An AI that sees your code and your data.
Pubner ships with a real assistant — not a gimmick. Describe what you want and it builds pages and styles; ask, and it writes posts, translates, fixes content, finds photos and answers your inquiries. It sees your actual site and always shows you what it's about to change.
AI Builder
Turn plain-language requests into pages, layouts and styles — no Twig required.
AI Assistant
Generate content, fill system files, set up records and more — it sees your code and data.
Telegram & Automation
Run the whole site from your pocket.
Connect the Telegram assistant once — and the site starts coming to you: inquiries arrive as messages, the weekly digest reports the numbers, and any change is one chat message away. Photos from your phone and voice notes work too.
Inquiries in real time
A visitor writes on the site — you read it in Telegram. Ask the assistant to draft a reply; it sends only after your OK.
Photos & voice commands
Send a photo — it lands in your site's gallery. Record a voice note — it becomes a command.
Pubner Assistant
Who wrote to us today?
Two new inquiries. Maria asks about Saturday delivery — I've drafted a reply. Send it?
list_contacts · draft ready · waiting for your ✅
Built for stability and peace of mind.
We take care of the boring parts — hosting, speed, security, backups — so you can focus on your business.
Native Multilingual Engine
Forget clunky translation plugins. Pubner supports multilingual content natively at the database level. Add a language, use the t() helper, and your site is globally ready.
Fast for every visitor
Pages and photos load instantly — good for impatient visitors and for your Google ranking alike.
Centralized Hub
One site or many — manage websites, billing and team access from one clean dashboard.
Absolute Tenant Isolation
Your data is yours alone. Every website lives in its own isolated space with strict separation — nobody else's traffic or content can touch it.
Ready for a site that works for you?
Create an account, describe your business, and see your first version live today. 14 days free, no card.
Start Free Trial
Read Documentation
---
# About
About Pubner
We're building the website platform a small business actually needs: an AI that does the work, a panel anyone understands, Telegram in your pocket — and clean code underneath, so you're never trapped.
Our Story
Born from frustration with the status quo.
For years a small business had two options: pay an agency real money for a site that's outdated in a year — or fight a template builder that looks like everyone else's and still eats your evenings.
Meanwhile AI got genuinely good at this work. But most builders bolt it on as a toy: it writes a paragraph and leaves you alone with the rest.
So we built Pubner. The AI here designs the site, writes and translates the content, answers your visitors and reports to you in Telegram. And underneath it all is clean, exportable code — so the site is truly yours.
The Perfect Stack
AI. Content. Telegram. Cloud. Unified.
Our Core Philosophy
Every line of code in Pubner is written with these three principles in mind.
Owners first
You shouldn't have to learn a CMS to run a coffee shop. Every feature must work from a simple panel — or a chat message. The complexity is our job.
Zero Compromises on Security
In a multi-tenant world, isolation is everything. Our architecture ensures that every tenant operates in a completely sandboxed environment. Your clients' data is theirs alone.
Performance by Default
We don't rely on caching plugins. From optimized routing and efficient database queries to compiled Twig views, speed is baked into the very core of the platform.
One site or twenty — under control.
The Hub shows all your websites in one place: status, billing, team access. Growing a second location? A new brand? It's one click, not a new hosting account. (Agencies running dozens of client sites: this was built with you in mind too.)
Explore the Hub
HUB
Be among the first.
We're onboarding our first wave of businesses right now. Join early — your feedback will shape what Pubner becomes.
Create Your Account
---
# Pricing
Simple, transparent pricing
Two simple plans — same features, different scale. Try it free, no credit card.
14 days free
Starter
$5
/ month
Every account starts with a 14-day free trial — all features, no credit card.
1 Site
Full Cloud Editor Access
3 Themes
250 MB Storage
3 Record Areas
Up to 300 Records
30 Categories, Tags & Custom Attributes each
Custom Domain Support
AI Builder & AI Assistant*
Start 14-day free trial
No card for the trial. Cancel anytime. Billed monthly after the trial.
For Growing Projects
Premium
$20
/ month
Same features — five times the room. For agencies and growing brands.
5 Sites
Full Cloud Editor Access
each of your 5 sites
5 Themes
1 GB Storage
10 Record Areas
Up to 1000 Records
100 Categories, Tags & Custom Attributes each
Custom Domain Support
Priority Support
AI Builder & AI Assistant*
Get Started with Premium
Cancel anytime. Billed monthly.
* AI Builder and AI Assistant are available on every plan — usage is billed separately based on token consumption.
---
# Documentation
Help & Documentation
Getting Started
Building with AI
Expert mode (code)
Core Templating
Pages
Partials
Layouts
Variables & Logic
Routing & SEO
Clean URLs & Binding
Managed SEO
Redirects & Navigation
Helpers
Forms & UI
Localization
Working with Data
Global Data
Record Builder
Record Content
Running your site
Telegram assistant
AI chat widget
Content autopilot
Site email
Pubner gives you two ways to build a site: describe what you want and let the AI assistant build it, or open Expert mode and craft the templates yourself. This guide covers both — start with the basics, then move on to clean URLs, SEO and the data builders.
Building with AI
The fastest way to build with Pubner is to simply describe what you want. In your site panel, switch the editor to AI mode, type a request in plain language, and the assistant builds the page for you — showing a live preview next to the chat as it works.
The assistant can create and edit pages, layouts and partials, and wire up routes for you. Keep refining in conversation — “make it wider”, “add a testimonials section” — and nothing touches your live site until you press Save. At any point you can switch to Expert mode to fine-tune the generated code by hand.
Example prompts:
{# Describe a page the way you'd explain it to a designer #}
“Create a contact page with a form and a map.”
“Add a blog section with categories and pagination.”
“Make the header sticky and add a language switcher.”
Every change is previewed before it goes live, and earlier versions are kept — so you can experiment freely and roll back whenever you need to.
Expert mode: your theme files
A Pubner theme is just Twig templates and one YAML config — no PHP. There are four kinds of files: pages/ (one template per URL), partials/ (reusable chunks), layouts/ (the HTML shell around every page), and config.yml (which URL loads which page). You edit them directly in the panel and switch between Expert and AI mode whenever you like.
Because themes contain no PHP, a template can never run arbitrary code — the worst a mistake can do is render broken HTML. Every save is validated first, and previous versions are kept so you can always roll back.
How a theme is organized:
my-theme/
├─ config.yml {# routes #}
├─ layouts/
│ └─ layout.twig {# the HTML shell #}
├─ pages/
│ ├─ home.twig {# one file per page #}
│ └─ post.twig
└─ partials/
├─ header.twig {# reusable chunks #}
└─ footer.twig
Pages
Pages are the most crucial elements of your Pubner website. Every URL route corresponds to a specific Page template. When a visitor requests a URL, the system loads the associated Page, processes its Twig code, and injects the output into the defined Layout.
Think of a Page as the "body" of your content. It contains only what is unique to that specific URL (like an article's text, or a specific form), while the global elements (like the navigation bar or footer) are handled by Layouts and Partials.
Render the current page content inside a layout:
{% page %}
Partials
Partials are reusable chunks of HTML and Twig logic. By breaking your design into partials, you keep your codebase DRY (Don't Repeat Yourself) and highly organized. If you need to update your site's footer, you only change one partial file, and it instantly updates across the entire site.
Common use cases for partials include headers, footers, sidebar widgets, product cards, or complex UI components that are used on multiple different pages.
Include a partial in your layout or page:
{% partial 'navigation.twig' %}
Pass data into a partial:
{% partial 'card.twig' product=item, featured=true %}
Named parameters become variables inside the partial — here product and featured are available directly in card.twig.
Layouts & Placeholders
Layouts define the core HTML wrapper of your site (the ,
, and tags). A single project can have multiple layouts (e.g., one for the public site, another for a customer dashboard).
To make layouts flexible, Pubner uses Placeholders. Placeholders act as "hooks" where individual pages can inject custom content, such as specific SEO meta tags, extra CSS stylesheets, or tracking scripts.
Define a placeholder in your layout:
{% placeholder styles %}
Push content to a placeholder from a specific Page:
{% put styles %}
{% endput %}
Content placed between the put tags will be automatically injected exactly where the placeholder is defined in your layout.
Variables & Control Logic
Pubner is powered by the modern Twig template engine. This allows you to write clean, secure, and highly dynamic templates without writing pure PHP code.
You can easily output variables, apply filters to transform text, loop through arrays of data (like blog posts or products), and use conditional logic to show or hide elements based on the current state or user session.
Output variables and use conditions:
{% if site().name %}
Welcome to {{ site().name }}
{% endif %}
Loop over a collection:
{% for post in records({'area': 'blog'}).get() %}
{{ post.name }}
{% else %}
No posts yet.
{% endfor %}
Clean URLs & Route Binding
In config.yml, every route is built from segments instead of a hand-typed path. A segment is either a fixed word (a literal, like news) or a captured value (a param, like a slug). A segment can also be bound to your content — an area, a category or a record — which Pubner then looks up automatically by its slug.
When a segment is bound, Pubner loads that item for you and injects it into the page: the record is available as record, plus area and category if you bind them. Mark one binding as primary and its fields also spread to the top level, so you can write name on its own. If the slug matches nothing, Pubner returns a clean 404 automatically — no manual lookup, no error page to build.
A bound detail route in config.yml:
- page: post.twig
layout: layout.twig
segments:
- { type: literal, value: news, bind: area }
- { type: param, name: slug, bind: record, primary: true }
This serves /news/{slug}. The news area is validated, the record is loaded by slug, and a missing slug 404s on its own. Prefer not to touch YAML? The panel's visual URL builder writes these segments for you.
Use the bound model in post.twig:
{# record is injected — no query needed #}
{{ record.name }}
{{ record.content | raw }}
{# the primary binding also spreads to the root #}
{{ name }}
No set, no firstOrFail(). The bound record arrives ready to use — and it's the same model the SEO block uses for the page title.
Managed SEO
One function — seo_head() — renders your entire managed SEO block: the , the meta description, a robots tag when indexing is turned off, and your analytics snippet. Drop it into your layout's once and it stays correct on every page.
Titles fill themselves in. On a bound detail page, seo_head() uses the record's meta_title and meta_description, falling back to its name and then the site name. To override on a specific page, call seo_title() / seo_description() from the page body. The brand suffix, indexing on/off and analytics ID are set once in Site settings (seo_title_suffix, seo_indexing, seo_ga). Need the pieces separately? seo('title'), seo('description'), seo('robots') and seo('analytics') each return one part.
Add the managed head to your layout:
{% placeholder meta %} {# your charset / viewport block #}
{{ seo_head() }}
One call renders the title, description, robots and analytics tags together.
Override title & description on a page:
{# call these from the page body #}
{{ seo_title('Summer Sale — up to 50% off') }}
{{ seo_description('Our biggest discounts of the year, ending Sunday.') }}
Bound detail pages usually need none of this — the record's meta_title / meta_description are used automatically.
Redirects & Navigation
Navigating users around your application should be safe and predictable. Pubner provides a suite of Twig functions to handle internal and external redirects directly from your templates.
Additionally, you can use the request_is() helper to easily determine the active state of navigation menus, supporting wildcard patterns and localized routes.
Available Redirect Helpers:
{# Redirect to a specific URL #}
{{ redirect('/about') }}
{# Redirect to the previous page #}
{{ redirect_back() }}
{# Redirect only if the user is logged in (Guest protection) #}
{{ redirect_if_auth('/dashboard') }}
{# Safe redirect (Prevents external open-redirect vulnerabilities) #}
{{ redirect_safely(user_provided_url) }}
Check Active Route (Great for Navbars):
{% if request_is('about*', 'contact') %}
{# This will be true for /about, /about/team, and /contact #}
Company
{% endif %}
Build Locale-Aware URLs with page_url():
{# Link to a record detail page (locale-aware) #}
Read more
{# Link to a static page #}
About Us
{# Single-language → /news/my-post Multilingual → /ua/news/my-post #}
Forms, Assets & UI Helpers
Building interactive elements like contact forms or loading static assets (CSS/JS) is streamlined through our built-in helpers. They automatically handle security (CSRF tokens), routing, and session state.
We also provide an automated paginator generator that will inject a clean, responsive pagination component wherever you need it, creating the necessary partial files on the fly if they don't exist.
Initialize a secure form:
{{ form({'action': 'contact.send', 'redirect': '/thanks'}).open() }}
{# Form inputs go here #}
{{ form().close() }}
Add inputs to your form:
{{ form({'action': 'contact.send'}).open() }}
{{ form().text('name') }}
{{ form().email('email') }}
{{ form().textarea('message') }}
{{ form().select('topic', {'sales': 'Sales', 'support': 'Support'}) }}
{{ form().submit('Send message') }}
{{ form().close() }}
Inputs repopulate from the last submission and show validation errors automatically. Also available: password(), file(), checkbox(), radio(), hidden(), label() and button().
Check for form success/fail alerts:
{% if success() %}
Message sent successfully!
{% endif %}
Generate Pagination Links:
{{ paginator_links(records) }}
Pass a paginated collection here. Pubner will automatically generate a pagination.twig partial in your theme if it doesn't exist.
Localization & Languages
Pubner is built from the ground up for global audiences. The native localization system allows you to translate static text strings and build intelligent language switchers with minimal effort.
The lang() object gives you full control over the URL structure, automatically injecting or updating the language prefix in the current URL while preserving query parameters.
Translate text strings:
{{ t('btn_checkout', 'Proceed to Checkout') }}
Using a default fallback string ensures your layout doesn't break even if the translation key hasn't been saved in the database yet.
Language Switcher Logic:
{# Get current language code (e.g., 'en') #}
{{ lang().current() }}
{# Check if specific language is active #}
{% if lang().is('ua') %}...{% endif %}
{# Generate a URL for a different language (Keeps current path) #}
Українська
Global Data Helpers
To build a truly dynamic platform, you need access to the environment. Pubner exposes global helpers to retrieve the current Site's configuration, authenticated user details, and URL payload data.
These helpers fetch data instantly without the need to write complex backend controllers for every single view.
Site Configuration Data:
Site Name: {{ site('name') }}
Primary Email: {{ site().email }}
Available Locales: {{ site().locales | join(', ') }}
Authenticated User & Requests:
{# Get logged-in user name (Returns null if guest) #}
{{ auth('name') }}
{# Get current URL Path parameter #}
{{ path('slug') }}
{# Get $_GET or $_POST request data #}
{{ request('search_query') }}
The Record Builder
The true power of a CMS is querying data. The Builders allow you to query your database records, categories, and areas directly from the template layer. They are extremely fast and automatically respect your site's multi-tenant boundaries.
There are two ways to query. Pass a filter array — records({...}) — for quick, declarative lookups, or chain methods fluently for more control. Either way, finish with .get() (an array of items), .first(), .paginate() or .count().
Filter-array style (e.g., Blog Posts or Products):
{% set posts = records({
'area': 'blog',
'limit': 10,
'sort': '-published_at'
}).get() %}
Pass 'area' with an area's slug to scope the query. For sort, prefix a field with - for descending order (e.g. -published_at) or omit it for ascending.
Fluent chaining for finer control:
{% set posts = records()
.where('category', 'guides')
.search(request('q'))
.latest()
.limit(6)
.get() %}
Filter with .where() / .whereNot() / .whereIn() / .like() / .search(); order with .latest() / .oldest() / .sort('-field') / .rand(); and use .with() to eager-load related data.
Paginate results:
{% set page = records({'area': 'blog'}).paginate() %}
{% for post in page.data %} ... {% endfor %}
{{ paginator_links(page) }}
.paginate() returns the items in page.data plus paging metadata; pass the whole result to paginator_links() to render the controls.
Query Categories and Areas:
{# Fetch Categories for a specific Area #}
{% set blog_categories = categories({'area': 'blog'}).get() %}
{# Fetch a specific structural Area #}
{% set portfolio_area = areas({'slug': 'portfolio'}).first() %}
Rendering Record Content
Records and categories store their rich content as structured blocks, written in the panel's block editor — separately for each language. Your templates never touch the raw blocks: the platform renders them into clean HTML for the current locale.
Read the rendered HTML from the content field and output it with Twig's raw filter — the same for records and categories. On a record's own page (the record bound to the route) the short content variable is available directly, without a prefix.
Output a record's content:
{# Fetch the record and render its content #}
{% set post = records({'slug': path('slug')}).first() %}
{{ post.content | raw }}
The HTML comes only from the editor's whitelisted blocks — headings, paragraphs, lists, images and links — so it is safe to output with raw.
Telegram assistant
Connect your Telegram once and the site starts coming to you: new inquiries arrive as messages, the weekly digest reports your numbers, and the AI assistant answers your requests right in the chat — it can write posts, translate, update content and draft replies to inquiries.
To connect: open Panel → Profile, press Connect next to Telegram and tap Start in the chat that opens. Every admin connects their own chat; what each person sees respects their panel permissions. Send /stop to the bot any time to unlink.
The assistant never acts silently: anything that changes your live site or emails a real person comes back as a preview with ✅ Confirm / ❌ Cancel buttons. Photos you send land in your site's Cloud; a voice note becomes a command.
AI chat widget for visitors
Your site can answer visitors itself. The AI chat widget knows your published content — services, prices, posts — and replies in the visitor's language, 24/7. It only ever sees what is already public on your site.
Turn it on in Settings → AI chat widget: pick the accent color, write a greeting per language, set a daily limit — and the widget appears on your site. It runs on your AI balance; if the balance is empty the widget simply hides.
Content autopilot
The autopilot writes posts on a schedule you set: “an article about coffee trends every Friday”, “news from our industry twice a month”. It can search the live web for fresh facts and picks matching photos.
Everything it writes is saved as a draft — nothing is published without you. Set it up in Settings → Content autopilot; you'll get a notification (and a Telegram ping, if connected) whenever a new draft is ready for review.
Site email
Your site sends email on your behalf — notifications about new inquiries and replies you approve. For this it uses your own email provider, so messages come from your address and land in inboxes, not spam.
Set it up in Settings → Mail config: pick a provider (any SMTP, Brevo, SendGrid, Mailgun), paste its credentials and hit Send test email. Without this, the site simply doesn't send mail — inquiries still arrive in the panel and Telegram.