Lalabase
Tickets, Doku, Zeiterfassung und Kundengespräche an einem Ort, durchsuchbar per KI. Für Softwarefirmen mit Kundenprojekten. Open Source: auf deinem eigenen Server oder in unserer Cloud in Deutschland.
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Weather-aware truck routing: 3 TomTom truck routes, forecast risk at each checkpoint's ETA, recommendation, and a 0-48 h corridor weather heatmap (React + Django)
翻譯準備中
取自儲存庫 README
正在載入完整 README。 以下為已儲存的摘錄。
A React + Django app that helps a truck driver pick the safest route. It generates three truck routes, samples the forecast at each checkpoint for the time the truck will actually be there, classifies risk with the assessment's wind/rain/snow and load rules, and recommends a route, balancing weather risk against travel time.檢視完整 README ↗A React + Django app that helps a truck driver pick the safest route. It generates three truck routes, samples the forecast at each checkpoint for the time the truck will actually be there, classifies risk with the assessment's wind/rain/snow and load rules, and recommends a route, balancing weather risk against travel time.
/trip/:id link.All of this lives in backend/domain/, plain Python with no Django dependency, covered by table-driven tests.
| Condition | Low | Moderate | High | Severe | No Travel |
|---|---|---|---|---|---|
| Wind (mph) | < 25 | 25 – <35 | 35 – <45 | 45 – <55 | ≥ 55 |
| Rain (in/hr) | < 0.10 | 0.10 – <0.25 | 0.25 – <0.50 | 0.50 – 1.00 | > 1.00 |
| Snow (in/hr) | < 0.5 | 0.5 – <1.0 | 1.0 – <2.0 | 2.0 – 3.0 | > 3.0 |
rain + showers. precipitation is not used because it also counts snow as water equivalent.snowfall, which is snow depth per hour.progress array), so mileage matches the route summary.rain, showers, snowfall and gusts describe the preceding hour. For an ETA t the app therefore uses the hour ending at or after t. Only sustained wind (an instantaneous value) is interpolated.zoneinfo, which handles DST. ETAs are shown in each checkpoint's local time zone.Routes are ranked by these criteria, in order:
flowchart LR
UI[React + MapLibre + deck.gl] -- POST /api/plans --> API[Django REST API]
API --> R[TomTom Routing: truck, 3 alternatives]
API --> W[Open-Meteo: hourly forecast]
API --> D[(Postgres: plans + cache)]
UI -- GET /api/plans/:id/heatmap --> API
backend/
domain/ pure logic: risk, sampling, route profile, HOS, weather alignment, scoring, lattice, geo
trips/
services/ routing (TomTom), geocode, weather (Open-Meteo), planner, heatmap
models.py TripPlan, RouteOption (immutable snapshots for shareable links)
views.py /api/geocode, /api/plans, /api/plans/:id, /api/plans/:id/heatmap
tests/ domain tables + planner/API tests against mocked providers
frontend/
src/map/ MapView: MapLibre basemap + interleaved deck.gl layers
src/components/ form, route cards, comparison table, forecast dock (slider/legend)
src/lib/ risk colors, timeline (truck position, risk runs), heatmap frames
Weather lattice.
Heatmap. The corridor forecast is a grid, so it is drawn as an image rather than a point-density heatmap.
BitmapLayer shows the image, interleaved beneath the map labels.| Method | Path | Description |
|---|---|---|
| GET | /api/geocode?q= | US place search (TomTom typeahead), returns label, lat/lon, time zone |
| POST | /api/plans | Create a plan (see below) → full plan with routes and checkpoints |
| GET | /api/plans/:id | A saved plan |
| GET | /api/plans/:id/heatmap | Corridor grid, 49 hourly frames × {risk, wind, gust, rain, snow}; complete is false if some cells failed |
| GET | /api/health | Liveness check (used by Railway) |
POST /api/plans
{
"origin": {"label": "Chicago, IL", "lat": 41.8781, "lon": -87.6298},
"destination": {"label": "Denver, CO", "lat": 39.7392, "lon": -104.9903},
"departure_local": "2026-10-11T08:00",
"load_lb": 42000,
"interval_mi": 25,
"wind_mode": "sustained",
"hos": true
}
Requirements: Python 3.12+ with uv, Node 22+ with pnpm, and a TomTom API key (free tier). Open-Meteo needs no key.
Backend:
cd backend
cp .env.example .env
uv sync
uv run python manage.py migrate
uv run python manage.py createcachetable
uv run python manage.py runserver
Put your key in TOMTOM_API_KEY in backend/.env.
Frontend (in another terminal; it proxies /api to 127.0.0.1:8000):
cd frontend
pnpm install
pnpm dev
Tests:
cd backend
uv run pytest
uv run ruff check .
cd frontend
pnpm test
pnpm typecheck
pnpm lint
Backend on Railway (a service from this repo, plus a Postgres database). Railway no longer reads railway.json for new services, so these are set in the service settings:
/backend, builder Railpack (it detects uv.lock and Python 3.13 from .python-version). Watch path /backend/**.python manage.py migrate --noinput && python manage.py createcachetablepython manage.py collectstatic --noinput && gunicorn config.wsgi --bind 0.0.0.0:$PORT --workers 1 --threads 4 --timeout 120 --access-logfile -/api/health.SECRET_KEYDEBUG=0TOMTOM_API_KEYCORS_ALLOWED_ORIGINS: the Vercel URL. Add CORS_ALLOWED_ORIGIN_REGEXES if Vercel preview URLs should work too.DATABASE_URL=${{Postgres.DATABASE_URL}}: a reference variable. The backend refuses to start without it when DEBUG=0.ALLOWED_HOSTS automatically includes Railway's public domain and its healthcheck host. Add any custom domain yourself.THROTTLE_PLANS (default 60/hour per client), THROTTLE_GEOCODE, LOG_LEVEL, OPEN_METEO_API_KEY.Frontend on Vercel (root: frontend/):
VITE_API_BASE_URL to the Railway URL.vercel.json rewrites all paths to the SPA so /trip/:id links load.OPEN_METEO_API_KEY switches to the commercial endpoint.