Skip to content

DirectorySkills

Editorial developer portfolio: 1440, made in this run
Run 1Editorial developer portfolio“I'd like a portfolio site that shows my projects and my blog posts. Everything is in brief.md.”
Runs in
  • Claude Code
  • Codex
  • Cursor
  • Gemini CLI
  • GitHub Copilot
  • OpenCode
Generates with
Your agent's model
Tested with
Claude Code 2.1.322Claude Sonnet 5.51 real run, 12 Nov
Needs
Node 20+Chrome
Licence
Recaply licence

Editorial Developer Portfolio

A newspaper-style portfolio for a developer who writes: a masthead hero, projects, essays, experience and contact.

$9.99once, yours to keep

Builds a developer portfolio laid out like a newspaper into your own project: off-white newsprint, a serif masthead with a dateline, a huge headline and three columns under a rule, projects as stories, essays, experience and contact. Plain HTML, CSS and JavaScript, or matched to React, Next.js, Vue, Svelte, Astro or Tailwind when the project uses them. Comes with a working reference and a check that screenshots it at phone, tablet and desktop widths and flags sideways overflow, text under 12px, missing alt text and names, low contrast, no focus styles, motion that ignores reduced motion, leftover sample words and emoji icons. Use when a developer, engineer or technical writer wants a portfolio that puts writing alongside projects, or someone asks for an editorial, newspaper-like personal site.

By RecaplyUpdated 12 Nov

Install Editorial Developer Portfolio

After the download, ask your agent to add it, or run the line yourself.

Read https://recaply.co/skills/editorial-developer-portfolio/install.md and follow it to install the editorial-developer-portfolio skill from editorial-developer-portfolio.zip.

Paste it into your agent. It reads our install steps, finds the ZIP you downloaded and adds the skill for you.

New to skills? How to install a skill

Similar skills

All 735 skills

Who Editorial Developer Portfolio is for

What you get

  • One HTML file with its CSS inside: no build step, no framework
  • A developer portfolio laid out like a newspaper
  • Checked at phone and desktop widths

Good fit

  • When a developer, engineer or technical writer wants a portfolio that puts writing alongside projects

Not for

  • An app with a backend, sign-in or a database
  • Copying another company's site

About this skill

You say

I'd like a portfolio site that shows my projects and my blog posts. Everything is in brief.md.

It said back

I built the portfolio as a plain HTML, CSS and JavaScript site in the project folder. The check passes at 390, 768 and 1440 px. It found no sideways overflow, text under 12px, missing alt text, contrast or focus problems, script errors, leftover sample words or emoji icons. I read the 390 and 1440 screenshots, and both look right. I did not open the 768 screenshot.

Files: index.html, style.css, script.js and og.svg (the social preview image). Screenshots are in check/: 390.png, 768.png and 1440.png.

Show more

