npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

spokay-app-starter-cli

v2.0.1

Published

A CLI for creating Fullstack starter applications from templates with OIDC authentication support

Readme

spokay-app-starter-cli

A CLI for scaffolding OIDC-ready starter projects: an Angular SPA, a Spring Boot resource server, or both wired to each other.

Installation

npm install -g spokay-app-starter-cli   # installs the `spokay-app-starter` command

Local development — the CLI is TypeScript, so it has to be built before it can be run:

npm install
npm run build
npm link

Usage

spokay-app-starter list                              # what can be scaffolded
spokay-app-starter create angular "My App"           # Angular 22 SPA with OIDC
spokay-app-starter create resource-server "My API"   # Spring Boot 4 resource server
spokay-app-starter create fullstack "My Project"     # both, pointing at each other

Each command prompts for what it needs. The project directory is derived from the name: "My App" becomes my-app.

Fullstack

create fullstack is the reason this CLI is not two CLIs. It asks for the OIDC authority, client id and the two URLs once, then writes them into both projects:

my-project/
├── frontend/     Angular SPA
├── backend/      Spring Boot resource server
└── README.md     how to run both

The frontend's secureRoutes and the backend's cors.allowed-origins and server.port are derived from the same answers, so the pair works on first run instead of after a round of manual reconciliation.

Running unattended

Every prompt has a flag. Supply what matters and add --yes to take defaults for the rest:

spokay-app-starter create resource-server "My API" \
  --oidc-authority https://idp.example.com/realms/demo \
  --client-id my-client \
  --base-package com.example.api \
  --yes --no-git

--yes refuses to guess an OIDC authority or client id — there is no sensible default — and tells you which flags are missing.

| flag | applies to | |---|---| | --oidc-authority, --client-id, --frontend-url, --backend-url | all | | --no-proxy, --vcs, --pkg, --node-version | angular, fullstack | | --group-id, --base-package, --java-version, --context-path | resource-server, fullstack | | -p, --path, -t, --template, --force, --no-git, -y, --yes | all |

Adding a template

Templates are data, not code paths. src/templates/<id>.ts describes one, typed as TemplateDescriptor (src/types.ts):

| field | purpose | |---|---| | repo | git URL to clone | | questions | inquirer questions, each with a flag name | | files(answers) | files to run token replacement over | | fileGlobs(answers) | globs for the same, e.g. src/**/*.java | | renames(answers) | directory renames, applied before replacement | | tokens(answers) | the __TOKEN__ map | | postSteps | extra work, e.g. deleting the unused CI config | | install(answers) | package manager to run, or null |

Register it in src/templates/registry.ts. The generator and the CLI pick it up with no further changes. The answers a template may read are the fields of ProjectAnswers; a question whose name is not one of them does not compile.

Development

npm run build         # tsc -> dist/, which is what ships
npm run typecheck     # tsc --noEmit over src/
npm test              # builds, then runs the tests against dist/
npm run lint
npm run format:check

The run skill exercises the whole thing against the real template repositories, served locally so nothing hits the network:

node .claude/skills/run-spokay-app-starter-cli/driver.mjs matrix   # every template
node .claude/skills/run-spokay-app-starter-cli/driver.mjs tui      # the real prompts
node .claude/skills/run-spokay-app-starter-cli/driver.mjs flags    # the unattended path