Skip to content
Merged
Show file tree
Hide file tree
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
41 changes: 41 additions & 0 deletions apps/web/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.

# dependencies
/node_modules
/.pnp
.pnp.*
.yarn/*
!.yarn/patches
!.yarn/plugins
!.yarn/releases
!.yarn/versions

# testing
/coverage

# next.js
/.next/
/out/

# production
/build

# misc
.DS_Store
*.pem

# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*
.pnpm-debug.log*

# env files (can opt-in for committing if needed)
.env*

# vercel
.vercel

# typescript
*.tsbuildinfo
next-env.d.ts
38 changes: 38 additions & 0 deletions apps/web/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# Web App

This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app).

## Getting Started

First, run the development server:

```bash
npm run dev
# or
yarn dev
# or
pnpm dev
# or
bun dev
```

Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.

You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file.

This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel.

## Learn More

To learn more about Next.js, take a look at the following resources:

- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.

You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome!

## Deploy on Vercel

The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.

Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details.
24 changes: 24 additions & 0 deletions apps/web/components.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
{
"$schema": "https://ui.shadcn.com/schema.json",
"style": "new-york",
"rsc": true,
"tsx": true,
"tailwind": {
"config": "",
"css": "src/app/globals.css",
"baseColor": "neutral",
"cssVariables": true,
"prefix": ""
},
"iconLibrary": "lucide",
"aliases": {
"components": "@/components",
"utils": "@/lib/utils",
"ui": "@/components/ui",
"lib": "@/lib",
"hooks": "@/hooks"
},
"registries": {
"@react-bits": "https://reactbits.dev/r/{name}.json"
}
}
18 changes: 18 additions & 0 deletions apps/web/eslint.config.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { defineConfig, globalIgnores } from "eslint/config";
import nextVitals from "eslint-config-next/core-web-vitals";
import nextTs from "eslint-config-next/typescript";

const eslintConfig = defineConfig([
...nextVitals,
...nextTs,
// Override default ignores of eslint-config-next.
globalIgnores([
// Default ignores of eslint-config-next:
".next/**",
"out/**",
"build/**",
"next-env.d.ts",
]),
]);

export default eslintConfig;
8 changes: 8 additions & 0 deletions apps/web/next.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import type { NextConfig } from "next";

const nextConfig: NextConfig = {
/* config options here */
reactCompiler: true,
};

export default nextConfig;
45 changes: 45 additions & 0 deletions apps/web/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
{
"name": "@devradar/web",
"version": "0.1.0",
"private": true,
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start",
"lint": "eslint ."
},
"dependencies": {
"@gsap/react": "^2.1.2",
"@radix-ui/react-accordion": "^1.2.12",
"@radix-ui/react-avatar": "^1.1.11",
"@radix-ui/react-dropdown-menu": "^2.1.16",
"@radix-ui/react-navigation-menu": "^1.2.14",
"@radix-ui/react-separator": "^1.1.8",
"@radix-ui/react-slot": "^1.2.4",
"@radix-ui/react-switch": "^1.2.6",
"@radix-ui/react-tabs": "^1.1.13",
"@radix-ui/react-tooltip": "^1.2.8",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"gsap": "^3.14.2",
"lucide-react": "^0.562.0",
"motion": "^12.26.1",
"next": "16.1.1",
"next-themes": "^0.4.6",
"react": "19.2.3",
"react-dom": "19.2.3",
"tailwind-merge": "^3.4.0"
Comment on lines +27 to +31
Copy link

Choose a reason for hiding this comment

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

🧹 Nitpick | 🔵 Trivial

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Verify that the specified versions exist on npm

echo "Checking Next.js 16.1.1..."
npm view next@16.1.1 version 2>/dev/null || echo "Next.js 16.1.1 NOT FOUND"

echo ""
echo "Checking React 19.2.3..."
npm view react@19.2.3 version 2>/dev/null || echo "React 19.2.3 NOT FOUND"

echo ""
echo "Checking react-dom 19.2.3..."
npm view react-dom@19.2.3 version 2>/dev/null || echo "react-dom 19.2.3 NOT FOUND"

echo ""
echo "Latest versions available:"
npm view next version 2>/dev/null
npm view react version 2>/dev/null

Repository: senutpal/devRadar

Length of output: 206


Versioning approach is acceptable; consider consistency if desired.

Next.js 16.1.1 and React 19.2.3 are valid versions and currently the latest available on npm. The decision to pin exact versions for core dependencies (next, react, react-dom) while using caret ranges for others is a common pattern. If you prefer a more consistent strategy across all dependencies, consider either pinning all major dependencies or relaxing constraints for these core packages.

🤖 Prompt for AI Agents
In @apps/web/package.json around lines 27 - 31, The package.json dependency
versioning is inconsistent: core packages "next", "react", and "react-dom" are
pinned to exact versions while others use caret ranges; choose a consistent
strategy and update the dependency strings accordingly (either pin all core deps
by removing caret ranges from "next-themes" and "tailwind-merge" or relax
"next", "react", and "react-dom" to caret ranges) and ensure the package.json
entries for "next", "react", "react-dom", "next-themes", and "tailwind-merge"
reflect the chosen approach so versioning is uniform.

},
"devDependencies": {
"@tailwindcss/postcss": "^4",
"@types/node": "^25.0.8",
"@types/react": "^19",
"@types/react-dom": "^19",
"babel-plugin-react-compiler": "1.0.0",
"eslint": "^9",
"eslint-config-next": "16.1.1",
"tailwindcss": "^4",
"tw-animate-css": "^1.4.0",
"typescript": "^5"
}
}
7 changes: 7 additions & 0 deletions apps/web/postcss.config.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
const config = {
plugins: {
"@tailwindcss/postcss": {},
},
};

