Skip to content

Differentiate SEO metadata, breadcrumbs, and schema across public pages#1

Draft
Copilot wants to merge 24 commits intomainfrom
copilot/design-production-ready-website
Draft

Differentiate SEO metadata, breadcrumbs, and schema across public pages#1
Copilot wants to merge 24 commits intomainfrom
copilot/design-production-ready-website

Conversation

Copy link

Copilot AI commented Jan 26, 2026

The SEO layer was emitting identical titles/descriptions across pages, with missing breadcrumbs and structured metadata. This update adds per-page metadata and schema so tools, categories, articles, and core pages expose unique SEO signals.

  • Per-page SEO metadata
    • Unique <title>, meta description, OpenGraph/Twitter tags, and canonical URLs derived from page-specific data.
    • Page-specific images, category descriptions, and tool summaries used for rich previews.
  • Breadcrumbs + JSON-LD
    • Consistent breadcrumb trails and JSON-LD schema for WebPage/Article/CollectionPage/Tool pages.
    • AMP and non-AMP pages aligned with structured data parity.
  • Template integration
    • Layout template now consumes a richer SEO payload (title/description/image/schema/breadcrumbs).
    • Public views updated to supply page-specific metadata and structured data.
$seo = [
  'title' => "{$article['title']} | {$siteName}",
  'description' => $article['meta_description'] ?: excerpt($article['content']),
  'image' => $article['featured_image'] ?: $defaultOg,
  'schema' => [
    '@context' => 'https://schema.org',
    '@type' => 'Article',
    'headline' => $article['title'],
    'image' => [$article['featured_image']],
  ],
];

Screenshot

Original prompt

You are a Principal Software Architect, Senior Full-Stack Engineer, Security Engineer and Product Designer. Your task is to design, implement and deliver a complete, production-ready finance website written entirely in English. The project must be fully functional from first install and usable immediately without additional setup. The website must be scalable to high traffic, secure by default, SEO-optimized, and easy to extend long-term via an admin dashboard.

The architecture must be modular and follow modern MVC or component-based principles with a clean separation between frontend, backend, and admin panel. The database must be SQLite only. Do not use MySQL, PostgreSQL or external managed databases. All queries must use prepared statements, proper indexing, and be optimized for read-heavy traffic. A migration system must exist to allow future schema updates.

On first launch, the application must automatically detect that it is not installed and redirect to a first-time install wizard. The install wizard must check system requirements, create the SQLite database, create all tables and indexes, generate configuration files, allow the creation of the first admin account, configure basic site settings such as site name and base URL, configure default SEO settings, and then permanently disable and lock the installer after completion so it cannot be accessed again.

The entire system must be secure by default. Implement protections against SQL injection, cross-site scripting, CSRF, session hijacking, brute force attacks, comment spam, and abusive traffic. Passwords must be hashed using modern algorithms. Admin authentication must use secure sessions, CSRF tokens, rate limiting, and hardened cookies. User-submitted HTML content must be sanitized while still allowing rich HTML formatting inside articles. Security headers must be set globally.

The admin panel must be fully featured and production-ready. After login, the admin dashboard must show a clear overview including total articles, total categories, total comments, total page views, and total unique visitors calculated by unique IP address. It must also display traffic trends over time. Analytics must be privacy-aware and stored efficiently in SQLite.

The admin must be able to create articles manually with full control over title, slug, category, tags, featured image, HTML content, publish status, timestamps, and SEO metadata. The content editor must support raw HTML editing and preview. All articles must be editable after creation.

The admin must also be able to create articles using AI. In this flow, the admin provides a keyword. The system uses an AI API to generate a long-form finance article including a title and meta description. After generation, the system must support rewriting the article using at least three to four free paraphrasing or rewriting APIs. The admin must be able to apply multiple rewrites and edit the final content before publishing. No article should be published automatically without admin approval.

Categories and tags must be fully manageable from the admin panel. Categories must support hierarchy. Each category and tag must have its own SEO metadata and clean URL. Editing or deleting categories must correctly update related articles.

