Skip to content

feat(blog): why am I not getting interviews (EN + ES), with minimal blog i18n - #119

Open
santifer wants to merge 19 commits into
mainfrom
d1-blog-i18n
Open

santifer wants to merge 19 commits into
mainfrom
d1-blog-i18n

Conversation

@santifer

Copy link
Copy Markdown
Member

What

A new post, Why am I not getting interviews?, in English and Spanish, and the small blog infrastructure the Spanish version needs.

  • /blog/why-am-i-not-getting-interviews (EN)
  • /es/blog/why-am-i-not-getting-interviews (ES, same slug)

The post

  • Opens with a self-contained answer (~60 words) and an anchored index.
  • US hiring backdrop from the Cleveland Fed Economic Commentary 2026-17 and the BLS July 2026 JOLTS release. Quoted verbatim, dated, labeled as US-only. In Spanish the quotes stay in English with a translation after them.
  • What the reader controls: evaluate before applying (below 4.0 it recommends against applying), contacto to find one person to write to (it never sends), and the funnel report, follow-ups and patterns (thresholds 20, 5 and three, as in the core).
  • The author's funnel, signed in the first person, framed as one search and not a benchmark.
  • It never promises interviews or replies, and never applies in the reader's name.

Blog i18n (minimal)

  • Same slug under /es/blog, with no /es/blog index while few posts have a Spanish twin.
  • BLOG_ES_TWINS lists the posts with a Spanish twin. The build fails if that list disagrees with the files, if a Spanish post has no English twin, or if a French post appears.
  • Reciprocal hreflang (en / es / x-default) only when a twin exists. Other English posts are unchanged.
  • The Spanish page has inLanguage: es on BlogPosting and FAQPage, Content-Language: es, and LangSync.
  • Sitemap has both entries with alternates. llms.txt lists the English post, and llms-full.txt stays English-only.

Checked locally (production build)

  • npm run build passes.
  • faq-from-mdx --check, verify-agent-layer and verify-schema-parity pass (115 claims on 122 URLs).
  • EN posts return 200. /es/blog and /es/blog/<post without twin> return 404.
  • Every index anchor resolves in both languages.

Depends on