What it did in run 1

  1. editorial-developer-portfolio
  2. ls -la && cat brief.md
  3. cd ./.claude/skills/editorial-developer-portfolio && ls -R . | head -30 && cat reference/index.html && cat reference/style.css && cat reference/script.js
  4. ~/.claude/projects/-private-var-folders-4r-x1k-d3dx36v-yrnn39ymflm40000gn-T-rcl-real-runs-editorial-developer-portfolio-work1/fbdb28cc-24c5-4787-a413-59f235baee64/tool-results/bwwdzy2db.txt
  5. cd . && S=.claude/skills/editorial-developer-portfolio/reference && cp $S/style.css style.css && cp $S/script.js script.js && cat >> style.css <<'EOF' /* ---- portfolio additions: non-link cards (no URLs supplied yet) ---- */ .work-link,.post-link{cursor:default} .work-link:hover .work-art svg{transform:scale(1.04)} .hero-editorial .kicker{display:block} EOF cat > index.html <<'EOF' <!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Freya Lindgren: data engineer and writer in Gothenburg</title> <meta name="description" content="Freya Lindgren is a data engineer and writer in Gothenburg. Open transit data, a weather dashboard, a book on SQL, and essays on dashboards and dbt."> <meta property="og:type" content="website"> <meta property="og:title" content="Freya Lindgren: data engineer and writer in Gothenburg"> <meta property="og:description" content="Projects and essays from a data engineer in Gothenburg: open transit data, live weather and SQL for Analysts."> <meta property="og:image" content="og.svg"> <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Newsreader:ital,opsz,wght@0,6..72,400;0,6..72,600;1,6..72,400&family=IBM+Plex+Sans:wght@400;500;600&family=IBM+Plex+Mono:wght@500&display=swap"> <link rel="stylesheet" href="style.css"> </head> <body> <a class="skip" href="#main">Skip to content</a> <header class="nav nav-center"><div class="wrap nav-in"> <a class="brand" href="#main" aria-label="Freya Lindgren, top of page"><span>Freya Lindgren</span></a> <button class="nav-toggle" type="button" data-nav-toggle aria-expanded="false" aria-controls="menu"><svg class="ic" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M4 7h16M4 12h16M4 17h16"/></svg><span class="sr-only">Menu</span></button> <nav id="menu" class="menu" aria-label="Main"><ul><li><a href="#work">Projects</a></li><li><a href="#writing">Essays</a></li><li><a href="#experience">Experience</a></li></ul><a class="btn btn-primary btn-sm" href="#contact">Write to me</a></nav> </div></header> <main id="main"> <section class="hero hero-editorial"><div class="wrap hero-in"><p class="kicker">Gothenburg · Data engineering and writing</p><h1 class="reveal">Data engineer and <em>writer</em> in Gothenburg</h1><div class="hero-cols reveal"><p class="hero-sub">Freya Lindgren builds data for a regional transit operator, opens it to the public, and writes about what she learns: dashboards, dbt and SQL.</p><div class="hero-ctas"><a class="btn btn-primary" href="#writing">Read the essays<svg class="ic" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a><a class="btn btn-ghost" href="#work">See projects</a></div><p class="hero-note">She likes newspapers and serif type, as you may have guessed.</p></div></div></section> <section class="sec work work-grid" id="work" aria-labelledby="work-h"><div class="wrap"><div class="sec-head"><h2 id="work-h">Projects</h2></div><ul class="work-list"> <li class="work-item reveal"><div class="work-link"><div class="work-art"><svg viewBox="0 0 640 420" role="img" aria-label="Drawing of a transit map with three routes and stops"><rect width="640" height="420" fill="#FFFFFF"/><g fill="none" stroke-width="10" stroke-linecap="round" stroke-linejoin="round"><path d="M70 330 L200 330 L260 250 L420 250 L500 150 L580 150" stroke="#A12B2B"/><path d="M70 120 L190 120 L260 250 L330 340 L580 340" stroke="#161514"/><path d="M120 60 L120 200 L260 250 L400 90 L400 60" stroke="#8C877D"/></g><g fill="#FFFFFF" stroke="#161514" stroke-width="4"><circle cx="260" cy="250" r="14"/><circle cx="200" cy="330" r="8"/><circle cx="420" cy="250" r="8"/><circle cx="500" cy="150" r="8"/><circle cx="190" cy="120" r="8"/><circle cx="330" cy="340" r="8"/><circle cx="120" cy="200" r="8"/><circle cx="400" cy="90" r="8"/></g></svg></div><div class="work-meta"><h3>Open Transit Gothenburg</h3><p>An open data portal for the city's transit: 14 datasets and 2.1 million API calls a month.</p><span class="work-year">2023</span></div></div></li> <li class="work-item reveal"><div class="work-link"><div class="work-art"><svg viewBox="0 0 640 420" role="img" aria-label="Drawing of a dashboard with a line chart and bar chart"><rect width="640" height="420" fill="#FFFFFF"/><rect x="40" y="40" width="560" height="190" fill="none" stroke="#D8D3C8"/><path d="M40 190 L120 150 L200 170 L280 110 L360 130 L440 80 L520 100 L600 70" fill="none" stroke="#A12B2B" stroke-width="5" stroke-linejoin="round"/><path d="M40 190 L120 150 L200 170 L280 110 L360 130 L440 80 L520 100 L600 70 L600 230 L40 230Z" fill="#A12B2B" opacity=".12"/><g fill="#161514"><rect x="40" y="290" width="40" height="90"/><rect x="100" y="260" width="40" height="120"/><rect x="160" y="310" width="40" height="70"/><rect x="220" y="280" width="40" height="100"/><rect x="280" y="250" width="40" height="130"/><rect x="340" y="300" width="40" height="80"/><rect x="400" y="270" width="40" height="110"/><rect x="460" y="320" width="40" height="60"/><rect x="520" y="290" width="40" height="90"/></g><rect x="40" y="380" width="560" height="2" fill="#161514"/></svg></div><div class="work-meta"><h3>Weatherline</h3><p>A live dashboard for 60 home weather stations along the west coast.</p><span class="work-year">2024</span></div></div></li> <li class="work-item reveal"><div class="work-link"><div class="work-art"><svg viewBox="0 0 640 420" role="img" aria-label="Drawing of a book cover titled SQL for Analysts"><rect width="640" height="420" fill="#EDE8DC"/><rect x="200" y="30" width="240" height="360" fill="#161514"/><rect x="200" y="30" width="16" height="360" fill="#000"/><rect x="236" y="70" width="170" height="3" fill="#FAF8F3"/><text x="236" y="130" font-family="Georgia,serif" font-size="40" font-weight="700" fill="#FAF8F3">SQL</text><text x="236" y="166" font-family="Georgia,serif" font-size="22" font-style="italic" fill="#FAF8F3">for Analysts</text><rect x="236" y="196" width="60" height="6" fill="#A12B2B"/><g fill="#FAF8F3" opacity=".6"><rect x="236" y="260" width="150" height="5"/><rect x="236" y="276" width="120" height="5"/><rect x="236" y="292" width="140" height="5"/></g><text x="236" y="360" font-family="Georgia,serif" font-size="16" fill="#FAF8F3">Freya Lindgren</text></svg></div><div class="work-meta"><h3>SQL for Analysts</h3><p>A 212-page book; 4,000 copies sold.</p><span class="work-year">2025</span></div></div></li> </ul></div></section> <section class="sec posts posts-list" id="writing" aria-labelledby="writing-h"><div class="wrap"><div class="sec-head"><h2 id="writing-h">Essays</h2></div><ul class="post-list"> <li class="post reveal"><div class="post-link"><p class="post-meta"><span>8 min read</span> <time datetime="2026-09-12">12 Sep 2026</time></p><h3>Why your dashboard is lying</h3><p class="post-dek">Averages hide the bad days; show the spread.</p></div></li> <li class="post reveal"><div class="post-link"><p class="post-meta"><span>11 min read</span> <time datetime="2026-07-02">2 Jul 2026</time></p><h3>Notes on dbt at scale</h3><p class="post-dek">What broke when our project passed 900 models.</p></div></li> <li class="post reveal"><div class="post-link"><p class="post-meta"><span>6 min read</span> <time datetime="2026-01-15">15 Jan 2026</time></p><h3>A year of public data</h3><p class="post-dek">What people did with the transit data we opened.</p></div></li> </ul></div></section> <section class="sec timeline" id="experience" aria-labelledby="experience-h"><div class="wrap"><div class="sec-head"><h2 id="experience-h">Experience</h2></div><ol class="tl-list"> <li class="tl reveal"><p class="tl-when">2022 – now</p><div><h3>Senior data engineer <span>· Kustlinjen regional transit</span></h3></div></li> <li class="tl reveal"><p class="tl-when">2019 – 2022</p><div><h3>Analytics engineer <span>· Fiskebäck Logistics</span></h3></div></li> <li class="tl reveal"><p class="tl-when">2016 – 2019</p><div><h3>Data analyst <span>· A city statistics office</span></h3></div></li> </ol></div></section> <section class="sec contact" id="contact" aria-labelledby="contact-h"><div class="wrap contact-in"><div class="reveal"><div class="sec-head"><h2 id="contact-h">Letters to the <em>editor</em></h2></div><p class="contact-line"><svg class="ic" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M3 6h18v12H3zM3 7l9 6 9-6"/></svg><a href="mailto:freya@lindgren.se">freya@lindgren.se</a></p><p class="contact-line"><svg class="ic" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M12 21s7-6.5 7-12a7 7 0 0 0-14 0c0 5.5 7 12 7 12zM12 11a2 2 0 1 0 0-4 2 2 0 0 0 0 4"/></svg><span>Gothenburg</span></p></div> <form class="contact-form reveal" data-form data-done="Thank you. This form is not connected to a mailbox yet, so nothing was sent. Please write to freya@lindgren.se." aria-label="Contact form"><label class="field"><span>Your name</span><input name="name" type="text" required autocomplete="name"></label><label class="field"><span>Email</span><input name="email" type="email" required autocomplete="email"></label><label class="field"><span>Message</span><textarea name="message" rows="5" required></textarea></label><button class="btn btn-primary" type="submit">Send message</button><p class="form-status" role="status" aria-live="polite"></p></form></div></section> </main> <footer class="foot"><div class="wrap foot-in"><div class="foot-brand"><a class="brand" href="#main"><span>Freya Lindgren</span></a><p>Data engineer and writer in Gothenburg.</p></div><nav class="foot-col" aria-label="Pages"><h2>Pages</h2><ul><li><a href="#work">Projects</a></li><li><a href="#writing">Essays</a></li><li><a href="#experience">Experience</a></li></ul></nav><nav class="foot-col" aria-label="Contact"><h2>Contact</h2><ul><li><a href="mailto:freya@lindgren.se">Email</a></li><li><a href="#contact">Contact form</a></li></ul></nav></div><div class="wrap foot-small"><p>© <span data-year>2026</span> Freya Lindgren</p></div></footer> <script src="script.js" defer></script> </body> </html> EOF cat > og.svg <<'EOF' <svg xmlns="http://www.w3.org/2000/svg" width="1200" height="630" viewBox="0 0 1200 630"><rect width="1200" height="630" fill="#FAF8F3"/><rect x="60" y="60" width="1080" height="4" fill="#161514"/><text x="60" y="300" font-family="Georgia,serif" font-size="110" font-weight="700" fill="#161514">Freya Lindgren</text><text x="60" y="390" font-family="Georgia,serif" font-size="48" font-style="italic" fill="#A12B2B">Data engineer and writer in Gothenburg</text></svg> EOF cd .claude/skills/editorial-developer-portfolio && node scripts/check.mjs ../../../index.html --out ../../../check 2>&1 | tail -40
  6. cd . && ls;
  7. S=.claude/skills/editorial-developer-portfolio/reference && cp $S/style.css style.css && cp $S/script.js script.js && printf '\n/* ---- portfolio additions: cards are not links until URLs exist ---- */\n.work-link,.post-link{cursor:default}\n' >> style.css && ls
  8. ./og.svg
  9. ./index.html
  10. cp .claude/skills/editorial-developer-portfolio/reference/style.css style.css
  11. cp .claude/skills/editorial-developer-portfolio/reference/script.js script.js
  12. W=.; cp "$W/.claude/skills/editorial-developer-portfolio/reference/style.css" "$W/style.css"; cp "$W/.claude/skills/editorial-developer-portfolio/reference/script.js" "$W/script.js"; ls "$W"
  13. ./style.css
  14. ./script.js
  15. W=.; node $W/.claude/skills/editorial-developer-portfolio/scripts/check.mjs $W/index.html --out $W/check 2>&1 | tail -40
  16. node ./.claude/skills/editorial-developer-portfolio/scripts/check.mjs ./index.html --out ./check
  17. ./check/1440.png
  18. ./check/390.png
  19. Done

