Skip to content

Milestones

List view

  • Jobs, verified company pages and recruiter tooling. Work order: #928 status visibility + salary expectation → #929 company pages → #930 roles/domains/aliases/admin → #931 work-experience linking → #932 job postings → #933 /jobs board → #934 admin + anti-abuse → #935 saved-search alerts → #936 API + docs. Two-way exclusion follow-ups (after #929): #938 member hides job-search info from an employer; #939 poster hides an offer from staff/competitors. Each issue is self-contained and lands whole (docs + smoke test included). Cross-cutting principles: every new field, toggle and cadence gets a harmless default (private/quiet unless the member opts up); locations are structured (zip, city, ISO country; offline Vutuv.Geo radius matching; remote postings state applicant countries); every posting states its pay range before publish; tags are the matching fabric between postings and profiles. ── SHARED BUILDING BLOCKS (build ONCE, generically, in the introducing issue; later issues plug in the new entity — never re-implement per entity) ── • Engagement (like + bookmark): one shared action-bar LiveComponent + Engagement context. Each new likeable/bookmarkable entity adds `<entity>_likes` + `<entity>_bookmarks` (unique {entity_id, user_id}), a public like count via compact_count live over PubSub, private bookmarks in the /bookmarks hub, both cascading on delete and wired into the Accounts.delete_user/1 chokepoint. Introduced #929 (companies); reused #932 (postings). • Machine-visibility toggle pair seo?/geo? (same semantics as member noindex?/noai?): seo?=false → noindex, no JSON-LD, out of sitemap + search-engine ping; geo?=false → the .md/.txt/.json/.xml siblings 404, out of /llms.txt and agent-format listings. On companies (#929) and postings (#932). • Human visibility everyone/members (postings only, #932; default everyone): members = signed-in members only, forced out of the public board / JSON-LD / sitemap / agent formats regardless of seo?/geo?. The board (#933) must honor it. It is the base the exclusion seam subtracts from. • Agent-format siblings: every public page gets a .md/.txt/.json/.xml doc builder under VutuvWeb.AgentDocs + a drift-test case (the site-wide rule). New builders: CompanyDoc (#929), JobPostingDoc + board + tag-page "Offene Stellen" section (#932/#933), profile additions (#931). • Structured location: ISO 3166-1 alpha-2 via the shared Vutuv.Countries helper; offline zip/city → coordinates + radius via Vutuv.Geo (:geo_countries config, no outbound calls, intranet-safe). Introduced #929/#932; reused #933 (radius filter), #935 (radius alerts), #936 (payloads). • Salary model: whole-unit INTEGER (matches #928 as shipped — NOT decimal), currencies EUR/USD/GBP/CHF, periods hour/day/week/month/year; cross-period comparison normalises to a yearly equivalent with fixed documented factors and NEVER converts currencies (different currency = no match). Member expectation #928, posting range #932, board filter #933, alerts #935. • Moderation: the existing report → freeze → case machinery + strike ladder, extended with content types company (#929/#930) and job_posting (#932/#934). Freeze hides from the public, keeps owner + admins, alarms the admin queue; the ladder ends in account deactivation. • Admin-dashboard scaffold: admin-shell LiveView (live_session :admin, German UI) with compact_count/delimited_count tiles, a paginated searchable list, status filter chips, a per-row detail drawer, PubSub live updates, and freeze/unfreeze/archive/delete actions. /admin/companies (#930) and /admin/jobs (#934) share it. • Rich text + images: the posts Milkdown editor + renderer + CommonMark profile, and the post_images storage/serving pattern (token/version layout, send_file, purged with the parent). Company descriptions + company_images (#929); posting descriptions + job_posting_images (#932). • Viewer-exclusion seam: one excluded?(subject, viewer) predicate — viewer is a listed member, belongs to a listed company (its verified domains + role-holders + members whose current work experience is linked to it, #931), has a confirmed email at a listed domain OR any subdomain of it, or is blocked by the subject's owner. Subject = a member's job-search fields (#938) or a posting (#939, effective set = own list ∪ owning company's default). Silent by design + visibility-only. Domain match needs no public-suffix list (host suffix). • New public listing crawl path: each new listing (/companies, /jobs) adds a shared-footer link + plain <a href> pagination so it is link-walk crawlable, with the sitemap as the second channel.

    No due date
    8/12 issues closed
  • No due date
    9/9 issues closed
  • No due date
    6/6 issues closed
  • Overdue by 9 year(s)
    Due by January 31, 2017
    30/30 issues closed
  • Overdue by 8 year(s)
    Due by February 28, 2018
    22/22 issues closed
  • Overdue by 9 year(s)
    Due by March 31, 2017
    62/62 issues closed