Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
72 changes: 72 additions & 0 deletions www/app/blogs/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
import AnimatedNav from "@/components/animated-nav/server";
import Footer from "@/components/footer";

export const metadata = {
title: "devb.io Blog",
description: "Learn more about devb.io and how it helps you build a portfolio",
};

export default function BlogPage() {
const features = [
"One-click GitHub Profile Connection",
"Automatic Portfolio Generation",
"AI-Powered Bio Creation",
"Dynamic Activity Tracking",
"Zero Maintenance Required",
];

const steps = [
{
title: "Generate Profile",
description:
"Click the \"Generate Profile\" button and make sure your GitHub profile is updated with projects and achievements.",
},
{
title: "Instant Portfolio Generation",
description:
"Your personalized developer portfolio is created instantly with no manual setup.",
},
{
title: "Automatic Weekly Updates",
description:
"Your portfolio refreshes every week based on your GitHub activity to showcase new work.",
},
{
title: "Support and Share",
description:
"Star the repository, upvote on Product Hunt, and share your portfolio with the world.",
},
];

return (
<>
<AnimatedNav />
<main className="min-h-screen px-10 pt-20 md:px-24 md:pt-32 pb-10">
<h1 className="text-4xl font-bold mb-6">devb.io Blog</h1>
<p className="mb-8 text-lg text-gray-700 max-w-2xl">
devb.io automatically generates polished developer portfolios by connecting to your GitHub account. Below is a quick overview of the main features and how the platform works.
</p>
<section className="mb-12">
<h2 className="text-2xl font-semibold mb-4">Key Features</h2>
<ul className="list-disc list-inside space-y-2">
{features.map((feature) => (
<li key={feature}>{feature}</li>

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The key prop here uses the feature string itself. This is acceptable for the current features array as it contains unique, static strings. However, if this list were to become dynamic, or if feature strings could potentially become non-unique or be reordered in a way that changes their identity, this keying strategy could lead to React reconciliation issues.

Could you clarify the plan for maintaining key uniqueness and stability if this data source evolves? For instance, would it be feasible to assign a dedicated, stable ID to each feature if the content becomes more dynamic?

))}
</ul>
</section>
<section>
<h2 className="text-2xl font-semibold mb-4">How It Works</h2>
<ol className="list-decimal list-inside space-y-4">
{steps.map((step) => (
<li key={step.title}>

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Similar to the features list, step.title is used as the key for items in the steps list. This works for the current static data where titles are unique.

If the steps data were to change in the future (e.g., sourced dynamically, titles becoming non-unique, or items being reordered), how would we ensure that the key remains unique and stable to avoid rendering problems? Would considering a unique ID for each step offer more robustness for future modifications?

<p className="font-medium">{step.title}</p>
<p className="text-gray-700">{step.description}</p>
</li>
))}
</ol>
</section>
</main>
<Footer />
</>
);
}
Loading