Agent skill

Converting Recorders To Services

by quarkusio in quarkusio/quarkus

Step-by-step guide for converting Quarkus extensions from the legacy @Record/@Recorder pattern to the ServiceRegistrar service system.

Apache-2.0Auto-check passed

Install Converting Recorders To Services

skills CLI
$ npx skills add quarkusio/quarkus --skill converting-recorders-to-services -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install quarkusio/quarkus converting-recorders-to-services --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/quarkusio/quarkus.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/converting-recorders-to-services .claude/skills/converting-recorders-to-services && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
converting-recorders-to-services
GitHub stars
16k
Token cost
~4.6k tokens
SKILL.md length
1,924 words
Files
1
Skills in repo
12
Repo updated
First seen
Licence
Apache-2.0

At a glance

Step-by-step guide for converting Quarkus extensions from the legacy @Record/@Recorder pattern to the ServiceRegistrar service system.

  • Works in 10 steps: Analyze the recorder → Convert the recorder class → Convert the build step → …
  • SKILL.md covers Architecture, Prerequisites, Conversion steps and Common pitfalls, plus 2 more sections
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md

What it does

Converting Recorders To Services is an agent skill from quarkusio/quarkus. Step-by-step guide for converting Quarkus extensions from the legacy @Record/@Recorder pattern to the ServiceRegistrar service system.

Its SKILL.md is about 4.6k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

The repository describes itself as: Quarkus: Supersonic Subatomic Java. The licence is Apache-2.0.

Example prompts

  • “/converting-recorders-to-services”

Workflow steps

10 steps, taken from the step headings in SKILL.md.

  1. Analyze the recorder
  2. Convert the recorder class
  3. Convert the build step
  4. Declare dependencies
  5. Stop ordering with before()
  6. Bridge to legacy build items
  7. Synthetic beans
  8. Shutdown handlers
  9. Runtime-optional services
  10. Lambda capture rules

What it can do on your machine

Read from SKILL.md and the folder at commit d58d0eb. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    No scripts in the folder and no shell commands in SKILL.md (its code samples are java).

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Converting Recorders To Services loads about 4.6k tokens when it runs. Until then it costs about 42 tokens; SKILL.md has 1,924 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~42
When it runs · the whole SKILL.md, loaded when a task matches
~4.6k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from quarkusio/quarkus at commit d58d0eb, republished under its Apache-2.0 licence (© quarkusio). 1,924 words, ~4,639 tokens.

