A full-stack web application for crawling and analyzing websites. It detects broken links, extracts HTML metadata, visualizes page structure, and provides real-time crawling status.
- URL Analysis: Crawl and inspect any URL
- Live Crawl Updates: See real-time crawling progress
- Metrics Extraction:
- HTML version
- Heading structure (H1βH6)
- Internal & external links
- Broken links with status codes
- Login form detection
- Interactive Dashboard:
- Filterable & sortable URL list
- Bulk actions: re-analyze, delete
- Responsive UI
- Data Visualization: Recharts-powered graphs for links, headings, and more
- Authentication: API key-based access
- Dockerized Dev Environment
- React 19 + TypeScript
- Vite
- Tailwind CSS + shadcn/ui
- React Router v6
- TanStack Query
- Zustand
- Recharts
- React Hook Form + Zod
- Axios
- Go (Gin framework)
- MySQL 8.0
- Goroutines for concurrency
- JWT-style API key validation
- Docker & Docker Compose
- Volumes for persistent DB storage
.
βββ README.md
βββ docker-compose.yml
βββ url-analyzer-backend
βΒ Β βββ Dockerfile
βΒ Β βββ README.md
βΒ Β βββ cmd
βΒ Β βΒ Β βββ server
βΒ Β βΒ Β βββ main.go
βΒ Β βββ docs
βΒ Β βΒ Β βββ docs.go
βΒ Β βΒ Β βββ swagger.json
βΒ Β βΒ Β βββ swagger.yaml
βΒ Β βββ go.mod
βΒ Β βββ go.sum
βΒ Β βββ internal
βΒ Β βΒ Β βββ database
βΒ Β βΒ Β βΒ Β βββ connection.go
βΒ Β βΒ Β βΒ Β βββ init.go
βΒ Β βΒ Β βΒ Β βββ interfaces.go
βΒ Β βΒ Β βΒ Β βββ repository.go
βΒ Β βΒ Β βΒ Β βββ repository_test.go
βΒ Β βΒ Β βΒ Β βββ utils.go
βΒ Β βΒ Β βββ handlers
βΒ Β βΒ Β βΒ Β βββ system.go
βΒ Β βΒ Β βΒ Β βββ urls.go
βΒ Β βΒ Β βΒ Β βββ urls_test.go
βΒ Β βΒ Β βββ middleware
βΒ Β βΒ Β βΒ Β βββ auth.go
βΒ Β βΒ Β βββ models
βΒ Β βΒ Β βΒ Β βββ models.go
βΒ Β βΒ Β βββ services
βΒ Β βΒ Β βββ crawler_service.go
βΒ Β βΒ Β βββ crawler_service_test.go
βΒ Β βΒ Β βββ interfaces.go
βΒ Β βββ migrations
βΒ Β βΒ Β βββ 001_initial_schema.sql
βΒ Β βββ pkg
βΒ Β βββ crawler
βΒ Β βββ crawler.go
βΒ Β βββ crawler_test.go
βΒ Β βββ debug_test.go
βββ url-analyzer-frontend
βββ Dockerfile.dev
βββ components.json
βββ eslint.config.js
βββ global.d.ts
βββ index.html
βββ package.json
βββ pnpm-lock.yaml
βββ public
βββ src
βΒ Β βββ App.tsx
βΒ Β βββ components
βΒ Β βΒ Β βββ errors
βΒ Β βΒ Β βΒ Β βββ AppErrorBoundary.tsx
βΒ Β βΒ Β βΒ Β βββ LoadingComponent.tsx
βΒ Β βΒ Β βββ layout
βΒ Β βΒ Β βΒ Β βββ AppName.tsx
βΒ Β βΒ Β βΒ Β βββ Header.tsx
βΒ Β βΒ Β βΒ Β βββ RootLayout.tsx
βΒ Β βΒ Β βΒ Β βββ sidebar
βΒ Β βΒ Β βΒ Β βββ Sidebar.tsx
βΒ Β βΒ Β βΒ Β βββ SidebarCollapseToggle.tsx
βΒ Β βΒ Β βΒ Β βββ SidebarMobileHeader.tsx
βΒ Β βΒ Β βΒ Β βββ SidebarNavLinks.tsx
βΒ Β βΒ Β βββ shared
βΒ Β βΒ Β βΒ Β βββ ConfirmDialog.tsx
βΒ Β βΒ Β βββ ui
βΒ Β βΒ Β βββ alert.tsx
βΒ Β βΒ Β βββ badge.tsx
βΒ Β βΒ Β βββ button.tsx
βΒ Β βΒ Β βββ card.tsx
βΒ Β βΒ Β βββ chart.tsx
βΒ Β βΒ Β βββ checkbox.tsx
βΒ Β βΒ Β βββ dialog.tsx
βΒ Β βΒ Β βββ form.tsx
βΒ Β βΒ Β βββ icon
βΒ Β βΒ Β βΒ Β βββ Icon.tsx
βΒ Β βΒ Β βΒ Β βββ iconMapping.ts
βΒ Β βΒ Β βββ input.tsx
βΒ Β βΒ Β βββ label.tsx
βΒ Β βΒ Β βββ pagination.tsx
βΒ Β βΒ Β βββ progress.tsx
βΒ Β βΒ Β βββ scroll-area.tsx
βΒ Β βΒ Β βββ select.tsx
βΒ Β βΒ Β βββ skeleton.tsx
βΒ Β βΒ Β βββ sonner.tsx
βΒ Β βΒ Β βββ table.tsx
βΒ Β βΒ Β βββ tooltip.tsx
βΒ Β βββ features
βΒ Β βΒ Β βββ auth
βΒ Β βΒ Β βΒ Β βββ components
βΒ Β βΒ Β βΒ Β βΒ Β βββ AuthForm.tsx
βΒ Β βΒ Β βΒ Β βΒ Β βββ LogoutButton.tsx
βΒ Β βΒ Β βΒ Β βΒ Β βββ ProtectedRoute.tsx
βΒ Β βΒ Β βΒ Β βββ hooks
βΒ Β βΒ Β βΒ Β βΒ Β βββ useAuthSubmit.ts
βΒ Β βΒ Β βΒ Β βββ pages
βΒ Β βΒ Β βΒ Β βΒ Β βββ AuthPage.tsx
βΒ Β βΒ Β βΒ Β βββ store
βΒ Β βΒ Β βΒ Β βββ authStore.ts
βΒ Β βΒ Β βββ dashboard
βΒ Β βΒ Β βΒ Β βββ __tests__
βΒ Β βΒ Β βΒ Β βΒ Β βββ DashboardPage.test.tsx
βΒ Β βΒ Β βΒ Β βββ components
βΒ Β βΒ Β βΒ Β βΒ Β βββ BulkActionsCard.tsx
βΒ Β βΒ Β βΒ Β βΒ Β βββ DashboardHeader.tsx
βΒ Β βΒ Β βΒ Β βΒ Β βββ URLTableSection.tsx
βΒ Β βΒ Β βΒ Β βββ pages
βΒ Β βΒ Β βΒ Β βββ DashboardPage.tsx
βΒ Β βΒ Β βββ system
βΒ Β βΒ Β βΒ Β βββ components
βΒ Β βΒ Β βΒ Β βΒ Β βββ ActiveJobsCard.tsx
βΒ Β βΒ Β βΒ Β βΒ Β βββ CrawlerConfigCard.tsx
βΒ Β βΒ Β βΒ Β βΒ Β βββ DatabaseErrorAlert.tsx
βΒ Β βΒ Β βΒ Β βΒ Β βββ DatabaseStatsCard.tsx
βΒ Β βΒ Β βΒ Β βΒ Β βββ HealthPageSkeleton.tsx
βΒ Β βΒ Β βΒ Β βΒ Β βββ SystemStatusCard.tsx
βΒ Β βΒ Β βΒ Β βββ hooks
βΒ Β βΒ Β βΒ Β βΒ Β βββ useSystem.ts
βΒ Β βΒ Β βΒ Β βββ pages
βΒ Β βΒ Β βΒ Β βΒ Β βββ HealthPage.tsx
βΒ Β βΒ Β βΒ Β βββ utils
βΒ Β βΒ Β βΒ Β βββ systemUtils.ts
βΒ Β βΒ Β βββ url-analysis
βΒ Β βΒ Β βΒ Β βββ components
βΒ Β βΒ Β βΒ Β βΒ Β βββ CrawlProgress.tsx
βΒ Β βΒ Β βΒ Β βΒ Β βββ CrawlStatusLabel.tsx
βΒ Β βΒ Β βΒ Β βΒ Β βββ URLCrawlStatusCell.tsx
βΒ Β βΒ Β βΒ Β βββ store
βΒ Β βΒ Β βΒ Β βΒ Β βββ urlAnalysisStore.ts
βΒ Β βΒ Β βΒ Β βββ utils
βΒ Β βΒ Β βΒ Β βββ crawlStatusConfig.ts
βΒ Β βΒ Β βΒ Β βββ isCrawlResultEmpty.ts
βΒ Β βΒ Β βΒ Β βββ mapCrawlToURLStatus.ts
βΒ Β βΒ Β βββ url-details
βΒ Β βΒ Β βΒ Β βββ components
βΒ Β βΒ Β βΒ Β βΒ Β βββ ActionButtons.tsx
βΒ Β βΒ Β βΒ Β βΒ Β βββ EmptyChartsSection.tsx
βΒ Β βΒ Β βΒ Β βΒ Β βββ StatsGrid.tsx
βΒ Β βΒ Β βΒ Β βΒ Β βββ URLDetailsPageSkeleton.tsx
βΒ Β βΒ Β βΒ Β βΒ Β βββ URLInfoCard.tsx
βΒ Β βΒ Β βΒ Β βΒ Β βββ broken-links
βΒ Β βΒ Β βΒ Β βΒ Β βΒ Β βββ BrokenLinksTable.tsx
βΒ Β βΒ Β βΒ Β βΒ Β βΒ Β βββ BrokenLinksTableHeader.tsx
βΒ Β βΒ Β βΒ Β βΒ Β βΒ Β βββ BrokenLinksTableRow.tsx
βΒ Β βΒ Β βΒ Β βΒ Β βΒ Β βββ getStatusUtils.ts
βΒ Β βΒ Β βΒ Β βΒ Β βββ charts
βΒ Β βΒ Β βΒ Β βΒ Β βββ HeadingDistributionChart.tsx
βΒ Β βΒ Β βΒ Β βΒ Β βββ LinkDistributionChart.tsx
βΒ Β βΒ Β βΒ Β βββ pages
βΒ Β βΒ Β βΒ Β βΒ Β βββ URLDetailsPage.tsx
βΒ Β βΒ Β βΒ Β βββ sections
βΒ Β βΒ Β βΒ Β βΒ Β βββ BrokenLinksSection.tsx
βΒ Β βΒ Β βΒ Β βΒ Β βββ ChartsSection.tsx
βΒ Β βΒ Β βΒ Β βββ utils
βΒ Β βΒ Β βΒ Β βββ urlDetailsUtils.ts
βΒ Β βΒ Β βββ urls
βΒ Β βΒ Β βββ components
βΒ Β βΒ Β βΒ Β βββ AddURLDialog.tsx
βΒ Β βΒ Β βΒ Β βββ URLFilters.tsx
βΒ Β βΒ Β βΒ Β βββ url-badge
βΒ Β βΒ Β βΒ Β βΒ Β βββ StatusBadge.tsx
βΒ Β βΒ Β βΒ Β βΒ Β βββ URLStatusBadge.tsx
βΒ Β βΒ Β βΒ Β βββ url-table
βΒ Β βΒ Β βΒ Β βββ PaginationControls.tsx
βΒ Β βΒ Β βΒ Β βββ SortableHeader.tsx
βΒ Β βΒ Β βΒ Β βββ URLTable.tsx
βΒ Β βΒ Β βΒ Β βββ URLTableEmptyState.tsx
βΒ Β βΒ Β βΒ Β βββ URLTableHeader.tsx
βΒ Β βΒ Β βΒ Β βββ URLTableRow.tsx
βΒ Β βΒ Β βΒ Β βββ URLTableSkeleton.tsx
βΒ Β βΒ Β βββ hooks
βΒ Β βΒ Β βΒ Β βββ useURLs.ts
βΒ Β βΒ Β βββ store
βΒ Β βΒ Β βΒ Β βββ urlStore.ts
βΒ Β βΒ Β βββ types.ts
βΒ Β βΒ Β βββ utils
βΒ Β βΒ Β βββ urlStatusConfig.ts
βΒ Β βββ hooks
βΒ Β βΒ Β βββ useDebounce.ts
βΒ Β βββ index.css
βΒ Β βββ lib
βΒ Β βΒ Β βββ utils.ts
βΒ Β βββ main.tsx
βΒ Β βββ mocks
βΒ Β βΒ Β βββ handlers.ts
βΒ Β βΒ Β βββ node.ts
βΒ Β βββ router
βΒ Β βΒ Β βββ Router.tsx
βΒ Β βΒ Β βββ routerConfig.tsx
βΒ Β βββ shared
βΒ Β βΒ Β βββ api
βΒ Β βΒ Β βΒ Β βββ client.ts
βΒ Β βΒ Β βββ types
βΒ Β βΒ Β βΒ Β βββ api.ts
βΒ Β βΒ Β βββ utils
βΒ Β βΒ Β βββ getErrorMessage.ts
βΒ Β βΒ Β βββ pluralize.ts
βΒ Β βββ test
βΒ Β βΒ Β βββ test-utils.tsx
βΒ Β βββ vite-env.d.ts
βββ tsconfig.app.json
βββ tsconfig.json
βββ tsconfig.node.json
βββ vite.config.ts
βββ vitest.config.ts
βββ vitest.setup.ts- Clone the repository
git clone https://github.com/YOUR_USERNAME/url-analyzer.git
cd url-analyzer- Start all services
docker-compose up --build- Access the app
- Frontend: http://localhost:5173
- Backend API: http://localhost:8000
- Default API Key:
test-api-key-12345(already set indocker-compose.yml)
- Backend (Go)
cd url-analyzer-backend
go mod download
# Create DB manually or use Docker MySQL
mysql -u root -p -e "CREATE DATABASE url_analyzer;"
# Load initial tables
mysql -u root -p url_analyzer < migrations/001_create_tables.sql
cp .env.example .env
go run main.go- Frontend (Vite + React)
cd url-analyzer-frontend
pnpm install
cp .env.example .env
pnpm run dev- Frontend
cd url-analyzer-frontend
pnpm run test # Run tests- Backend
cd url-analyzer-backend
go test ./...
go test -cover ./...- Backend
| Variable | Description |
|---------------|-----------------------------|
| `DB_HOST` | MySQL host (`mysql`) |
| `DB_PORT` | MySQL port (`3306`) |
| `DB_USER` | MySQL user (`root`) |
| `DB_PASSWORD` | MySQL password |
| `DB_NAME` | Database name |
| `API_KEY` | API key for requests |
| `PORT` | Backend server port |- Frontend
| Variable | Description |
|-----------------|--------------------------|
| `VITE_API_URL` | Backend API base URL |All requests must include:
Authorization: test-api-key-12345GET /api/urlsβ List URLsPOST /api/urlsβ Create a new crawl jobGET /api/urls/:idβ Get crawl detailsPUT /api/urls/:id/startβ Start crawlingPUT /api/urls/:id/stopβ Stop crawlPUT /api/urls/:id/restartβ Restart crawlGET /api/urls/:id/statusβ Poll job statusDELETE /api/urlsβ Bulk delete
GET /api/healthβ Health checkGET /api/statsβ System usage stats
This project is licensed under the MIT License.