diff --git a/config.yaml b/config.yaml
index 79ac383..0f71664 100644
--- a/config.yaml
+++ b/config.yaml
@@ -67,10 +67,6 @@ companies:
platform: greenhouse
board_token: tailscale
- - name: HashiCorp
- platform: greenhouse
- board_token: hashicorp
-
# Developer Tools & Platforms
- name: Automattic
platform: greenhouse
@@ -88,6 +84,71 @@ companies:
platform: greenhouse
board_token: cloudflare
+ - name: Fastly
+ platform: greenhouse
+ board_token: fastly
+
+ # Database & Data Infrastructure
+ - name: Materialize
+ platform: greenhouse
+ board_token: materialize
+
+ - name: PingCAP
+ platform: greenhouse
+ board_token: pingcap
+
+ - name: CockroachLabs
+ platform: greenhouse
+ board_token: cockroachlabs
+
+ - name: TigerData
+ platform: ashby
+ ashby_company: tigerdata
+
+ # Observability & Monitoring
+ - name: Honeycomb
+ platform: greenhouse
+ board_token: honeycomb
+
+ - name: Datadog
+ platform: greenhouse
+ board_token: datadog
+
+ - name: Sentry
+ platform: ashby
+ ashby_company: sentry
+
+ # Cloud & Developer Platforms
+ - name: Render
+ platform: ashby
+ ashby_company: render
+
+ - name: Railway
+ platform: ashby
+ ashby_company: Railway
+
+ - name: Stripe
+ platform: greenhouse
+ board_token: stripe
+
+ - name: JetBrains
+ platform: greenhouse
+ board_token: jetbrains
+
+ # Rust-heavy / Visualization
+ - name: Rerun
+ platform: ashby
+ ashby_company: rerun
+
+ # Big Tech (Selective)
+ - name: Discord
+ platform: greenhouse
+ board_token: discord
+
+ - name: Dropbox
+ platform: greenhouse
+ board_token: dropbox
+
# Notification settings (optional - configure as needed)
notifications:
# Console output is always enabled
diff --git a/dashboard.py b/dashboard.py
index dd4ff1f..dc746a0 100644
--- a/dashboard.py
+++ b/dashboard.py
@@ -3,24 +3,149 @@
Generate a simple text-based HTML dashboard of all tracked jobs.
"""
+import re
from datetime import datetime
from pathlib import Path
from db import Database
+# Regions/locations we care about (case-insensitive matching)
+DESIRED_REGIONS = [
+ "canada", "toronto", "vancouver",
+ "germany", "berlin", "munich",
+ "emea",
+ "americas", # includes North/South America
+ "north america",
+ "worldwide", "global", "anywhere",
+]
+
+# Locations to explicitly exclude (on-site or remote restricted to these)
+EXCLUDED_LOCATIONS = [
+ # US cities/states (we don't want US-only jobs)
+ "san francisco", "new york", "nyc", "seattle", "austin", "boston",
+ "chicago", "denver", "los angeles", "atlanta", "dallas", "houston",
+ "california", "washington", "texas", "massachusetts", "colorado",
+ "united states", "usa", "u.s.", "us-", "usa-",
+ # UK
+ "london", "united kingdom", "uk", "dublin", "ireland",
+ # Australia/APAC (not EMEA)
+ "sydney", "melbourne", "australia", "singapore", "tokyo", "japan",
+ "india", "bangalore", "bengaluru", "hyderabad", "delhi",
+ "korea", "seoul", "taiwan", "taipei", "china", "beijing", "shenzhen",
+ # Other excluded
+ "israel", "tel aviv", "brazil", "sao paulo", "mexico",
+ "netherlands", "amsterdam", "france", "paris", "spain", "madrid",
+ "portugal", "lisbon", "poland", "warsaw", "italy",
+ "czech", "prague", "serbia", "belgrade", "cyprus", "limassol",
+ "austria", "vienna", "sweden", "stockholm", "denmark", "copenhagen",
+ "switzerland", "romania", "bucharest", "hungary", "greece",
+ "south africa", "indonesia", "jakarta", "malaysia",
+]
+
+
+def is_location_relevant(location: str, remote_type: str) -> bool:
+ """
+ Strict location filter. Only keeps jobs available in Canada, Germany, EMEA, or Worldwide.
+ Filters out US-only jobs, UK jobs, APAC jobs, etc.
+ """
+ if not location:
+ return False # No location info = probably US-based, filter out
+
+ loc_lower = location.lower()
+
+ # Check if any desired region is mentioned FIRST
+ has_desired = any(region in loc_lower for region in DESIRED_REGIONS)
+
+ # If it has a desired region, keep it (even if it also mentions excluded locations)
+ # e.g., "Remote (United States | Canada)" should be kept because of Canada
+ if has_desired:
+ return True
+
+ # If it just says "Remote" with nothing else, keep it (truly remote)
+ if loc_lower.strip() == "remote":
+ return True
+
+ # Check for excluded locations
+ has_excluded = any(excl in loc_lower for excl in EXCLUDED_LOCATIONS)
+ if has_excluded:
+ return False
+
+ # Check for patterns like "In-Office", "Hybrid", "On-site" without desired region
+ if any(x in loc_lower for x in ["in-office", "hybrid", "on-site", "onsite", "office based"]):
+ return False
+
+ # If we can't determine, filter it out (safer)
+ return False
+
+
+def extract_location_tags(location: str, remote_type: str) -> tuple[list[str], str]:
+ """
+ Extract relevant location tags and a short display location.
+ Returns (list of tag names, short location string)
+ """
+ if not location:
+ return [], ""
+
+ loc_lower = location.lower()
+ tags = []
+ short_loc = ""
+
+ # Check for remote
+ is_remote = remote_type == "remote" or "remote" in loc_lower
+ if is_remote:
+ tags.append("remote")
+
+ # Check for Canada
+ if any(x in loc_lower for x in ["canada", "toronto", "vancouver"]):
+ tags.append("canada")
+ short_loc = "Canada"
+
+ # Check for Germany/Berlin
+ if any(x in loc_lower for x in ["germany", "berlin", "munich"]):
+ tags.append("germany")
+ short_loc = "Germany" if "germany" in loc_lower else "Berlin"
+
+ # Check for EMEA
+ if "emea" in loc_lower:
+ tags.append("emea")
+ short_loc = "EMEA"
+
+ # Check for Americas/North America
+ if "americas" in loc_lower or "north america" in loc_lower:
+ tags.append("americas")
+ short_loc = "Americas"
+
+ # Check for Worldwide
+ if any(x in loc_lower for x in ["worldwide", "global", "anywhere"]):
+ tags.append("worldwide")
+ short_loc = "Worldwide"
+
+ # If no specific region found but it's remote
+ if not short_loc and is_remote:
+ short_loc = "Remote"
+
+ return tags, short_loc
+
+
def generate_dashboard(output_path: str = "data/dashboard.html"):
"""Generate a static HTML dashboard."""
db = Database()
jobs = db.get_all_active_jobs()
- # Group by company
+ # Group by company, filtering out irrelevant remote locations
companies = {}
+ filtered_count = 0
for company_name, job in jobs:
+ if not is_location_relevant(job.location, job.remote_type):
+ filtered_count += 1
+ continue
if company_name not in companies:
companies[company_name] = []
companies[company_name].append(job)
+ total_shown = sum(len(jobs) for jobs in companies.values())
+
# Sort companies by name
sorted_companies = sorted(companies.items())
@@ -116,14 +241,14 @@ def generate_dashboard(output_path: str = "data/dashboard.html"):
font-size: 12px;
}}
.jobs {{
- margin-left: 20px;
+ margin-left: 0;
}}
.job {{
padding: 6px 0;
border-bottom: 1px solid var(--border);
- display: grid;
- grid-template-columns: 1fr 180px;
- gap: 10px;
+ display: flex;
+ justify-content: space-between;
+ gap: 20px;
align-items: baseline;
}}
.job:last-child {{
@@ -148,6 +273,8 @@ def generate_dashboard(output_path: str = "data/dashboard.html"):
color: var(--muted);
font-size: 12px;
text-align: right;
+ white-space: nowrap;
+ flex-shrink: 0;
}}
.tag {{
display: inline-block;
@@ -168,6 +295,18 @@ def generate_dashboard(output_path: str = "data/dashboard.html"):
background: #4a4a1a;
color: #facc15;
}}
+ .tag-emea {{
+ background: #1a3a4a;
+ color: #60a5fa;
+ }}
+ .tag-americas {{
+ background: #3a1a4a;
+ color: #c084fc;
+ }}
+ .tag-worldwide {{
+ background: #1a4a3a;
+ color: #34d399;
+ }}
.hidden {{
display: none;
}}
@@ -228,7 +367,7 @@ def generate_dashboard(output_path: str = "data/dashboard.html"):
$ job-board
Last updated: {datetime.now().strftime("%Y-%m-%d %H:%M:%S")} |
- {len(jobs)} jobs across {len(companies)} companies
+ {total_shown} jobs across {len(companies)} companies
- {len(jobs)} jobs shown
+ {total_shown} jobs shown
@@ -283,18 +425,27 @@ def generate_dashboard(output_path: str = "data/dashboard.html"):
location = job.location or ""
location_lower = location.lower()
- # Tags
- tags = ""
- if job.remote_type == "remote" or "remote" in location_lower:
- tags += 'remote'
- if "canada" in location_lower or "toronto" in location_lower or "vancouver" in location_lower:
- tags += 'canada'
- if "berlin" in location_lower or "germany" in location_lower:
- tags += 'berlin'
+ # Extract tags and short location
+ tag_list, short_loc = extract_location_tags(location, job.remote_type)
- html += f"""
+ # Build tag HTML
+ tags = ""
+ if "remote" in tag_list:
+ tags += 'remote'
+ if "canada" in tag_list:
+ tags += 'canada'
+ if "germany" in tag_list:
+ tags += 'germany'
+ if "emea" in tag_list:
+ tags += 'emea'
+ if "americas" in tag_list:
+ tags += 'americas'
+ if "worldwide" in tag_list:
+ tags += 'worldwide'
+
+ html += f"""