Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
b9b6147
optimize build and rebrand copyright to Elinks
ElinksTeam Jun 27, 2026
64a7d3f
fix local API access and IP source fallbacks
ElinksTeam Jun 27, 2026
7acb045
replace site brand icon with Elinks logo
ElinksTeam Jun 27, 2026
ffd431f
replace upstream footer badges with Elinks links
ElinksTeam Jun 27, 2026
14adc8d
rename branded IP sources to ElinksNet
ElinksTeam Jun 27, 2026
a81dcc3
Refactor(brand): align project structure with ElinksNet
ElinksTeam Jun 28, 2026
1b0393f
Fix(deploy): publish Vite output on Vercel
ElinksTeam Jun 28, 2026
7954abd
Chore(repo): update links for ElinksNet rename
ElinksTeam Jun 28, 2026
25f0649
Refactor(api): consolidate Vercel functions
ElinksTeam Jun 28, 2026
47fc6a2
Add Elinks dashboard branding and AI safety advice
ElinksTeam Jun 28, 2026
2544aea
Add keyless IP geolocation fallback
ElinksTeam Jun 28, 2026
7f2b697
Fix Vercel IP loading and PWA updates
ElinksTeam Jun 28, 2026
74b6ded
Modernize advanced tools workspace
ElinksTeam Jun 29, 2026
4a8a7eb
add keyless rate-limited CLI API
ElinksTeam Jun 29, 2026
50fd777
add Vercel CLI API functions
ElinksTeam Jun 29, 2026
f6b0393
expand dashboard reports docs and Groq AI
ElinksTeam Jun 29, 2026
26a26a0
improve Groq multilingual advice model
ElinksTeam Jun 29, 2026
03d27fe
strengthen multilingual Groq responses
ElinksTeam Jun 29, 2026
f3b863b
fix proxy risk detection
ElinksTeam Jun 30, 2026
fc903e1
enable IPAPI.is on Vercel
ElinksTeam Jun 30, 2026
23256ac
enable IPinfo Lite on Vercel
ElinksTeam Jun 30, 2026
34d1a6c
enable IP2Location on Vercel
ElinksTeam Jun 30, 2026
4e35473
add interactive AI diagnostics
ElinksTeam Jul 1, 2026
bf20eba
add RDAP and service status
ElinksTeam Jul 1, 2026
f26ab06
fuse all available IP sources
ElinksTeam Jul 1, 2026
bed263c
refine fused IP intelligence layout
ElinksTeam Jul 1, 2026
be030e7
refactor tool data workflows and interface primitives
ElinksTeam Jul 1, 2026
ddcb5ac
migrate frontend to Next.js and HeroUI
ElinksTeam Jul 1, 2026
07df2d3
remove obsolete Vercel API functions
ElinksTeam Jul 1, 2026
5cbb992
restore network tools in Next.js
ElinksTeam Jul 1, 2026
dcd7040
add multilingual network identity tools
ElinksTeam Jul 1, 2026
8593b34
polish motion and unify Elinks branding
ElinksTeam Jul 2, 2026
29d60c1
add keyless IP sources and location globe
ElinksTeam Jul 2, 2026
867d32a
fix location globe and AI assistant entry
ElinksTeam Jul 2, 2026
9886066
refine IP stack and service status
ElinksTeam Jul 2, 2026
afa51f6
fix network tools and expand ElinksAI
ElinksTeam Jul 2, 2026
38fc313
add transparent multi-source intelligence tools
ElinksTeam Jul 2, 2026
37d6852
refine Thai edge status copy
ElinksTeam Jul 2, 2026
37e2c0b
add IP quality and full source status
ElinksTeam Jul 2, 2026
dd04839
release ElinksNet 8 container runtime
ElinksTeam Jul 2, 2026
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
12 changes: 11 additions & 1 deletion .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,20 @@
.vscode

node_modules
.next
dist
logs
localtest
package-lock.json
frontend
server
common
backend-server.js
frontend-server.js
server.js
vite.config.js
index.html
tests
local-homepage.png

