add-service
Skill56k starsChanged 3 days agoMITView on GitHub
Create a new Ghost Core service with gx generate service, then finish what the generator leaves to the author - dependency wiring, boot initialization, tests and checks. Use when adding a new boot-owned capability under ghost/core/server/services. To adopt defineService in an existing service, use migrate-service instead.
4 other projects use a version of this.
Trending
Less talk lately.about the whole repository
Most recently taken up by
- lbedner/aegis-stacktheir own version, first seen Oct 8, 2026
- jblemee/docker-compose-homelabtheir own version, first seen Sep 3, 2026
- ludeo-labs/cosmos-ostheir own version, first seen Jul 27, 2026
- ficaviolaodorata520/met-museum-mcp-servertheir own version, first seen Jun 1, 2026
Who's talking about TryGhost/Ghost
- Repocast | GitHub 일일 브리핑“뉴스레터로 돈 버는 오픈소스, Ghost 공개”YouTube · Aug 21, 2026 · 1.2k views
- YT G“How to install Ghost platform on Mac locally”YouTube · Jun 27, 2018 · 508 views
- The Infinity“What is Ghost? The Next-Gen Publishing Platform for Creators”YouTube · Aug 13, 2025 · 277 views
- Ghost for Beginners“Significance of Ghost's Upcoming Public API”YouTube · Nov 6, 2015 · 251 views
- Blueprint Bytes“Blueprint Bytes | Ghost: The Professional Open-Source Publishing Platform”YouTube · Aug 3, 2026 · 190 views
The biggest 5 of 96 mentions linking to the repository that our crawl found. Each line is their own headline.
See all 96
Talked about on Stack Overflow, GitHub, YouTube, Bluesky, Hacker News and the web (96 times).
On Stack Overflow · 28
- Feb 24, 2014Bootstrap 3 .img-responsive images are not responsive inside fieldset in FireFox50 votes
- Dec 6, 2017Random high content download time in chrome?28 votes
- Oct 16, 2013Ghost blog Failed to lookup view "index"25 votes
- Dec 9, 2014Ghost: newest post with specific tag on the front page12 votes
- Feb 3, 2019How do I set Ghost Blog Custom Routes.yaml Collection Title / Meta Description in my custom template?6 votes · 3 answers
23 more on Stack Overflow
- Feb 13, 2015How to deploy an Ember CLI app to Azure Websites6 votes · 2 answers
- Jan 23, 2015Run Ghost in a subdirectory of my main Node.js application5 votes · 1 answer
- May 14, 2020custom fields and post types for Ghost4 votes
- Oct 5, 2016Common practice for database schema load on Bookshelf.js/Knex.js4 votes · 1 answer
- Nov 7, 2013How can I apply date formatting to Ghost's post.published_at property?4 votes
- Feb 19, 2016ERR_TOO_MANY_REDIRECTS while setting up Ghost + Nginx with both HTTP and HTTPS2 votes
- Jan 15, 2016Ghost how to add custom template post2 votes
- Jan 19, 2015Run Ghost blog as subfolder of website running on node http-server2 votes
- Nov 20, 2014Use an articles title in the url, not the id2 votes
- Feb 20, 2019How do I set Ghost Blog Custom Routes.yaml Collection Title / Meta Description in my custom template?1 vote
- Feb 8, 2019How do I Re-route Ghost Blog Admin URL without modifying the API Address?1 vote
- Jul 2, 2018How run ghost on Google App Engine1 vote
- Mar 23, 2018Accessing Post html from Ghost Blog Custom Handlebars Helper1 vote
- Dec 10, 2017Initialize Ghost database on new install1 vote · 3 answers
- Jan 14, 2017Ghost on Heroku1 vote
- Mar 9, 2016Trying to setup a Ghost blog with Buster1 vote
- Dec 23, 2015Ghost Blog posts sort order1 vote
- Feb 20, 2015node-pre-gyp install --fallback-to-build error install with npm on OSX1 vote
- Feb 14, 2015Is there a way to give Ghost static pages access to the 'posts' variable that index.hbs is passed?1 vote
- Sep 16, 2014How does ember data access fixtures declared with ic-ajax's declareFixture?1 vote
- Apr 11, 2014Error installing via npm install1 vote
- Nov 18, 2013Why these 2 calls to same function?1 vote · 1 answer
- Nov 6, 2013gem installed, can't import bourbon1 vote · 1 answer
On GitHub · 26
- May 2, 2022`dropNullable` gives incorrect SQL on MariaDB 10.2.7+ — knex/knex12 reactions · 1 comment
- Jan 22, 2019Source Request: Ghost — gridsome/gridsome11 reactions · 2 comments
- Sep 5, 2018Enhancement: expose libvips magicksave, requires v8.7.0 — lovell/sharp11 reactions · 30 comments
- Dec 18, 2019Fix IME issue — bustle/mobiledoc-kit8 reactions · 4 comments
- Oct 28, 2019Non-breaking spaces are ignored by the editor — bustle/mobiledoc-kit4 reactions · 2 comments
21 more on GitHub
- Sep 30, 2016Minor toolbar visual refinement suggestions — brave/browser-laptop4 reactions · 5 comments
- Sep 12, 2023[benchmark] Contribute Ghost.js workload to Node.js benchmarks — nodejs/nodesays it tested it3 reactions · 3 comments
- Apr 24, 2021Repeated crash on 4.3.2-alpine with no log output — TryGhost/docker-library-ghost2 reactions · 30 comments
- Jun 11, 2019:memo: iTop security policy — Combodo/iTop2 reactions · 4 comments
- Feb 7, 2018add a SUPPORT.md file to centralize support resources for Desktop — desktop/desktop2 reactions · 1 comment
- Mar 14, 2017🔥 remove settings.postsPerPage — TryGhost/Admin2 reactions · 1 comment
- Sep 25, 2026Add outbound ActivityPub Move support — TryGhost/ActivityPub1 reaction · 5 comments
- Jun 16, 2026chore(ghost): bump ghost to 6.45.0 — helmforgedev/charts1 reaction · 2 comments
- Jun 15, 2026Improved Twitter embed rendering — TryGhost/ActivityPub1 reaction · 1 comment
- Jun 10, 2026chore(ghost): bump ghost to 6.44.1 — helmforgedev/charts1 reaction · 2 comments
- Nov 9, 2023🐛 Fixed HTML->Lexical conversion not handling paragraphs inside blockquotes — TryGhost/Koenig1 reaction
- Jan 13, 2023Added support for FormData and body streams in express-test — TryGhost/framework1 reaction · 2 comments
- Sep 6, 2021Added missing schedule events to webhook dropdown — TryGhost/Admin1 reaction · 6 comments
- Apr 1, 2021Allows administrators to update email settings — TryGhost/Admin1 reaction · 3 comments
- Nov 20, 2019✨ Added Secondary Navigation — TryGhost/Admin1 reaction · 3 comments
- Sep 19, 2019✨ Added Koenig bookmark card CSS v2 rules — TryGhost/gscan1 reaction
- Dec 11, 2018Fix temp files not being deleted of unzipped theme in cache — TryGhost/gscan1 reaction · 2 comments
- Dec 10, 2018🐛 Fixed ability to submit invite form with a missing role — TryGhost/Admin1 reaction · 1 comment
- Jul 11, 2017Switch from ember-cli-shims to new module imports — TryGhost/Admin1 reaction · 2 comments
- Dec 21, 2016Add initial alpine variant — TryGhost/docker-library-ghost1 reaction · 8 comments
- Aug 24, 2016🐛 prevent task-buttons dropping clicks after focus-out events — TryGhost/Admin1 reaction · 1 comment
On YouTube · 19
- Aug 21, 2026뉴스레터로 돈 버는 오픈소스, Ghost 공개 — Repocast | GitHub 일일 브리핑1.2k views · 1 comment
- Jun 27, 2018How to install Ghost platform on Mac locally — YT G508 views
- Aug 13, 2025What is Ghost? The Next-Gen Publishing Platform for Creators — The Infinity277 views · 2 comments
- Nov 6, 2015Significance of Ghost's Upcoming Public API — Ghost for Beginners251 views
- Aug 3, 2026Blueprint Bytes | Ghost: The Professional Open-Source Publishing Platform — Blueprint Bytes190 views
14 more on YouTube
- Sep 13, 2026Cut the Cost: Self‑Hosted Ghost for Free Publishing — CodeAZ187 views
- Nov 30, 2017Ghost Blog GitHub repo History — Kirsten Kluge163 views
- Apr 25, 2019Ghost Content Management System — Brian Christner155 views
- Oct 20, 2013TryGhost - Ghost — GourceTV87 views
- Apr 20, 2026Ghost CMS: 93 Devs, 567 Commits, One Month! 👻✨ — CodeTimelapse81 views
- Jun 20, 2026Ghost — Open Source Alternative to Medium / Substack — Open Sourcery77 views
- Sep 13, 202610 free GitHub projects you can legally rebrand and sell #ai — Neura Quanta76 views
- Aug 7, 2026Stop Paying Substack! Own Your Newsletter FREE (Ghost) — OpenRepo71 views
- Nov 9, 2026🤯 This Open-Source Tool Can Replace Substack! Build Your Own Platform 🔥 #Shorts — GitHub_devils52 views
- Jul 14, 2026Stop Giving Substack a Cut! Run Your OWN Newsletter (Ghost) — OpenRepo51 views
- May 28, 2026GitHub - TryGhost/Ghost: Independent technology for modern publishing, memberships, subscriptions... — GitHub Daily Trend AI Podcast50 views
- Jan 2, 2022TryGhost/Ghost - Gource visualisation — Gourcer25 views
- Oct 22, 2026How to Get Notified When Ghost CMS Releases a New Version — MayaGuides7 views
- Nov 6, 2026Stop Paying $300.00 for Webflow Premium Site Plan — This Free GitHub Repo Replaces It — Githut0 views · 1 comment
On Bluesky · 15
- Sep 1, 2025This is not true Quillette isn’t on ghost.org. They run the open source code from github.com/TryGhost/Ghost — @retornam.bsky.social19 likes and reposts · 1 reply
- Jan 30, 2025Congrats to @johnonolan.bsky.social and team for the latest release of the open source Ghost CMS (now up to 5.108.2). A great CMS, a great… — @davidryan.bsky.social4 likes and reposts · 1 reply
- Sep 24, 2025📦 TryGhost / Ghost ⭐ 50,758 (+31) 🗒 JavaScript Independent technology for modern publishing, memberships, subscriptions and newsletters. — @github-trending-js.bsky.social3 likes and reposts
- Oct 3, 2024And they're using an open source CMS with an active developer community, so there is an emphasis on a lot of these kinds of open web… — @ericm.cd3 likes and reposts
- Aug 22, 2026📦 TryGhost / Ghost ⭐ 54,861 (+32) 🗒 JavaScript Independent technology for modern publishing, memberships, subscriptions and newsletters. — @github-trending.bsky.social2 likes and reposts
10 more on Bluesky
- May 17, 2026🚀 Skyrocketing! 🚀 (200+ new stars) 📦 TryGhost / Ghost ⭐ 53,070 (+209) 🗒 JavaScript Independent technology for modern publishing,… — @github-trending-js.bsky.social2 likes and reposts · 1 reply
- Mar 30, 2026📦 TryGhost / Ghost ⭐ 52,213 (+36) 🗒 JavaScript Independent technology for modern publishing, memberships, subscriptions and newsletters. — @github-trending-js.bsky.social2 likes and reposts
- Dec 3, 2025Ist nicht LAMP, aber: Ghost? — @papaleaks.de2 likes and reposts · 1 reply
- May 7, 2025Maybe github.com/TryGhost/Ghost ? You can self host it and the ui is clean, but I think it might be a little bit too focused on selling… — @efpee.pl2 likes and reposts
- Jan 6, 2025It’s open source too! github.com/TryGhost/Ghost (also they don’t pay me, I’m just enthusiastic about web stuff) — @laniakita.com2 likes and reposts
- May 18, 2026🚀 Skyrocketing! 🚀 (200+ new stars) 📦 TryGhost / Ghost ⭐ 53,070 (+209) 🗒 JavaScript Independent technology for modern publishing,… — @github-trending.bsky.social1 likes and repost · 1 reply
- Mar 4, 2024📦 TryGhost / Ghost ⭐ 45,277 (+32) 🗒 JavaScript Independent technology for modern publishing, memberships, subscriptions and newsletters. — @github-trending-js.bsky.social1 likes and repost
- Mar 1, 2024I thought this might interest you, since I remembered you considering Ghost. CEO/founder of Ghost flat-out saying Ghost won't sell your… — @flaky.blue1 likes and repost · 1 reply
- Dec 28, 2023I am interested in trying Ghost ghost.org github.com/TryGhost/Ghost And what people think of it before I commit — @tqft.bsky.social1 likes and repost
- Dec 21, 2023If you're a complete nerd you can just host it on your own damn server and not have ANYONE tell you what to do. — @brokentoys.social1 likes and repost
On Hacker News · 7
- Oct 14, 2013Ghost Blogging Platform47 points · 6 comments
- Feb 27, 2024Tea.xyz causes a flood of spam pull requests to open source projects46 points · 16 comments
- Feb 5, 2018Ghost: A beautiful, Open Source, markdown blogging platform in JavaScript5 points · 1 comment
- Feb 18, 2014The future of Ghost's admin UI4 points
- Jul 28, 2016New Ghost blog release with scheduled posts2 points
2 more on Hacker News
- Jul 25, 2017Ghost Blog 1.0.0 has been released1 point · 3 comments
- Feb 19, 2014The future of Ghost's admin UI1 point
On the web · 1
- Oct 5, 2026CVE-2026-105647 Detail - NVD — nvd.nist.gov
Other versions4 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 4
- lbedner/aegis-stack★ 146same name
- jblemee/docker-compose-homelab★ 9same name
- ludeo-labs/cosmos-os★ 3same name
- ficaviolaodorata520/met-museum-mcp-server★ 0same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository19 other files it gives its agents.
- AGENTS.mdAGENTS.md
- e2e/AGENTS.mdAGENTS.md
- Add Admin API EndpointSkill
- add-private-feature-flagSkill
- admin7-feature-flagsSkill
- commitSkill
- convert-internal-package-to-typescriptSkill
- Create database migrationSkill
- Format numbersSkill
- migrate-internal-packageSkill
- migrate-serviceSkill
- Shade component decisionSkill
- Shade dropdown surface contractSkill
- Shade inputSurface recipeSkill
- Shade new componentSkill
- Shade ShadCN installSkill
- tinybird-cli-guidelinesSkill
- tinybirdSkill
- verify-service-changeSkill
The file
We split this skill into the rules it gives an agent
6 rules. 0 are common, 4 are distinctive, and 2 are very specific to this project.
0
Common
Most of the 4 edited versions we read keep these.
4
Distinctive
This author's own choices. Worth a look.
2
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 38
Use lowercase kebab-case beginning with a letter.
- Distinctive: line 50
If the generator refuses a name because a path exists or the name is still listed as legacy, read that code.
- Very specific: line 55
Put behavior in the implementation and composition in the root's create callback.
- Very specific: line 62
Delete the generated example comments once the real dependencies are wired.
- Distinctive: line 117
Run from the repository root:
- Distinctive: line 133
Commit with the repository commit skill, then run on the committed result:
“Common” is measured: kept by at least 6 in 10 of the 4 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Add a service
The services guide is the authoring guide. This skill is the checklist that goes with it; follow the links rather than copying a neighbouring service, which may still be legacy.
1. Check it is a service
Apply the guide's What belongs here test first. A service root wires an instance that boot owns and callers share. Name that instance, its callers and what must be ready before they use it. A reusable constructor, an ordinary library or a helper used by one service is not a service: put it where the guide says and stop here.
For an existing service, use migrate-service.
Then read creating a service, initialization and the kernel contract. IndexNow and its root test are the worked example.
2. Generate the service
From the repository root:
pnpm gx generate service <name>Use lowercase kebab-case beginning with a letter. Never write the root by hand. The generator creates:
ghost/core/server/services/<name>/index.ts, thedefineServicerootghost/core/server/services/<name>/<name>-service.ts, the implementationghost/test/unit/server/services/<name>/index.test.ts, a starter root test
It registers nothing. A service that is not in the
legacy service inventory
is standard, so every service check applies from the first commit. Do not add
the service to the inventory's services list or to any lint configuration.
If the generator refuses a name because a path exists or the name is still listed as legacy, read that code. Do not delete it to make generation succeed.
3. Implement and wire dependencies
Put behavior in the implementation and composition in the root's create
callback. The guide's
dependency boundaries
say what the root injects, what the implementation imports directly, and how to
handle live settings, deferred lookups and logging types. Apply them to every
implementation file, including nested helpers.
Delete the generated example comments once the real dependencies are wired.
Consumers read the instance through the root's .service. If a check rejects an
import, fix the wiring; do not widen the allowlist to make lint pass.
4. Initialize in boot
The generator leaves boot.js to you.
- Phase. Most roots belong in
initServices.initCoreandinitServicesForFrontendrun earlier, for roots that the frontend or later phases read. Do not initialize on the first request. - Order. Initialize after everything
createreads and before anything reads.service. IninitServices, a root that others read during their owncreateis awaited on its own line before thePromise.all; independent roots go inside it; a root that reads one of those goes after it. Form. Bind the root, then call
init()on the binding, as the lines around it do. Await it even whencreateis synchronous:const deliveryReceipts = require('./server/services/delivery-receipts').default; await deliveryReceipts.init();pnpm lint:oxlintandgx services verifyfind the call through that binding. Lint fails until it is there, and neither recognises the inlineawait require(...).default.init().- Comments. Replace the generated comment above
defineServicewith whatcreateneeds ready. Where the order matters, say why beside the call in boot, as the existing comments there do. - Boot test.
ghost/test/unit/boot/standard-services.test.tsalready checks that boot waits for the root'sinit()and that its failure fails boot; do not write that test again. Add a boot test only where order matters. TheinitCoreandinitServicesForFrontendtests fail on a root they do not list, so add a stub there for a root in those phases. - Resources. Finish startup work before returning the instance. Acquire
listeners, timers and work to drain in
startand release them instop, following starting and stopping. Registerroot.stop()withghostServer.registerCleanupTaskin boot.
5. Test and check
Extend the generated root test and add implementation tests for behavior, dependency timing and readiness. If startup acquires resources, cover a failed attempt followed by a successful retry. The testing guide explains the focused commands.
A new service has no inventory entry. The one exception: if the root declares
extras, catalogue each one in the followUps section of
ghost/core/server/services/legacy-service-inventory.yaml, as the
standard root contract
describes. The inventory test compares the names.
Run from the repository root:
pnpm nx run ghost:test:unit test/unit/server/services/<name>/index.test.ts
pnpm nx run ghost:test:unit test/unit/boot/
pnpm --filter ghost exec vitest run --config vitest.config.inventory.ts
pnpm lint:oxlint
pnpm lint:boundaries
pnpm checkpnpm lint:oxlint applies ghost/service-root-shape to the root and
ghost/boot-awaits-service-init to boot.js.
pnpm lint:boundaries checks the implementation's imports. The inventory test
checks the directory has an index.ts root and that extras match the catalogue.
Commit with the repository commit skill, then run on the committed result:
pnpm gx services verify <name>It needs a clean tree on a branch that contains the fetched origin/main. It
repeats the checks above, runs the full unit suite and confirms a boot test
fails when boot stops waiting for this root's init(). Run it again after
every rebase or fix.
Fix failures in the service rather than disabling a check. Report the commands you ran and anything still failing.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