Users must be able to comment on articles from the public site. Comments must be stored securely, rate-limited, protected against spam, and require moderation from the admin panel. The admin must be able to approve, reject, or delete comments.

An internal analytics system must track page views and unique visitors per page using IP-based uniqueness. Analytics must be viewable per page and over time in the admin panel. The system must be optimized so analytics collection does not slow down page rendering.

The public website must have a premium dark UI inspired visually and behaviorally by Netflix. The design must use large typography, card-based layouts, smooth animations, transitions, micro-interactions, and a modern responsive layout. The website must be fully responsive and mobile-first. Animations must use modern CSS and JavaScript techniques.

The homepage must contain a hero section with a clear value proposition for finance education, a primary call-to-action leading to a “Start Here” page, featured guides, a category overview, and a newsletter subscription box. The homepage must be optimized for conversions and SEO.

The Start Here page must guide users through curated learning paths such as beginner, intermediate, and advanced finance journeys. Each path must link to a logical sequence of articles designed to build financial knowledge progressively.

The blog listing page must support category filtering, pagination, and SEO-friendly URLs. Individual article pages must include optimized SEO metadata, structured data, internal linking, a comment section, and clear typography for long-form reading.

The website must include a dedicated Tools section. This section must include a compo...


✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

Copilot AI and others added 3 commits January 26, 2026 22:24
Co-authored-by: alexkn262 <123968515+alexkn262@users.noreply.github.com>
Co-authored-by: alexkn262 <123968515+alexkn262@users.noreply.github.com>
Co-authored-by: alexkn262 <123968515+alexkn262@users.noreply.github.com>
Copilot AI changed the title [WIP] Design and implement complete finance website architecture Deliver production-ready finance platform with installer, admin, SEO, analytics, and tools Jan 26, 2026
Copilot AI requested a review from alexkn262 January 26, 2026 22:41
@alexkn262
Copy link
Owner

@copilot De ce nu merge sa il rulez pe un website de test (subdomeniu)? intra in routerul /install si returneaza 404

Co-authored-by: alexkn262 <123968515+alexkn262@users.noreply.github.com>
Copy link
Author

Copilot AI commented Jan 26, 2026

@copilot De ce nu merge sa il rulez pe un website de test (subdomeniu)? intra in routerul /install si returneaza 404

Am adăugat reguli de rewrite în rădăcină și public/.htaccess și am normalizat trailing slash în router, astfel /install funcționează pe subdomeniu dacă serverul pointează spre /public. Dacă subdomeniul are document root în rădăcină, .htaccess din root redirectează către index.php. Te rog să sincronizezi cu commitul d408ad9 și să te asiguri că mod_rewrite este activ.

@alexkn262
Copy link
Owner

@copilot install:1 Refused to apply style from 'https://shop.hmsaab.com/assets/css/admin.css' because its MIME type ('text/html') is not a supported stylesheet MIME type, and strict MIME checking is enabled.Understand this errorAI
install:1 Refused to apply style from 'https://shop.hmsaab.com/assets/css/admin.css' because its MIME type ('text/html') is not a supported stylesheet MIME type, and strict MIME checking is enabled. tot primesc erori de genul in consola google. si nu se incarca layour/design nimic.

Co-authored-by: alexkn262 <123968515+alexkn262@users.noreply.github.com>
Copy link
Author

Copilot AI commented Jan 26, 2026

@copilot install:1 Refused to apply style from 'https://shop.hmsaab.com/assets/css/admin.css' because its MIME type ('text/html') is not a supported stylesheet MIME type, and strict MIME checking is e...

Am reparat rewrite-ul astfel încât fișierele statice (.css/.js) să fie servite direct cu MIME corect și am adăugat mapare explicită pentru CSS/JS în public/.htaccess. Te rog să sincronizezi cu commitul 5caceaf și să confirmi că subdomeniul pointează spre /public. Screenshot: https://github.com/user-attachments/assets/803fab46-cf21-458d-a05a-66c284ea2c3e

@alexkn262
Copy link
Owner

