-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathindex.html
More file actions
51 lines (45 loc) · 44.3 KB
/
Copy pathindex.html
File metadata and controls
51 lines (45 loc) · 44.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<!doctype html>
<html lang="en" dir="ltr" class="plugin-pages plugin-id-default" data-has-hydrated="false">
<head>
<meta charset="UTF-8">
<meta name="generator" content="Docusaurus v3.9.2">
<title data-rh="true">Agent-first open-source admin panel framework</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://adminforth.dev/img/og.jpg"><meta data-rh="true" name="twitter:image" content="https://adminforth.dev/img/og.jpg"><meta data-rh="true" property="og:url" content="https://adminforth.dev/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docusaurus_tag" content="default"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docsearch:docusaurus_tag" content="default"><meta data-rh="true" property="og:title" content="Agent-first open-source admin panel framework"><meta data-rh="true" name="description" content="Build robust and powerful agentic back-office panels for your projects while maintaining full control over the code. AdminForth is a flexible, modern foundation for developer-owned back-end management systems."><meta data-rh="true" property="og:description" content="Build robust and powerful agentic back-office panels for your projects while maintaining full control over the code. AdminForth is a flexible, modern foundation for developer-owned back-end management systems."><meta data-rh="true" property="og:type" content="website"><meta data-rh="true" property="og:site_name" content="AdminForth"><meta data-rh="true" property="og:image:alt" content="AdminForth social card"><meta data-rh="true" name="twitter:title" content="Agent-first open-source admin panel framework"><meta data-rh="true" name="twitter:description" content="Build robust and powerful agentic back-office panels for your projects while maintaining full control over the code. AdminForth is a flexible, modern foundation for developer-owned back-end management systems."><meta data-rh="true" name="twitter:image:alt" content="AdminForth social card"><meta data-rh="true" name="twitter:label1" content="License"><meta data-rh="true" name="twitter:data1" content="Open source and free"><meta data-rh="true" name="twitter:label2" content="Stack"><meta data-rh="true" name="twitter:data2" content="Tailwind, Vue, TypeScript"><link data-rh="true" rel="icon" href="/img/favicon.png"><link data-rh="true" rel="canonical" href="https://adminforth.dev/"><link data-rh="true" rel="alternate" href="https://adminforth.dev/" hreflang="en"><link data-rh="true" rel="alternate" href="https://adminforth.dev/" hreflang="x-default"><link data-rh="true" rel="preconnect" href="https://VSIPOF54AV-dsn.algolia.net" crossorigin="anonymous"><script data-rh="true">function insertBanner(){var n=document.createElement("div");n.id="__docusaurus-base-url-issue-banner-container";n.innerHTML='\n<div id="__docusaurus-base-url-issue-banner" style="border: thick solid red; background-color: rgb(255, 230, 179); margin: 20px; padding: 20px; font-size: 20px;">\n <p style="font-weight: bold; font-size: 30px;">Your Docusaurus site did not load properly.</p>\n <p>A very common reason is a wrong site <a href="https://docusaurus.io/docs/docusaurus.config.js/#baseUrl" style="font-weight: bold;">baseUrl configuration</a>.</p>\n <p>Current configured baseUrl = <span style="font-weight: bold; color: red;">/</span> (default value)</p>\n <p>We suggest trying baseUrl = <span id="__docusaurus-base-url-issue-banner-suggestion-container" style="font-weight: bold; color: green;"></span></p>\n</div>\n',document.body.prepend(n);var e=document.getElementById("__docusaurus-base-url-issue-banner-suggestion-container"),s=window.location.pathname,o="/"===s.substr(-1)?s:s+"/";e.innerHTML=o}document.addEventListener("DOMContentLoaded",function(){void 0===window.docusaurus&&insertBanner()})</script><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@graph":[{"@type":"WebSite","name":"AdminForth","alternateName":"Agent-first open-source admin panel framework","url":"https://adminforth.dev/","description":"You can use AdminForth to build robust and powerful agentic back-office panels for your projects while maintaining full control over the code. It is designed for developers who need a flexible, modern foundation for back-end management systems.","image":"https://adminforth.dev/img/og.jpg"},{"@type":"SoftwareApplication","name":"AdminForth","alternateName":"Agent-first open-source admin panel framework","applicationCategory":"BusinessApplication","applicationSubCategory":"Admin panel framework","operatingSystem":"Web browser","url":"https://adminforth.dev/","image":"https://adminforth.dev/img/og.jpg","screenshot":"https://adminforth.dev/img/adminforth_screenshot.png","description":"You can use AdminForth to build robust and powerful agentic back-office panels for your projects while maintaining full control over the code. It is designed for developers who need a flexible, modern foundation for back-end management systems.","isAccessibleForFree":true,"offers":{"@type":"Offer","price":"0","priceCurrency":"USD"},"featureList":["Connect to existing Postgres, MySQL, SQLite, or MongoDB data, provide an OpenAI or Anthropic API key, and start using the internal agent in natural language with npx adminforth create-app.","Ships assets for coding agents like Claude, Codex, Copilot, and Antigravity, including AGENTS.md, CLAUDE.md, llms.txt, and skills.","Always open-source and free.","Built with Tailwind CSS and fully extendable with Vue and TypeScript.","Premade RFC and OWASP-compatible plugins for TOTP, passkeys, third-party auth providers, and audit logs.","Rich component library for custom admin controls and pages."],"sameAs":["https://github.com/devforth/adminforth","https://demo.adminforth.dev/"]}],"dateModified":"2026-09-16T18:01:58.664Z"}</script><link rel="alternate" type="application/rss+xml" href="/blog/rss.xml" title="Agent-first open-source admin panel framework RSS Feed">
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Agent-first open-source admin panel framework Atom Feed">
<link rel="preconnect" href="https://www.google-analytics.com">
<link rel="preconnect" href="https://www.googletagmanager.com">
<script async src="https://www.googletagmanager.com/gtag/js?id=G-7K99Q2BH04"></script>
<script>function gtag(){dataLayer.push(arguments)}window.dataLayer=window.dataLayer||[],gtag("js",new Date),gtag("config","G-7K99Q2BH04",{anonymize_ip:!0})</script>
<link rel="search" type="application/opensearchdescription+xml" title="Agent-first open-source admin panel framework" href="/opensearch.xml">
<meta name="application-name" content="AdminForth">
<meta name="robots" content="index,follow,max-image-preview:large,max-snippet:-1,max-video-preview:-1">
<meta name="googlebot" content="index,follow,max-image-preview:large,max-snippet:-1,max-video-preview:-1">
<meta name="keywords" content="agent-first admin panel framework, open-source admin panel, agentic back office, tailwind admin framework, vue typescript admin panel, internal admin agent">
<link rel="image_src" href="https://adminforth.dev/img/adminforth_screenshot.png">
<script type="application/ld+json">{"@context":"https://schema.org","@type":"WebSite","name":"AdminForth","url":"https://adminforth.dev","description":"Agent-first open-source admin panel framework. Build robust and powerful agentic back-office panels for your projects while maintaining full control over the code.","keywords":"backoffice, vue backoffice, agent-first admin panel framework, open-source admin panel, agentic back office, tailwind admin framework, vue typescript admin panel, internal admin agent"}</script>
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Familjen+Grotesk:wght@500;700&family=IBM+Plex+Mono:wght@400;500&family=IBM+Plex+Sans:wght@400;500;600&display=swap">
<script src="/scripts/adminforth.js"></script>
<script src="/scripts/tluma-config.js"></script>
<script src="https://tluma.ai/widget.js" async></script><link rel="stylesheet" href="/assets/css/styles.55f62380.css">
<script src="/assets/js/runtime~main.792cdd56.js" defer="defer"></script>
<script src="/assets/js/main.76e76321.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<svg style="display: none;"><defs>
<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
</defs></svg>
<script>!function(){var t=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",t||"light"),document.documentElement.setAttribute("data-theme-choice",t||"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/"><div class="navbar__logo"><img src="/img/logo.svg" alt="AdminForth Logo" class="themedComponent_mlkZ themedComponent--light_NVdE"><img src="/img/logo.svg" alt="AdminForth Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU"></div><b class="navbar__title text--truncate">AdminForth</b></a><a class="navbar__item navbar__link" href="/docs/tutorial/gettingStarted/">Tutorial</a><a class="navbar__item navbar__link" href="/docs/api/">API</a><a class="navbar__item navbar__link" href="/blog/">Blog</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><div class="navbarSearchContainer_Bca1"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search (Command+K)"><span class="DocSearch-Button-Container"><svg width="20" height="20" class="DocSearch-Search-Icon" viewBox="0 0 20 20" aria-hidden="true"><path d="M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z" stroke="currentColor" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"></path></svg><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"></span></button></div><a href="https://demo.adminforth.dev/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Live Demo<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://github.com/devforth/adminforth" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="landing_V_Km"><header class="hero_aEcG"><div class="wrap_T5Hr heroGrid_ibpR"><div><span class="eyebrow_kY3W">Open source · MIT · Self-hosted</span><h1 class="heroTitle_qg2I">The back-office agents <em class="accent_TDbE">build</em>, and agents<!-- --> <em class="accent_TDbE">run</em>.</h1><p class="heroLede_tbCg">A back-office framework for the two people who already work with agents: the developer, who lets Claude Code or Codex write the panel, and the admin, who lets an agent work inside it. Same repo, same database, same permissions.</p><div class="cta__fRr"><a class="btn_bvfa btnPrimary_hBjO" href="/docs/tutorial/gettingStarted/">Get started</a><a href="https://demo.adminforth.dev/" target="_blank" rel="noopener noreferrer" class="btn_bvfa btnGhost_qNii">Open live demo</a></div><div class="term_hlVX"><div class="termBar_cvn2"><i></i><i></i><i></i></div><div class="termBody_Djwr"><p class="termLine_slJu"><span class="termPrompt_mD0s">$</span><span>npx adminforth create-app</span></p><p class="termLine_slJu"><em class="termNote_jgRt"># Postgres · MySQL · SQLite · Mongo</em></p></div></div></div><div class="panel_aLk8"><div class="panelBar_NfPp"><span class="tl_TG81"></span><span class="tl_TG81"></span><span class="tl_TG81"></span><span class="panelUrl_OU_P">localhost:3000/resource/users</span></div><div class="panelBody_Q075"><aside class="panelSide_p02P"><div class="sideBrand_UnjL"><svg viewBox="0 0 16 16" aria-hidden="true"><path d="M8.034 6.006V13H6.097V12.194C5.59433 12.8007 4.86633 13.104 3.913 13.104C3.25433 13.104 2.65633 12.9567 2.119 12.662C1.59033 12.3673 1.17433 11.947 0.871 11.401C0.567667 10.855 0.416 10.2223 0.416 9.503C0.416 8.78367 0.567667 8.151 0.871 7.605C1.17433 7.059 1.59033 6.63867 2.119 6.344C2.65633 6.04933 3.25433 5.902 3.913 5.902C4.80567 5.902 5.50333 6.18367 6.006 6.747V6.006H8.034ZM4.264 11.44C4.77533 11.44 5.2 11.2667 5.538 10.92C5.876 10.5647 6.045 10.0923 6.045 9.503C6.045 8.91367 5.876 8.44567 5.538 8.099C5.2 7.74367 4.77533 7.566 4.264 7.566C3.744 7.566 3.315 7.74367 2.977 8.099C2.639 8.44567 2.47 8.91367 2.47 9.503C2.47 10.0923 2.639 10.5647 2.977 10.92C3.315 11.2667 3.744 11.44 4.264 11.44Z" fill="currentColor"></path><path d="M13.317 5.538C12.589 5.538 12.0387 5.69833 11.666 6.019C11.2933 6.331 11.107 6.80333 11.107 7.436V7.995H14.851V9.685H11.107V13H9.001V7.449C9.001 6.279 9.365 5.369 10.093 4.719C10.8297 4.069 11.8567 3.744 13.174 3.744C13.694 3.744 14.1837 3.80033 14.643 3.913C15.1023 4.017 15.501 4.173 15.839 4.381L15.189 6.045C14.669 5.707 14.045 5.538 13.317 5.538Z" fill="var(--signal)"></path></svg>AdminForth</div><nav><a class="on_QHIv" href="#users">Users</a><a href="#users">Orders</a><a href="#users">Products</a><a href="#users">Audit log</a></nav></aside><div><div class="panelHead_DIiz"><b>Users</b><span class="count_Kmqv">1 284 records</span><span class="mini_rXwS">+ Create</span></div><div class="scroll_QFsE"><table><thead><tr><th>Email</th><th>Role</th><th>Status</th></tr></thead><tbody><tr><td>alice@acme.io</td><td>Admin</td><td><span class="pill_OEjO pillOk_aDgS">Active</span></td></tr><tr><td>b.novak@acme.io</td><td>Editor</td><td><span class="pill_OEjO pillOk_aDgS">Active</span></td></tr><tr><td>carol@vendor.co</td><td>Viewer</td><td><span class="pill_OEjO pillWarn_PJ4B">Invited</span></td></tr><tr><td>d.ross@acme.io</td><td>Editor</td><td><span class="pill_OEjO pillOff_euOG">Suspended</span></td></tr></tbody></table></div></div></div></div></div></header><main><section class="sec_bT0q"><div class="wrap_T5Hr secGrid_ckBc"><div class="secLabel_e8f_"><span class="eyebrow_kY3W">Two sides</span><p>One panel, written with agents and then worked by them.</p></div><div><h2 class="h2_gZ6G">Developers use agents. So do admins.</h2><p class="lede_wCb7">Most back-office tools are built for one of the two and leave the other clicking. AdminForth treats both as the normal case, and gives each a first-class surface.</p><div class="dual_d3b6"><div class="dcard_JXxm"><span class="who_htCM">Developers who use agents</span><h3 class="h3_MdNH">Your coding agent already knows this repo</h3><p>Every generated app ships the files agents look for, and the config is a plain declarative object — so Claude Code, Codex, Gemini or Copilot can add a resource, a column or a plugin without being re-taught the project each session.</p><ul class="files_CAs2"><li>AGENTS.md</li><li>CLAUDE.md</li><li>llms.txt</li><li>skills/</li></ul><a class="link_J5gy" href="/docs/tutorial/gettingStarted/">Read the getting started guide</a></div><div class="dcard_JXxm"><span class="who_htCM">Admins who use agents</span><h3 class="h3_MdNH">The panel is also a data surface</h3><p>Turn the same resources into tools an agent can call, so an operator can ask for the data instead of paging through it — and change it without a developer in the loop.</p><ul class="plain_fwdx"><li>Read, filter and write the records your team sees</li><li>Runs as the user who issued the secret — permissions, validation and hooks apply</li><li>One secret per agent, revocable on its own</li></ul><a class="link_J5gy" href="/docs/tutorial/Plugins/mcp/">Read the MCP docs</a></div></div><div class="mcp_CF5s"><div class="mcpText_T8Ad"><span class="flag_f77X">New plugin</span><h3 class="h3_MdNH">MCP Server</h3><p>Let your agent work the data in your panel — read it, clean it up, write it back. An agent is just another frontend for the same data: the same hooks, the same permissions, the same audit log.</p><a class="link_J5gy" href="/docs/tutorial/Plugins/mcp/">Read the MCP docs</a></div><div class="mcpImage_lg7m"><div class="mcpShot_9iFT" role="img" aria-label="AdminForth MCP server connected to Claude Code, OpenAI Codex and Gemini CLI" style="background-image:url(/assets/images/mcp-cf2b3c2f681c76a4850434b7ea31ee05.png)"></div></div></div></div></div></section><section class="sec_bT0q"><div class="wrap_T5Hr secGrid_ckBc"><div class="secLabel_e8f_"><span class="eyebrow_kY3W">How it works</span><p>Three steps, in order. No scaffolding to maintain after.</p></div><div><h2 class="h2_gZ6G">Declare the resource. Keep the code.</h2><p class="lede_wCb7">AdminForth reads the schema you already have — nothing is copied or locked into a proprietary format. The panel is an ordinary Node app in your repo, which is also why an agent can edit it and a reviewer can read the diff.</p><pre class="code_wG_E">{
<span class="k_BBzr">dataSource</span>: <span class="s_EdmB">'maindb'</span>,
<span class="k_BBzr">table</span>: <span class="s_EdmB">'users'</span>,
<span class="k_BBzr">resourceId</span>: <span class="s_EdmB">'users'</span>,
<span class="k_BBzr">columns</span>: [
{ <span class="k_BBzr">name</span>: <span class="s_EdmB">'id'</span>, <span class="k_BBzr">primaryKey</span>: true, <span class="k_BBzr">showIn</span>: { <span class="k_BBzr">list</span>: false } },
{ <span class="k_BBzr">name</span>: <span class="s_EdmB">'email'</span>, <span class="k_BBzr">required</span>: true, <span class="k_BBzr">isUnique</span>: true },
{ <span class="k_BBzr">name</span>: <span class="s_EdmB">'role'</span>, <span class="k_BBzr">enum</span>: [
{ <span class="k_BBzr">value</span>: <span class="s_EdmB">'admin'</span>, <span class="k_BBzr">label</span>: <span class="s_EdmB">'Admin'</span> },
{ <span class="k_BBzr">value</span>: <span class="s_EdmB">'editor'</span>, <span class="k_BBzr">label</span>: <span class="s_EdmB">'Editor'</span> },
] }, <span class="c_AfeO">// renders as a select</span>
{ <span class="k_BBzr">name</span>: <span class="s_EdmB">'created_at'</span>, <span class="k_BBzr">showIn</span>: { <span class="k_BBzr">create</span>: false } },
],
}</pre></div></div></section><section class="sec_bT0q"><div class="wrap_T5Hr secGrid_ckBc"><div class="secLabel_e8f_"><span class="eyebrow_kY3W">Watch</span><p>Six minutes, from an empty folder to a working panel.</p></div><div><h2 class="h2_gZ6G">See it built once.</h2><p class="lede_wCb7">An existing database, one command, and the agent taking it from there.</p><div class="panel_aLk8"><div class="panelBar_NfPp"><span class="tl_TG81"></span><span class="tl_TG81"></span><span class="tl_TG81"></span><span class="panelUrl_OU_P">youtube.com · AdminForth overview</span></div><iframe class="videoFrame_Py2W" src="https://www.youtube-nocookie.com/embed/4tB8uzY__uk" title="AdminForth overview video" loading="lazy" referrerpolicy="strict-origin-when-cross-origin" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen=""></iframe></div></div></div></section><section class="sec_bT0q"><div class="wrap_T5Hr secGrid_ckBc"><div class="secLabel_e8f_"><span class="eyebrow_kY3W">In the panel</span><p>What ships, and what a plugin adds on top.</p></div><div><h2 class="h2_gZ6G">What it can do for you.</h2><p class="lede_wCb7">Every screen below is the stock interface or a plugin you enable with a line of config.</p><div class="gallery_P6ck"><div class="gcard_OP4Q"><img src="/assets/images/login_form-e39e8b344176092f67e67a90816672db.png" alt="Authentication and Authorization" title="Authentication and Authorization" loading="lazy"><div class="gcardBody_f7I3"><h3 class="gcardTitle_LEse">Authentication and Authorization</h3><p>OWASP-Compliant Sign-In done for you</p><a class="link_J5gy" href="/docs/tutorial/gettingStarted/">Learn how</a></div></div><div class="gcard_OP4Q"><img src="/assets/images/sso-a3bfb421a09e53b312267169c026b44f.png" alt="OAuth2/OpenID SSO Plugin - one click login" title="OAuth2/OpenID SSO Plugin - one click login" loading="lazy"><div class="gcardBody_f7I3"><h3 class="gcardTitle_LEse">OAuth2/OpenID SSO Plugin - one click login</h3><p>RFC 6749 SSO plugin with premade Google, Github, Facebook, Keycloak, Microsoft or any custom OAuth2 adapter</p><a class="link_J5gy" href="/docs/tutorial/Plugins/oauth/">Learn how</a></div></div><div class="gcard_OP4Q"><img src="/assets/images/2fa_plugin-b99b1bc08f2fe162b135ffe8f5f46dba.png" alt="2FA Plugin - secure your admin panel" title="2FA Plugin - secure your admin panel" loading="lazy"><div class="gcardBody_f7I3"><h3 class="gcardTitle_LEse">2FA Plugin - secure your admin panel</h3><p>RFC 6238-Compliant TOTP-Based & WebAuthn PassKeys 2FA will add additional security layer (login and preferred actions)</p><a class="link_J5gy" href="/docs/tutorial/Plugins/two-factors-auth/">Learn how</a></div></div><div class="gcard_OP4Q"><img src="/assets/images/branding-0aad53349f471dbc80d6b27dc61dcd91.png" alt="Branding and theming" title="Branding and theming" loading="lazy"><div class="gcardBody_f7I3"><h3 class="gcardTitle_LEse">Branding and theming</h3><p>Upload your logo, change colors, update titles, make the look to match your brand</p><a class="link_J5gy" href="/docs/tutorial/Customization/branding/">Learn how</a></div></div><div class="gcard_OP4Q"><img src="/assets/images/dashboard-831b4024390d5a23264144fef4469348.png" alt="Custom Pages and Dashboards" title="Custom Pages and Dashboards" loading="lazy"><div class="gcardBody_f7I3"><h3 class="gcardTitle_LEse">Custom Pages and Dashboards</h3><p>Create your own pages and dashboards with Vue3 components. Add any additional npm packages and extend your admin panel as you like</p><a class="link_J5gy" href="/docs/tutorial/Customization/customPages/">Learn how</a></div></div><div class="gcard_OP4Q"><img src="/assets/images/users_management-ae1326386515d8759821ff97638ac049.png" alt="Users management" title="Users management" loading="lazy"><div class="gcardBody_f7I3"><h3 class="gcardTitle_LEse">Users management</h3><p>Manage users and roles with ease, extend as you like</p><a class="link_J5gy" href="/docs/tutorial/gettingStarted/">Learn how</a></div></div><div class="gcard_OP4Q"><img src="/assets/images/translate-f0fdd50f280f007d065e4e1d36256b28.png" alt="LLM-based Translation Plugin - translate your admin and External apps" title="LLM-based Translation Plugin - translate your admin and External apps" loading="lazy"><div class="gcardBody_f7I3"><h3 class="gcardTitle_LEse">LLM-based Translation Plugin - translate your admin and External apps</h3><p>Use LLMs to translate any external apps (Mobile, Nuxt, etc.) OR/AND admin panel with minimal effort. Any language supported</p><a class="link_J5gy" href="/docs/tutorial/Plugins/i18n/">Learn how</a></div></div><div class="gcard_OP4Q"><img src="/assets/images/auditlog-a45132e0520cb6d573e31795863ad513.png" alt="Audit log Plugin - know who did what" title="Audit log Plugin - know who did what" loading="lazy"><div class="gcardBody_f7I3"><h3 class="gcardTitle_LEse">Audit log Plugin - know who did what</h3><p>Attach Audit log plugin with couple of lines, create table for logs and track full history of any data changes</p><a class="link_J5gy" href="/docs/tutorial/Plugins/audit-log/">Learn how</a></div></div><div class="gcard_OP4Q"><img src="/assets/images/ai_complete-a896f586381f2cf86ae54958ba2a3c3e.png" alt="AI autocomplete Plugin - write with LLMs" title="AI autocomplete Plugin - write with LLMs" loading="lazy"><div class="gcardBody_f7I3"><h3 class="gcardTitle_LEse">AI autocomplete Plugin - write with LLMs</h3><p>Provide your LLM API key to autocomplete plugin and AI will help you to write your content using record context</p><a class="link_J5gy" href="/docs/tutorial/Plugins/text-complete/">Learn how</a></div></div><div class="gcard_OP4Q"><img src="/assets/images/dark-ac2c92d6131e5f51f3961d3c0c1e552f.png" alt="Dark mode out of the box" title="Dark mode out of the box" loading="lazy"><div class="gcardBody_f7I3"><h3 class="gcardTitle_LEse">Dark mode out of the box</h3><p>Dark mode is enabled by default, create your own components in Tailwind-way and it will work with no additional friction</p><a class="link_J5gy" href="/docs/tutorial/gettingStarted/">Learn how</a></div></div><div class="gcard_OP4Q"><img src="/assets/images/upload-737425889e5f73534566facca45f107a.png" alt="Upload Plugin - upload files" title="Upload Plugin - upload files" loading="lazy"><div class="gcardBody_f7I3"><h3 class="gcardTitle_LEse">Upload Plugin - upload files</h3><p>Upload files to Amazon S3 with instantiating plugin and providing your S3 credentials</p><a class="link_J5gy" href="/docs/tutorial/Plugins/upload/">Learn how</a></div></div><div class="gcard_OP4Q"><img src="/assets/images/filters-217af865884f065633b93c24509ebec3.png" alt="Filters to query your data" title="Filters to query your data" loading="lazy"><div class="gcardBody_f7I3"><h3 class="gcardTitle_LEse">Filters to query your data</h3><p>AdminForth provides basic filters out of the box and allows you to create your own</p><a class="link_J5gy" href="/docs/tutorial/Customization/virtualColumns/#virtual-columns-for-filtering">Learn how</a></div></div><div class="gcard_OP4Q"><img src="/assets/images/richeditor-b8d189773049b4e70b2d7b01868199b3.png" alt="Rich Editor Plugin - WYSIWYG" title="Rich Editor Plugin - WYSIWYG" loading="lazy"><div class="gcardBody_f7I3"><h3 class="gcardTitle_LEse">Rich Editor Plugin - WYSIWYG</h3><p>Attach Rich Editor plugin to your text fields and get WYSIWYG editor for your content</p><a class="link_J5gy" href="/docs/tutorial/Plugins/rich-editor/">Learn how</a></div></div><div class="gcard_OP4Q"><img src="/assets/images/inplace-edit-eae0d6ef4550b88e98b6ca8424f1ed19.png" alt="List in-place edit Plugin for quick edit" title="List in-place edit Plugin for quick edit" loading="lazy"><div class="gcardBody_f7I3"><h3 class="gcardTitle_LEse">List in-place edit Plugin for quick edit</h3><p>Edit some oftenly used fields in list directly without opening edit page. Decide which fields to be editable in list view</p><a class="link_J5gy" href="/docs/tutorial/Plugins/list-in-place-edit/">Learn how</a></div></div><div class="gcard_OP4Q"><img src="/assets/images/inplace-create-2c25b763a789b638dee0ee3aae7361d5.png" alt="Inline create Plugin for quick create" title="Inline create Plugin for quick create" loading="lazy"><div class="gcardBody_f7I3"><h3 class="gcardTitle_LEse">Inline create Plugin for quick create</h3><p>For tables with small fields number which should be created massively, use inline create plugin to create records directly in list view</p><a class="link_J5gy" href="/docs/tutorial/Plugins/inline-create/">Learn how</a></div></div><div class="gcard_OP4Q"><img src="/assets/images/importexport-a5491eeaa7135647a7ddc1a7077232f3.png" alt="Import/Export CSV Plugin" title="Import/Export CSV Plugin" loading="lazy"><div class="gcardBody_f7I3"><h3 class="gcardTitle_LEse">Import/Export CSV Plugin</h3><p>Export tables to CSV and import from CSV with one click. Move data between environments easily</p><a class="link_J5gy" href="/docs/tutorial/Plugins/import-export/">Learn how</a></div></div><div class="gcard_OP4Q"><img src="/assets/images/bulk-ai-flow-9e9ad35c6aed6431d0eee0bbf843f46e.png" alt="Bulk AI Plugin - generate data for your resources" title="Bulk AI Plugin - generate data for your resources" loading="lazy"><div class="gcardBody_f7I3"><h3 class="gcardTitle_LEse">Bulk AI Plugin - generate data for your resources</h3><p>Use LLMs to fill records with generated data or images. For example, generate product descriptions based on product name and image or generate products images</p><a class="link_J5gy" href="/docs/tutorial/Plugins/bulk-ai-flow/">Learn how</a></div></div><div class="gcard_OP4Q"><img src="/assets/images/quick-filters-5d8e43b9d95a42c3f363d9ad5cee5edc.png" alt="Quick Filters Plugin - filter your data quickly" title="Quick Filters Plugin - filter your data quickly" loading="lazy"><div class="gcardBody_f7I3"><h3 class="gcardTitle_LEse">Quick Filters Plugin - filter your data quickly</h3><p>Use quick filters to filter your data efficiently. Create custom filters and apply them with a single click</p><a class="link_J5gy" href="/docs/tutorial/Plugins/quick-filters/">Learn how</a></div></div><div class="gcard_OP4Q"><img src="/assets/images/background-jobs1-773e787cc1ce9c452e6882c12c843290.png" alt="Background Jobs Plugin - manage your background tasks" title="Background Jobs Plugin - manage your background tasks" loading="lazy"><div class="gcardBody_f7I3"><h3 class="gcardTitle_LEse">Background Jobs Plugin - manage your background tasks</h3><p>Use background jobs to handle long-running tasks efficiently. Schedule, monitor, and manage your background processes with ease even after server restarts</p><a class="link_J5gy" href="/docs/tutorial/Plugins/background-jobs/">Learn how</a></div></div><div class="gcard_OP4Q"><img src="/assets/images/agent-4850f73476c1a5447c0c2f7b550e9009.png" alt="Agent Plugin - give AI any task and let it handle it" title="Agent Plugin - give AI any task and let it handle it" loading="lazy"><div class="gcardBody_f7I3"><h3 class="gcardTitle_LEse">Agent Plugin - give AI any task and let it handle it</h3><p>Provides an internal agent that can perform various tasks based on natural language instructions. Connect it to your data and let it help you with content generation, data management, or any custom use case you can think of</p><a class="link_J5gy" href="/docs/tutorial/Plugins/agent/">Learn how</a></div></div><div class="gcard_OP4Q"><img src="/assets/images/mcp-cf2b3c2f681c76a4850434b7ea31ee05.png" alt="MCP Server Plugin - plug your admin into coding agents" title="MCP Server Plugin - plug your admin into coding agents" loading="lazy"><div class="gcardBody_f7I3"><h3 class="gcardTitle_LEse">MCP Server Plugin - plug your admin into coding agents</h3><p>Expose AdminForth resources and actions as remote MCP tools for Claude Code, OpenAI Codex, Gemini CLI and any other MCP client. Every call runs as the AdminForth user who created the auth secret, so your resource permissions, validation and hooks still apply</p><a class="link_J5gy" href="/docs/tutorial/Plugins/mcp/">Learn how</a></div></div><div class="gcard_OP4Q"><img src="/assets/images/dashboards-plugin-d19f2f9bbcb162814d3cc1a8baea93f0.png" alt="Dashboard Plugin - creare custom dashboards from web interface" title="Dashboard Plugin - creare custom dashboards from web interface" loading="lazy"><div class="gcardBody_f7I3"><h3 class="gcardTitle_LEse">Dashboard Plugin - creare custom dashboards from web interface</h3><p>Provides a customizable dashboard plugin that allows you to create and manage dashboards for your data. Connect it to your resources and visualize your data in a meaningful way</p><a class="link_J5gy" href="/docs/tutorial/Plugins/dashboard/">Learn how</a></div></div></div></div></div></section><section class="sec_bT0q"><div class="wrap_T5Hr secGrid_ckBc"><div class="secLabel_e8f_"><span class="eyebrow_kY3W">Plugins</span><p>29 of them, installed as npm packages. Open protocols where a protocol exists.</p></div><div><h2 class="h2_gZ6G">The parts you would otherwise write twice.</h2><p class="lede_wCb7">Each one is a line of config and a package — and each is documented well enough that an agent can install it for you.</p><div class="groups_f87K"><div class="group_Jj6T"><h3 class="groupTitle_ElLt">For the agent</h3><ul><li><a href="/docs/tutorial/Plugins/mcp/">MCP server</a><span class="pluginDesc_Q2A0">Your resources as remote MCP tools, one revocable secret per agent</span><span class="rfc__AJ8">Model Context Protocol</span></li><li><a href="/docs/tutorial/Plugins/agent/">AI agent</a><span class="pluginDesc_Q2A0">Chat inside the panel that searches and edits data, with skills you define</span></li><li><a href="/docs/tutorial/Plugins/bulk-ai-flow/">Bulk AI flow</a><span class="pluginDesc_Q2A0">Fill, classify or read images across every selected record</span></li><li><a href="/docs/tutorial/Plugins/text-complete/">Text complete</a><span class="pluginDesc_Q2A0">Inline completion while an editor types</span></li><li><a href="/docs/tutorial/Plugins/i18n/">LLM translation</a><span class="pluginDesc_Q2A0">Translate the panel — and your own app — from the same catalogue</span></li><li><a href="/docs/tutorial/Plugins/dashboard/">Dashboards</a><span class="pluginDesc_Q2A0">Charts you build by asking the agent for them</span></li></ul></div><div class="group_Jj6T"><h3 class="groupTitle_ElLt">Auth & access</h3><ul><li><a href="/docs/tutorial/Plugins/oauth/">OAuth2 & SSO</a><span class="pluginDesc_Q2A0">Google, GitHub, Microsoft, Keycloak, Clerk, Twitch, Facebook, Telegram</span><span class="rfc__AJ8">RFC 6749</span></li><li><a href="/docs/tutorial/Plugins/two-factors-auth/">Two-factor auth</a><span class="pluginDesc_Q2A0">Authenticator apps and hardware-backed passkeys</span><span class="rfc__AJ8">RFC 6238 · WebAuthn</span></li><li><a href="/docs/tutorial/Plugins/login-captcha/">Login captcha</a><span class="pluginDesc_Q2A0">reCAPTCHA or Cloudflare Turnstile in front of the login form</span></li><li><a href="/docs/tutorial/Plugins/email-invite/">Email invite</a><span class="pluginDesc_Q2A0">Create a user without ever knowing their password</span></li><li><a href="/docs/tutorial/Plugins/email-password-reset/">Password reset</a><span class="pluginDesc_Q2A0">Reset links signed as tokens, over SES or Mailgun</span><span class="rfc__AJ8">RFC 7519</span></li><li><a href="/docs/tutorial/Plugins/open-signup/">Open signup</a><span class="pluginDesc_Q2A0">Let people register themselves into a low-privilege role</span></li><li><a href="/docs/tutorial/Plugins/user-soft-delete/">User soft delete</a><span class="pluginDesc_Q2A0">Deactivate an account and keep everything it did</span></li></ul></div><div class="group_Jj6T"><h3 class="groupTitle_ElLt">Fields & editing</h3><ul><li><a href="/docs/tutorial/Plugins/rich-editor/">Rich editor</a><span class="pluginDesc_Q2A0">Quill WYSIWYG on any text column</span></li><li><a href="/docs/tutorial/Plugins/markdown/">Markdown</a><span class="pluginDesc_Q2A0">Author and preview Markdown, stored as Markdown</span></li><li><a href="/docs/tutorial/Plugins/json-form/">JSON form</a><span class="pluginDesc_Q2A0">A real form for a JSON column, generated from your schema</span><span class="rfc__AJ8">JSON Schema</span></li><li><a href="/docs/tutorial/Plugins/upload/">Uploads</a><span class="pluginDesc_Q2A0">S3, S3-compatible or local storage under your own keys</span><span class="rfc__AJ8">S3 API</span></li><li><a href="/docs/tutorial/Plugins/inline-create/">Inline create</a><span class="pluginDesc_Q2A0">Add a row without leaving the list</span></li><li><a href="/docs/tutorial/Plugins/list-in-place-edit/">List in-place edit</a><span class="pluginDesc_Q2A0">Edit cells where you read them</span></li><li><a href="/docs/tutorial/Plugins/clone-row/">Clone row</a><span class="pluginDesc_Q2A0">Duplicate a record into a prefilled form</span></li><li><a href="/docs/tutorial/Plugins/many2many/">Many-to-many</a><span class="pluginDesc_Q2A0">Link tables managed as one ordinary field</span></li><li><a href="/docs/tutorial/Plugins/foreign-inline-list/">Foreign inline list</a><span class="pluginDesc_Q2A0">Related rows as a table inside the show page</span></li><li><a href="/docs/tutorial/Plugins/foreign-inline-show/">Foreign inline show</a><span class="pluginDesc_Q2A0">The linked record itself, expanded in place</span></li></ul></div><div class="group_Jj6T"><h3 class="groupTitle_ElLt">Data & operations</h3><ul><li><a href="/docs/tutorial/Plugins/import-export/">Import / export</a><span class="pluginDesc_Q2A0">CSV and XLSX in and out, on any resource</span><span class="rfc__AJ8">RFC 4180</span></li><li><a href="/docs/tutorial/Plugins/background-jobs/">Background jobs</a><span class="pluginDesc_Q2A0">Durable work that resumes after a restart</span></li><li><a href="/docs/tutorial/Plugins/audit-log/">Audit log</a><span class="pluginDesc_Q2A0">Every change, by whom, from where</span></li><li><a href="/docs/tutorial/Plugins/quick-filters/">Quick filters</a><span class="pluginDesc_Q2A0">Preset filters and search pinned to the list</span></li><li><a href="/docs/tutorial/Plugins/auto-remove/">Auto remove</a><span class="pluginDesc_Q2A0">Retention rules by age or by row count</span></li><li><a href="/docs/tutorial/Plugins/universal-search/">Universal search</a><span class="pluginDesc_Q2A0">Legacy multi-column search — prefer Quick filters</span></li></ul></div></div></div></div></section><section class="close_uYfb"><div class="wrap_T5Hr"><span class="eyebrow_kY3W">Free, and staying that way</span><h2 class="h2_gZ6G" style="margin-top:12px">One command for the developer. One secret for the admin.</h2><div class="term_hlVX"><div class="termBar_cvn2"><i></i><i></i><i></i></div><div class="termBody_Djwr"><p class="termLine_slJu"><span class="termPrompt_mD0s">$</span><span>npx adminforth create-app</span></p></div></div><div class="closeCta_oGCk"><a class="btn_bvfa btnPrimary_hBjO" href="/docs/tutorial/gettingStarted/">Read the guide</a><a href="https://github.com/devforth/adminforth" target="_blank" rel="noopener noreferrer" class="btn_bvfa btnGhost_qNii">Star on GitHub</a></div></div></section><section class="featured_CcDY"><div class="wrap_T5Hr"><span class="eyebrow_kY3W">Featured on</span><div class="featuredBadges_vIin"><a href="https://auraplusplus.com/projects/adminforth-agent-first-open-source-admin-panel-framework" target="_blank" rel="noopener" class="featuredLink_RJJb"><img class="featuredBadgeImage_uLNT" src="https://auraplusplus.com/images/badges/featured-on-light.svg" alt="Featured on Aura++" loading="lazy"></a><a href="https://peerpush.net/p/adminforth" target="_blank" rel="noopener" class="featuredLink_RJJb"><img class="featuredBadgeImage_uLNT" src="https://peerpush.net/p/adminforth/badge.png" alt="AdminForth on PeerPush" loading="lazy"></a><a href="https://openhunts.com" target="_blank" rel="noopener" class="featuredLink_RJJb"><img class="featuredBadgeImage_uLNT" src="https://cdn.openhunts.com/badges/club.webp" alt="OpenHunts Club Member" loading="lazy"></a><a href="https://toolfio.com" target="_blank" rel="dofollow" class="featuredLink_RJJb"><img class="featuredBadgeImage_uLNT" src="https://toolfio.com/toolfio-light-badge.png" alt="Featured on Toolfio" loading="lazy"></a><a href="https://earlyhunt.com/project/adminforth" target="_blank" rel="noopener" class="featuredLink_RJJb"><img class="featuredBadgeImage_uLNT" src="https://earlyhunt.com/badges/earlyhunt-badge-light.svg" alt="Featured on EarlyHunt" loading="lazy"></a><a href="https://www.producthunt.com/products/adminforth/reviews/new?utm_source=badge-product_review&utm_medium=badge&utm_source=badge-adminforth" target="_blank" rel="noopener noreferrer" class="featuredLink_RJJb"><img class="featuredBadgeImage_uLNT" src="https://api.producthunt.com/widgets/embed-image/v1/product_review.svg?product_id=598095&theme=light" alt="AdminForth on Product Hunt" loading="lazy"></a></div></div></section></main></div></div><footer class="theme-layout-footer footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="theme-layout-footer-column col footer__col"><div class="footer__title">Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/docs/tutorial/gettingStarted/">Tutorial</a></li><li class="footer__item"><a href="https://demo.adminforth.dev/" target="_blank" rel="noopener noreferrer" class="footer__link-item">Live Demo</a></li><li class="footer__item"><a class="footer__link-item" href="/docs/api/">API</a></li><li class="footer__item"><a class="footer__link-item" href="/blog/archive/">Blog Archive</a></li><li class="footer__item"><a class="footer__link-item" href="/search/">Find anything</a></li></ul></div><div class="theme-layout-footer-column col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://devforth.io" target="_blank" rel="noopener noreferrer" class="footer__link-item">DevForth.io<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a href="https://devforth.io/contact" target="_blank" rel="noopener noreferrer" class="footer__link-item">We can develop admin panel for your project<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a href="https://github.com/devforth/adminforth" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2026 Devforth sp. z o.o.</div></div></div></footer></div>
</body>
</html>