Node.js Application Configuration

Overview

Configure your Node.js Applications

NPM   Build Status   release notes

Introduction

Node-config organizes hierarchical configurations for your app deployments.

It lets you define a set of default parameters, and extend them for different deployment environments (development, qa, staging, production, etc.).

Configurations are stored in configuration files within your application, and can be overridden and extended by environment variables, command line parameters, or external sources.

This gives your application a consistent configuration interface shared among a growing list of npm modules also using node-config.

Project Guidelines

  • Simple - Get started fast
  • Powerful - For multi-node enterprise deployment
  • Flexible - Supporting multiple config file formats
  • Lightweight - Small file and memory footprint
  • Predictable - Well tested foundation for module and app developers

Quick Start

The following examples are in JSON format, but configurations can be in other file formats.

Install in your app directory, and edit the default config file.

$ npm install config
$ mkdir config
$ vi config/default.json
{
  // Customer module configs
  "Customer": {
    "dbConfig": {
      "host": "localhost",
      "port": 5984,
      "dbName": "customers"
    },
    "credit": {
      "initialLimit": 100,
      // Set low for development
      "initialDays": 1
    }
  }
}

Edit config overrides for production deployment:

 $ vi config/production.json
{
  "Customer": {
    "dbConfig": {
      "host": "prod-db-server"
    },
    "credit": {
      "initialDays": 30
    }
  }
}

Use configs in your code:

const config = require('config');
//...
const dbConfig = config.get('Customer.dbConfig');
db.connect(dbConfig, ...);

if (config.has('optionalFeature.detail')) {
  const detail = config.get('optionalFeature.detail');
  //...
}

config.get() will throw an exception for undefined keys to help catch typos and missing values. Use config.has() to test if a configuration value is defined.

Start your app server:

$ export NODE_ENV=production
$ node my-app.js

Running in this configuration, the port and dbName elements of dbConfig will come from the default.json file, and the host element will come from the production.json override file.

Articles

Further Information

If you still don't see what you are looking for, here are some more resources to check:

Contributors

lorenwest markstos iMoses elliotttf jfelege leachiM2k
josx enyo leosuncin arthanzel eheikes th507
Osterjour cunneen nsabovic BadgerBadgerBadgerBadger simon-scherzinger leonardovillela
axelhzf benkroeger fgheorghe IvanVergiliev jpwilliams jaylynch
jberrisch kgoerlitz bertho-zero NguyenMatthieu nitzan-shaked robertrossmann

License

May be freely distributed under the MIT license.

Copyright (c) 2010-2020 Loren West and other contributors

