深入解读 Sendwave 公司档案:Remote In Tech 远程友好公司目录中的数据建模与解析实践
深入解读 Sendwave 公司档案:Remote In Tech 远程友好公司目录中的数据建模与解析实践
Sendwave 是一份典型的"远程友好公司"档案,由仓库中的 src/companies/sendwave.md 一份 Markdown 文件承载。本文以该档案为骨架,逐层拆解其 frontmatter 字段、正文章节语义,并结合 collections.js、company.njk、labels.js 等源码,说明一份档案从编写到渲染、再到被目录与标签页消费的完整链路。读完本文,你将掌握 Remote In Tech(remoteintech.company 的源码仓库)中公司档案的标准结构、字段枚举约束、自动元描述生成机制与维护巡检流程,能够独立读懂或贡献任何一家公司的档案。
一、档案文件概览:一个 Markdown 文件如何承载一家公司
在 Remote In Tech 仓库中,每一家公司都对应 src/companies/ 下的一个独立 Markdown 文件,文件名即 slug(如 sendwave.md)。Sendwave 档案的顶层结构分为两部分:
- YAML frontmatter:以
---包裹的结构化元数据,用于站点排序、分组、打标签与 SEO; - Markdown 正文:以
##开头的若干章节,用于向读者呈现公司详情。
这种"元数据 + 正文"双轨结构是整个目录的数据基础。站点构建时,collections.js 通过 collection.getFilteredByGlob('./src/companies/**/*.md') 一次性读取全部档案(见 collections.js),再按不同维度切分集合,供首页、浏览页、标签页复用。也就是说,一份档案只需写一次,就会被站点在多处自动引用。
二、Frontmatter 元数据:字段语义与枚举约束
Sendwave 档案的 frontmatter 原文如下:
---
title: "Sendwave (International Remittance)"
slug: sendwave-international-remittance
website: https://www.sendwave.com/
region: worldwide
remote_policy: fully-remote
company_size: large
technologies:
- go
- javascript
- mobile
addedAt: 2022-10-08
updatedAt: 2022-10-08
---
各字段的含义与 Sendwave 的实际取值如下:
| 字段 | Sendwave 取值 | 语义 |
|---|---|---|
title |
Sendwave (International Remittance) | 公司展示名,同时用于字母排序与页面 <h1>(company.njk) |
slug |
sendwave-international-remittance | 唯一标识,必须与文件名一致(sendwave.md → sendwave-international-remittance),详见 CONTRIBUTING.md |
website |
https://www.sendwave.com/ | 公司官网,作为"Visit Website"按钮的跳转目标(company.njk) |
region |
worldwide | 招聘地域,渲染为 /browse/worldwide/ 的地域标签 |
remote_policy |
fully-remote | 远程政策,渲染为 /browse/fully-remote/ 的政策标签 |
company_size |
large | 公司规模区间 |
technologies |
go, javascript, mobile | 技术栈列表,每个技术渲染为 /browse/{tech}/ 的技术标签 |
addedAt / updatedAt |
2022-10-08 | 录入/更新时间,用于"最近新增"排序与页脚"Last updated"展示 |
其中 region、remote_policy、company_size、technologies 都是受控枚举,合法取值统一维护在 labels.js 这个单一事实源(single source of truth)中。Sendwave 的取值含义如下:
region: worldwide对应标签 "Worldwide";其他可选值包括americas、europe、americas-europe、asia-pacific、other(labels.js);remote_policy: fully-remote对应 "Fully Remote";另有三档remote-first、hybrid、remote-friendly(labels.js);company_size: large对应 "201-1000 employees" 区间;完整区间为tiny(1-10)、small(11-50)、medium(51-200)、large(201-1000)、enterprise(1000+)(labels.js);technologies中的go、javascript、mobile分别对应 "Go"、"JavaScript"、"Mobile" 标签,目录目前支持共 25 个技术枚举值(labels.js)。
这些标签映射会通过 companyHelpers.js 重新导出,被 collections.js 等 JS 消费者与 Nunjucks 模板(全局数据级联中的 labels.*)共同使用,保证站点各处显示口径一致。
三、正文章节:从 Company blurb 到 How to apply
Sendwave 档案的正文由七个 ## 章节构成,其中四个是 CONTRIBUTING.md 规定的必填章节(Company blurb、Remote status、How to apply),其余为常用可选章节。
3.1 Company blurb(必填)
Over 800,000 people trust Sendwave. In just a few short years, Sendwave has gone from a simple idea to becoming one of the world's leading money senders to Africa. Sendwave's mission is to make sending money as easy and affordable as sending a text. Our app sends transfers securely from North America and Europe to Africa, Asia and the Americas with great rates.
该章节是公司的核心定位描述,除了呈现在页面上,还承担一项重要职责:作为页面 meta description 的自动生成来源。companies.11tydata.js 通过正则 /##\s*Company\s*blurb\s*\n+(<a href="https://link.gitcode.com/i/b9e385f5490fe93d26396e6954e2770f" target="_blank">\s\S]*?)(?=\n##|$)/i 提取 blurb 内容,剥离 Markdown 链接语法、* _ `` 字符并压缩空白([companies.11tydata.js),再按句号边界截断至约 155 字符生成描述(companies.11tydata.js)。因此,blurb 的写作质量直接影响页面在搜索引擎中的摘要表现。
3.2 Company size(可选)
387 employees on LinkedIn
记录公司规模的外部佐证。frontmatter 的 company_size: large 提供机器可读的区间标签,此处则提供具体数字供人工核验。
3.3 Remote status(必填)
Because we work in a 100% remote environment, we happily hire people from all over the world who share our mission of making sending money as easy as sending a text.
该章节说明公司真实的远程工作形态,与 frontmatter 的 remote_policy: fully-remote 互相印证——机器读取枚举值用于筛选,正文则为求职者提供上下文。
3.4 Region / Company technologies / Office locations(可选)
Region: Worldwide与 frontmatterregion: worldwide呼应;Company technologies引用第三方数据源(G2 Stack 统计的 17 个技术产品/服务,含 HTML5、Google Analytics、jQuery;BuiltWith 统计的 25 个网站技术,含 Viewport Meta、IPhone / Mobile Compatible、Google Font API),与 frontmatter 中编辑者手动维护的technologies枚举互补——前者是市场情报,后者是站点检索依据;Office locations: Boston, Massachusetts, United States记录实体办公地点,即便是 fully-remote 公司也可保留法务/注册地信息。
3.5 How to apply(必填)
## How to apply
[Click here to apply](https://www.sendwave.com/careers)
必须提供官网招聘页或申请指引。CONTRIBUTING.md 明确要求 careers_url(若填写)必须指向公司自己的招聘页面。Sendwave 档案未设 careers_url 字段,因此 company.njk 会回退使用 website,将主按钮渲染为 "Visit Website →";若后续维护者补充 careers_url,按钮文案将自动变为 "Apply Now →"。
四、数据如何被站点消费:集合、标签与渲染链路
一份档案的价值最终体现在站点多个页面的联动输出上,Sendwave 档案会被以下机制消费:
- 字母排序列表:
getAllCompanies按title做localeCompare排序(collections.js),Sendwave 因首字母 "S" 排在目录中段; - 按地域分组:
getCompaniesByRegion将region: worldwide归入 Worldwide 分组(collections.js); - 按技术分组:
getCompaniesByTech将 Sendwave 同时归入 go、javascript、mobile 三个技术组(collections.js); - 标签聚合:
getCompanyTags读取technologies、region、remote_policy三个维度生成标签数据,并按命中数量倒序排列(collections.js),Sendwave 的fully-remote、worldwide都会进入对应浏览页; - 页面渲染:company.njk 模板将 frontmatter 渲染为标签链接——地域标签指向
/browse/worldwide/,政策标签指向/browse/fully-remote/,每个技术标签指向/browse/{tech}/(company.njk),正文通过{{ content | safe }}注入,页脚根据updatedAt展示 "Last updated" 日期(company.njk)。
从源码结构看,这种设计让"一份 Markdown 档案"同时驱动列表页、分组页、标签页和详情页,新增公司只需写一个文件,站点索引自动更新。
五、档案的治理与维护:贡献规范与链接巡检
5.1 贡献规范与校验
档案不是随意填写的。贡献者在新增公司前需对照 CONTRIBUTING.md 的前置元数据模板(含 careers_url、region、remote_policy、company_size、technologies 等字段)填写,并满足:
- 必须是半远程到完全远程的科技行业公司;
- 必须直接雇佣员工(不接受中介、自由职业平台、纯佣金销售岗);
- 正文必须包含 Company blurb、Remote status、How to apply 三个必填章节;
addedAt/updatedAt由维护者管理,贡献者 PR 中不应包含(CONTRIBUTING.md)。
涉及公司档案的 PR 会被 Validate Company Profiles 自动化工作流校验,机器人会在 PR 中反馈问题并阻塞合并直至修复(CONTRIBUTING.md)。Sendwave 档案的 addedAt: 2022-10-08 表明其录入于 2022 年 10 月。
5.2 链接腐化巡检管线
档案中的 website 与 How to apply 链接属于外链,长期运行必然面临失效风险。仓库为此在 scripts/README.md 中提供了两段式巡检管线:
./scripts/check-links.sh --refresh # 重新抽取全部公司文件 URL 并扫描
node scripts/fix-links.mjs --reverify --apply # 复验被限流的 URL 并应用安全修复
check-links.sh并发爬取src/companies/*.md中所有出站 URL(约 2200 个链接,全量约 8 分钟),记录 HTTP 状态、重定向终点与原因到 CSV;fix-links.mjs读取结果并按类别处置,其中HTTPS_UPGRADE(http→https 同主机同路径)、CAREERS_DEAD(招聘页跳转到首页/登录页等)、DEAD_DNS(域名不可解析)等类别可自动应用修复或删除档案,而REBRAND、NOT_FOUND、THROTTLED则需要人工复核(scripts/README.md)。
这意味着像 Sendwave 这样的档案,其官网与招聘链接会随着维护周期(约每 6 周一次)被持续验证与修正,避免目录中出现失效外链。
六、从档案到求职线索:如何阅读这份远程公司档案
对求职者而言,Sendwave 这份档案可以快速提炼出以下决策信息:
- 远程程度:
fully-remote+ "100% remote environment" 双重确认,全球范围(worldwide)招聘,无地域限制; - 规模:
large(201-1000 人),LinkedIn 显示 387 名员工,属于成长期中型偏大规模团队; - 业务与技术:面向非洲、亚洲及美洲的国际汇款业务,技术栈以 Go、JavaScript、移动端为主,同时通过 G2 Stack / BuiltWith 记录了约 17 项技术产品与 25 项网站技术;
- 申请入口:官网招聘页 Sendwave careers 继续检索同类 fully-remote 公司。
从贡献者视角,若想将 Sendwave 档案更新(例如补充 careers_url、刷新员工数、增补技术栈),只需遵循 frontmatter 枚举约束与必填章节规范修改 sendwave.md,运行 npm run build(详见 README.md)验证后提交 PR,交由校验机器人把关即可。整份档案既是求职信息载体,也是目录数据模型与治理流程的完整缩影。