12 Nov 2026 · Claude Code 2.1.322 with Claude Sonnet 5.5 · 2 min 17 s · $0.49 of API use

Questions

Is Editorial Developer Portfolio free?

No. Editorial Developer Portfolio costs $9.99 once and stays in your Recaply account, or it comes with the Recaply plan ($19.99 a month), which opens every premium skill and prompt.

Which agents can use Editorial Developer Portfolio?

Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot and OpenCode.

What do I get when I buy Editorial Developer Portfolio?

A ZIP of the whole skill folder (39 KB): the SKILL.md your agent follows and its 6 other files, the references, templates and scripts it uses. You download it from this page whenever you need it, and install it in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot and OpenCode. The Recaply plan opens it too, with every other premium skill and prompt.

How do I install Editorial Developer Portfolio?

Buy it, then download the ZIP from this page. For Claude Code, unzip it into .claude/skills/ in your project. For Codex, Cursor and Gemini CLI, unzip it and run npx skills add ./editorial-developer-portfolio with your agent's flag.

What do I get from Editorial Developer Portfolio?

One HTML file with its CSS inside: no build step, no framework. A developer portfolio laid out like a newspaper. Checked at phone and desktop widths.

What does Editorial Developer Portfolio need?

Node 20+ and Chrome, and no API key. Each use costs nothing beyond your agent.

How big is Editorial Developer Portfolio?

7 files, about 29,099 tokens in all. The SKILL.md is about 2,507 tokens, and your agent reads it only when the job fits.

What does a run cost?

Our 1 runs took 2 min 17 s to 2 min 17 s and $0.49 to $0.49 of API use each, in Claude Code with claude-sonnet-5-5. On a Claude plan, a run counts toward your usage instead.

Do I have to name Editorial Developer Portfolio to use it?

Type /editorial-developer-portfolio first to make sure it loads. Without it, Claude Code may judge a small job simple enough to do without the skill.