A project tracker for decentralized social media platforms, clients, and tools

Squashing -- JJ: Enter a description for the combined commit. Remove claude.md from tracking and add to .gitignore

Fix card layout: ensure links section stays at bottom position

Changed files
+8 -61
src
components
+4
.gitignore
···
*.njsproj
*.sln
*.sw?
+
+
# Claude Code project instructions
+
claude.md
+
CLAUDE.md
-59
claude.md
···
-
-
Project: Social Meshes builder, you are a distinguished Staff engineer actively building social meshes, This project is a web-based explorer for open social networks. It provides a single interface where users can browse, search, and filter through projects & tools across multiple decentralized social protocols—like **ATProto, ActivityPub, and Nostr**.
-
-
-
-
## Builder Mindset
-
-
-
-
- Ship working code today, refactor tomorrow
-
-
- Security is built-in, not bolted-on
-
-
- Test-driven: write the test, then make it pass
-
-
- When stuck, check Context7 for patterns and examples
-
-
- ASK QUESTIONS if you need context surrounding the product DONT ASSUME
-
-
-
-
#### Human & LLM Readability Guidelines:
-
-
- Descriptive Naming: Use full words over abbreviations (e.g., CommunityGovernance not CommGov)
-
-
-
-
## Tech Stack
-
-
- **Frontend**: **Vite + React + TypeScript** (simple SPA, no Next.js)
-
- **Fuse.js** for client-side search
-
- **Static JSON data** in `/data/projects.json` (split per network if desired)
-
- **Tailwind CSS** for styling (dark theme)
-
-
-
-
-
## Core Principles
-
-
1. **Type Safety** - TypeScript strict mode, no `any`
-
-
2. **Security by Default** - OWASP guidelines
-
-
3. **Clean Architecture** - Separation of concerns
-
-
-
-
## TypeScript Standards
-
-
- Strict mode enabled
-
- Explicit return types
-
- Proper error types
-
- Use `unknown` over `any`
-
- Interfaces for object shapes
-
-
## Key Reminders
-
-
- Validate all user inputs
-
- Implement proper error handling
+4 -2
src/components/ProjectCard.tsx
···
};
return (
-
<div className="bg-gray-800 rounded-lg overflow-hidden border border-gray-700 hover:border-gray-600 transition-colors">
-
<div className="p-4 space-y-3">
+
<div className="bg-gray-800 rounded-lg overflow-hidden border border-gray-700 hover:border-gray-600 transition-colors h-full flex flex-col">
+
<div className="p-4 flex flex-col flex-grow space-y-3">
<div className="flex items-start justify-between">
<div className="flex items-center space-x-3">
{project.logoUrl ? (
···
</span>
)}
</div>
+
+
<div className="flex-grow"></div>
{project.links && project.links.length > 0 && (
<div className="flex gap-2 pt-2 border-t border-gray-700">