Download SKILL.mdSave it as .claude/skills/converting-recorders-to-services/SKILL.md (or your agent's skills folder).
name
converting-recorders-to-services
description
Step-by-step guide for converting Quarkus extensions from the legacy @Record/@Recorder pattern to the ServiceRegistrar service system.

Converting Recorders to Services

Architecture

The ServiceRegistrar service system replaces @Recorder with typed service. Services declare dependencies explicitly and execute in dependency order, not build step order. The system is designed for incremental migration — converted and unconverted extensions may coexist.

Key principles
  1. Explicit dependencies only. Services get NO implicit ordering from the build step graph. All ordering comes from require(), after(), before(), or afterBuildItem().
  2. Services are independent from recorders in the same step. Even if a build step method contains both a @Record call and an ServiceRegistrar call, the service and recorder are separate nodes with no implicit ordering between them.
  3. Values flow through the dependency graph. Service values are passed from producer to consumer via indexed dependency access on ServiceNode, not through the StartupContext maps (except for recorder proxy bridges).
Node types in the service graph
KindDescriptionGets step-graph deps?
LEGACY_RECORDERRecorder chunk from a @Record stepYes
ALIASBridges a recorder value to a service keyYes
SERVICEServiceRegistrar service with a lambda bodyNo
RV_WRAPPERWraps a service value in RuntimeValue for recordersNo
CROSS_PHASE_PROXYBridges a static-init service to the runtime graphNo

Legacy recorders and aliases use step-graph ordering for compatibility. Service nodes use only explicit declarations.

Prerequisites

Before converting, verify that all runtime dependencies are available as services:

Dependency TypeAvailability
ArcContainerService in ArcProcessor#initializeContainer
BeanContainerService in ArcProcessor#createBeanContainer
ScheduledExecutorServiceAliased by ThreadPoolSetup
@ConfigMapping (RUN_TIME)Auto-registered by ConfigServiceRegistrationStep
@ConfigMapping (BUILD_AND_RUN_TIME_FIXED)Auto-registered as static-init
@ConfigMapping (BUILD_TIME)Cannot be a service — extract values into locals
Other runtime objectsSearch for aliasRecorderValue or forService

Conversion steps

1. Analyze the recorder

For each @Recorder method, determine:

  • Return type — becomes the service type. RuntimeValue<X> unwraps to X. void becomes Void.class with a descriptive name.
  • Parameters — RuntimeValue<X> params become require(X.class). Simple values (String, int, boolean, enum) can be captured. Immutable collections (List.of(), Set.of(), etc.) can be captured.
  • Instance fields — config RuntimeValues injected via constructor become require() dependencies.
  • Trivial methods — inline directly into the lambda.
2. Convert the recorder class
  • Trivial methods — delete; inline into the lambda.
  • Complex methods — remove @Recorder, make methods static, unwrap RuntimeValue parameters and return types.
  • If all methods are converted, delete the class. Otherwise keep @Recorder for remaining methods.
3. Convert the build step

Before:

java
@BuildStep
@Record(ExecutionTime.RUNTIME_INIT)
ServiceStartBuildItem setup(MyRecorder recorder, SomeBuildItem item) {
    recorder.initialize(item.getValue());
    return new ServiceStartBuildItem("my-feature");
}

After:

java
@BuildStep
ServiceStartBuildItem setup(ServiceRegistrar serviceRegistrar, SomeBuildItem item) {
    serviceRegistrar
        .forService("io.quarkus.my-feature.setup")
        .onStart(ctx -> MyRecorder.initialize());
    return new ServiceStartBuildItem("my-feature");
}

Key changes:

  • Remove @Record(ExecutionTime.*) annotation.
  • Replace recorder parameter with ServiceRegistrar serviceRegistrar.
  • Use .atPhase(Phase.STATIC_INIT) for static-init services (default is runtime-init / Phase.APPLICATION).
  • For void services, use hierarchical dot-separated names: "io.quarkus.<extension>.<purpose>".
4. Declare dependencies

Every dependency must be explicit. There is no implicit ordering from the build step graph.

Old PatternNew Pattern
recorder.method(beanContainer.getValue()).require(BeanContainer.class)
recorder.method(someRuntimeValue).require(SomeType.class)
recorder.method(config.maxSize())Capture int maxSize = config.maxSize() before lambda
@Consume(SyntheticBeansRuntimeInitBuildItem.class) on step.afterBuildItem(SyntheticBeansRuntimeInitBuildItem.class) on service
afterBuildItem() — bridging to build step ordering

When a service depends on state produced by a legacy recorder (e.g., synthetic beans must be initialized), declare the dependency via afterBuildItem():

java
serviceRegistrar
    .forService("io.quarkus.arc.lifecycle")
    .afterBuildItem(SyntheticBeansRuntimeInitBuildItem.class)
    .onStart(ctx -> ArcRecorder.fireLifecycleEvent(new StartupEvent()));

This resolves the producing step's nodes (with passthrough resolution for steps that have no service graph nodes) and creates ordering edges.

afterBuildItem() is deprecated — it exists only for recorder coexistence. Once the producing recorder is converted to a service, replace with require() or after(), or drop it, as appropriate.

Cross-phase dependencies

Runtime services can require() static-init services. The framework automatically creates a CROSS_PHASE_PROXY node that reads the value from the serviceValues map (populated during static-init and retained via retainServiceValues()).

java
// static-init service
serviceRegistrar.forService(ArcContainer.class)
    .atPhase(Phase.STATIC_INIT)
    .afterBuildItem(ResourcesGeneratedPhaseBuildItem.class)
    .onStart(ctx -> Arc.initialize());

// runtime service that depends on it
serviceRegistrar.forService("io.quarkus.my-ext.setup")
    .require(ArcContainer.class)  // cross-phase: resolved via proxy
    .onStart((ctx, container) -> { ... });
Config mappings
  • BUILD_TIME — extract values into locals before the lambda.
  • BUILD_AND_RUN_TIME_FIXED — use .require(ConfigType.class) (resolved directly from SmallRye Config, no graph edge).
  • RUN_TIME — use .require(ConfigType.class) (same mechanism).
5. Stop ordering with before()

before(X) declares "X depends on me" — this service starts before X and stops after X. Use it for cleanup services that must outlive their dependents:

java
serviceRegistrar
    .forService("io.quarkus.vertx.netty-thread-local-cleanup")
    .atPhase(Phase.STATIC_INIT)
    .before(IOThreadDetector.class)
    .before(ArcContainer.class)
    .onStart(ctx -> {
        ctx.onStop(() -> InternalThreadLocalMap.remove());
    });
6. Bridge to legacy build items

Build items consumed by unconverted extensions need bridge proxies:

Build Item StoresBridge Method
RuntimeValue<T>serviceRegistrar.staticInitServiceAsRuntimeValue(T.class) or serviceRegistrar.serviceAsRuntimeValue(T.class)
Bare T (interface)serviceRegistrar.staticInitServiceAsRecorderValue(T.class) or serviceRegistrar.serviceAsRecorderValue(T.class)
Bare T (concrete)Use RuntimeValue variant — concrete classes may not be proxyable

Recorder proxies resolve via startupContext.getServiceValue() (for __service$$value() proxies) or startupContext.getValue() (for standard recorder proxies). The service deploy body stores values in the serviceValues map for this resolution.

7. Synthetic beans

Before:

java
Supplier<MyBean> supplier = recorder.createBeanSupplier(args);
SyntheticBeanBuildItem.configure(MyBean.class).supplier(supplier).done();

After:

java
serviceRegistrar.forService(MyBean.class, "my-bean-name")
    .onStart(ctx -> new MyBean(args));

SyntheticBeanBuildItem.configure(MyBean.class)
    .serviceValue(MyBean.class, "my-bean-name")
    .done();
8. Shutdown handlers

Register cleanup via ctx.onStop(Runnable) or ctx.onStopAsync(Consumer<AsyncStopContext>). Stop handlers run in reverse dependency order.

addLastShutdownTask() is deprecated — its per-node "last" semantics don't provide global ordering. Use before() to ensure your service stops after the services it cleans up for.

9. Runtime-optional services

A value-producing service must return a non-null value — the generated code throws "...returned null; use a void service if no value is produced" otherwise. For a service whose identity is known at build time but which may be absent at runtime (e.g. a handler gated by quarkus.log.file.enabled), declare optional() before onStart(). This flips the service's return type from T to Optional<T>; returning Optional.empty() marks the service absent (nothing constructed, no side effects) instead of failing.

java
serviceRegistrar.forService(Handler.class, "file")
    .atPhase(Phase.LOGGING)
    .require(LogRuntimeConfig.class)
    .optional()
    .onStart((ctx, config) -> config.file().enabled()
        ? Optional.of(buildFileHandler(config.file()))
        : Optional.empty());

Consuming an optional service:

  • consumeAll(T.class) skips absent producers (the map omits them).
  • request(T.class) yields Optional.empty() when absent.
  • require(T.class) on an optional service is a build error — a mandatory dependency cannot depend on a maybe-absent value. Use request() or consumeAll() instead.

Do not return null from a normal (non-optional) service, and do not use a sentinel value — optional() is the supported mechanism. (The null tolerance in consumeAll applies only to aliased recorder values that resolve to null, not to direct services.)

10. Lambda capture rules

Supported captures:

  • Primitives, String, Class, enum values
  • Immutable collections: List.of(), Set.of(), Map.of(), Collections.singletonList/Set/Map(), Collections.empty*(), Collections.unmodifiable*(), Set.copyOf(), List.copyOf(), Map.copyOf()
  • BUILD_AND_RUN_TIME_FIXED config mappings (via ConfigCaptureInterceptor)
  • Constable values — any type implementing java.lang.constant.Constable is captured via its describeConstable(). To make a custom value type capturable, implement Constable with a describeConstable() that reconstructs it (e.g. a DynamicConstantDesc invoking a static factory), rather than registering a recorder ObjectSubstitution. Immutable collections of Constable values (via Map.copyOf/List.copyOf) are themselves capturable.
  • record values — captured by reconstructing via the canonical constructor, as long as every component is itself capturable (recursively). Note this is the capture path; it is unrelated to the proxy path — a record still cannot be used as an aliased recorder return type (see "Aliased recorder return types must be proxyable" below).

Not capturable:

  • Mutable collections — use Set.copyOf() / List.copyOf() first
  • BUILD_TIME config objects — extract values into locals
  • RUN_TIME config objects — use require() instead
  • Arbitrary runtime objects — use require() instead

Common pitfalls

No implicit ordering from build steps

Services get NO ordering from @Consume/@Produce annotations or build item parameters on their build step method. Every ordering dependency must be declared on the service itself.

If a service needs to run after a legacy recorder step, use afterBuildItem() to depend on a build item that step produces.

Concrete class proxying

staticInitServiceAsRecorderValue(ConcreteClass.class) fails if the class has a non-trivial constructor. Use staticInitServiceAsRuntimeValue() instead — RuntimeValue is always proxyable.

Show full SKILL.md (817 more words)Show less
Aliased recorder return types must be proxyable

A value published via aliasRecorderValue(T.class, recorderValue) — or any @Recorder method whose return value is used as a recorder proxy — must have a proxyable type: an interface or a non-final class. A record is final, so it fails with "the return type cannot be proxied; use RuntimeValue to wrap the return value instead". When bridging a bundle of recorder values into a single service value, make the holder an interface (with a nested record impl for the runtime value), or wrap it in RuntimeValue. Abstract JDK types such as java.util.logging.Formatter and java.util.logging.Handler are already proxyable.

Package-private visibility

Lambda bytecode runs at runtime but references runtime classes directly. Package-private classes become inaccessible from the generated consolidated class.

Solutions:

  1. Add a public static factory method on a public runtime class.
  2. Move the class to a .impl subpackage and make it public.
Never reference deployment classes from within service lambdas

Action lambda bytecode (defined inside .onStart(ctx -> { ... })) is executed at runtime. Therefore, the lambda body must never reference, instantiate, or invoke methods on any deployment classes (such as your @BuildStep processor classes). Doing so will compile successfully but will throw a ClassNotFoundException / NoClassDefFoundError at runtime because deployment modules are absent from the runtime classpath.

  • The Anonymous Inner Class Trap: Writing an anonymous inner class (e.g. new MyInterface() {}) inside an instance-method lambda forces javac to generate a constructor that captures EnclosingProcessor.this (via a synthetic this$0 parameter) to bind the inner class to its enclosing processor scope. This turns your lambda into an instance-capturing lambda (throwing a TransliterationException at build time).
  • The Static Helper Method Trap: Moving the anonymous class instantiation to a private static helper method inside your processor class solves the EnclosingProcessor.this capture, but because the compiled lambda still references the static helper method on your deployment processor, it causes a NoClassDefFoundError at runtime.
  • Solution: Always place helper methods, custom interfaces, or static factory methods inside your runtime module classes (which are safely present at both build time and runtime).
Use require() instead of Arc.container()

Access CDI beans through require(BeanContainer.class) and beanInstance(). Direct Arc.container() calls bypass the dependency graph and can cause ordering failures.

Mutable collections must be copied
java
Set<String> captured = Set.copyOf(endpoints);  // before the lambda

Behavioral parity with recorders

Conversion must preserve behavior the recorder model provided implicitly. These are recurring, high-cost regressions — check each when converting a step that touches classloaders, threads, cleanup, or failure handling.

TCCL parity (thread context classloader)

Recorder bytecode always ran with the runtime classloader as the TCCL (the generated doStart sets it). Any recorder code that captured Thread.currentThread().getContextClassLoader() for later use — request handlers, thread factories, config/ServiceLoader lookups — relied on that.

  • After converting, ensure the service still runs with the runtime CL as TCCL, and that captured/inherited CLs are the runtime CL (not the system AppClassLoader). A wrong TCCL surfaces as ServiceLoader "not a subtype" errors or dev-mode failures, not as an obvious classloader bug.
  • Threads created during startup inherit the creating thread's TCCL. A long-lived or library thread that captures the per-app runtime CL and outlives the app leaks the QuarkusClassLoader (metaspace growth across test/dev restarts). Internal/scheduler threads that run no user code should not hold an app CL. Clean up threads/ThreadLocals your service owns in onStop; never rely on a global "reset all TCCLs" sweep.
Teardown-ordering parity

Start ordering is explicit (require/after/before) — but so is stop ordering, and that is the easy thing to lose. The recorder model gave cleanup incidental ordering from build-step order; a converted service's onStop runs only in reverse dependency order. If a cleanup implicitly depended on running before/after another (e.g. bean destruction before a "last" task, or a listener firing before container teardown), declare it with before()/after(). Lost teardown ordering surfaces as unrelated downstream symptoms, so verify shutdown explicitly.

Failure-path parity

Recorders logged nothing in-band on failure — doStart caught, wrapped in RuntimeException("Failed to start quarkus", cause), and rethrew. The service graph rethrows the first failure (concurrent ones attach as suppressed), so nothing is lost by staying quiet. Do not add ERROR/WARN logging in service bodies for expected failures — let them propagate. Some tests assert clean propagation (no WARNING+ log records, no suppressed exceptions) for a static-init failure, e.g. StaticInitFailureTest.

consumeAll uses indexed access

consumeAll dependencies expand to multiple consecutive entries in the ServiceNode's dependency array (one per matching service, sorted by name). Both ServiceGraphBuilder and LambdaTransliterator compute the same match list using the same prefix and sort order, ensuring index alignment.

Checklist

  • Identify all @Record build steps in the processor
  • For each, determine if all dependencies are available as services
  • Convert recorder methods (inline trivial ones, make complex ones static)
  • Update build steps: remove @Record, add ServiceRegistrar, register services
  • Declare ALL dependencies explicitly (require, after, before, afterBuildItem)
  • Do NOT rely on build step ordering for service execution order
  • Bridge values to legacy build items where needed
  • Convert synthetic beans from supplier()/runtimeValue() to serviceValue()
  • Check for package-private visibility issues
  • ./mvnw install the modified modules before running integration tests

© quarkusio, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .agents/skills/converting-recorders-to-services of quarkusio/quarkus.

Open the folder on GitHubat commit d58d0eb

Compare with similar skills

Converting Recorders To Services next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Converting Recorders To Services compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Converting Recorders To Services this skillquarkusio/quarkus16k—~4.6kAutomated safety check: PassApache-2.0
Record Extension Demomengxi-ream/read-frog10k—~2.8kAutomated safety check: PassGPL-3.0
Convertremotion-dev/remotion63k—~247Automated safety check: PassCustom licence
Recordingcodewhale-hq/Codewhale41k—~540Automated safety check: PassMIT
Browser Extension Buildersickn33/agentic-awesome-skills47k2 repos~2.3kAutomated safety check: PassMIT
Browser Extension Launchsickn33/agentic-awesome-skills47k1 repos~1.4kAutomated safety check: PassMIT

Similar skills

  • Record Extension Demo

    mengxi-ream/read-frog

    Record polished, evidence-backed demos of the Read Frog extension as MP4 (and optional GIF) by driving real Chrome with the built extension, following captioned scene scripts, asserting extension…

    10k GitHub stars~2.8k tokensUpdated today
    DevelopmentAuto-check passed
  • Convert

    remotion-dev/remotion

    Official

    Start the local @remotion/convert app and open it in the Codex browser.

    63k GitHub stars~247 tokensUpdated today
    Media & CreativeAuto-check passed
  • Recording

    codewhale-hq/Codewhale

    Capture screenshots on registered computers, record on macOS or HarmonyOS, and manage saved captures.

    41k GitHub stars~540 tokensUpdated today
    Productivity & AutomationAuto-check passed
  • Browser Extension Builder

    sickn33/agentic-awesome-skills

    Expert in building browser extensions that solve real problems - Chrome, Firefox, and cross-browser extensions.

    47k GitHub starsUsed in 2 repos~2.3k tokens
    DevelopmentAuto-check passed
  • Browser Extension Launch

    sickn33/agentic-awesome-skills

    Builds, tests, packages, and prepares Chrome extensions for store launch from a plain-language idea; use for new extensions, fixes, releases, and submission recovery.

    47k GitHub starsUsed in 1 repo~1.4k tokens
    DevelopmentAuto-check passed
  • Browser Extension Reverse

    sickn33/agentic-awesome-skills

    Authorized reverse engineering of Chrome/Firefox extensions: manifest analysis, background workers, content scripts, and extension-based credential or data-exposure research.

    47k GitHub starsUsed in 1 repo~695 tokens
    SecurityAuto-check passed

More from quarkusio/quarkus

All 12 skills in this repo
  • Manage Deprecations

    quarkusio/quarkus

    Maintain @Deprecated code in the Quarkus codebase: remove code that has been deprecated for more than 12 months, add the @Deprecated annotations that were missed when a related element was…

    16k GitHub stars~2.8k tokensUpdated today
    Auto-check passed
  • Building And Testing

    quarkusio/quarkus

    How to build and test Quarkus: Maven commands, build flags, incremental builds, justfile aliases, and important build rules.

    16k GitHub stars~615 tokensUpdated today
    Auto-check passed
  • Building Docs

    quarkusio/quarkus

    How to build, preview, and verify Quarkus documentation locally: root Maven build, docs rebuild, Roq dev server preview.

    16k GitHub stars~1.8k tokensUpdated today
    Auto-check passed
  • Quarkus split classloading model, runtime-dev module wiring, conditional dependencies, and common classloading mistakes.

    16k GitHub stars~635 tokensUpdated today
    Auto-check passed
  • Creating Extensions

    quarkusio/quarkus

    How to create a new Quarkus extension: full module layout, package naming, artifact naming, dependency rules, and Dev UI setup.

    16k GitHub stars~929 tokensUpdated today
    Auto-check passed
  • Pull Requests

    quarkusio/quarkus

    Rules for preparing pull requests and commits in the Quarkus project: title conventions, description format, commit hygiene, labels, and contribution policies.

    16k GitHub stars~840 tokensUpdated today
    Auto-check passed

Questions about Converting Recorders To Services

What does Converting Recorders To Services do?

Step-by-step guide for converting Quarkus extensions from the legacy @Record/@Recorder pattern to the ServiceRegistrar service system. Converting Recorders To Services is an agent skill from quarkusio/quarkus. Step-by-step guide for converting Quarkus extensions from the legacy @Record/@Recorder pattern to the ServiceRegistrar service system.

How do I install Converting Recorders To Services in Claude Code?

Run `npx skills add quarkusio/quarkus --skill converting-recorders-to-services -a claude-code`. Or copy the skill folder (.agents/skills/converting-recorders-to-services in quarkusio/quarkus) into .claude/skills/converting-recorders-to-services in your project. Claude Code loads it when a task matches its description.

How do I install Converting Recorders To Services in Codex?

Run `npx skills add quarkusio/quarkus --skill converting-recorders-to-services -a codex`. Or copy the skill folder (.agents/skills/converting-recorders-to-services in quarkusio/quarkus) into .agents/skills/converting-recorders-to-services in your project. Codex loads it when a task matches its description.

Can I use Converting Recorders To Services in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add quarkusio/quarkus --skill converting-recorders-to-services -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/converting-recorders-to-services, .gemini/skills/converting-recorders-to-services, .github/skills/converting-recorders-to-services and .opencode/skills/converting-recorders-to-services in your project.

What does Converting Recorders To Services need to run?

SKILL.md names no scripts, command-line tools or credentials: Converting Recorders To Services is instructions for the agent only.

Does Converting Recorders To Services access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Converting Recorders To Services safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Converting Recorders To Services use?

Converting Recorders To Services is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Converting Recorders To Services use?

About 4.6k tokens (SKILL.md is roughly 19k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Converting Recorders To Services?

Skills that share tags, products or a category with Converting Recorders To Services: Record Extension Demo (mengxi-ream/read-frog, 10k stars), Convert (remotion-dev/remotion, 63k stars), Recording (codewhale-hq/Codewhale, 41k stars) and Browser Extension Builder (sickn33/agentic-awesome-skills, 47k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Converting Recorders To Services?

quarkusio (a GitHub organization) maintains it in quarkusio/quarkus, which has 15,939 GitHub stars. The repository holds 12 skills in this directory. The repository was last updated on October 9, 2026.

Source: quarkusio/quarkus on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.