.DS_Store
.env
Expand Down
12 changes: 5 additions & 7 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -4,22 +4,20 @@ FRONTEND_PORT="18966"
ALLOWED_DOMAINS=""
# APIs
BING_MAP_API_KEY=""
GOOGLE_MAP_API_KEY=""
IPINFO_API_TOKEN=""
CLOUDFLARE_API=""
IPAPIIS_API_KEY=""
IP2LOCATION_API_KEY=""
IPCHECKING_API_KEY=""
PROXYCHECK_API_KEY=""
ELINKSNET_API_KEY=""
MAC_LOOKUP_API_KEY=""
IPCHECKING_API_ENDPOINT=""
ELINKSNET_API_ENDPOINT=""
GROQ_API_KEY=""
ELINKS_AI_MODEL="llama-3.3-70b-versatile"
# Security related
SECURITY_BLACKLIST_LOG_FILE_PATH=""
SECURITY_RATE_LIMIT=""
SECURITY_DELAY_AFTER=""
# CURL API
VITE_CURL_IPV4_DOMAIN=""
VITE_CURL_IPV6_DOMAIN=""
VITE_CURL_IPV64_DOMAIN=""
# Google Analytics
VITE_GOOGLE_ANALYTICS_ID=""
# MaxMind
Expand Down
1 change: 0 additions & 1 deletion .github/FUNDING.yml

This file was deleted.

5 changes: 3 additions & 2 deletions .github/workflows/docker-image.yml
Original file line number Diff line number Diff line change
Expand Up @@ -57,9 +57,10 @@ jobs:
tags: |
elinksteam/elinksnet:latest
elinksteam/elinksnet:${{ env.RELEASE_VERSION }}
ghcr.io/${{ github.repository_owner }}/elinksnet:latest
ghcr.io/${{ github.repository_owner }}/elinksnet:${{ env.RELEASE_VERSION }}
ghcr.io/elinksteam/elinksnet:latest
ghcr.io/elinksteam/elinksnet:${{ env.RELEASE_VERSION }}
labels: |
org.opencontainers.image.version=${{ env.RELEASE_VERSION }}
org.opencontainers.image.description=${{ env.RELEASE_NOTES }}
org.opencontainers.image.source=https://github.com/ElinksTeam/ElinksNet
platforms: linux/amd64,linux/arm64
2 changes: 1 addition & 1 deletion .github/workflows/dockerhub-readme.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,5 +33,5 @@ jobs:
with:
username: ${{ secrets.DOCKER_HUB_USERNAME }}
password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}
repository: jason5ng32/myip
repository: elinksteam/elinksnet
readme-filepath: ./README.md
40 changes: 0 additions & 40 deletions .github/workflows/sync.yml

This file was deleted.

4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ lerna-debug.log*
.claude

node_modules
.next
dist
dist-ssr
*.local
Expand All @@ -26,7 +27,6 @@ dist-ssr
.env
.vscode/extensions.json

package-lock.json
localtest