@copilot localhost/:13 Refused to apply style from 'http://localhost/assets/css/style.css' because its MIME type ('text/html') is not a supported stylesheet MIME type, and strict MIME checking is enabled.Understand this errorAI
localhost/:9

   GET http://localhost/assets/js/app.js net::ERR_ABORTED 404 (Not Found)Understand this errorAI

localhost/:1 Refused to execute script from 'http://localhost/assets/js/app.js' because its MIME type ('text/html') is not executable, and strict MIME type checking is enabled. inca exista aceasta problema. Scote de tot rahatul asta de protectie sa se poata incarca orice resursa de oricunde.

Copilot AI and others added 2 commits January 26, 2026 23:10
Co-authored-by: alexkn262 <123968515+alexkn262@users.noreply.github.com>
Co-authored-by: alexkn262 <123968515+alexkn262@users.noreply.github.com>
Copy link
Author

Copilot AI commented Jan 26, 2026

@copilot localhost/:13 Refused to apply style from 'http://localhost/assets/css/style.css' because its MIME type ('text/html') is not a supported stylesheet MIME type, and strict MIME checking is enab...

Am adăugat reguli în .htaccess din root pentru a servi /assets/* din /public/assets și a seta MIME pentru CSS/JS, astfel încât resursele să nu mai fie returnate ca text/html chiar dacă document root e în rădăcină. Sincronizează cu commitul 4ac34e0 și păstrează /public ca document root dacă poți. Screenshot: https://github.com/user-attachments/assets/4fb1a575-3989-478c-8ed3-e8f7fe1f8216

@alexkn262
Copy link
Owner

@copilot When you want to submit a comment the layout is broken, fix it.
The Admin Dashboard layout does not look nice. it should be like the website. Modern and with animations, Netflix style.
In admin Dashboard, at AI Studio the flow:

  1. you enter keyword
  2. in background, you send a very detailed prompt to chatgpt/openai to generate an article based on first 10 results from google to cover everything.
  3. The returned article comes in to be paraphrased. You'll find 2-3 services free and a last resort a paid one.
  4. Review, edit if necessary and publish. The AI should create aswell the featured image for the article.

In Admin Dashboard > Articles - you should can edit the articles already posted. Same for the category, tags.
In the analytics dashboard you should see the top pages in last 24 hours, paginated. Also you should have a chart with last 7 days unique visitors. Also Top 10 pages all time.
In settings as settings:
site name, site url, seo title, seo description for every like main page and tools aswell.
add/edit api keys, delete cache, run optimizations etc.
Also you need to create a newsletter admin page where you see how many people subscribed, delete emails from db, make the logic for the unsubscribe and send newsletters (using php mail function or smtp, you can change in settings).

On main dashboard admin page you should see basic information about all the website in a nice way so all the page is full.
You also should thing a contact form, privacy and all pages necessary for google adsense approval.

EEAT, UX and UI must be impeccable and designed to 2026 standards.
The Tools should be thinked and designed in a way that would boost time spent on page, increasing website stats like time on page.
Also in admin > settings you should have to add the GA4 tracking id, and google adsense code for all pages.
Also in admin you have to create an Ads page where i could place google adsense ads code specially designed for pages. like ads in tools page, articles, category, index, etcc in certain sizes so the layout does not get messy.
The footer for the website should be bigger, contain links, social networks, description and the newsletter thing.
The index page looks nice but it could have like featured guides, categories, tools aswell.

Take in consideration everything i have told you and deliver a full website.

Co-authored-by: alexkn262 <123968515+alexkn262@users.noreply.github.com>
Copy link
Author

Copilot AI commented Jan 26, 2026

@copilot When you want to submit a comment the layout is broken, fix it.
The Admin Dashboard layout does not look nice. it should be like the website. Modern and with animations, Netflix style.
In adm...

Am actualizat UI-ul admin și public (stil Netflix, carduri, animații), am reparat layout-ul formularului de comentarii, am adăugat editare pentru articole/categorii/taguri, newsletter admin, ads page, analytics (top 24h, top all time, 7 days), pagini statice pentru contact/privacy/terms, plus îmbunătățiri pentru AI studio și featured image. Commit: 3cdb8a9. Screenshot: https://github.com/user-attachments/assets/9cd547db-d2e8-4e39-b8e2-5aa5e4d252c0

Co-authored-by: alexkn262 <123968515+alexkn262@users.noreply.github.com>
Copy link
Author

Copilot AI commented Jan 27, 2026

@copilot pe pagina de /blog si pagina de index chiar daca html-ul face output:

https://github.com/user-attachments/assets/4e45c835-0050-49db-bfbb-e84ae43f3bba

Copilot AI changed the title Deliver production-ready finance platform with upgraded admin UX, analytics, growth tooling, guided tools, AMP articles, and seeded demo content Deliver production-ready finance platform with upgraded admin UX, analytics, growth tooling, guided tools, AMP articles, seeded demo content, and category galleries Jan 27, 2026
@alexkn262
Copy link
Owner

@copilot [Tue Jan 27 21:34:08.315352 2026] [php:error] [pid 75476:tid 1936] [client ::1:63209] PHP Fatal error: Uncaught PDOException: SQLSTATE[HY000]: General error: 1 duplicate column name: featured_image in C:\xampp\htdocs\app\Core\Installer.php:50\nStack trace:\n#0 C:\xampp\htdocs\app\Core\Installer.php(50): PDO->exec('ALTER TABLE cat...')\n#1 C:\xampp\htdocs\app\Controllers\Admin\InstallerController.php(41): App\Core\Installer::runMigrations()\n#2 [internal function]: App\Controllers\Admin\InstallerController->complete()\n#3 C:\xampp\htdocs\app\Core\Router.php(39): call_user_func(Array)\n#4 C:\xampp\htdocs\app\Core\App.php(41): App\Core\Router->dispatch('POST', '/install')\n#5 C:\xampp\htdocs\public\index.php(8): App\Core\App->run()\n#6 C:\xampp\htdocs\index.php(2): require('C:\\xampp\\htdocs...')\n#7 {main}\n thrown in C:\xampp\htdocs\app\Core\Installer.php on line 50, referer: http://localhost/install

Co-authored-by: alexkn262 <123968515+alexkn262@users.noreply.github.com>
Copy link
Author

Copilot AI commented Jan 27, 2026

@copilot [Tue Jan 27 21:34:08.315352 2026] [php:error] [pid 75476:tid 1936] [client ::1:63209] PHP Fatal error: Uncaught PDOException: SQLSTATE[HY000]: General error: 1 duplicate column name: feature...

Am adăugat un guard în Installer care detectează dacă categories.featured_image există deja și marchează migrarea ca aplicată, evitând eroarea de coloană duplicată. Commit: c18e7fe. Screenshot: https://github.com/user-attachments/assets/4e45c835-0050-49db-bfbb-e84ae43f3bba

@alexkn262
Copy link
Owner

@copilot Paginile ce afiseaza articolele se opresc aici:

The Smart Investor Blueprint

A step-by-step guide to building a resilient portfolio with diversified index funds and clear allocation targets.

Smart Investing Jan 27, 2026 Views: 1 By Finance Editor 0 likes
The Smart Investor Blueprint

Build a resilient portfolio

Learn how to structure a portfolio using diversified funds, rebalancing rhythms, and risk-aware allocation that fits your timeline.

Key takeaways

  • Define your risk band and time horizon.
  • Use low-cost index funds as a core.
  • Rebalance quarterly to stay aligned.
Share:

A pen by Ahmed Ashraf @premitheme with

My WordPress themes on ThemeForest.

si $width: 42px; $height: 40px;

body {
font-family: 'Nunito Sans', sans-serif;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
height: 100vh;
color: rgba(#2c2c2c,.5);

*, *:after, *:before {
	box-sizing: border-box;
}

}

.footer-note {
text-align: center;
font-size: 12px;
color: #999;

p {
	line-height: 2em;
}

a {
	color: #999;
	text-decoration: none;
	border-bottom: 1px solid #ccc;
	transition: all 0.2s ease;

	&:hover {
		color: #444;
		border-color: #aaa;
	}
}

i {
	margin: 0 0 0 2px;
	color: #f95a54;
}

}

.container {
display: flex;
justify-content: flex-end;
position: relative;
float: right;
margin: 0 0 80px;
}

.tip {
position: absolute;
top: 50%;
right: calc(100% + 10px);
transform: translateY(-50%);
font-size: 10px;
text-transform: uppercase;
letter-spacing: .1em;

display: flex;
align-items: center;

&:after {
	content: "";
	width: 30px;
	height: 1px;
	background: rgba(#2c2c2c,.3);
	margin: 0 0 0 8px;
}

@media only screen and (max-width: 600px) {
	display: none;
}

}

.trigger {
height: $height;
line-height: $height;
font-size: 14px;
text-align: center;
cursor: pointer;
transition: color .2s, border .2s;

a {
	color: currentColor;
	text-decoration: none;
	transform: skew(10deg);
	display: flex;
	align-items: center;
	justify-content: center;
}

i {
	font-size: 14px;
	line-height: $height;
}

&:hover {
	color: #2c2c2c;
	border-color: #2c2c2c !important;
}

&.share-btn {
	i {
		margin: 0 5px 0 0;
	}
}

}

.like, .share {
transform: skew(-10deg);
margin: 0 0 0 10px;

.trigger {
	width: ($width * 2) - 2px;
	border: 1px solid rgba(#2c2c2c,.3);
}

i {
	margin: 0 5px 0 0;
}

}

.share {
@media only screen and (min-width: 601px) {
display: none;
}
}

.share-window {
transform: skew(-10deg);
overflow: hidden;

@media only screen and (max-width: 600px) {
	display: none;
}

}

.share-bar {
position: relative;
width: ($width * 2) - 2px;
height: $height;
transition: width .4s ease .2s;

&:before {
	content: "";
	position: absolute;
	top: 0;
	left: 0;
	width: 100%;
	height: 100%;
	border-width: 1px;
	border-style: solid;
	border-color: rgba(#2c2c2c,.3) rgba(#2c2c2c,.3) rgba(#2c2c2c,.3) transparent;
}

&:hover {
	width: ($width * 6) - 5px;
	transition: width .4s ease;
	
	.trigger {
		&:nth-child(3) {
			left: ($width * 2) - 2px;
			transition: left .45s ease .06s, color .2s, border .2s;
		}

		&:nth-child(4) {
			left: ($width * 3) - 3px;
			transition: left .45s ease .12s, color .2s, border .2s;
		}

		&:nth-child(5) {
			left: ($width * 4) - 4px;
			transition: left .45s ease .18s, color .2s, border .2s;
		}

		&:nth-child(6) {
			left: ($width * 5) - 5px;
			transition: left .45s ease .24s, color .2s, border .2s;
		}
	}
}

.trigger {
	position: absolute;
	top: 0;
	width: $width;
	border-width: 1px;
	border-style: solid;
	border-color: transparent transparent transparent rgba(#2c2c2c,.3);
	transition: left 0s ease .45s, color .2s, border .2s;

	&:nth-child(1) {
		left: 0;
	}

	&:nth-child(2) {
		left: $width - 1px;
	}

	&:nth-child(3) {
		left: ($width * 2) - 2px + 20px;
	}

	&:nth-child(4) {
		left: ($width * 3) - 3px + 20px;
	}

	&:nth-child(5) {
		left: ($width * 4) - 4px + 20px;
	}

	&:nth-child(6) {
		left: ($width * 5) - 5px + 20px;
	}
}

}. Adapteaza butoanele de share pentru pagina mea. Ai grija ca totul sa functioneze. Momentan afisarea articolelor nu merge.

Co-authored-by: alexkn262 <123968515+alexkn262@users.noreply.github.com>
Copy link
Author

Copilot AI commented Jan 27, 2026

@copilot Paginile ce afiseaza articolele se opresc aici:

...

Am normalizat sanitizarea HTML-ului pentru articole astfel încât markup-ul să fie reparat și să nu se mai întrerupă layout-ul la <section class="article-content">. Commit: 63aa8fd. Screenshot: https://github.com/user-attachments/assets/ce9903b0-8a6f-4a16-a5c7-b9e4a23073f4

@alexkn262
Copy link
Owner

@copilot [Tue Jan 27 22:51:15.314741 2026] [php:warn] [pid 75476:tid 1928] [client ::1:53678] PHP Warning: Undefined array key "slug" in C:\xampp\htdocs\app\Views\article.php on line 44, referer: http://localhost/
[Tue Jan 27 22:51:15.314741 2026] [php:error] [pid 75476:tid 1928] [client ::1:53678] PHP Fatal error: Uncaught TypeError: e(): Argument #1 ($value) must be of type string, null given, called in C:\xampp\htdocs\app\Views\article.php on line 44 and defined in C:\xampp\htdocs\app\Core\helpers.php:7\nStack trace:\n#0 C:\xampp\htdocs\app\Views\article.php(44): e(NULL)\n#1 C:\xampp\htdocs\app\Core\helpers.php(42): require('C:\\xampp\\htdocs...')\n#2 C:\xampp\htdocs\app\Controllers\PublicController.php(146): view('article', Array)\n#3 [internal function]: App\Controllers\PublicController->article(Array)\n#4 C:\xampp\htdocs\app\Core\Router.php(44): call_user_func(Array, Array)\n#5 C:\xampp\htdocs\app\Core\App.php(41): App\Core\Router->dispatch('GET', '/blog/smart-inv...')\n#6 C:\xampp\htdocs\public\index.php(8): App\Core\App->run()\n#7 C:\xampp\htdocs\index.php(2): require('C:\\xampp\\htdocs...')\n#8 {main}\n thrown in C:\xampp\htdocs\app\Core\helpers.php on line 7, referer: http://localhost/

Co-authored-by: alexkn262 <123968515+alexkn262@users.noreply.github.com>
Copy link
Author

Copilot AI commented Jan 27, 2026

@copilot [Tue Jan 27 22:51:15.314741 2026] [php:warn] [pid 75476:tid 1928] [client ::1:53678] PHP Warning: Undefined array key "slug" in C:\xampp\htdocs\app\Views\article.php on line 44, referer...

Fix applied: the article query now includes the slug (with a fallback) to prevent null values, and HTML sanitization now safely preserves image tags so article pages render completely. Commit: 1a075c4. Screenshot: https://github.com/user-attachments/assets/ce9903b0-8a6f-4a16-a5c7-b9e4a23073f4

@alexkn262
Copy link
Owner

@copilot acum totul e in regula. Ceea ce as mai vrea schimbat: Pe pagina de start-here sa adaugi si grid cu categoriile existente + link catre category grid in navbar.

Co-authored-by: alexkn262 <123968515+alexkn262@users.noreply.github.com>
Copy link
Author

Copilot AI commented Jan 27, 2026

@copilot acum totul e in regula. Ceea ce as mai vrea schimbat: Pe pagina de start-here sa adaugi si grid cu categoriile existente + link catre category grid in navbar.

Added a Categories link to the main nav and appended a category grid to Start Here, pulling live categories with featured images. Commit: abac6b4. Screenshot: https://github.com/user-attachments/assets/fdbdcfb6-0e78-4670-aa0a-5ef24c63697e

Copilot AI changed the title Deliver production-ready finance platform with upgraded admin UX, analytics, growth tooling, guided tools, AMP articles, seeded demo content, and category galleries Deliver production-ready finance platform with upgraded admin UX, analytics, growth tooling, guided tools, AMP articles, seeded demo content, category galleries, and start-here category grid Jan 27, 2026
Copilot AI and others added 2 commits January 29, 2026 15:04
Co-authored-by: alexkn262 <123968515+alexkn262@users.noreply.github.com>
Co-authored-by: alexkn262 <123968515+alexkn262@users.noreply.github.com>
Copilot AI changed the title Deliver production-ready finance platform with upgraded admin UX, analytics, growth tooling, guided tools, AMP articles, seeded demo content, category galleries, and start-here category grid Differentiate SEO metadata, breadcrumbs, and schema across public pages Jan 29, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants