Lalabase
티켓·문서·근무시간·고객대화를 한 곳에 모아 KI로 검색, 소프트웨어 기업 고객 프로젝트용, 오픈소스로 자체 서버·독일 클라우드에 배포
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기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.