Giter Site home page Giter Site logo

senchopens / base16.nix Goto Github PK

View Code? Open in Web Editor NEW
174.0 3.0 7.0 2.86 MB

Theme applications with your favourite base16 colorschemes in Nix

License: MIT License

Nix 100.00%
base16 base16-manager nixos nixos-module flake nix nix-flake home-manager base16-builder colorschemes

base16.nix's Introduction

logo

demo

Introduction

tinted-theming (continuation of base16) is a framework with hundreds of colorschemes and application configuration templates.

base16.nix combines the expressiveness of Nix with the abundance of tinted-theming to help you theme your setup.

Features

With base16.nix, you can:

  • load base16 and base24 schemes, override them or specify custom ones in YAML / nix, to use across the configuration;
  • theme applications with existing or custom templates.

Note that base16.nix is a simple theming interface, not an all-batteries-included ricing engine β€” but if you want one, check out Stylix, which, among other things, complements base16.nix functionality with pre-defined configuration for common application.

πŸ‘€ Tutorial by Example

In this tutorial, we will use base16.nix as a NixOS module to theme zathura, neovim and alacritty to use the nord scheme (home-manager module works the same way).

Import and set the scheme (step 1/2)

In your NixOS configuration directory:

flake.nix

{ inputs = {
  # Add base16.nix, base16 schemes and
  # zathura and vim templates to the flake inputs.
  base16.url = "github:SenchoPens/base16.nix";

  tt-schemes = {
    url = "github:tinted-theming/schemes";
    flake = false;
  };

  base16-zathura = {
    url = "github:haozeke/base16-zathura";
    flake = false;
  };

  base16-vim = {
    url = "github:tinted-theming/base16-vim";
    flake = false;
  };
  ...
};
outputs = { self, ... } @ inputs {
  ...
    nixosSystem {
      modules = [
        # import the base16.nix module
        base16.nixosModule
        # set system's scheme to nord by setting `config.scheme`
        { scheme = "${inputs.tt-schemes}/base16/nord.yaml"; }
        # import `theming.nix`, we will write it in the next, final, step
        ./theming.nix
        ...
      ];
      # so you can use `inputs` in config files
      specialArgs = {
        inherit inputs;
      };
      ...
    };
  ...
};
... }

Theme (step 2/2)

Now that config.scheme is set, we can use it like a function to create themes from templates.

theming.nix

{ config, pkgs, inputs, ... }:
{
  # Theme zathura
  home-manager.users.sencho.programs.zathura.extraConfig =
    builtins.readFile (config.scheme inputs.base16-zathura);

  # Theme `neovim` β€” more complex, but the principle is the same.
  home-manager.users.sencho.programs.neovim = {
    plugins = [ (pkgs.vimPlugins.base16-vim.overrideAttrs (old:
      let schemeFile = config.scheme inputs.base16-vim;
      in { patchPhase = ''cp ${schemeFile} colors/base16-scheme.vim''; }
    )) ];
    extraConfig = ''
      set termguicolors background=dark
      let base16colorspace=256
      colorscheme base16-scheme
    '';
  };

  # Theme `alacritty`. home-manager doesn't provide an `extraConfig`,
  # but gives us `settings.colors` option of attrs type to set colors. 
  # As alacritty expects colors to begin with `#`, we use an attribute `withHashtag`.
  # Notice that we now use `config.scheme` as an attrset, and that this attrset,
  # besides from having attributes `base00`...`base0F`, has mnemonic attributes (`red`, etc.) -
  # read more on that in the next section.
  home-manager.users.sencho.programs.alacritty.settings.colors =
    with config.scheme.withHashtag; let default = {
        black = base00; white = base07;
        inherit red green yellow blue cyan magenta;
      };
    in {
      primary = { background = base00; foreground = base07; };
      cursor = { text = base02; cursor = base07; };
      normal = default; bright = default; dim = default;
    };
}

That's all, we themed 3 applications!