Links to /docs/introduction/guides/is-this-job-worth-applying-to (#117). Merge after #117 so those links are not 404 in production. In this preview they 404.

Not to be merged before the 24 h notice to search-ops has run.

🤖 Generated with Claude Code

https://claude.ai/code/session_01BcPLgMFMs2B4SJv3vfq8jv

santifer and others added 2 commits September 27, 2026 17:14
A post has a Spanish twin iff content/blog/<slug>.es.mdx exists; it is
served at /es/blog/<slug> (no /es/blog index), with reciprocal hreflang
and x-default=EN, its own canonical, and a sitemap entry dated from its
frontmatter. Same loader-only i18n as docs. EN surfaces (index, sitemap,
llms-full) now ask for getPages('en') explicitly. The build fails if a
Spanish post has no English twin, if a French post appears (no route),
or if the language bar's twin list disagrees with the files. The post
render moves into a shared BlogPostView; English output is unchanged.

IndexNow: date-only lastmods (midnight UTC) are compared by day, or a new
post dated from frontmatter would never be announced.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BcPLgMFMs2B4SJv3vfq8jv
A post for people whose applications go unanswered. It opens with a
self-contained answer, gives the US hiring backdrop from a Cleveland Fed
commentary and the BLS July 2026 JOLTS release (quoted, dated, US-only),
and moves to what the reader controls: whether a job deserves an
application, who to write to before applying, and what their own
funnel shows. It never promises interviews or replies.

The Spanish twin is the first post on the minimal blog i18n: same slug
under /es/blog, reciprocal hreflang, inLanguage es, FAQPage mirrored
from the visible FAQ. The essay links stay on the English essay and say
so.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BcPLgMFMs2B4SJv3vfq8jv
@vercel

vercel Bot commented Sep 27, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
career-ops-docs Ready Ready Preview Oct 9, 2026 7:30am UTC

Request Review

@coderabbitai

coderabbitai Bot commented Sep 27, 2026 •

Copy link
Copy Markdown

Warning

Review limit reached

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Next included review available in 12 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used the included review currently available.

Learn how review limits work.

Review configuration:

⚙️ Run configuration
  • Configuration used: Repository: career-ops-hq/career-ops-docs/.coderabbit.yaml
  • Review profile: ASSERTIVE
  • Plan: Advanced
  • Run ID: 9c386dc0-d7bb-4dd8-928e-7722b943a73d
📥 Commits

Reviewing files that changed from the base of the PR and between f217ca5 and db9af31.

📒 Files selected for processing (16)
  • .github/workflows/indexnow.yml
  • content/blog/why-am-i-not-getting-interviews.es.mdx
  • content/blog/why-am-i-not-getting-interviews.mdx
  • source.config.ts
  • src/app/(en)/blog/[slug]/page.tsx
  • src/app/(en)/blog/page.tsx
  • src/app/es/blog/[slug]/page.tsx
  • src/app/es/blog/layout.tsx
  • src/app/llms-full.txt/route.ts
  • src/app/sitemap.ts
  • src/components/blog-post-view.tsx
  • src/components/language-bar.tsx
  • src/lib/blog-source.ts
  • src/lib/blog-twins.ts
  • src/lib/llms-index.ts
  • src/lib/schema.ts
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

santifer and others added 13 commits October 1, 2026 09:40
…llow it

On /de (and /es, /fr) the ⌘K dialog searched the English index. /api/search
already keeps one Orama index per language, with that language's tokenizer:
/api/search?query=bewerbung&locale=de returns 100 German hits, the same query
without locale returns 0. But the dialog takes the locale from Fumadocs'
I18nProvider, and the shared root layout never mounted one, so it sent none
and the server fell back to English.

LocaleRootProvider reads the locale from the path, the same way
FooterLocaleLink and the AI search do, and passes it to RootProvider together
with the ten Fumadocs UI labels for es, fr and de (search placeholder, "On this
page", previous/next page...). It passes no `locales` list on purpose: with
more than one, Fumadocs layouts render their own language picker next to ours.

English is unchanged: locale=en, default labels. No date source is touched
(neither file feeds git-date or home-date), so no lastmod moves.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ared home modules into _home (renames only)

Pure renames, no content change, so every moved file keeps its git history
and, with git-date's --follow --diff-filter=r, its lastmod. Edits come in the
following commits.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e server HTML; one home dictionary per language

<html lang> was "en" on every page: the single root layout hardcoded it, and
a script corrected it in the browser, which crawlers that read raw HTML never
see (search-ops D1). Each locale now has its own root layout ((en)/, es/, fr/,
de/), all rendering the same RootShell (providers, footer, analytics) with
their own lang, the content-language meta on translated pages, and a static
locale for the ⌘K search. LangSync and the inline script are gone. Unmatched
URLs get global-not-found.tsx (experimental.globalNotFound), which keeps the
404 the site had: Next's message inside the English shell, noindex. Switching
language is now a full page load, the cost of separate root layouts.

The home dictionary is split: home-dict.tsx keeps the type and helpers, and
each language has its own home-<locale>.tsx. A home's lastmod now depends on
its route, the shared trunk and its own dictionary, so editing the French
home stops moving the English one.

Dates: the English routes moved into (en) in the previous commit as pure
renames, and git-date now runs git log with --follow --diff-filter=r, so a
moved page keeps its last real change as lastmod. The sitemap paths and
home-date follow the new locations.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
With one root layout per locale the server HTML carries the right <html lang>
on every page, so a wrong one is a regression. Agreed with search-ops when the
guard landed (#142): flip it in the same PR as the root layouts.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…locale

# Conflicts:
#	src/components/locale-root-provider.tsx
#	src/components/root-shell.tsx
Moving the home under (en)/ changes the file name Next derives for its
opengraph image (same bytes, new path hash), so the old URL would 404 for
cards cached by social networks and for saved links.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…king after the move into (en)

An adversarial review of this branch reproduced three regressions:

- Every signatory's wide card moved from /manifesto/s/<user>/opengraph-image to
  ...-1xn4ck (Next hashes generated image routes inside a route group). The
  example card on /manifesto and /es/manifesto, the "Download your card: wide"
  link and every card already shared on social sites would 404. A 308 keeps
  the stable path working, and the i18n guard now fails if either old card
  URL stops ending in an image (stable-image, with its selftest sabotage).
- git-date skipped any rename commit, including R<100 ones. PRs land
  squashed, so a move and an edit share one commit and the edit never reached
  the lastmod. -M100% makes only exact renames count as moves.
- .coderabbit.yaml still pointed its homepage rules at src/app/(home)/, which
  no longer exists, so its "visual change needs the maintainer" checks went
  silent. They now cover src/app/**/(home)/ and src/app/_home/.

The outputFileTracingIncludes keys are also written as the escaped picomatch
route globs Next documents. The TTF is traced by static analysis either way.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…he site, and drop founderOf from the Person node

Bylines, the /about descriptions, the home and /methodology author answers, the press boilerplate, llms.txt and llms-full.txt now use the same descriptor as santifer.io and Wikidata. The author paragraphs are rewritten so they do not repeat it, in en, es, fr and de.

/about: Featured in WIRED Greece in the two descriptions, two sentences reworded, Last updated and ProfilePage dateModified set to 9 Oct 2026.
/methodology: bio FAQ wording and role-name correction only; methodology unchanged, dateModified kept.
schema: founderOf removed from the Person node. It is not a schema.org property, and Organization.founder already states the relation.

The signatory bio on the manifesto pages is not touched.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…he blog i18n branch

The blog post page keeps the shared BlogPostView. Its byline now reads creator of career-ops (creador de career-ops in Spanish), and post dates in the sitemap go through handDate.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@santifer
santifer changed the base branch from main to i18n/root-layout-per-locale October 9, 2026 07:10
@santifer

santifer commented Oct 9, 2026

Copy link
Copy Markdown
Member Author

Status on 9 October.

This PR is now stacked on #149 (the per-language root layouts). #149 moves the blog under src/app/(en)/ and changes the byline, so the two conflicts this branch had with main are resolved against it here:

  • The post page keeps the shared BlogPostView. Its byline reads "creator of career-ops", and "creador de career-ops" on the Spanish post.
  • Post dates in the sitemap go through handDate, like the rest of the sitemap.

Built and served locally: 165 of 165 URLs pass the i18n SEO guard (the two new ones are this post in English and Spanish), and the agent-layer guard, schema parity and the future-dates check pass.

Still to do before merging, on the day itself: the post's date and lastModified say 1 October and must be set to the real publication day. Planned merge: Wednesday 14 October after 19:00 UTC, by Santiago, once #149 is in.

@santifer
santifer changed the base branch from i18n/root-layout-per-locale to main October 9, 2026 07:22
@santifer santifer closed this Oct 9, 2026
@santifer santifer reopened this Oct 9, 2026
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

This branch was successfully deployed

1 active deployment
Preview — db9af315 Deployed Oct 9, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant