diff --git a/README.md b/README.md
index f1de131..d932439 100644
--- a/README.md
+++ b/README.md
@@ -5,7 +5,7 @@


-A modern web application providing essential developer tools with a clean, responsive interface. Built with Next.js 15, featuring 30+ powerful tools that run entirely client-side for optimal performance and privacy.
+A modern web application providing essential developer tools with a clean, responsive interface. Built with Next.js (App Router, static export), featuring 30+ powerful tools that run entirely client-side for optimal performance and privacy.
đ **[Production](https://devpockit.hypkey.com/)** | đ **[Documentation](#-documentation)** | đ€ **[Contributing](CONTRIBUTING.md)** | đ **[Changelog](CHANGELOG.md)**
@@ -14,7 +14,7 @@ A modern web application providing essential developer tools with a clean, respo
- **30+ Developer Tools** - JSON formatter, UUID generator, JWT decoder, regex tester, and more
- **Client-Side Processing** - All tools run in your browser, no data sent to servers
- **Modern UI** - Clean, responsive design with dark/light theme support
-- **Fast & Reliable** - Built with Next.js 15 and TypeScript
+- **Fast & Reliable** - Built with Next.js and TypeScript
- **Mobile Friendly** - Works seamlessly on desktop, tablet, and mobile devices
- **Open Source** - MIT licensed, free to use and contribute
diff --git a/package.json b/package.json
index 07c9e89..d4ec7d8 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "devpockit-frontend",
- "version": "0.2.0",
+ "version": "0.2.1",
"description": "DevPockit Frontend - Developer Tools Web App",
"license": "MIT",
"repository": {
diff --git a/public/manifest.webmanifest b/public/manifest.webmanifest
new file mode 100644
index 0000000..6f75f7b
--- /dev/null
+++ b/public/manifest.webmanifest
@@ -0,0 +1,17 @@
+{
+ "name": "DevPockit",
+ "short_name": "DevPockit",
+ "description": "Free developer tools that run in your browser.",
+ "start_url": "/",
+ "display": "standalone",
+ "background_color": "#ffffff",
+ "theme_color": "#ea580c",
+ "icons": [
+ {
+ "src": "/assets/devpockit-logo.svg",
+ "sizes": "any",
+ "type": "image/svg+xml",
+ "purpose": "any"
+ }
+ ]
+}
diff --git a/src/app/layout.tsx b/src/app/layout.tsx
index c07cf6e..8dc60b9 100644
--- a/src/app/layout.tsx
+++ b/src/app/layout.tsx
@@ -1,5 +1,7 @@
import { AppLayout } from '@/components/layout/AppLayout'
+import { AppToastProvider } from '@/components/providers/AppToastProvider'
import { ThemeProvider } from '@/components/providers/ThemeProvider'
+import { absoluteAssetUrl, absoluteSiteUrl } from '@/libs/site-url'
import type { Metadata, Viewport } from 'next'
import { DM_Serif_Text, Geist, Geist_Mono } from 'next/font/google'
import './globals.css'
@@ -23,8 +25,12 @@ const dmSerifText = DM_Serif_Text({
const baseUrl = process.env.NEXT_PUBLIC_BASE_URL || 'https://devpockit.hypkey.com';
+const canonicalHome = absoluteSiteUrl('/')
+const ogImageUrl = absoluteAssetUrl('/og-image.png')
+
export const metadata: Metadata = {
metadataBase: new URL(baseUrl),
+ manifest: absoluteAssetUrl('/manifest.webmanifest'),
title: {
default: 'DevPockit - Free Online Developer Tools',
template: '%s | DevPockit',
@@ -78,14 +84,14 @@ export const metadata: Metadata = {
openGraph: {
type: 'website',
locale: 'en_US',
- url: `${baseUrl}/`,
+ url: canonicalHome,
siteName: 'DevPockit',
title: 'DevPockit - Free Online Developer Tools',
description:
'Free online developer tools that run locally in your browser. JSON formatter, UUID generator, JWT decoder, and 25+ more tools. Fast, private, no sign-up.',
images: [
{
- url: '/og-image.png',
+ url: ogImageUrl,
width: 1200,
height: 630,
alt: 'DevPockit - Developer Tools',
@@ -97,10 +103,10 @@ export const metadata: Metadata = {
title: 'DevPockit - Free Online Developer Tools',
description:
'Free developer tools in your browser. JSON formatter, UUID generator, JWT decoder & more. Private, fast, no sign-up.',
- images: ['/og-image.png'],
+ images: [ogImageUrl],
},
alternates: {
- canonical: `${baseUrl}/`,
+ canonical: canonicalHome,
},
category: 'technology',
}
@@ -108,6 +114,10 @@ export const metadata: Metadata = {
export const viewport: Viewport = {
width: 'device-width',
initialScale: 1,
+ themeColor: [
+ { media: '(prefers-color-scheme: light)', color: '#ffffff' },
+ { media: '(prefers-color-scheme: dark)', color: '#0a0a0a' },
+ ],
}
export default function RootLayout({
@@ -124,7 +134,9 @@ export default function RootLayout({
enableSystem
disableTransitionOnChange
>
- {children}
+
+ {children}
+