The attentive reader will notice that after setting config.scheme to a string, we use it as a function (to theme zathura and neovim) and as an attrset (to theme alacritty) β€” that's base16.nix' magic! Read the Documentation section to see how it works.

🍳 How To

Import a scheme from a YAML file
config.scheme = "${inputs.tt-schemes}/base16/nord.yaml";
Override a scheme

We need to explicitly use mkSchemeAttrs function to use the override field of the resulting scheme attrs:

config.scheme = (config.lib.base16.mkSchemeAttrs "${inputs.tt-schemes}/base16/nord.yaml").override {
  scheme = "Now it's my scheme >:]";
  base00 = "000000";  # make background completely black
};
Declare a scheme in Nix
config.scheme = {
  slug = "balsoftheme"; scheme = "Theme by balsoft"; author = "balsoft";
  base00 = "000000"; base01 = "333333"; base02 = "666666"; base03 = "999999";
  base04 = "cccccc"; base05 = "ffffff"; base06 = "e6e6e6"; base07 = "e6e6e6";
  base08 = "bf4040"; base09 = "bf8040"; base0A = "bfbf40"; base0B = "80bf40";
  base0C = "40bfbf"; base0D = "407fbf"; base0E = "7f40bf"; base0F = "bf40bf";
};

source

Use multiple schemes simultaneously

Achieve this by theming without config.scheme β€” by calling mkSchemeAttrs:

home-manager.users.sencho.programs.zathura.extraConfig =
  builtins.readFile (config.lib.base16.mkSchemeAttrs inputs.tt-schemes inputs.base16-zathura);

Without importing base16.nix as a module at all:

home-manager.users.sencho.programs.zathura.extraConfig =
  builtins.readFile ((pkgs.callPackage inputs.base16.lib {}).mkSchemeAttrs inputs.tt-schemes inputs.base16-zathura);
Use template variation

Template repositories often define more than one template variation. For example, zathura template repository defines default.mustache (colors only the interface) and recolor.mustache (colors the interface and pdfs).

By default base16.nix uses default.mustache. To use another template, e.g. recolor.mustache:

home-manager.users.sencho.programs.zathura.extraConfig =
  builtins.readFile (config.scheme {
    templateRepo = inputs.base16-zathura; target = "recolor";
  });
Override a template

Sample use-case: suppose you like zathura's default.mustache template, but want to change the background (default-bg) from base00 to base01.

  1. Override the scheme only for zathura:
home-manager.users.sencho.programs.zathura.extraConfig =
  builtins.readFile ((config.scheme.override {
    base00 = config.scheme.base01;
  }) inputs.base16-zathura);

Keep in mind that by doing so you'll change not only default-bg color, but also inputbar-bg, notification-bg, etc.

  1. Copy-paste the template and modify it:
home-manager.users.sencho.programs.zathura.extraConfig =
  builtins.readFile (config.scheme { template = ''
    ... 
    set default-bg   "#{{base01-hex}}"  # <-- we changed this
    set default-fg   "#{{base01-hex}}"

    set statusbar-fg "#{{base04-hex}}"
    set statusbar-bg "#{{base02-hex}}"
    ...
  ''; });

πŸ“š Documentation

Consult the DOCUMENTATION.md to learn about every feature in detail and see how base16.nix works underhood.

☎️ Troubleshooting

Error / incorrect behavior after updating base16.nix or adding a new source / template

The most probable reason of such an error is incorrectly parsed YAML file of either a scheme or a template.