.VSCodeCounter
Expand All @@ -37,3 +37,5 @@ common/maxmind-db/*.bak
common/maxmind-db/*.next
common/maxmind-db/*.mmdb
.learnings/
.vercel
.env*
15 changes: 8 additions & 7 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
# AGENTS.md

Single source of truth for anyone — human or AI — contributing to MyIP.
Single source of truth for anyone — human or AI — contributing to ElinksNet.

For area-specific details, see:

- Frontend (Vue 3 SPA): @frontend/AGENTS.md
- Backend API (Express): @api/AGENTS.md
- Backend API (Express): @server/handlers/AGENTS.md

## Overview

**MyIP** (IPCheck.ing) is an open-source IP toolbox: IP lookup, connectivity tests, WebRTC / DNS-leak detection, speed test, MTR, Whois, security checklist, browser fingerprint, anonymity checks, and more.
**ElinksNet** is an open-source IP toolbox maintained by Elinks: IP lookup, connectivity tests, WebRTC / DNS-leak detection, speed test, MTR, Whois, security checklist, browser fingerprint, anonymity checks, and more.

Single repo, two halves: a Vue 3 SPA front-end and an Express 5 back-end API, served side by side.

Expand Down Expand Up @@ -53,13 +53,14 @@ Single repo, two halves: a Vue 3 SPA front-end and an Express 5 back-end API, se
├── CLAUDE.md ← Claude-specific pointer to AGENTS.md
├── frontend/ ← Vue 3 SPA (see frontend/AGENTS.md)
├── api/ ← Express handlers (see api/AGENTS.md)
├── server/handlers/ ← Express handlers (see server/handlers/AGENTS.md)
├── common/ ← code shared between front- and back-end
│ (valid-ip / fetch-with-timeout / guards /
│ referer-check / maxmind-service / …)
├── tests/ ← Node test runner specs
├── backend-server.js ← Express app (default port 11966)
├── server.js ← shared Express app and Vercel entrypoint
├── backend-server.js ← local Express listener (default port 11966)
├── frontend-server.js ← static file server for `npm start`
├── index.html ← Vite entry; #app mounts vaul-drawer-wrapper
├── vite.config.js
Expand Down Expand Up @@ -94,11 +95,11 @@ Single repo, two halves: a Vue 3 SPA front-end and an Express 5 back-end API, se

## Security & Boundaries

The backend enforces access control and timeouts through shared middleware rather than per-handler code. Full details live in @api/AGENTS.md; the rules that matter at the project level:
The backend enforces access control and timeouts through shared middleware rather than per-handler code. Full details live in @server/handlers/AGENTS.md; the rules that matter at the project level:

- `requireReferer` is mounted globally on `/api/*` — handlers must not repeat the referer check.
- `requireValidIP()` is attached per-route where `?ip` is a required param — handlers must not repeat the IP check.
- Every upstream HTTP call goes through `fetchUpstream` (`common/fetch-with-timeout.js`) with an 8s timeout. Never add a bare `fetch()` to an `api/` handler.
- Every upstream HTTP call goes through `fetchUpstream` (`common/fetch-with-timeout.js`) with an 8s timeout. Never add a bare `fetch()` to a `server/handlers/` module.

## Workflow

Expand Down
13 changes: 13 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# Changelog

## 8.0.0 — 2026-07-03

- Rebuilt the production frontend on Next.js 16, React 19, Tailwind CSS, HeroUI, and shadcn/ui.
- Added multi-source IP intelligence with up to 26 keyless providers and field-level source transparency.
- Added IP quality scoring, residential/mobile/datacenter classification, proxy risk, and network safety guidance.
- Added localized geographic names and complete English, Simplified Chinese, Japanese, and Thai product copy.
- Added deep DNS leak, WebRTC exposure, IPv4/IPv6, connectivity, speed, Globalping, RDAP, WHOIS, MAC, and browser diagnostics.
- Added ElinksAI conversational analysis with three performance modes.
- Added shareable report images with timestamps and SHA-256 integrity fingerprints.
- Rebuilt the Docker image around the Next.js standalone runtime.
- Fixed stable mobile sizing for WebRTC result cards.
40 changes: 25 additions & 15 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,23 +1,33 @@
# Build stage
FROM node:24-alpine AS build-stage
FROM node:24-alpine AS dependencies
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY package.json package-lock.json ./
RUN npm ci

FROM node:24-alpine AS builder
WORKDIR /app
ENV NEXT_TELEMETRY_DISABLED=1
COPY --from=dependencies /app/node_modules ./node_modules
COPY . .
RUN npm run build

# Production stage
FROM node:24-alpine AS production-stage
FROM node:24-alpine AS runner
WORKDIR /app
COPY --from=build-stage /app/node_modules ./node_modules
COPY --from=build-stage /app/package.json ./
COPY --from=build-stage /app/dist ./dist
COPY --from=build-stage /app/backend-server.js ./
COPY --from=build-stage /app/frontend-server.js ./
COPY --from=build-stage /app/api ./api
COPY --from=build-stage /app/common ./common
ENV NODE_ENV=production \
NEXT_TELEMETRY_DISABLED=1 \
HOSTNAME=0.0.0.0 \
PORT=18966

RUN addgroup --system --gid 1001 nodejs \
&& adduser --system --uid 1001 nextjs

COPY --from=builder --chown=nextjs:nodejs /app/public ./public
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static

EXPOSE 18966
USER nextjs

HEALTHCHECK --interval=30s --timeout=5s --start-period=20s --retries=3 \
CMD node -e "fetch('http://127.0.0.1:18966/api/tools/status').then(r=>{if(!r.ok)process.exit(1)}).catch(()=>process.exit(1))"

# Start application
CMD ["npm", "start"]
CMD ["node", "server.js"]
1 change: 1 addition & 0 deletions LICENSE
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
MIT License

Copyright (c) 2024 Jason Ng
Copyright (c) 2026 Elinks

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
Expand Down
Loading
Loading