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,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
Search the free, no-auth stapply.ai / ats-scrapers
job dataset (~5M live jobs, 65 ATS sources) for engineering roles, and produce a
browsable HTML page you can skim each morning.
job_search.py streams the hosted Parquet snapshot with pyarrow (title filter
pushed down, the huge description/raw columns skipped, so it runs in ~1 GB
RAM). For each profile (a named set of title keywords) it produces two lists:檢視完整 README ↗Search the free, no-auth stapply.ai / ats-scrapers job dataset (~5M live jobs, 65 ATS sources) for engineering roles, and produce a browsable HTML page you can skim each morning.
job_search.py streams the hosted Parquet snapshot with pyarrow (title filter
pushed down, the huge description/raw columns skipped, so it runs in ~1 GB
RAM). For each profile (a named set of title keywords) it produces two lists:
remote / hybrid / onsite / unknown
from the free-form location + commitment text and the dataset's is_remote flag.country_iso == DE, or the location text
names Germany or a German city).| profile | title keywords |
|---|---|
engineer | engineer, tech lead |
product | product manager, product management, product owner |
Edit PROFILES in job_search.py to add or tune them. --profiles engineer product
(default runs both); --keywords <words…> overrides with an ad-hoc custom profile.
The snapshot is scanned once for all selected profiles' keywords combined, then
partitioned per profile. Each profile gets its own section (with its own tables)
in the HTML.
By default both lists drop roles whose location also names another country,
a multi-country region (Europe/EMEA/DACH/…), or a well-known foreign city –
only Germany-only locations are kept. Multi-city German locations (e.g.
"Hamburg, Berlin, München") are fine. Pass --allow-multi-country to disable.
Outputs to results/:
| file | what |
|---|---|
jobs_<date>.csv | flat table of every match (has a profile column) |
jobs_<date>.html | one section per profile; clickable job + apply links, text filter, sortable columns, remote/hybrid/onsite toggle |
latest.html | copy of today's page |
A GitHub Actions workflow (.github/workflows/daily.yml) runs the search every
day at 15:00 UTC (17:00 Berlin) and deploys the result to GitHub Pages:
https://rgripper.github.io/job-search/
15:00 UTC is deliberate: the stapply snapshot publishes at 14:30 UTC, so each run
picks up that day's data. Trigger it by hand from the Actions tab
(Run workflow) or with gh workflow run "Daily job search".
The published site holds the current run's index.html (same as latest.html),
the dated jobs_<date>.html, and the jobs_<date>.csv (linked from the page
header). It is replaced on each deploy - there is no archive of past days.
GitHub disables scheduled workflows on repos with no activity for 60 days; push a commit or re-enable it in the Actions tab if that happens.
./daily.sh # engineer + product profiles, Berlin + DE-remote, posted in the last 7 days, opens latest.html
daily.sh uses --max-age-days 7 --require-date, so it only shows roles with a
real posting date inside the last 7 days (a small, sharp list — typically a few
dozen). Remove --require-date from the script for a much larger list that also
keeps roles with no posting date.
Or via cron:
0 8 * * * cd /home/vladimir/github/job-search && ./daily.sh >> daily.log 2>&1
uv run job_search.py # engineer + product profiles, full snapshot
uv run job_search.py --profiles product # just the product profile
uv run job_search.py --keywords "data scientist" "ml engineer" # ad-hoc custom profile
uv run job_search.py --city Munich --country DE
uv run job_search.py --berlin-workplace remote hybrid # Berlin: drop onsite-only
uv run job_search.py --include-eu-remote # also Europe/EMEA-wide remote roles
uv run job_search.py --allow-multi-country # keep roles that also list another country
uv run job_search.py --max-age-days 30 # last 30 days; keeps undated roles
uv run job_search.py --max-age-days 5 --require-date # last 5 days, and must have a real posted_at
uv run job_search.py --sources greenhouse lever ashby # scan only these ATS slices (smaller download)
uv run job_search.py --refresh # re-download the snapshot
uv run job_search.py --open # open the HTML page when done
generated_at timestamp. For a specific company's freshest postings, use the
ats_scrapers per-company scrapers directly.posted_at is sparse – only a minority of sources publish it. --max-age-days
keeps undated roles by default; add --require-date to drop them.hybrid is inferred from text and
undercounts. Many Berlin roles tagged onsite here are hybrid in practice.country_iso is null for many sources; Germany attribution falls back to a
city-name list in job_search.py (GERMAN_CITIES), extend it as needed.all.parquet (~2.3 GB) to .cache/ and verifies its
SHA-256 against the manifest. Subsequent runs reuse it (~5 s scan).