Comments
  • Gearing up for 0.5 - Feature discussion

    Gearing up for 0.5 - Feature discussion

    Node-config has been on the 0.4 release for a long time, and a few features have been held back due to backward compatibility issues.

    We're gearing up for the 0.5 release, and now is the time to request features that we've held off due to compatibility.

    Planned for 0.5:

    • Change load ordering from hostname.EXT --> deployment.EXT to deployment.EXT --> hostname.EXT @xaka
    • Make configurations immutable by default, with a configuration to reverse this behavior @markstos
    • Add a configuration to disable runtime.json reading/writing https://github.com/lorenwest/node-config/issues/91 @triccardi-systran

    Any others?

    opened by lorenwest 38
  • devDependencies errors on ES6

    devDependencies errors on ES6

    I've used config before on a previous project and things worked great. I really like the library for it's simplicity and ease of use. It's like the underscore of configurations. Anyway, I recently decided to create a new project based on the old one, but this time using ES6 syntax, that would then get transpiled to ES5 using gulp and babel. Sadly, things didn't work out as I expected. Attempting to transpile the code or even to run it (using npm run start) throws an error that several modules were not found. After some inspection, I found out that these are ALL modules listed as devDependencies for config. The devDependencies aren't installed using npm i (but I didn't expect them to)...but they also weren't installed in the old project (yet that still worked fine). Any ideas on how to resolve this?

    pr-welcome 
    opened by sylvanash 33
  • More robust handling of JSON

    More robust handling of JSON

    This appears to have been added in #1 but it actually causes problems with the module due to the way the data is mutated with regular expressions.

    I would like to have this removed because:

    1. Comments in straight JSON are not valid according to the spec
    2. node-config already supports JSON5, so if comments are required users can use that file format instead.

    The case where this breaks is when a JSON file has all of its whitespace removed, for example, consider this original config file:

    {
      "version": "v3.1",
      "supportedVersions": [
        "v3",
        "v3.1"
      ],
      "supportedExt": [
        "bulk"
      ],
      "publicRoot": "http://localhost:3000",
      "port": 3000,
      "processes": 0,
      "killTimeout": 10000,
      "api": {
        "host": "",
        "options": {}
      },
      "redis": {
        "host": "127.0.0.1",
        "options": {}
      }
    }
    

    Now suppose we remove whitespace, e.g.

    fs.writeFileSync('./config/default.json', JSON.stringify({
      "version": "v3.1",
      "supportedVersions": [
        "v3",
        "v3.1"
      ],
      "supportedExt": [
        "bulk"
      ],
      "publicRoot": "http://localhost:3000",
      "port": 3000,
      "processes": 0,
      "killTimeout": 10000,
      "api": {
        "host": "",
        "options": {}
      },
      "redis": {
        "host": "127.0.0.1",
        "options": {}
      }
    }));
    

    The resulting file will look like this:

    {"version":"v3.1","supportedVersions":["v3","v3.1"],"supportedExt":["bulk"],"publicRoot":"http://localhost:3000","port":3000,"processes":0,"killTimeout":10000,"api":{"host":"","options":{}},"redis":{"host":"127.0.0.1","options":{}}}
    

    This is still valid JSON; however, node-config's util.stripComments results in the following string:

    {"version":"v3.1","supportedVersions":["v3","v3.1"],"supportedExt":["bulk"],"publicRoot":"http://localhost:3000","port":3000,"processes":0,"killTimeout":10000,"api":{"host":"","options":{}},"redis":{"hostundefined.0.0.1","options":{}}}
    

    which is no longer valid JSON.

    opened by elliotttf 33
  • Module config not get loaded if the main app also uses node-config

    Module config not get loaded if the main app also uses node-config

    Assume that we have a node module called myModule and we use this module in the main application called myApp. Both myModule and myApp utilizing node-config. When we run myApp, it loads it's config but never loads myModule's config and whenever myModule tries to access its own config, it actually reads myApp's config. The reason behind this is the way module caching works in node. Very first time it loads myApp config:

    var myAppConfig = require("config");
    

    It then tries to load myModule config.

    var myModuleConfig = require("config"); //never loads config as it's already cached
    

    Since they both are reuiring the same module, "config", and it is already cached in require.cache, it will not be load myModule's config.

    Summary: If I use node-config in my app and also happen to use a module which depends on node-config , there will be config conflict and either my app or most likely the module's config will not work.

    opened by skilledDeveloper 31
  • Error using PM2 with node-config when NODE_APP_INSTANCE === 0

    Error using PM2 with node-config when NODE_APP_INSTANCE === 0

    PM2 has an option to automatically cluster the right amount based on your server's cores with the -i 0 option. However, node-config pulls up an error and quits the app. This would preferably be a nonfatal error that would simply continue without looking for the cluster-specific config files.

    opened by DaAwesomeP 30
  • Add env var to search additional config directories in order to override values found in $NODE_CONFIG_DIR

    Add env var to search additional config directories in order to override values found in $NODE_CONFIG_DIR

    I've authored my app so that the default configuration values in config/default.json make the app runnable (on a dev's machine, for instance). However, in other environments (unit-test, qa, staging, production), I want to override config values, but not have to copy my environment-specific config file into my app's config dir but still use the defaults found in my app's config/default.json.

    According to the docs, setting NODE_CONFIG_DIR changes the config directory that's searched for config files -- I'm assuming all config files. I want to specify an extra directory, in addition to config so that I don't have to copy, say, production.json into config. I want to

    1. leave production.json in its well-known place on the production server, say, /foo/bar/production.json,
    2. have all defaults in my regular config directory, say /sna/fu/app/config/default.json,
    3. set NODE_ENV to production,
    4. set NODE_CONFIG_DIRS to /foo/bar,
    5. fire up my app and have it pick up /foo/bar/production.json and then /sna/fu/app/default.json.

    By using NODE_CONFIG_DIRS (with an S), config

    1. leaves legacy behavior of NODE_CONFIG_DIR but allows additional directories to be searched before $DEFAULT_NODE_CONFIG is searched, and
    2. allows me to copy my application into a directory and just run, no additional copying required (if NODE_CONFIG_DIRS is already set). Yay, one less production deployment step!

    My requirement is only for one additional directory, but I don't see why multiple additional directories couldn't be supported using either JavaScript array notation (like ['/foo/bar','/goo/far']) or a single string with platform-specific path separators (like /foo/bar:/goo/faron _n_x or \foo\bar;\goo\far on Win) where first config file found wins.

    opened by matthewadams 27
  • Bug: defer'ed values can end up in the final configuration object depending resolution order. AKA

    Bug: defer'ed values can end up in the final configuration object depending resolution order. AKA "the double-defer bug"

    This is closely related to #265.

    Consider the following configuration, where one deferred configuration value refers to another configuration value:

    // using defer functions is optional. See example and docs below.
     var defer = require('config/defer').deferConfig
    
    
    module.exports = {
      a : "value a",
      b : defer(function () {
        return this.a;
      }),
      c : defer(function () {
        return this.b;
      }),
    };
    

    Regardless of whether #265 is fixed, it's possible that a deferred value will be referenced in another deferred value.

    This happened to us in today in a complex configuration which wasn't easy to spot right away and where it's desirable to have these values to deferred, to eliminate configuration repetition.

    The current result is a kind of a "silent failure" where the the deferred function becomes the value of one of the functions, which later becomes a bug in the application.

    Some possible improvements would be:

    1. Fail explicitly. Throw an exception noting that nested defer'ed values have been encountered and aren't supported.
    2. Resolve-on-demand. When an unresolved is encountered in a defer function, we would resolve it immediately.

    Resolve-on-demand sounds attractive, but has challenges. Right now raw objects are used in the defer functions. We use an explicit method in the functions to access config properties, which would involve changing the syntax of in defer functions (at least if you want this safety check).

    Other possibility might be to modify the 'this' available to defer functions using a custom get key for the properties. When properties were attempted to be read, we could resolve-on-demand. This custom 'getters' would not be needed on the final object.

    Failing explicitly in this case is simpler.

    opened by markstos 27
  • Reconsider default profile names

    Reconsider default profile names

    Note: for support questions, please use StackOverflow and tag your question with node-config. This repository's issues are reserved for feature requests and bug reports.

    Before submitting a bug report, please search the issue tracker the wiki first. Many issues have already been discussed.

    The wiki is located at: https://github.com/lorenwest/node-config/wiki

    I'm submitting a ...

    • [ ] bug report
    • [ X ] feature request
    • [ ] support request or question => Please do not submit support request or questions here, see note at the top of this template.

    What is the current behavior?

    If the current behavior is a bug, please provide the steps to reproduce and if possible a minimal demo of the problem:

    Node-Config has official naming conventions for development, stage, production, and local. Local is restricted in a way that you shouldn't commit it to your repository.

    What is the expected behavior?

    At a minimum, I would like to see the local profile be opened up to be kept in source control.

    I think in actuality these names shouldn't matter to node-config at all. These are very implementation specific and different teams and organization may have standard names for their different environments.

    It seems reasonable to have node-config not care about these details and allow teams to chose how they manage their config names for their different environments. As an example, we use local as a shared set of local developer settings and commit that to source control for our other, non-Node.js, projects that way we don't have to share it through other methods outside of source control. When we tried doing that with node-config we were stunned by the restriction and had to work around it when it didn't seem necessary. The work around then caused an inconsistency across our other projects that use local profiles for running projects locally on developer machines.

    Please tell us about your environment:

    • node-config version: x.x.x
    • node-version: x.x.x

    Other information

    (e.g. are you using an environment besides Node.js?) No

    feature-request pending-more-information 
    opened by jashatton 21
  • wish: support async config sources

    wish: support async config sources

    The solution to this may also address #181, pluggable file formats. However, the solutions don't necessarily need to be coupled together, so I'm opening this Issue to consider async sources separately.

    opened by markstos 21
  • config.get returns a reference, instead of a copy

    config.get returns a reference, instead of a copy

    Not sure if this is a bug or not, but the 'get' method call for a config value which is an object returns a reference rather than a copy.

    This means that any changes to the returned config value, would update the config value - this behaviour not being expected for a READ method and is inconsistent with get calls for non object values.

    What is the current behavior?

    let value = config.get('test') -> where test is an object. value.testKey = 'test' console.log(config.get('test')) -> the config 'test' value has been updated with a new key: 'testKey'.

    What is the expected behavior?

    If a config value is an object, a copy of it should be returned, such that value.testKey does not affect subsequent calls to .get(). Instead of the user making a copy using Object.assign or something else, this is what I would expect .get to do.

    Lib version:

    ^1.26.x

    opened by fgheorghe 20
  • config.get('barf.blah') triggers `TypeError: Cannot redefine a property of an object with external array elements`

    config.get('barf.blah') triggers `TypeError: Cannot redefine a property of an object with external array elements`

    Hi, I'm trying something simple I've done before and I'm getting a crazy error that really surprises me:

    .../node_modules/config/lib/config.js:534
        Object.defineProperty(object, propertyName, {
               ^
    TypeError: Cannot redefine a property of an object with external array elements`
    

    All I'm doing is calling get on the config object:

    config.get('barf.blah');

    Any idea what is going on? I imagine that my application is mutating the config somewhere after it has been accessed by .get, because this error goes away if I set the environment variable ALLOW_CONFIG_MUTATIONS=true when booting the app. It would be great if I could easily find out where this was happening...

    Any pointers would be much appreciated. Thanks!

    opened by alash3 20
  • Add support for jsonc file extension

    Add support for jsonc file extension

    This is another attempt to support .jsonc extension but using JSON5 parser as advised in https://github.com/node-config/node-config/issues/671#issuecomment-1039794125

    opened by ducaale 0
  • Fix for collision of setModuleDefaults with get(), has() and friends

    Fix for collision of setModuleDefaults with get(), has() and friends

    This PR addresses #689

    The problem is that defineProperty() defaults to configurable: false, which should only be false in makeImmutable(). If you set it before that, you can't delete properties or modify the property.

    opened by jdmarshall 1
  • [BUG] Failing test on master?

    [BUG] Failing test on master?

    Describe the bug

    Configuration file Tests ✓ Objects wrapped with raw should be unmodified ✓ Inner configuration objects wrapped with raw should be unmodified ✓ Supports multiple levels of nesting ✗ Supports keeping promises raw by default » expected 'this is a promise result', got undefined (==) // /Users/jasonmarshall/Projects/cobbler/node-config/node_modules/vows/lib/assert/macros.js:14

    I thought this was something on my end, but I pulled master and I'm still getting this, node 8 through 16

    Submitting a PR for a failing test for the test suite is ideal.

    Expected behavior Green tests

    Screenshots If applicable, add screenshots to help explain your problem.

    Please tell us about your environment:

    • node-config version: 3.3.8
    • node-version: 8-18

    Other information

    opened by jdmarshall 3
  • [BUG] TypeError: Cannot redefine property when sub module is using config.get() within the module

    [BUG] TypeError: Cannot redefine property when sub module is using config.get() within the module

    Describe the bug

    I'm trying to use node-config within my company's ecosystem (apps and libraries) but running into an issue when I start using it within one of our libraries and a consumer instantiates the library more than once. Everything works fine if the library references the config via dot notation. However, if it references values of the config via the recommended config.get('...') method I'll get the following error:

    /Users/example/config-module-example/node_modules/config/lib/config.js:423
          Object.defineProperty(object, propertyName, {
                 ^
    
    TypeError: Cannot redefine property: myModule
        at Function.defineProperty (<anonymous>)
        at Config.util.makeImmutable (/Users/example/config-module-example/node_modules/config/lib/config.js:423:14)
        at Config.get (/Users/example/config-module-example/node_modules/config/lib/config.js:170:12)
        at myModule (/Users/example/config-module-example/src/my-module.js:18:24)
        at Object.<anonymous> (/Users/example/config-module-example/src/index.js:7:1)
        at Module._compile (node:internal/modules/cjs/loader:1105:14)
        at Object.Module._extensions..js (node:internal/modules/cjs/loader:1159:10)
        at Module.load (node:internal/modules/cjs/loader:981:32)
        at Function.Module._load (node:internal/modules/cjs/loader:822:12)
        at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:77:12)
    

    Here is a repo that demonstrates the issue with a contrived example (reference the README for more details): https://github.com/hershmire/config-module-example.

    Expected behavior

    I would expect that I could use the get() method off the config object based on your documentation. However, this doesn't seem possible since the .get() method will make the object and its children immutable, making it problematic when the second instance is created. I cannot find any documentation walking through a recommended approach other than what is referenced here (which I seem to be following) – https://github.com/node-config/node-config/wiki/Sub-Module-Configuration.

    Please tell us about your environment:

    • node-config version: 3.3.8
    • node-version: v16.16.0
    opened by hershmire 5
  • [BUG] Cannot find module 'ts-node' from 'parser.js'

    [BUG] Cannot find module 'ts-node' from 'parser.js'

    Describe the bug During the run test in jest, I get an error "Cannot find module 'ts-node' from 'parser.js'". I figure out the problem disappears when I commented on these lines in parser.js file.

    image

    It appears, that:

    1. the require.extensions is deprecated
    2. the require.extensions object has only the following keys: .js, .json, .node. It doesn't have the .ts key

    Tests and src codebase is in typescript, including config files.

    Expected behavior A clear and concise description of what you expected to happen.

    Please tell us about your environment:

    • node-config version: 3.3.6
    • node-version: 16.16.0
    • ts-node version: 10.9.1

    Other information

    pr-welcome 
    opened by KalinaMatysiak 0
  • setModuleDefaults behaves differently from loadFileConfigs() when the defaults collide with config utility functions

    setModuleDefaults behaves differently from loadFileConfigs() when the defaults collide with config utility functions

    Note: for support questions, please use StackOverflow and tag your question with node-config. This repository's issues are reserved for feature requests and bug reports.

    Before submitting a bug report, please search the issue tracker the wiki first. Many issues have already been discussed.

    The wiki is located at: https://github.com/node-config/node-config/wiki

    I'm submitting a ...

    • [ x ] bug report
    • [ ] feature request
    • [ ] support request or question => Please do not submit support request or questions here, see note at the top of this template.

    What is the current behavior?

    If your default.js file contains a key that collides with node-config's extendDeep() helpers, such as 'get', then config figures it out and leaves the value. However when you pass in values via setModuleDefaults, they don't get copied because the function already exists.

    What is the expected behavior?

    setModuleDefaults() and extendDeep() should have the same semantics, so that loadFileConfigs behaves the same as setting defaults.

    Please tell us about your environment:

    • node-config version: 3.3.7
    • node-version: 14.20.0

    Other information

    (e.g. are you using an environment besides Node.js?)

    opened by jdmarshall 8
Releases(v3.3.8)
  • v3.3.8(Sep 9, 2022)

    What's Changed

    • bump json5 dep to 2.2.1
    • Cleanup of file scoped environment variables by @jdmarshall in https://github.com/node-config/node-config/pull/667
    • Allow multiple relative directory paths separated by path.delimiter to work by @inside in https://github.com/node-config/node-config/pull/661
    • Reentrancy bugs by @jdmarshall in https://github.com/node-config/node-config/pull/668
    • Fixed property mutation. Throw an exception on such an attempt. Updat… by @fgheorghe in https://github.com/node-config/node-config/pull/516
    • docs: update copyright & fix misspelling by @DigitalGreyHat in https://github.com/node-config/node-config/pull/677

    New Contributors

    • @jdmarshall made their first contribution in https://github.com/node-config/node-config/pull/667
    • @inside made their first contribution in https://github.com/node-config/node-config/pull/661
    • @DigitalGreyHat made their first contribution in https://github.com/node-config/node-config/pull/677

    Full Changelog: https://github.com/node-config/node-config/compare/v3.3.7...v3.3.8

    Source code(tar.gz)
    Source code(zip)
  • v3.3.7(Jan 11, 2022)

  • v3.3.6(Nov 3, 2021)

Owner
Loren West
Loren West
Run any command on specific Node.js versions

Run any command on specific Node.js versions. Unlike nvm exec it: can run multiple Node.js versions at once can be run programmatically is 5 times fas

ehmicky 605 Dec 30, 2022
simple metadata scrapper for node.js

meta-fetcher Simple metadata scrapper for node.js. Under the hood it uses isomorphic-unfetch to fetch the metadata, parses it and returns it as json o

Rocktim 137 Nov 6, 2022
Node.js object hash library with properties/arrays sorting to provide constant hashes. It also provides a method that returns sorted object strings that can be used for object comparison without hashes.

node-object-hash Tiny and fast node.js object hash library with properties/arrays sorting to provide constant hashes. It also provides a method that r

Alexander 73 Oct 7, 2022
Node.js CLI tool to visualize an aggregate list of your dependencies' licenses

licenseye Node.js CLI tool to visualize an aggregate list of your project's dependencies' licenses. Install Yarn yarn global add licenseye NPM npm ins

Liran Tal 36 Dec 21, 2022
Abstracts execution of tasks in parallel using Node.js cluster.

cluster-map Abstracts execution of tasks in parallel using Node.js cluster. It is a high level abstraction around a common pattern used to delegate a

Gajus Kuizinas 27 Jul 3, 2022
Clock and task scheduler for node.js applications, providing extensive control of time and callback scheduling in prod and test code

#zeit A node.js clock and scheduler, intended to take place of the global V8 object for manipulation of time and task scheduling which would be handle

David Denton 12 Dec 21, 2021
📦🚀 Blazing fast, zero configuration web application bundler

Features ?? Blazing fast bundle times - multicore compilation, and a filesystem cache for fast rebuilds even after a restart. ?? Out of the box suppor

Parcel 41.8k Jan 4, 2023
📦🚀 Blazing fast, zero configuration web application bundler

Features ?? Blazing fast bundle times - multicore compilation, and a filesystem cache for fast rebuilds even after a restart. ?? Out of the box suppor

Parcel 41.8k Jan 4, 2023
This "To-do-list" app is a simple web application that displays a list of task and allows you to add and remove task from that list. it is built with the latest technology namely; JavaScript with webpack Configuration.

To-do-list "To-do-list" is a simple web application that displays a list of task and allows you to add and remove task from that list. Built With HTML

Aniekan udo 10 Nov 21, 2022
Node.js configuration engine

Cofman Node.js configuration engine const { Cofman, FileSource, EnvSourc, ObjectSource } = require("@umbrellio/cofman") const instance = new Cofman()

Umbrellio 5 Jun 12, 2022
a Node.js boilerplate to start creating your telegram bot without too much configuration at the beginning

node-telegram-bot-starter-pack How to use clone the repo run npm install run cp .env.example .env and replace the variables with your data define your

Mohammad MohammadAlian 7 Sep 7, 2022
✨ Create server-rendered universal JavaScript applications with no configuration

Universal JavaScript applications are tough to setup. Either you buy into a framework like Next.js or Nuxt, fork a boilerplate, or set things up yours

Jared Palmer 11k Jan 7, 2023
✨ Create server-rendered universal JavaScript applications with no configuration

Universal JavaScript applications are tough to setup. Either you buy into a framework like Next.js or Nuxt, fork a boilerplate, or set things up yours

Jared Palmer 11k Jan 8, 2023
A toolkit for React, Preact, Inferno & vanilla JS apps, React libraries and other npm modules for the web, with no configuration (until you need it)

nwb nwb is a toolkit for: Quick Development with React, Inferno, Preact or vanilla JavaScript Developing: React Apps Preact Apps Inferno Apps Vanilla

Jonny Buchanan 5.5k Jan 3, 2023
Sanitize untrusted HTML (to prevent XSS) with a configuration specified by a Whitelist

Sanitize untrusted HTML (to prevent XSS) with a configuration specified by a Whitelist. xss is a module used to filter input from users to prevent XSS

老雷 4.8k Jan 2, 2023
📦 Zero-configuration bundler for tiny modules.

Microbundle The zero-configuration bundler for tiny modules, powered by Rollup. Guide → Setup ✯ Formats ✯ Modern Mode ✯ Usage & Configuration ✯ All Op

Jason Miller 7.4k Dec 28, 2022
a simple zero-configuration command-line http server

http-server: a command-line http server http-server is a simple, zero-configuration command-line http server. It is powerful enough for production usa

http ... PARTY! 12.4k Jan 4, 2023
A Browserslist configuration which reflects standardized-audio-context support.

@generative-music/browserslist-config-standardized-audio-context A Browserslist configuration which reflects standardized-audio-context support. This

Generative Music 4 Oct 28, 2022
The Ghost configuration for the blog of Stefan Kühnel.

Railway Ghost Starter The Ghost configuration for a blog hosted on Railway with an external MySQL database. Found a bug? ??‍♀️ Thanks for letting me k

ツ StevyStevson 1 Apr 9, 2022
A custom action for setting GitHub Workflow environment variables with YAML configuration files.

yaml-env-action - A custom action for setting GitHub Workflow environment variables with YAML configuration files. Introduction yaml-env-action is a c

Piper Dougherty 3 Dec 13, 2022