Fix incorrectly parsed YAML file

  • Enable IFD (but beware of a possible error described below): If the problem is in the scheme YAML file, set the scheme as such:
    config.scheme =  {
      yaml = "${inputs.tt-schemes}/base16/nord.yaml";
      use-ifd = "auto";  # to suppress errors, set to "always"
    };
    If the problem is in the template templates/config.yaml file, turn on use-ifd:
    home-manager.users.sencho.programs.zathura.extraConfig =
      builtins.readFile (config.scheme {
        use-ifd = "always";
        templateRepo = inputs.base16-zathura; target = "recolor";
      });
  • If you think that it's safe to ignore the error on template instantiation, you can turn off the check:
    home-manager.users.sencho.programs.zathura.extraConfig =
      builtins.readFile (config.scheme {
        check-parsed-config-yaml = false;
        templateRepo = inputs.base16-zathura; target = "recolor";
      });
  • If the problem is with a scheme YAML file and the nix evaluates, add the config.scheme.check derivation to your NixOS / home-manager package list, this will indicate which part of the YAML is being parsed incorrectly.
  • Submit an issue.
  • Fix the YAML upstream. Probable causes: trailing spaces, file structure differs from typical config.yaml / scheme YAML files.
  • Fix the Nix parser 😈.

Context: since version v2.0.0 base16.nix parses the YAML file in pure Nix to bypass IFD issues. The parser works for most base16-<scheme-name>.yaml and templates' config.yaml files, but, as YAML can be quite complicated, sometimes they can be parsed incorrectly.

The exact error depends on the point of failure. It will probably be cryptic if incorrect parsing caused an issue during nix evaluation. Otherwise, if your flake evaluates (nix flake check succeeds), the error may look something like this:

error: builder for '/nix/store/snbbfb43qphzfl6xr1mjs0mr8jny66x9-base16-nix-parse-check.drv' failed with exit code 1;
       last 7 log lines:
       > running tests
       > Output of "jd /nix/store/9jvxabhfx9acrysknblg0r2hzvcwv6ab-fromYAML /nix/store/qwmj9cbg7fpi5fvyd2x3kywfbw7hlm8f-parsed-yaml-as-json":
       > @ ["gotcha"]
       > - ["1 2"]
       > + "[ 1 2 ]"
       > Error: /nix/store/qhdqwj0mfp8qn0gq5s95pgd2i57lb09c-source/base16-kandinsky.yaml was parsed incorrectly during nix evaluation.
       > Please consult https://github.com/SenchoPens/base16.nix/tree/main#%EF%B8%8F-troubleshooting

The check that produces this error happens by default for templates by installing a special derivation. You can do it for scheme too by adding the config.scheme.check derivation to your NixOS / home-manager package list, though you might need to set the scheme to { yaml = ...; use-ifd = "auto"; }.

Error on `nix flake check` or `nix flake show`

First, check that you have the most recent version of base16.nix. If the error persists, check that you don't set use-ifd anywhere to "auto" or "always".

Relevant issue: #3.

If neither of the above listed solutions do not work for you, please open an issue.

Anyhow, feel free to open an issue!

πŸ’™ Acknowledgments

Thanks to:

πŸ‘©β€πŸ’» Contributing

Contributions are highly welcome, but please keep in mind I want to keep the code compact.

Testing

To test the module, you can do the following:

  1. Set the flake url to the fork's absolute path: base16.url = "/home/sencho/github.com/SenchoPens/base16.nix";.
  2. Build the configuration:
nix flake lock --update-input base16
nixos-rebuild build --flake . --fast  # NixOS
home-manager build --flake . --no-out-link  # home-manager

Note that you don't have to commit the changes to test them.

base16.nix's People

Contributors

gekoke avatar maksalees avatar musjj avatar senchopens avatar thinkchaos avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

base16.nix's Issues

Color functions

Functions to lighten/darken/hue-shift/etc. colors would be really useful. Sometimes the palette isn't quite enough, so the ability to derive extra colors is always nice to have.

Schemes with dashes in the name don't work.

When doing:

cssScheme = builtins.readFile (config.scheme inputs.base16-waybar);

when

config.scheme = "${inputs.base16-schemes}/gruvbox-dark-hard.yaml";

I get an error like this:

error: builder for '/nix/store/dfm82w1faj8kb4pg67k4p6ak9arnlyx5-gruvbox-dark-hard.drv' failed with exit code 1;
       last 3 log lines:
       > building
       > installing
       > cp: target 'hard.css': No such file or directory

this started after 124820f

`yaml2attrs`/`fromYAML` results in IFD causing `nix flake check` to fail

