diff --git a/.env.example b/.env.example
index 1ab15cf..b690b70 100644
--- a/.env.example
+++ b/.env.example
@@ -24,7 +24,7 @@ JWT_KEY=change-me-64-char-random-string-use-openssl-rand-hex-32-output
NEXT_PUBLIC_API_URL=http://171.22.25.73:5080
NEXT_PUBLIC_ADMIN_API_URL=http://171.22.25.73:5081
NEXT_PUBLIC_SITE_URL=http://171.22.25.73:3010
-NEXT_PUBLIC_FINDER_URL=http://171.22.25.73:3103
+NEXT_PUBLIC_KOJA_URL=http://171.22.25.73:3103
APP_QR_BASE_URL=http://171.22.25.73:3101
BILLING_DASHBOARD_URL=http://171.22.25.73:3101
@@ -40,7 +40,7 @@ ADMIN_API_PORT=5081
WEB_PORT=3101
ADMIN_WEB_PORT=3102
WEBSITE_PORT=3010
-FINDER_PORT=3103
+KOJA_PORT=3103
POSTGRES_PORT=5434
REDIS_PORT=6381
@@ -51,19 +51,19 @@ REDIS_PORT=6381
# NEXT_PUBLIC_API_URL=https://api.meezi.ir
# NEXT_PUBLIC_ADMIN_API_URL=https://admin-api.meezi.ir
# NEXT_PUBLIC_SITE_URL=https://meezi.ir
-# NEXT_PUBLIC_FINDER_URL=https://finder.meezi.ir
+# NEXT_PUBLIC_KOJA_URL=https://koja.meezi.ir
#
# APP_QR_BASE_URL=https://app.meezi.ir
# BILLING_DASHBOARD_URL=https://app.meezi.ir
#
# CORS_ORIGIN_0=https://app.meezi.ir
# CORS_ORIGIN_1=https://meezi.ir
-# CORS_ORIGIN_2=https://finder.meezi.ir
+# CORS_ORIGIN_2=https://koja.meezi.ir
# CORS_ADMIN_ORIGIN_0=https://admin.meezi.ir
#
# Then run CI once to rebuild images with the new URLs baked in.
# DNS required: meezi.ir, app.meezi.ir, api.meezi.ir,
-# finder.meezi.ir, admin.meezi.ir, admin-api.meezi.ir → server IP
+# koja.meezi.ir, admin.meezi.ir, admin-api.meezi.ir → server IP
# ── Migrations ────────────────────────────────────────────────────────────────
RUN_MIGRATIONS=true
diff --git a/.gitea/workflows/ci-cd.yml b/.gitea/workflows/ci-cd.yml
index c1e59e5..945d6b9 100644
--- a/.gitea/workflows/ci-cd.yml
+++ b/.gitea/workflows/ci-cd.yml
@@ -228,8 +228,8 @@ jobs:
env:
MEEZI_API_URL: http://localhost:5080
- finder-check:
- name: "CI · Finder (tsc)"
+ koja-check:
+ name: "CI · Koja (tsc)"
runs-on: ubuntu-latest
container:
image: 171.22.25.73:5000/library/node:20-alpine
@@ -250,11 +250,11 @@ jobs:
rm -f /tmp/repo.tar.gz
- name: Install dependencies
- working-directory: web/finder
+ working-directory: web/koja
run: npm install --legacy-peer-deps --ignore-scripts --registry http://mirror:8081/repository/npm-group/
- name: TypeScript check
- working-directory: web/finder
+ working-directory: web/koja
run: npx tsc --noEmit
env:
NEXT_PUBLIC_API_URL: http://localhost:5080
@@ -276,7 +276,7 @@ jobs:
- dashboard-check
- admin-web-check
- website-check
- - finder-check
+ - koja-check
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
timeout-minutes: 40
@@ -297,8 +297,8 @@ jobs:
env:
ENV_FILE: ${{ secrets.ENV_FILE }}
- - name: Build main images (api, web, website, finder)
- run: docker compose build --parallel api web website finder
+ - name: Build main images (api, web, website, koja)
+ run: docker compose build --parallel api web website koja
env:
DOCKER_BUILDKIT: 1
COMPOSE_DOCKER_CLI_BUILD: 1
@@ -318,7 +318,7 @@ jobs:
docker compose up -d \
--remove-orphans \
--no-deps \
- postgres redis api web website finder
+ postgres redis api web website koja
- name: Start admin services
run: |
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 7d12e71..e0f426a 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -58,20 +58,20 @@ jobs:
env:
NEXT_PUBLIC_API_URL: http://localhost:5080
- # ── Finder: typecheck ──────────────────────────────────────────────────────
- finder:
- name: Finder (Next.js typecheck)
+ # ── Koja: typecheck ─────────────────────────────────────────────────────────
+ koja:
+ name: Koja (Next.js typecheck)
runs-on: ubuntu-latest
defaults:
run:
- working-directory: web/finder
+ working-directory: web/koja
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: "20"
cache: npm
- cache-dependency-path: web/finder/package-lock.json
+ cache-dependency-path: web/koja/package-lock.json
- run: npm install --legacy-peer-deps --ignore-scripts
- run: npx tsc --noEmit
env:
diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
index 4be60a8..8d90f34 100644
--- a/.github/workflows/deploy.yml
+++ b/.github/workflows/deploy.yml
@@ -32,7 +32,7 @@ jobs:
run: |
docker compose build --parallel \
--build-arg BUILDKIT_INLINE_CACHE=1 \
- api web website finder
+ api web website koja
env:
DOCKER_BUILDKIT: 1
COMPOSE_DOCKER_CLI_BUILD: 1
@@ -43,7 +43,7 @@ jobs:
docker compose up -d \
--remove-orphans \
--no-deps \
- postgres redis api web website finder
+ postgres redis api web website koja
# Wait for API healthcheck before declaring success
- name: Wait for API health
diff --git a/Caddyfile b/Caddyfile
index d1e8a6e..32f171c 100644
--- a/Caddyfile
+++ b/Caddyfile
@@ -6,7 +6,7 @@
# Caddy auto-provisions Let's Encrypt TLS — no certbot needed.
# Domains needed in DNS (all → same server IP):
# meezi.ir, app.meezi.ir, api.meezi.ir,
-# finder.meezi.ir, admin.meezi.ir, admin-api.meezi.ir
+# koja.meezi.ir, admin.meezi.ir, admin-api.meezi.ir
{
email {$ACME_EMAIL}
@@ -27,9 +27,9 @@ api.{$DOMAIN} {
reverse_proxy api:8080
}
-# ── Finder (public discovery) ────────────────────────────────────────────────
-finder.{$DOMAIN} {
- reverse_proxy finder:3000
+# ── Koja (public discovery) ──────────────────────────────────────────────────
+koja.{$DOMAIN} {
+ reverse_proxy koja:3000
}
# ── Super-Admin panel ────────────────────────────────────────────────────────
diff --git a/DEPLOY.md b/DEPLOY.md
index 23342fb..b26aecb 100644
--- a/DEPLOY.md
+++ b/DEPLOY.md
@@ -13,7 +13,7 @@ Server: 171.22.25.73
├── meezi-web :3101 ← Next.js cafe owner dashboard
├── meezi-admin-web:3102 ← Next.js super-admin panel
├── meezi-website :3010 ← Next.js marketing website
-├── meezi-finder :3103 ← Next.js public finder
+├── meezi-koja :3103 ← Next.js public discovery (Koja)
├── meezi-db :5434 ← PostgreSQL (not internet-facing)
└── meezi-redis :6381 ← Redis (not internet-facing)
```
@@ -21,7 +21,7 @@ Server: 171.22.25.73
Docker Compose files:
```
-docker-compose.yml main services (postgres, redis, api, web, website, finder)
+docker-compose.yml main services (postgres, redis, api, web, website, koja)
docker-compose.admin.yml admin overlay (+admin-api, +admin-web)
docker-compose.mirror.yml Nexus mirror — run once separately, stays running
docker-compose.caddy.yml Caddy HTTPS proxy — add when domain is ready
@@ -60,7 +60,7 @@ RUN_MIGRATIONS=true
NEXT_PUBLIC_API_URL=http://171.22.25.73:5080
NEXT_PUBLIC_ADMIN_API_URL=http://171.22.25.73:5081
NEXT_PUBLIC_SITE_URL=http://171.22.25.73:3010
-NEXT_PUBLIC_FINDER_URL=http://171.22.25.73:3103
+NEXT_PUBLIC_KOJA_URL=http://171.22.25.73:3103
APP_QR_BASE_URL=http://171.22.25.73:3101
BILLING_DASHBOARD_URL=http://171.22.25.73:3101
@@ -77,7 +77,7 @@ ADMIN_API_PORT=5081
WEB_PORT=3101
ADMIN_WEB_PORT=3102
WEBSITE_PORT=3010
-FINDER_PORT=3103
+KOJA_PORT=3103
POSTGRES_PORT=5434
REDIS_PORT=6381
@@ -123,7 +123,7 @@ CI takes ~5–10 minutes: builds 6 Docker images, runs all checks, then deploys.
|---|---|
| Marketing website | http://171.22.25.73:3010/fa |
| Cafe owner dashboard | http://171.22.25.73:3101/fa/login |
-| Public finder | http://171.22.25.73:3103/fa |
+| Public Koja | http://171.22.25.73:3103/fa |
| Super-admin panel | http://171.22.25.73:3102/fa/admin/login |
| Main API (Swagger) | http://171.22.25.73:5080/swagger |
| Admin API (Swagger) | http://171.22.25.73:5081/swagger |
@@ -173,7 +173,7 @@ Create these A records — all pointing to `171.22.25.73`:
| `meezi.ir` | Marketing website |
| `app.meezi.ir` | Cafe dashboard |
| `api.meezi.ir` | Main API |
-| `finder.meezi.ir` | Finder |
+| `koja.meezi.ir` | Koja |
| `admin.meezi.ir` | Admin panel |
| `admin-api.meezi.ir` | Admin API |
@@ -189,14 +189,14 @@ ACME_EMAIL=you@example.com
NEXT_PUBLIC_API_URL=https://api.meezi.ir
NEXT_PUBLIC_ADMIN_API_URL=https://admin-api.meezi.ir
NEXT_PUBLIC_SITE_URL=https://meezi.ir
-NEXT_PUBLIC_FINDER_URL=https://finder.meezi.ir
+NEXT_PUBLIC_KOJA_URL=https://koja.meezi.ir
APP_QR_BASE_URL=https://app.meezi.ir
BILLING_DASHBOARD_URL=https://app.meezi.ir
CORS_ORIGIN_0=https://app.meezi.ir
CORS_ORIGIN_1=https://meezi.ir
-CORS_ORIGIN_2=https://finder.meezi.ir
+CORS_ORIGIN_2=https://koja.meezi.ir
CORS_ADMIN_ORIGIN_0=https://admin.meezi.ir
# Remove all PORT= lines — Caddy is the only public endpoint
diff --git a/docker-compose.caddy.yml b/docker-compose.caddy.yml
index c9fae16..96cb366 100644
--- a/docker-compose.caddy.yml
+++ b/docker-compose.caddy.yml
@@ -36,7 +36,7 @@ services:
- api
- web
- website
- - finder
+ - koja
- admin-api
- admin-web
diff --git a/docker-compose.yml b/docker-compose.yml
index adf49a0..046831c 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -1,4 +1,4 @@
-# Meezi — main stack (Postgres, Redis, API, Dashboard, Website, Finder)
+# Meezi — main stack (Postgres, Redis, API, Dashboard, Website, Koja)
#
# Local dev:
# cp .env.example .env
@@ -13,7 +13,7 @@
# URLs (port-based defaults):
# Dashboard http://SERVER:3101/fa/login
# Website http://SERVER:3010/fa
-# Finder http://SERVER:3103/fa
+# Koja http://SERVER:3103/fa
# API http://SERVER:5080/swagger
services:
@@ -141,18 +141,18 @@ services:
ports:
- "${WEBSITE_PORT:-3010}:3000"
- finder:
+ koja:
build:
context: .
- dockerfile: docker/finder/Dockerfile
+ dockerfile: docker/koja/Dockerfile
extra_hosts:
- "mirror:host-gateway"
args:
NODE_IMAGE: ${NODE_IMAGE:-docker-mirror.liara.ir/library/node:20-alpine}
NPM_REGISTRY: ${NPM_REGISTRY:-https://package-mirror.liara.ir/repository/npm/}
NEXT_PUBLIC_API_URL: ${NEXT_PUBLIC_API_URL:-http://localhost:5080}
- NEXT_PUBLIC_SITE_URL: ${NEXT_PUBLIC_FINDER_URL:-http://localhost:3103}
- container_name: meezi-finder
+ NEXT_PUBLIC_SITE_URL: ${NEXT_PUBLIC_KOJA_URL:-http://localhost:3103}
+ container_name: meezi-koja
restart: unless-stopped
depends_on:
api:
@@ -161,9 +161,9 @@ services:
PORT: "3000"
HOSTNAME: 0.0.0.0
NEXT_PUBLIC_API_URL: "${NEXT_PUBLIC_API_URL:-http://localhost:5080}"
- NEXT_PUBLIC_SITE_URL: "${NEXT_PUBLIC_FINDER_URL:-http://localhost:3103}"
+ NEXT_PUBLIC_SITE_URL: "${NEXT_PUBLIC_KOJA_URL:-http://localhost:3103}"
ports:
- - "${FINDER_PORT:-3103}:3000"
+ - "${KOJA_PORT:-3103}:3000"
volumes:
postgres_data:
diff --git a/docker/finder/Dockerfile b/docker/koja/Dockerfile
similarity index 90%
rename from docker/finder/Dockerfile
rename to docker/koja/Dockerfile
index bf927f1..2d21d64 100644
--- a/docker/finder/Dockerfile
+++ b/docker/koja/Dockerfile
@@ -2,7 +2,7 @@ ARG NODE_IMAGE=docker-mirror.liara.ir/library/node:20-alpine
FROM ${NODE_IMAGE} AS deps
WORKDIR /app
-COPY web/finder/package*.json ./
+COPY web/koja/package*.json ./
ARG NPM_REGISTRY=https://package-mirror.liara.ir/repository/npm/
RUN npm install --legacy-peer-deps --ignore-scripts --registry ${NPM_REGISTRY}
@@ -10,13 +10,13 @@ FROM ${NODE_IMAGE} AS builder
WORKDIR /app
ARG NEXT_PUBLIC_API_URL=http://localhost:5080
-ARG NEXT_PUBLIC_SITE_URL=https://find.meezi.ir
+ARG NEXT_PUBLIC_SITE_URL=https://koja.meezi.ir
ENV NEXT_PUBLIC_API_URL=$NEXT_PUBLIC_API_URL
ENV NEXT_PUBLIC_SITE_URL=$NEXT_PUBLIC_SITE_URL
ENV NEXT_TELEMETRY_DISABLED=1
COPY --from=deps /app/node_modules ./node_modules
-COPY web/finder/ .
+COPY web/koja/ .
RUN npm run build
FROM ${NODE_IMAGE} AS runner
diff --git a/web/finder/next.config.ts b/web/koja/next.config.ts
similarity index 100%
rename from web/finder/next.config.ts
rename to web/koja/next.config.ts
diff --git a/web/finder/package-lock.json b/web/koja/package-lock.json
similarity index 99%
rename from web/finder/package-lock.json
rename to web/koja/package-lock.json
index 47ff23f..617368e 100644
--- a/web/finder/package-lock.json
+++ b/web/koja/package-lock.json
@@ -1,11 +1,11 @@
{
- "name": "meezi-finder",
+ "name": "koja",
"version": "0.1.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
- "name": "meezi-finder",
+ "name": "koja",
"version": "0.1.0",
"dependencies": {
"@ducanh2912/next-pwa": "^10.2.9",
diff --git a/web/finder/package.json b/web/koja/package.json
similarity index 72%
rename from web/finder/package.json
rename to web/koja/package.json
index 7872b05..ef904a1 100644
--- a/web/finder/package.json
+++ b/web/koja/package.json
@@ -1,14 +1,20 @@
{
- "name": "meezi-finder",
+ "name": "koja",
"version": "0.1.0",
"private": true,
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start",
- "lint": "next lint"
+ "lint": "next lint",
+ "cap:sync": "cap sync android",
+ "cap:open": "cap open android"
},
"dependencies": {
+ "@capacitor/android": "^6.2.0",
+ "@capacitor/core": "^6.2.0",
+ "@capacitor/splash-screen": "^6.0.3",
+ "cordova-plugin-pushe": "^2.5.0",
"next": "16.2.6",
"react": "19.2.6",
"react-dom": "19.2.6",
@@ -22,6 +28,7 @@
"date-fns-jalali": "^3.4.0-0"
},
"devDependencies": {
+ "@capacitor/cli": "^6.2.0",
"typescript": "5.8.3",
"@types/node": "^22",
"@types/react": "19.1.4",
diff --git a/web/finder/postcss.config.js b/web/koja/postcss.config.js
similarity index 100%
rename from web/finder/postcss.config.js
rename to web/koja/postcss.config.js
diff --git a/web/finder/public/icons/icon-192.png b/web/koja/public/icons/icon-192.png
similarity index 100%
rename from web/finder/public/icons/icon-192.png
rename to web/koja/public/icons/icon-192.png
diff --git a/web/finder/public/icons/icon-512.png b/web/koja/public/icons/icon-512.png
similarity index 100%
rename from web/finder/public/icons/icon-512.png
rename to web/koja/public/icons/icon-512.png
diff --git a/web/finder/public/icons/icon-maskable-512.png b/web/koja/public/icons/icon-maskable-512.png
similarity index 100%
rename from web/finder/public/icons/icon-maskable-512.png
rename to web/koja/public/icons/icon-maskable-512.png
diff --git a/web/finder/src/app/[locale]/cafe/[slug]/page.tsx b/web/koja/src/app/[locale]/cafe/[slug]/page.tsx
similarity index 100%
rename from web/finder/src/app/[locale]/cafe/[slug]/page.tsx
rename to web/koja/src/app/[locale]/cafe/[slug]/page.tsx
diff --git a/web/finder/src/app/[locale]/city/[city]/page.tsx b/web/koja/src/app/[locale]/city/[city]/page.tsx
similarity index 100%
rename from web/finder/src/app/[locale]/city/[city]/page.tsx
rename to web/koja/src/app/[locale]/city/[city]/page.tsx
diff --git a/web/finder/src/app/[locale]/layout.tsx b/web/koja/src/app/[locale]/layout.tsx
similarity index 100%
rename from web/finder/src/app/[locale]/layout.tsx
rename to web/koja/src/app/[locale]/layout.tsx
diff --git a/web/finder/src/app/[locale]/page.tsx b/web/koja/src/app/[locale]/page.tsx
similarity index 100%
rename from web/finder/src/app/[locale]/page.tsx
rename to web/koja/src/app/[locale]/page.tsx
diff --git a/web/finder/src/app/[locale]/search/page.tsx b/web/koja/src/app/[locale]/search/page.tsx
similarity index 100%
rename from web/finder/src/app/[locale]/search/page.tsx
rename to web/koja/src/app/[locale]/search/page.tsx
diff --git a/web/finder/src/app/globals.css b/web/koja/src/app/globals.css
similarity index 100%
rename from web/finder/src/app/globals.css
rename to web/koja/src/app/globals.css
diff --git a/web/finder/src/app/layout.tsx b/web/koja/src/app/layout.tsx
similarity index 100%
rename from web/finder/src/app/layout.tsx
rename to web/koja/src/app/layout.tsx
diff --git a/web/finder/src/app/manifest.ts b/web/koja/src/app/manifest.ts
similarity index 74%
rename from web/finder/src/app/manifest.ts
rename to web/koja/src/app/manifest.ts
index 7148796..6722e71 100644
--- a/web/finder/src/app/manifest.ts
+++ b/web/koja/src/app/manifest.ts
@@ -2,8 +2,9 @@ import type { MetadataRoute } from "next";
export default function manifest(): MetadataRoute.Manifest {
return {
- name: "میزییاب — جستجوی کافه و رستوران",
- short_name: "میزییاب",
+ id: "/fa",
+ name: "کجا — جستجوی کافه و رستوران",
+ short_name: "کجا",
description: "بهترین کافهها و رستورانهای ایران را با هوش مصنوعی پیدا کنید",
start_url: "/fa",
display: "standalone",
@@ -33,6 +34,14 @@ export default function manifest(): MetadataRoute.Manifest {
purpose: "maskable",
},
],
+ shortcuts: [
+ {
+ name: "جستجوی کافه",
+ short_name: "جستجو",
+ url: "/fa/search",
+ icons: [{ src: "/icons/icon-192.png", sizes: "192x192" }],
+ },
+ ],
screenshots: [],
};
}
diff --git a/web/finder/src/app/offline/page.tsx b/web/koja/src/app/offline/page.tsx
similarity index 100%
rename from web/finder/src/app/offline/page.tsx
rename to web/koja/src/app/offline/page.tsx
diff --git a/web/finder/src/app/page.tsx b/web/koja/src/app/page.tsx
similarity index 100%
rename from web/finder/src/app/page.tsx
rename to web/koja/src/app/page.tsx
diff --git a/web/finder/src/app/robots.ts b/web/koja/src/app/robots.ts
similarity index 100%
rename from web/finder/src/app/robots.ts
rename to web/koja/src/app/robots.ts
diff --git a/web/finder/src/app/sitemap.ts b/web/koja/src/app/sitemap.ts
similarity index 100%
rename from web/finder/src/app/sitemap.ts
rename to web/koja/src/app/sitemap.ts
diff --git a/web/finder/src/components/cafe/cafe-card.tsx b/web/koja/src/components/cafe/cafe-card.tsx
similarity index 100%
rename from web/finder/src/components/cafe/cafe-card.tsx
rename to web/koja/src/components/cafe/cafe-card.tsx
diff --git a/web/finder/src/components/layout/footer.tsx b/web/koja/src/components/layout/footer.tsx
similarity index 97%
rename from web/finder/src/components/layout/footer.tsx
rename to web/koja/src/components/layout/footer.tsx
index 70b22e9..8e6e1ad 100644
--- a/web/finder/src/components/layout/footer.tsx
+++ b/web/koja/src/components/layout/footer.tsx
@@ -16,7 +16,7 @@ export function Footer() {
{t("tagline")}
diff --git a/web/finder/src/components/layout/navbar.tsx b/web/koja/src/components/layout/navbar.tsx similarity index 98% rename from web/finder/src/components/layout/navbar.tsx rename to web/koja/src/components/layout/navbar.tsx index e550e24..cb458fc 100644 --- a/web/finder/src/components/layout/navbar.tsx +++ b/web/koja/src/components/layout/navbar.tsx @@ -30,7 +30,7 @@ export function Navbar() {