export default config;
1 change: 1 addition & 0 deletions apps/web/public/file.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions apps/web/public/globe.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added apps/web/public/logo.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions apps/web/public/next.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions apps/web/public/vercel.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions apps/web/public/window.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
66 changes: 66 additions & 0 deletions apps/web/src/app/dashboard/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
import type { Metadata } from 'next';
import Link from 'next/link';
import { Lock, ExternalLink } from 'lucide-react';

import { Container } from '@/components/layout';
import { Card, CardContent } from '@/components/ui/card';
import { SITE_CONFIG } from '@/lib/constants';

export const metadata: Metadata = {
title: 'Dashboard',
description: 'DevRadar Dashboard - Manage your account and view your coding activity.',
};
Comment on lines +9 to +12
Copy link

Choose a reason for hiding this comment

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

🧹 Nitpick | 🔵 Trivial

Consider metadata alignment with page content.

The metadata describes this as a dashboard for managing accounts and viewing stats, but the actual page renders a sign-in prompt with placeholder values. This may confuse users arriving via search results expecting dashboard functionality.

Consider either:

  1. Updating the description to reflect the sign-in requirement, or
  2. Implementing server-side auth check to redirect unauthenticated users to a login page
🤖 Prompt for AI Agents
In @apps/web/src/app/dashboard/page.tsx around lines 9 - 12, The
metadata.description currently advertises a full dashboard while the page
renders a sign-in prompt, causing a mismatch; either update the exported
metadata constant (metadata.description) to mention that authentication/sign-in
is required, or implement a server-side auth check inside the page's server
component (the default export in page.tsx) to detect unauthenticated users and
perform a redirect to the login route (e.g., /login) before rendering; locate
and update the metadata object or add the auth-check and redirect logic in the
page component to ensure metadata and actual behavior align.


export default function DashboardPage() {
return (
<div className="pt-24 pb-16 min-h-screen flex items-center">
<Container size="sm">
<div className="text-center">
<div className="inline-flex items-center justify-center w-20 h-20 rounded-full bg-muted mb-8">
<Lock className="w-10 h-10 text-muted-foreground" />
</div>

<h1 className="text-3xl sm:text-4xl font-bold mb-4">Sign in to continue</h1>
<p className="text-lg text-muted-foreground mb-8 max-w-md mx-auto">
Access your dashboard to manage your account, view your coding stats, and connect with
friends.
</p>

<div className="grid sm:grid-cols-3 gap-4 mb-8">
<Card className="bg-card/50 border-border/50">
<CardContent className="pt-6 text-center">
<div className="text-2xl font-bold text-primary mb-1">0</div>
<p className="text-sm text-muted-foreground">Coding Streak</p>
</CardContent>
</Card>
<Card className="bg-card/50 border-border/50">
<CardContent className="pt-6 text-center">
<div className="text-2xl font-bold text-primary mb-1">0h 0m</div>
<p className="text-sm text-muted-foreground">This Week</p>
</CardContent>
</Card>
<Card className="bg-card/50 border-border/50">
<CardContent className="pt-6 text-center">
<div className="text-2xl font-bold text-primary mb-1">0</div>
<p className="text-sm text-muted-foreground">Friends Online</p>
</CardContent>
</Card>
</div>

<p className="text-sm text-muted-foreground">
Don&apos;t have the extension yet?{' '}
<Link
href={SITE_CONFIG.links.marketplace}
target="_blank"
rel="noopener noreferrer"
className="text-primary hover:underline inline-flex items-center gap-1"
>
Install DevRadar
<ExternalLink className="w-3 h-3" />
</Link>
</p>
</div>
</Container>
</div>
);
}
Loading