This particular chain of functions in yaml2attrs leads to IFD, as it forces the derivation to be evaluated before anything else can continue because we need to builtins.readFile from the resulting file.

base16.nix/default.nix

Lines 108 to 113 in 6b404cd

yaml2attrs = yaml:
builtins.fromJSON (builtins.readFile (pkgs.stdenv.mkDerivation {
name = "fromYAML";
phases = [ "buildPhase" ];
buildPhase = "${pkgs.yaml2json}/bin/yaml2json < ${yaml} > $out";
}));

Because stdenv is system-specific, that chain of requirements leads to requiring cross-compilation in order to simply run nix flake check.

It does not appear to be possible to run nix flake check on a flake containing both aarch64-darwin and x86_64-linux host configurations.

$ nf check --show-trace
trace: namaka={"dir":"tests","results":{"ops__keys":true,"ops__metadata":true}}
warning: unknown flake output '__std'
Failed to find a machine for remote build!
derivation: lm95hkshyfvyisjcxs17z4kx5mrcc3md-fromYAML.drv
required (system, features): (x86_64-linux, [])
1 available machines:
(systems, maxjobs, supportedFeatures, mandatoryFeatures)
([aarch64-linux], 4, [kvm], [])
error:
       … while checking flake output 'nixosConfigurations'

         at Β«noneΒ»:0: (source not available)

       … while checking the NixOS configuration 'nixosConfigurations.freundix'

         at Β«noneΒ»:0: (source not available)

       … while calling the 'seq' builtin

         at /nix/store/38rzi6kzh5ilbpdgpvd8aj34vksgkcfa-source/lib/modules.nix:326:18:

          325|         options = checked options;
          326|         config = checked (removeAttrs config [ "_module" ]);
             |                  ^
          327|         _module = checked (config._module);

       … while evaluating a branch condition

         at /nix/store/38rzi6kzh5ilbpdgpvd8aj34vksgkcfa-source/lib/modules.nix:267:9:

          266|       checkUnmatched =
          267|         if config._module.check && config._module.freeformType == null && merged.unmatchedDefns != [] then
             |         ^
          268|           let

       … in the right operand of the AND (&&) operator

         at /nix/store/38rzi6kzh5ilbpdgpvd8aj34vksgkcfa-source/lib/modules.nix:267:72:

          266|       checkUnmatched =
          267|         if config._module.check && config._module.freeformType == null && merged.unmatchedDefns != [] then
             |                                                                        ^
          268|           let

       … while evaluating the attribute 'unmatchedDefns'

         at /nix/store/38rzi6kzh5ilbpdgpvd8aj34vksgkcfa-source/lib/modules.nix:671:7:

          670|       # Transforms unmatchedDefnsByName into a list of definitions
          671|       unmatchedDefns =
             |       ^
          672|         if configs == []

       … while calling the 'concatLists' builtin

         at /nix/store/38rzi6kzh5ilbpdgpvd8aj34vksgkcfa-source/lib/modules.nix:678:11:

          677|         else
          678|           concatLists (mapAttrsToList (name: defs:
             |           ^
          679|             map (def: def // {

       … while calling anonymous lambda

         at /nix/store/38rzi6kzh5ilbpdgpvd8aj34vksgkcfa-source/lib/attrsets.nix:539:10:

          538|     attrs:
          539|     map (name: f name attrs.${name}) (attrNames attrs);
             |          ^
          540|

       … from call site

         at /nix/store/38rzi6kzh5ilbpdgpvd8aj34vksgkcfa-source/lib/attrsets.nix:539:16:

          538|     attrs:
          539|     map (name: f name attrs.${name}) (attrNames attrs);
             |                ^
          540|

       … while calling anonymous lambda

         at /nix/store/38rzi6kzh5ilbpdgpvd8aj34vksgkcfa-source/lib/modules.nix:678:46:

          677|         else
          678|           concatLists (mapAttrsToList (name: defs:
             |                                              ^
          679|             map (def: def // {

       … while calling anonymous lambda

         at /nix/store/38rzi6kzh5ilbpdgpvd8aj34vksgkcfa-source/lib/modules.nix:664:22:

          663|         # Propagate all unmatched definitions from nested option sets
          664|         mapAttrs (n: v: v.unmatchedDefns) resultsByName
             |                      ^
          665|         # Plus the definitions for the current prefix that don't have a matching option

       … while calling anonymous lambda

         at /nix/store/38rzi6kzh5ilbpdgpvd8aj34vksgkcfa-source/lib/attrsets.nix:539:10:

          538|     attrs:
          539|     map (name: f name attrs.${name}) (attrNames attrs);
             |          ^
          540|

       … from call site

         at /nix/store/38rzi6kzh5ilbpdgpvd8aj34vksgkcfa-source/lib/attrsets.nix:539:16:

          538|     attrs:
          539|     map (name: f name attrs.${name}) (attrNames attrs);
             |                ^
          540|

       … while calling anonymous lambda

         at /nix/store/38rzi6kzh5ilbpdgpvd8aj34vksgkcfa-source/lib/modules.nix:678:46:

          677|         else
          678|           concatLists (mapAttrsToList (name: defs:
             |                                              ^
          679|             map (def: def // {

       … while calling anonymous lambda

         at /nix/store/38rzi6kzh5ilbpdgpvd8aj34vksgkcfa-source/lib/modules.nix:664:22:

          663|         # Propagate all unmatched definitions from nested option sets
          664|         mapAttrs (n: v: v.unmatchedDefns) resultsByName
             |                      ^
          665|         # Plus the definitions for the current prefix that don't have a matching option

       … while calling anonymous lambda

         at /nix/store/38rzi6kzh5ilbpdgpvd8aj34vksgkcfa-source/lib/modules.nix:594:46:

          593|       # an attrset 'name' => list of submodules that define β€˜name’.
          594|       defnsByName = byName "config" (module: value:
             |                                              ^
          595|           map (config: { inherit (module) file; inherit config; }) (pushDownProperties value)

       … from call site

         at /nix/store/38rzi6kzh5ilbpdgpvd8aj34vksgkcfa-source/lib/modules.nix:595:69:

          594|       defnsByName = byName "config" (module: value:
          595|           map (config: { inherit (module) file; inherit config; }) (pushDownProperties value)
             |                                                                     ^
          596|         ) configs;

       … while calling 'pushDownProperties'

         at /nix/store/38rzi6kzh5ilbpdgpvd8aj34vksgkcfa-source/lib/modules.nix:826:24:

          825|   */
          826|   pushDownProperties = cfg:
             |                        ^
          827|     if cfg._type or "" == "merge" then

       … from call site

         at /nix/store/fxgkj2xxcz9pn5khyq9f0ddyfpiw854y-source/stylix/palette.nix:128:26:

          127|     # https://github.com/SenchoPens/base16.nix#mktheme
          128|     lib.stylix.colors = (base16.mkSchemeAttrs cfg.base16Scheme).override override;
             |                          ^
          129|     lib.stylix.scheme = base16.mkSchemeAttrs cfg.base16Scheme;

       … while calling 'mkSchemeAttrs'

         at /nix/store/c4ri83y4ka8q5ad1i9b278vp2qch2xx1-source/default.nix:190:5:

          189|     # (see https://github.com/base16-project/home/blob/main/builder.md#schemes-repository).
          190|     scheme:
             |     ^
          191|     let

       … from call site

         at /nix/store/c4ri83y4ka8q5ad1i9b278vp2qch2xx1-source/default.nix:237:25:

          236|
          237|       populatedColors = colors inputAttrs;
             |                         ^
          238|

       … while calling 'colors'

         at /nix/store/c4ri83y4ka8q5ad1i9b278vp2qch2xx1-source/default.nix:44:12:

           43|   */
           44|   colors = scheme:
             |            ^
           45|     let

       … from call site

         at /nix/store/c4ri83y4ka8q5ad1i9b278vp2qch2xx1-source/default.nix:76:18:

           75|
           76|       base-hex = lib.mapAttrs' (k: v: lib.nameValuePair "${k}-hex" v) base;
             |                  ^
           77|       base-short = lib.mapAttrs' (k: v: lib.nameValuePair "${k}" v) base;

       … while calling 'mapAttrs''

         at /nix/store/38rzi6kzh5ilbpdgpvd8aj34vksgkcfa-source/lib/attrsets.nix:518:5:

          517|     # Attribute set to map over.
          518|     set:
             |     ^
          519|     listToAttrs (map (attr: f attr set.${attr}) (attrNames set));

       … from call site

         at /nix/store/c4ri83y4ka8q5ad1i9b278vp2qch2xx1-source/default.nix:50:9:

           49|       base = lib.mapAttrs (_: value: lib.toLower (lib.removePrefix "#" value)) (
           50|         lib.filterAttrs (name: _: lib.hasPrefix "base" name && builtins.stringLength name == 6) scheme
             |         ^
           51|       );

       … while calling 'filterAttrs'

         at /nix/store/38rzi6kzh5ilbpdgpvd8aj34vksgkcfa-source/lib/attrsets.nix:305:5:

          304|     # The attribute set to filter
          305|     set:
             |     ^
          306|     listToAttrs (concatMap (name: let v = set.${name}; in if pred name v then [(nameValuePair name v)] else []) (attrNames set));

       … from call site

         at /nix/store/c4ri83y4ka8q5ad1i9b278vp2qch2xx1-source/default.nix:202:12:

          201|           //
          202|           (yaml2attrs scheme)
             |            ^
          203|         ;

       … while calling 'yaml2attrs'

         at /nix/store/c4ri83y4ka8q5ad1i9b278vp2qch2xx1-source/default.nix:108:16:

          107|
          108|   yaml2attrs = yaml:
             |                ^
          109|     builtins.fromJSON (builtins.readFile (pkgs.stdenv.mkDerivation {

       error: a 'x86_64-linux' with features {} is required to build '/nix/store/lm95hkshyfvyisjcxs17z4kx5mrcc3md-fromYAML.drv', but I am a 'aarch64-darwin' with features {benchmark, big-parallel, nixos-test}
7.63s user 1.97s system 51% cpu 18.808s total

`escapeShellArg` breaks using paths as `template`

The following error message is written to file instead of the output.

Error: open /nix/store/syncbcpk5c9s0cl7cq203dhh2wab9kkz-source/stylix/palette.json.mustache: no such file or directory

It seems like running the path through escapeShellArg stops it being listed as an input to the derivation, so presumably the sandbox is hiding it. It definitely exists from my perspective.

The build succeeds when escapeShellArg is removed, however I can see why that might be necessary if the name contains spaces.

`nix flake check` and rebuild fails after update

error:
       … while checking flake output 'nixosConfigurations'

         at /nix/store/z7bz1jaafr7mxi9swrk684cgn25zbava-source/flake.nix:39:5:

           38|   outputs = { self, nixpkgs, ... } @ inputs: {
           39|     nixosConfigurations = import ./hosts inputs;
             |     ^
           40|   };

       … while checking the NixOS configuration 'nixosConfigurations.noelle'

         at /nix/store/z7bz1jaafr7mxi9swrk684cgn25zbava-source/hosts/default.nix:19:5:

           18|   in {
           19|     noelle = nixpkgs.lib.nixosSystem {
             |     ^
           20|       inherit system;

       (stack trace truncated; use '--show-trace' to show the full trace)

       error: attribute '"\""' missing

       at /nix/store/4wg7s6z4hmv6x7a8nzr6nznd1mz0x5cw-source/default.nix:23:12:

           22|     in
           23|       16 * hex2decDigits."${builtins.substring 0 1 hex}"
             |            ^
           24|       + hex2decDigits."${builtins.substring 1 2 hex}";
       Did you mean one of 0, 1, 2, 3 or 4?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    πŸ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. πŸ“ŠπŸ“ˆπŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❀️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.