Configuration
Comprehensive guide to configure and customize your Fireship AI Blog component.
Environment Variables
Required Variables
# Primary API key (required) NEXT_PUBLIC_FIRESHIP_BLOG_PUBLISHABLE_KEY=fs_your_key_here
Optional Variables
# Server-side API key (optional, same as above) FIRESHIP_BLOG_API_KEY=fs_your_key_here # Custom API base URL (optional) FIRESHIP_BLOG_API_BASE=https://custom-api.example.com/api/blog
Proxy Configuration
Basic Proxy Setup
// app/api/fireship-blog/[...path]/route.ts
import { createFireshipProxyHandler } from 'fireship-ai-blog';
const base = createFireshipProxyHandler({
apiBase: 'https://fireship.ai/api/blog',
getApiKey: () => process.env.NEXT_PUBLIC_FIRESHIP_BLOG_PUBLISHABLE_KEY,
allowOrigin: 'http://localhost:3000',
});Advanced Proxy Configuration
const base = createFireshipProxyHandler({
// Custom API endpoint
apiBase: process.env.FIRESHIP_BLOG_API_BASE || 'https://fireship.ai/api/blog',
// Dynamic API key resolution
getApiKey: () => {
return process.env.FIRESHIP_BLOG_API_KEY ||
process.env.NEXT_PUBLIC_FIRESHIP_BLOG_PUBLISHABLE_KEY ||
'fallback_key';
},
// Multiple allowed origins
allowOrigin: [
'http://localhost:3000',
'https://yourdomain.com',
'https://preview.yourdomain.com'
],
});Styling Configuration
TailwindCSS Setup
// tailwind.config.js
module.exports = {
content: [
'./app/**/*.{js,ts,jsx,tsx,mdx}',
'./components/**/*.{js,ts,jsx,tsx,mdx}',
'./node_modules/fireship-ai-blog/**/*.{js,ts,jsx,tsx}',
],
theme: {
extend: {
// Custom blog theme colors
colors: {
'blog-primary': '#3b82f6',
'blog-secondary': '#64748b',
}
},
},
plugins: [
require('@tailwindcss/typography'),
],
}Custom CSS Overrides
/* styles/blog-custom.css */
.fireship-blog {
--blog-primary: #your-color;
--blog-secondary: #your-color;
--blog-background: #your-color;
}
/* Override specific components */
.fireship-blog .post-card {
border-radius: 12px;
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
}
.fireship-blog .post-content {
font-family: 'Your Custom Font', sans-serif;
}Middleware Configuration
Clerk Integration
// middleware.ts
import { clerkMiddleware } from '@clerk/nextjs/server';
export default clerkMiddleware((auth, req) => {
// Skip authentication for fireship-blog API routes
if (req.nextUrl.pathname.startsWith('/api/fireship-blog')) {
return;
}
});
export const config = {
matcher: [
'/((?!_next|[^?]*\.(?:html?|css|js(?!on)|jpe?g|webp|png|gif|svg|ttf|woff2?|ico|csv|docx?|xlsx?|zip|webmanifest)).*)',
'/(api|trpc)(.*)',
],
};NextAuth Integration
// middleware.ts
import { withAuth } from 'next-auth/middleware';
export default withAuth(
function middleware(req) {
// Skip auth for blog API routes
if (req.nextUrl.pathname.startsWith('/api/fireship-blog')) {
return;
}
},
{
callbacks: {
authorized: ({ token, req }) => {
if (req.nextUrl.pathname.startsWith('/api/fireship-blog')) {
return true; // Allow blog API access
}
return !!token;
},
},
}
);Performance Configuration
Bundle Optimization
// next.config.js
module.exports = {
experimental: {
optimizePackageImports: ['fireship-ai-blog'],
},
// Optimize images
images: {
domains: ['fireship.ai', 'images.unsplash.com'],
},
// Enable compression
compress: true,
};Caching Configuration
// app/api/fireship-blog/[...path]/route.ts
export async function GET(req: Request, ctx: any) {
const response = await base.GET(req, ctx);
// Add caching headers
response.headers.set('Cache-Control', 'public, s-maxage=300, stale-while-revalidate=600');
return response;
}Production Configuration
Environment Variables
# Production .env NEXT_PUBLIC_FIRESHIP_BLOG_PUBLISHABLE_KEY=fs_prod_key_here FIRESHIP_BLOG_API_KEY=fs_prod_key_here NODE_ENV=production
Build Optimization
// next.config.js
module.exports = {
// Enable static optimization
output: 'standalone',
// Optimize bundle
experimental: {
optimizeCss: true,
optimizePackageImports: ['fireship-ai-blog'],
},
// Security headers
async headers() {
return [
{
source: '/api/fireship-blog/:path*',
headers: [
{
key: 'X-Content-Type-Options',
value: 'nosniff',
},
],
},
];
},
};