Giter VIP home page Giter VIP logo

ryan4yin / nix-config Goto Github PK

View Code? Open in Web Editor NEW
810.0 7.0 49.0 41.46 MB

❄️ my nix config for both desktops(NixOS+macOS) and homelab servers(NixOS).

Home Page: https://nixos-and-flakes.thiscute.world

License: MIT License

Nix 51.59% Shell 33.19% Python 1.11% Lua 7.27% CSS 0.80% Nushell 1.30% Emacs Lisp 3.14% Just 1.59%
nixos nixos-configuration nix dotfiles nix-flake nix-flakes hyprland i3 ricing rice unixporn

nix-config's Introduction

❄️ Ryan4Yin's Nix Config ❄️

Stargazers

My configuration is becoming more and more complex, and it will be difficult for beginners to read. If you are new to NixOS and want to know how I use NixOS, I would recommend you to take a look at the ryan4yin/nix-config/releases first, checkout to some simpler older versions, such as i3-kickstarter, which will be much easier to understand.

This repository is home to the nix code that builds my systems:

  1. NixOS Desktops: NixOS with home-manager, i3, hyprland, agenix, etc.
  2. macOS Desktops: nix-darwin with home-manager, share the same home-manager configuration with NixOS Desktops.
  3. NixOS Servers: virtual machines running on Proxmox/KubeVirt, with various services, such as kubernetes, homepage, prometheus, grafana, etc.

See ./hosts for details of each host.

See ./Virtual-Machine.md for details of how to create & manage KubeVirt's Virtual Machine from this flake.

Why NixOS & Flakes?

Nix allows for easy-to-manage, collaborative, reproducible deployments. This means that once something is setup and configured once, it works (almost) forever. If someone else shares their configuration, anyone else can just use it (if you really understand what you're copying/refering now).

As for Flakes, refer to Introduction to Flakes - NixOS & Nix Flakes Book

Want to know NixOS & Flaks in detail? Looking for a beginner-friendly tutorial or best practices? You don't have to go through the pain I've experienced again! Check out my NixOS & Nix Flakes Book - 🛠️ ❤️ An unofficial & opinionated 📖 for beginners!

If you're using macOS, check out ryan4yin/nix-darwin-kickstarter for a quick start.

Components

NixOS(Wayland) NixOS(Xorg)
Window Manager Hyprland i3
Terminal Emulator Zellij + Kitty Zellij + Kitty
Bar Waybar polybar
Application Launcher anyrun rofi
Notification Daemon Mako Dunst
Display Manager GDM GDM
Color Scheme Catppuccin Catppuccin
network management tool NetworkManager NetworkManager
Input method framework Fcitx5 Fcitx5
System resource monitor Btop Btop
File Manager Yazi + thunar Yazi + thunar
Shell Nushell + Starship Nushell + Starship
Music Player mpd, ncmpcpp, mpc, Netease-cloud-music-gtk Netease-cloud-music-gtk
Media Player mpv mpv
Text Editor Neovim + DoomEmacs Neovim + DoomEmacs
Fonts Nerd fonts Nerd fonts
Image Viewer imv imv
Screenshot Software flameshot + grim flameshot
Screen Recording OBS OBS
Filesystem & Encryption tmpfs on /, Btrfs subvolumes on a LUKS encrypted partition for persistent, unlock via passphrase tmpfs on /, Btrfs subvolumes on a LUKS encrypted partition for persistent, unlock via passphrase
Secure Boot lanzaboote lanzaboote

Wallpapers: https://github.com/ryan4yin/wallpapers

Hyprland + AstroNvim + DoomEmacs

I3 + AstroNvim

Neovim

See ./home/base/tui/editors/neovim/ for details.

Emacs

See ./home/base/tui/editors/emacs/ for details.

Secrets Management

See ./secrets for details.

How to Deploy this Flake?

🔴 IMPORTANT: You should NOT deploy this flake directly on your machine :exclamation: It will not succeed. This flake contains my hardware configuration(such as hardware-configuration.nix, Nvidia Support, etc.) which is not suitable for your hardwares, and requires my private secrets repository ryan4yin/nix-secrets to deploy. You may use this repo as a reference to build your own configuration.

For NixOS:

To deploy this flake from NixOS's official ISO image(purest installation method), please refer to ./nixos-installer/

Need to restart the machine when switching between wayland and xorg.

# deploy one of the configuration based on the hostname
# sudo nixos-rebuild switch --flake .#ai_i3
sudo nixos-rebuild switch --flake .#ai-hyprland

# deploy via `just`(a command runner with similar syntax to make) & Justfile
# just i3    # deploy my pc with i3 window manager
just hypr  # deploy my pc with hyprland compositor

# or we can deploy with details
# just i3 debug
just hypr debug

For macOS:

# If you are deploying for the first time,
# 1. install nix & homebrew manually.
# 2. prepare the deployment environment with essential packages available
nix-shell -p just nushell
# 3. comment home-manager's code in lib/macosSystem.nix to speed up the first deplyment.
# 4. comment out the proxy settings in scripts/darwin_set_proxy.py if the proxy is not ready yet.

# 4. deploy harmonica's configuration(macOS Intel)
just ha

# deploy fern's configuration(Apple Silicon)
just fe

# deploy with details
just ha debug
# just fe debug

What y'all will need when Nix drives you to drink. (copy from hlissner's dotfiles, it really matches my feelings when I first started using NixOS...)

References

Other dotfiles that inspired me:

nix-config's People

Contributors

balssh avatar dataeraserc avatar dependabot[bot] avatar he0119 avatar kluen avatar piyoki avatar ryan4yin avatar shelken avatar sxyazi avatar we-do-it-lu avatar yocoldle avatar zhpjy 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  avatar  avatar  avatar  avatar

nix-config's Issues

nix package installed by nix-darwin ignore the `PATH` env passed by the parent process

Test Result on macOS with nix-darwin:

# remove bashrc to avoid interfering with test results
$ sudo rm -rf ~/.bashrc

# 1. bash installed by nix-darwin ignored the `PATH` env passed by the parent process
$ PATH=XXX /run/current-system/sw/bin/bash
bash-5.2$ echo $PATH
/Users/ryan/.nix-profile/bin:/etc/profiles/per-user/ryan/bin:/run/current-system/sw/bin:/nix/var/nix/profiles/default/bin:/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin

bash-5.2$ exit
exit

# 2. macOS's builtin bash read the passed `PATH` successfully
$ PATH=XXX /bin/bash

The default interactive shell is now zsh.
To update your account to use zsh, please run `chsh -s /bin/zsh`.
For more details, please visit https://support.apple.com/kb/HT208050.
bash-3.2$ echo $PATH
XXX

I'd love some advice on getting flakes to use private repos

Hi! Love reading through your config for inspiration!
I noticed that you use a private repo in your flake inputs. I'm trying to do a similar thing with my own private repo in my dotfiles, but I keep seeing Permission denied (publickey). I have git happily set up for my user, but since I have to use sudo for nixos-rebuild, that ssh doesn't have the right access.

Also, it feels like there would be a chicken and egg problem. How does the nix configuration know to setup the righ ssh configuration before it's been run the first time?

Anyway, I'd love any advice or resources you have. Thanks!

在引入 clang-unwrapped 情况下,go运行错误

虽然我跟您的配置不完全一致,但是在只引入该包的情况下,在我的电脑上(darwin),直接运行 go run . 发现以下错误:

# runtime/cgo
cgo-builtin-prolog:1:10: fatal error: 'stddef.h' file not found
#include <stddef.h>
         ^~~~~~~~~~
1 error generated

去掉就正常了。不知道你是否能复现?

nixos-installer swapfile

Hi Ryan,

I've really enjoyed your book and reading your thorough notes in the config files. When reviewing your nixos-installer I noticed that you are creating a 96g swapfile. This seemed excessive to me and I was wondering what the rationale is. I know you are using impermanence and loading into tmpfs, so perhaps its due to system compiling downloads?

Also, sorry if this question isn't appropriate for github issues. Feel free to close and delete if you don't want to answer.

[Feature] Refactor the code to make it more maintainable and readable

Why refactoring is needed?

My nix config was very simple at the beginning, but as I kept updating and adding new things, it became more and more complicated.

The current pain points of this project is:

  1. It's hard to read.
  2. It's hard to add a new host into the config, I have to edit several nix file very carefully.
  3. Every time I modified some shared configs, I have to deploy and test it on all my 20 hosts, which consumes energy and time.
  4. It's hard to refactor the config, nix's error message is obscure, and my poor project structure made it even worse.

The goal I want to achieve through refactoring

Sort by priority:

  • Make it simple and easy to add a new host. #79
  • Make refactoring and code modification more quickly and smoother by
    • Adding eval tests #88
    • Adding integration tests #93
  • Make it more readable, to myself.(Readability to beginners will not be considered...) #79

Full disk encryption with TPM and Secure Boot

Related to:

agenix not found

Hi Mate,

Trying to follow your steps @ https://github.com/ryan4yin/nix-config/tree/main/secrets ..

But I am getting:

[fs@nixos:~/projects/nix-config]$ nix shell nixpkgs#agenix
error: flake 'flake:nixpkgs' does not provide attribute 'packages.x86_64-linux.agenix', 'legacyPackages.x86_64-linux.agenix' or 'agenix'
       Did you mean one of agebox or agenda?

[fs@nixos:~/projects/nix-config]$

(this is all the same weather I try to run this on a NixOS machine (vanila config with only SSH and flakes enabled, no other changes in the /etc/nixos/configuration.nix

# /etc/nixos/configuration.nix

...
  # Enable the Flakes feature and the accompanying new nix command-line tool
  nix.settings.experimental-features = [ "nix-command" "flakes" ];
...
services.openssh.enable = true;
...

Any suggestion what I am missing?

Ta,
FS.

hyprland 在 home-manager 下的配置无法运行。

首先感谢大佬的NIX手册,跟着入了NIX的坑。
本来在arch上单独使用NIX,最近下定决心转向NIXOS,但是在hyprland配置上有些问题请教下大佬~

参考大佬的配置,发现 hyprland 也是配置在nixos下了,请问是否也是在 home-manager 下配置 hyprland 无法启动?
配置和大佬也是类似的 intel + nvidia 双GPU,同样配置在 nixos 下面正常启动,使用 home-manager 的配置就不行。

typo

modules/nixos/base/visualisation.nix => modules/nixos/base/virtualization.nix

Astronvim with telescope-fzf-native-nvim

First of all, thank you for your amazing work in creating documentation about the Nixos ecosystem. As a newbie like me, it's a gold mine!

I was very inspired by your dotfiles to build mine and rebuild my workstation with Nixos. I plan to migrate all my VMs from Debian to Nixos, so I start with my workstation and try to install Astronvim as IDE.

At first glance everything seems to work with your dotfiles, but I get a nasty error message on startup:
image

It seems to be related to telescope-fzf-native-nvim, but Telescope seems to be functional:
image

I don't really understand what this means. Can you please enlighten me ? Here is my repo with my dotfiles.

[Bug]QQ:Cannot be launched normally at some situation(with possible solutions)

Describe the bug

QQ can not be launched

I'm not quite sure if the problem is due to my improper operation.

Steps To Reproduce

Steps to reproduce the behavior:

  1. In Hyprland environment , launch QQ from anyrun/terminal

Expected behavior

QQ can be launched normally

Metadata

Please run nix-shell -p nix-info --run "nix-info -m" and paste the result.

[user@system:~]$ nix-shell -p nix-info --run "nix-info -m"
 - system: `"x86_64-linux"`
 - host os: `Linux 6.6.7-xanmod1, NixOS, 23.11 (Tapir), 23.11.20231218.d02ffbb`
 - multi-user?: `yes`
 - sandbox: `yes`
 - version: `nix-env (Nix) 2.18.1`
 - channels(nixos): `"home-manager-23.05.tar.gz, nixpkgs"`
 - channels(root): `"nixos-23.05, nixos-hardware"`
 - nixpkgs: `/etc/nix/inputs/nixpkgs`

Possible solutions

temporarily use QQ from nixpkgs-unstable

rsync是否需要加上`--checksum`参数?

rsync -avz --progress --copy-links result $remote

相同名字,且修改日期相同时(size不同)。发现rsync并没有正常传输。(可以尝试下,并用sha256sum检查),两边文件的sha256sum值不一样。
加入checksum参数后,两边重新sha256sum后,相同了

nixos-install error with modules.nix

Hi, I am new to Nixos and wanted to have quickstart with your awesome config, but I am stuck with an error while using "nixos-install ....".

Not sure if I made mistake or if it is a general error. So I decided to post here after a long search on google.

Used command:
nixos-install --root /mnt --flake .#ai --no-root-password --option substituters "https://mirror.sjtu.edu.cn/nix-channels/store"

Error:

building the flake in git+file:///root/nix-config...
warning: Git tree '/root/nix-config' is dirty
error:
       … while calling the 'seq' builtin
 
         at /mnt/nix/store/gjd1iiwgwv7x29b21ng2dpysbgjp6kxr-source/lib/modules.nix:320:18:
 
          319|         options = checked options;
          320|         config = checked (removeAttrs config [ "_module" ]);
             |                  ^
          321|         _module = checked (config._module);
 
       … while evaluating a branch condition
 
         at /mnt/nix/store/gjd1iiwgwv7x29b21ng2dpysbgjp6kxr-source/lib/modules.nix:261:9:
 
          260|       checkUnmatched =
          261|         if config._module.check && config._module.freeformType == null && merged.unmatchedDefns != [] then
             |         ^
          262|           let
 
       (stack trace truncated; use '--show-trace' to show the full trace)
 
       error: infinite recursion encountered
 
       at /mnt/nix/store/gjd1iiwgwv7x29b21ng2dpysbgjp6kxr-source/lib/modules.nix:506:28:
 
          505|         builtins.addErrorContext (context name)
          506|           (args.${name} or config._module.args.${name})
             |                            ^
          507|       ) (lib.functionArgs f);

Thanks for your help in advance.

Need help in setting up VPN in nixOS

Hello,

I've read your tutorial on nixOS and it's great! I was wondering if you would be willing to share your config for VPN clients like clash and v2ray. I've been trying to set up a VPN on my nixOS machine for a while now but haven't found a good solution. I hope I can learn from your approach.
It would be really helpful if you could share any solution or suggestions. Thank you in advance for your assistance.

got error when trying to nixos-install --root /mnt --flake .#ai --no-root-password --show-trace

i am beginner of nixos try to Deploying nixos-installer and flow the execute cmd and i got errors when i execute

nixos-install --root /mnt --flake .#ai --no-root-password --show-trace # instlall-1

errors at first launch:

Details

[nix-shell:~/nix-config/nixos-installer]$ nixos-install --root /mnt --flake .#ai --no-root-password --show-trace # instlall-1
warning: Git tree '/home/nixos/nix-config' is dirty
warning: updating lock file '/home/nixos/nix-config/nixos-installer/flake.lock':
• Updated input 'nixos-hardware':
'github:NixOS/nixos-hardware/7763c6fd1f299cb9361ff2abf755ed9619ef01d6' (2023-12-13)
→ 'github:NixOS/nixos-hardware/3f7d0bca003eac1a1a7f4659bbab9c8f8c2a0958' (2024-02-22)
warning: Git tree '/home/nixos/nix-config' is dirty
mktemp: failed to create directory via template ‘/mnt/tmp.XXXXXXXXXX’: Permission denied

[nix-shell:~/nix-config/nixos-installer]$ sudo nixos-install --root /mnt --flake .#ai --no-root-password --show-trace # instlall-1
warning: Git tree '/home/nixos/nix-config' is dirty
copying channel...
building the flake in git+file:///home/nixos/nix-config?dir=nixos-installer...
warning: Git tree '/home/nixos/nix-config' is dirty
error:
… while calling the 'seq' builtin

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/lib/modules.nix:320:18:

      319|         options = checked options;
      320|         config = checked (removeAttrs config [ "_module" ]);
         |                  ^
      321|         _module = checked (config._module);

   … while evaluating a branch condition

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/lib/modules.nix:261:9:

      260|       checkUnmatched =
      261|         if config._module.check && config._module.freeformType == null && merged.unmatchedDefns != [] then
         |         ^
      262|           let

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

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/lib/modules.nix:261:72:

      260|       checkUnmatched =
      261|         if config._module.check && config._module.freeformType == null && merged.unmatchedDefns != [] then
         |                                                                        ^
      262|           let

   … while evaluating the attribute 'unmatchedDefns'

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/lib/modules.nix:686:7:

      685|       # Transforms unmatchedDefnsByName into a list of definitions
      686|       unmatchedDefns =
         |       ^
      687|         if configs == []

   … while calling the 'concatLists' builtin

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/lib/modules.nix:693:11:

      692|         else
      693|           concatLists (mapAttrsToList (name: defs:
         |           ^
      694|             map (def: def // {

   … while calling anonymous lambda

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/lib/attrsets.nix:615:10:

      614|     attrs:
      615|     map (name: f name attrs.${name}) (attrNames attrs);
         |          ^
      616|

   … from call site

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/lib/attrsets.nix:615:16:

      614|     attrs:
      615|     map (name: f name attrs.${name}) (attrNames attrs);
         |                ^
      616|

   … while calling anonymous lambda

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/lib/modules.nix:693:46:

      692|         else
      693|           concatLists (mapAttrsToList (name: defs:
         |                                              ^
      694|             map (def: def // {

   … while calling anonymous lambda

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/lib/modules.nix:679:22:

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

   … while calling anonymous lambda

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/lib/attrsets.nix:615:10:

      614|     attrs:
      615|     map (name: f name attrs.${name}) (attrNames attrs);
         |          ^
      616|

   … from call site

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/lib/attrsets.nix:615:16:

      614|     attrs:
      615|     map (name: f name attrs.${name}) (attrNames attrs);
         |                ^
      616|

   … while calling anonymous lambda

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/lib/modules.nix:693:46:

      692|         else
      693|           concatLists (mapAttrsToList (name: defs:
         |                                              ^
      694|             map (def: def // {

   … while calling anonymous lambda

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/lib/modules.nix:679:22:

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

   … while calling anonymous lambda

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/lib/attrsets.nix:615:10:

      614|     attrs:
      615|     map (name: f name attrs.${name}) (attrNames attrs);
         |          ^
      616|

   … from call site

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/lib/attrsets.nix:615:16:

      614|     attrs:
      615|     map (name: f name attrs.${name}) (attrNames attrs);
         |                ^
      616|

   … while calling anonymous lambda

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/lib/modules.nix:693:46:

      692|         else
      693|           concatLists (mapAttrsToList (name: defs:
         |                                              ^
      694|             map (def: def // {

   … while calling anonymous lambda

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/lib/modules.nix:679:22:

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

   … while calling anonymous lambda

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/lib/modules.nix:627:39:

      626|
      627|       resultsByName = mapAttrs (name: decls:
         |                                       ^
      628|         # We're descending into attribute ‘name’.

   … while calling anonymous lambda

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/lib/modules.nix:634:14:

      633|           optionDecls = filter
      634|             (m: m.options?_type
         |              ^
      635|                 && (m.options._type == "option"

   … from call site

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/lib/attrsets.nix:160:39:

      159|         then value
      160|         else { ${elemAt attrPath n} = atDepth (n + 1); };
         |                                       ^
      161|     in atDepth 0;

   … while calling 'atDepth'

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/lib/attrsets.nix:157:17:

      156|       len = length attrPath;
      157|       atDepth = n:
         |                 ^
      158|         if n == len

   … from call site

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/lib/modules.nix:1270:12:

     1269|         apply = x: use (toOf config);
     1270|       } // optionalAttrs (toType != null) {
         |            ^
     1271|         type = toType;

   … while calling 'optionalAttrs'

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/lib/attrsets.nix:781:5:

      780|     # The attribute set to return if `cond` is `true`.
      781|     as:
         |     ^
      782|     if cond then as else {};

   … from call site

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/lib/modules.nix:1263:26:

     1262|         (abort "Renaming error: option `${showOption to}' does not exist.");
     1263|       toType = let opt = attrByPath to {} options; in opt.type or (types.submodule {});
         |                          ^
     1264|     in

   … while calling 'attrByPath'

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/lib/attrsets.nix:36:5:

       35|     # The nested attribute set to select values from
       36|     set:
         |     ^
       37|     let attr = head attrPath;

   … from call site

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/lib/attrsets.nix:41:12:

       40|       else if set ? ${attr}
       41|       then attrByPath (tail attrPath) default set.${attr}
         |            ^
       42|       else default;

   … while calling 'attrByPath'

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/lib/attrsets.nix:36:5:

       35|     # The nested attribute set to select values from
       36|     set:
         |     ^
       37|     let attr = head attrPath;

   … from call site

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/lib/attrsets.nix:41:12:

       40|       else if set ? ${attr}
       41|       then attrByPath (tail attrPath) default set.${attr}
         |            ^
       42|       else default;

   … while calling 'attrByPath'

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/lib/attrsets.nix:36:5:

       35|     # The nested attribute set to select values from
       36|     set:
         |     ^
       37|     let attr = head attrPath;

   … from call site

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/lib/attrsets.nix:41:12:

       40|       else if set ? ${attr}
       41|       then attrByPath (tail attrPath) default set.${attr}
         |            ^
       42|       else default;

   … while calling 'attrByPath'

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/lib/attrsets.nix:36:5:

       35|     # The nested attribute set to select values from
       36|     set:
         |     ^
       37|     let attr = head attrPath;

   … while calling anonymous lambda

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/lib/modules.nix:674:37:

      673|
      674|       matchedOptions = mapAttrs (n: v: v.matchedOptions) resultsByName;
         |                                     ^
      675|

   … from call site

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/lib/modules.nix:644:32:

      643|             in {
      644|               matchedOptions = evalOptionValue loc opt defns';
         |                                ^
      645|               unmatchedDefns = [];

   … while calling 'evalOptionValue'

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/lib/modules.nix:778:31:

      777|      config value. */
      778|   evalOptionValue = loc: opt: defs:
         |                               ^
      779|     let

   … from call site

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/lib/modules.nix:803:9:

      802|       warnDeprecation =
      803|         warnIf (opt.type.deprecationMessage != null)
         |         ^
      804|           "The type `types.${opt.type.name}' of option `${showOption loc}' defined in ${showFiles opt.declarations} is deprecated. ${opt.type.deprecationMessage}";

   … while calling 'warnIf'

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/lib/trivial.nix:357:18:

      356|   */
      357|   warnIf = cond: msg: if cond then warn msg else x: x;
         |                  ^
      358|

   … from call site

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/lib/modules.nix:642:23:

      641|           if length optionDecls == length decls then
      642|             let opt = fixupOptionType loc (mergeOptionDecls loc decls);
         |                       ^
      643|             in {

   … while calling 'fixupOptionType'

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/lib/modules.nix:955:26:

      954|   # TODO: Merge this into mergeOptionDecls
      955|   fixupOptionType = loc: opt:
         |                          ^
      956|     if opt.type.getSubModules or null == null

   … while calling anonymous lambda

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/lib/modules.nix:504:44:

      503|       context = name: ''while evaluating the module argument `${name}' in "${key}":'';
      504|       extraArgs = builtins.mapAttrs (name: _:
         |                                            ^
      505|         builtins.addErrorContext (context name)

   … while evaluating the module argument `pkgs' in "/mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/nixos/modules/services/hardware/bluetooth.nix":

   … while calling anonymous lambda

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/lib/types.nix:581:29:

      580|       merge = loc: defs:
      581|         zipAttrsWith (name: defs:
         |                             ^
      582|           let merged = mergeDefinitions (loc ++ [name]) elemType defs;

   … while calling anonymous lambda

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/lib/modules.nix:832:19:

      831|           # Avoid sorting if we don't have to.
      832|           if any (def: def.value._type or "" == "order") defs''.values
         |                   ^
      833|           then sortProperties defs''.values

   … from call site

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/nixos/modules/misc/nixpkgs.nix:86:7:

       85|       in
       86|       import ../../.. ({
         |       ^
       87|         inherit (cfg) config overlays;

   … while calling anonymous lambda

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/pkgs/top-level/impure.nix:14:1:

       13|
       14| { # We put legacy `system` into `localSystem`, if `localSystem` was not passed.
         | ^
       15|   # If neither is passed, assume we are building packages on the current

   … from call site

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/pkgs/top-level/impure.nix:87:1:

       86|
       87| import ./. (builtins.removeAttrs args [ "system" ] // {
         | ^
       88|   inherit config overlays localSystem;

   … while calling anonymous lambda

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/pkgs/top-level/default.nix:19:1:

       18|
       19| { # The system packages will be built on. See the manual for the
         | ^
       20|   # subtle division of labor between these two `*System`s and the three

   … from call site

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/pkgs/top-level/default.nix:55:5:

       54|   checked =
       55|     throwIfNot (lib.isList overlays) "The overlays argument to nixpkgs must be a list."
         |     ^
       56|     lib.foldr (x: throwIfNot (lib.isFunction x) "All overlays passed to nixpkgs must be functions.") (r: r) overlays

   … while calling 'throwIfNot'

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/lib/trivial.nix:386:22:

      385|   */
      386|   throwIfNot = cond: msg: if cond then x: x else throw msg;
         |                      ^
      387|

   … while calling 'g'

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/lib/attrsets.nix:701:19:

      700|           g =
      701|             name: value:
         |                   ^
      702|             if isAttrs value && cond value

   … from call site

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/lib/attrsets.nix:704:20:

      703|               then recurse (path ++ [name]) value
      704|               else f (path ++ [name]) value;
         |                    ^
      705|         in mapAttrs g;

   … while calling anonymous lambda

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/lib/modules.nix:242:72:

      241|           # For definitions that have an associated option
      242|           declaredConfig = mapAttrsRecursiveCond (v: ! isOption v) (_: v: v.value) options;
         |                                                                        ^
      243|

   … while evaluating the option `nixpkgs.overlays':

   … from call site

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/lib/modules.nix:844:59:

      843|       if isDefined then
      844|         if all (def: type.check def.value) defsFinal then type.merge loc defsFinal
         |                                                           ^
      845|         else let allInvalid = filter (def: ! type.check def.value) defsFinal;

   … while calling 'merge'

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/lib/types.nix:526:20:

      525|       check = isList;
      526|       merge = loc: defs:
         |                    ^
      527|         map (x: x.value) (filter (x: x ? value) (concatLists (imap1 (n: def:

   … while calling anonymous lambda

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/lib/types.nix:527:35:

      526|       merge = loc: defs:
      527|         map (x: x.value) (filter (x: x ? value) (concatLists (imap1 (n: def:
         |                                   ^
      528|           imap1 (m: def':

   … while calling anonymous lambda

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/lib/lists.nix:165:29:

      164|   */
      165|   imap1 = f: list: genList (n: f (n + 1) (elemAt list n)) (length list);
         |                             ^
      166|

   … from call site

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/lib/lists.nix:165:32:

      164|   */
      165|   imap1 = f: list: genList (n: f (n + 1) (elemAt list n)) (length list);
         |                                ^
      166|

   … while calling anonymous lambda

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/lib/types.nix:528:21:

      527|         map (x: x.value) (filter (x: x ? value) (concatLists (imap1 (n: def:
      528|           imap1 (m: def':
         |                     ^
      529|             (mergeDefinitions

   … while calling anonymous lambda

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/lib/modules.nix:822:28:

      821|         # Process mkMerge and mkIf properties.
      822|         defs' = concatMap (m:
         |                            ^
      823|           map (value: { inherit (m) file; inherit value; }) (builtins.addErrorContext "while evaluating definitions from `${m.file}':" (dischargeProperties m.value))

   … while evaluating definitions from `/mnt/nix/store/89nap4m4x275gy6mkkngh7b5yzhj3gsm-source/modules/base.nix':

   … from call site

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/lib/modules.nix:823:137:

      822|         defs' = concatMap (m:
      823|           map (value: { inherit (m) file; inherit value; }) (builtins.addErrorContext "while evaluating definitions from `${m.file}':" (dischargeProperties m.value))
         |                                                                                                                                         ^
      824|         ) defs;

   … while calling 'dischargeProperties'

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/lib/modules.nix:894:25:

      893|   */
      894|   dischargeProperties = def:
         |                         ^
      895|     if def._type or "" == "merge" then

   … while calling anonymous lambda

     at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/lib/modules.nix:504:44:

      503|       context = name: ''while evaluating the module argument `${name}' in "${key}":'';
      504|       extraArgs = builtins.mapAttrs (name: _:
         |                                            ^
      505|         builtins.addErrorContext (context name)

   … while evaluating the module argument `nuenv' in "/mnt/nix/store/89nap4m4x275gy6mkkngh7b5yzhj3gsm-source/modules/base.nix":

   error: attribute 'nuenv' missing

   at /mnt/nix/store/lnbafzxw52r0w55hwbcrsdkvk5fymv3l-source/lib/modules.nix:506:28:

      505|         builtins.addErrorContext (context name)
      506|           (args.${name} or config._module.args.${name})
         |                            ^
      507|       ) (lib.functionArgs f);

secend launch and more..
sudo nixos-install --root /mnt --flake .#ai --no-root-password --show-trace # instlall-1
warning: Git tree '/home/nixos/nix-config' is dirty
copying channel...
building the flake in git+file:///home/nixos/nix-config?dir=nixos-installer...
warning: Git tree '/home/nixos/nix-config' is dirty
error: cached failure of attribute 'nixosConfigurations.ai.config'

OS

nixos kde-plasma version 23.11 USB iso boot

hardware

PC intel i5 + NVIDIA 1060
so i only modified nix-config/hosts/idols_ai/hardware-configuration.nix

/dev/disk/by-uuid/xxx

my disk info

lsblk
NAME              MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINTS
loop0               7:0    0   2.5G  1 loop  /nix/.ro-store
sda                 8:0    1 116.5G  0 disk  
├─sda1              8:1    1 116.4G  0 part  
│ └─ventoy        254:0    0   2.5G  1 dm    /iso
└─sda2              8:2    1    32M  0 part  
nvme0n1           259:0    0 476.9G  0 disk  
├─nvme0n1p1       259:1    0   100M  0 part  
├─nvme0n1p2       259:2    0    16M  0 part  
├─nvme0n1p3       259:3    0   200G  0 part  
├─nvme0n1p4       259:4    0   667M  0 part  
├─nvme0n1p5       259:5    0    50G  0 part  
├─nvme0n1p6       259:11   0     1G  0 part  /mnt/boot
└─nvme0n1p7       259:12   0 225.2G  0 part  
  └─crypted-nixos 254:1    0 225.2G  0 crypt /mnt/snapshots
                                             /mnt/persistent
                                             /mnt/swap
                                             /mnt/tmp
                                             /mnt/gnu
                                             /mnt/nix
df -Th
Filesystem                Type      Size  Used Avail Use% Mounted on
devtmpfs                  devtmpfs  798M     0  798M   0% /dev
tmpfs                     tmpfs     7.8G   12M  7.8G   1% /dev/shm
tmpfs                     tmpfs     3.9G  5.5M  3.9G   1% /run
tmpfs                     tmpfs     7.8G  1.2M  7.8G   1% /run/wrappers
tmpfs                     tmpfs     7.8G  275M  7.6G   4% /
/dev/root                 iso9660   2.6G  2.6G     0 100% /iso
/dev/loop0                squashfs  2.5G  2.5G     0 100% /nix/.ro-store
tmpfs                     tmpfs     7.8G  479M  7.4G   7% /nix/.rw-store
overlay                   overlay   7.8G  479M  7.4G   7% /nix/store
tmpfs                     tmpfs     1.6G  7.3M  1.6G   1% /run/user/1000
/dev/mapper/crypted-nixos btrfs     226G  1.4G  223G   1% /mnt/nix
/dev/mapper/crypted-nixos btrfs     226G  1.4G  223G   1% /mnt/gnu
/dev/mapper/crypted-nixos btrfs     226G  1.4G  223G   1% /mnt/tmp
/dev/mapper/crypted-nixos btrfs     226G  1.4G  223G   1% /mnt/swap
/dev/mapper/crypted-nixos btrfs     226G  1.4G  223G   1% /mnt/persistent
/dev/mapper/crypted-nixos btrfs     226G  1.4G  223G   1% /mnt/snapshots
/dev/nvme0n1p6            vfat     1022M  4.0K 1022M   1% /mnt/boot

[Bug] the latest version of atuin in nixpkgs has problem to work with the latest version of nushell

Issue Description

Bug

The latest version of Atuin in nixpkgs is not working properly with the latest version of Nushell.

Problem Details

The atuin tool faces issues when used in the latest version of Nushell. Refer to the issue raised at the Atuin repository for more information: atuinsh/atuin#1934.

Possible Solutions

  1. Temporarily disable atuin.enableNushellIntegration.
  2. Try substituting the value of programs.atuin.package with a different nix flake that offers an updated version of Atuin.
  3. Consider downgrading the Nushell version.

倉庫如何使用

朋友您好,最近對你的book和倉庫進行了閱讀和使用,受益匪淺,但是有些問題,請教一下:

  1. 我將你的倉庫download下來,直接放在了/etc/nixos下
  2. 執行nix flake update或者sudo nixos-rebuild switch --flake .均會報如下錯誤
    ...................
    [email protected]: Permission denied (publickey).
    fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
warning: could not read HEAD ref from repo at 'ssh://[email protected]/ryan4yin/nix-secrets.git', using 'master'

[email protected]: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
error:
… while updating the lock file of flake 'path:/etc/nixos?lastModified=1711889533&narHash=sha256-RO3rlYZimWKQEgRdL9kCU0vbJdU5SWi8I7kHFmctKM4%3D'

   … while updating the flake input 'mysecrets'

   … while fetching the input 'git+ssh://[email protected]/ryan4yin/nix-secrets.git?shallow=1'

   error: program 'git' failed with exit code 128
  1. 所以特此請教一下,我是否需要做一些配置上的修改,先謝謝了,忘指導一下
  2. 微信:superfpgaer

Another ScreenShot Tool

There is another screenshots tool for Hyprland (Only available on unstable channel): pkgs-unstable.hyprshot

I think we can give it a try.

The command to try:

hyprshot -m window -o ~/Pictures/Screenshots -- imv

Hyprland keybind

# -- Screenshots --
bind=,Print,exec,hyprshot -m output -o ~/Pictures/Screenshots -- imv
bind=SUPER,Print,exec,hyprshot -m window -o ~/Pictures/Screenshots -- imv
bind=CTRL,Print,exec,hyprshot -m region -o ~/Pictures/Screenshots -- imv

Git error: nix-secrets not exist

I get this errot when I try to excute : make i3 or any other command:

nixos-rebuild switch --flake .#ai_i3 --use-remote-sudo
building the system configuration...
The authenticity of host 'github.com (140.82.121.4)' can't be established.
ED25519 key fingerprint is SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU.
This key is not known by any other names.
fetching Git repository 'ssh://[email protected]/ryan4yin/nix-secrets.git'
Host key verification failed.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
error: program 'git' failed with exit code 128
(use '--show-trace' to show detailed location information)
make: *** [Makefile:14: i3] Error 1

And this repository ryan4yin/nix-secrets.git is not exist.

how would you deploy remotely *suzu* without cross-building?

Hello Ryan!
First of all thank you for your repositories and the flake book. I had learned a lot from your documentation.

I managed to install nixOS and boot orangepi5 from nvme ssd based on your notes in nixos-rk3588 repo.

Then I discovered your nix-config repo and started constructing similar repository of nixos boxes around me.
What I'm struggling to do is to remote rebuild rk3588 SBC with colmena without cross-build

Would you mind to share any hint if there is an easy way to do it?

This is what I tried, but failed:

[nix-shell:~/nix-config]$ colmena apply --on @suzu --build-on-target 
[INFO ] Using flake: git+file:///home/user/nix-config
[INFO ] Enumerating nodes...
[INFO ] Selected all 1 nodes.
      ❌ 5m Failed: Child process exited with error code: 1
 suzu ✅ 8s Evaluated suzu
 suzu ❌ 5m Build failed: Child process exited with error code: 1                                                                                                                                                                                                              
[ERROR] Failed to build suzu - Last 20 lines of logs:
[ERROR]   stderr) copying path '/nix/store/srbkgcw7bms6a4w0816gfsbrpbx72fgk-wayland-1.22.0-bin' from 'https://cache.nixos.org'...
[ERROR]   stderr) copying path '/nix/store/573p18msvkjjafbhf934pn6lw32lb753-docbook2X-0.8.8' from 'https://cache.nixos.org'...
[ERROR]   stderr) copying path '/nix/store/1pcyxjck2sfyy3fvmnykdwpbgxldfgay-xz-5.4.3-dev' from 'https://cache.nixos.org'...
[ERROR]   stderr) copying path '/nix/store/v61lhflqmjp44ncwkcl9xzlzs8my35ij-util-linux-minimal-2.38.1-dev' from 'https://cache.nixos.org'...
[ERROR]   stderr) copying path '/nix/store/03grn1z9pl9m8702wkshj5pwnvknazim-zlib-1.2.13-dev' from 'https://cache.nixos.org'...
[ERROR]   stderr) copying path '/nix/store/7gqmifamblx3zb25qcrxdsmsi3az7an2-zstd-1.5.5-bin' from 'https://cache.nixos.org'...
[ERROR]   stderr) copying path '/nix/store/rkvlj6viy90c6k70h11dd31b9r0r7mmw-curl-8.1.1-dev' from 'https://cache.nixos.org'...
[ERROR]   stderr) copying path '/nix/store/wnnvw5mayjn90968illd0k1vjigrva4d-libxml2-2.10.4-dev' from 'https://cache.nixos.org'...
[ERROR]   stderr) copying path '/nix/store/h01cajb40c7h8251qgcy9x5694k186vr-kbd-2.5.1' from 'https://cache.nixos.org'...
[ERROR]   stderr) copying path '/nix/store/vr04ag53qddlr77886lq9mmssibbaz18-man-db-2.11.2' from 'https://cache.nixos.org'...
[ERROR]   stderr) copying path '/nix/store/n2a39vr4ibqls44g5qnrzjz8zhlw1gmb-libxml2-2.10.4-py' from 'https://cache.nixos.org'...
[ERROR]   stderr) copying path '/nix/store/34f8w6ypmmfwjjjlvpfajxfzl7m017jy-libxslt-1.1.37-dev' from 'https://cache.nixos.org'...
[ERROR]   stderr) copying path '/nix/store/vp48cipsvykyv7qvi2w8kmpj1wfw4kzd-w3m-0.5.3+git20230121' from 'https://cache.nixos.org'...
[ERROR]   stderr) copying path '/nix/store/nj5b4bppgf75yk8jzdb4ckk4asjk9b7z-zstd-1.5.5-dev' from 'https://cache.nixos.org'...
[ERROR]   stderr) copying path '/nix/store/q1sm01394l7f1hciw2hh68mqvsc7r3cf-kbd-2.5.1-dev' from 'https://cache.nixos.org'...
[ERROR]   stderr) copying path '/nix/store/n0w0yyilnnl3j553slwyd76wn0h17s9l-curl-8.1.1-dev' from 'https://cache.nixos.org'...
[ERROR]   stderr) copying path '/nix/store/8vkyh3z9pfyhd30aj8d547g4psr3knil-systemd-minimal-253.6' from 'https://cache.nixos.org'...
[ERROR]   stderr) copying path '/nix/store/rfhvd32xy0xgr5ab71lm9qnvhi1rj52m-xmlto-0.0.28' from 'https://cache.nixos.org'...
[ERROR]   stderr) error: a 'x86_64-linux' with features {} is required to build '/nix/store/swnwfkpz8bsb9jfcg2gq7414bipj7d3z-aarch64-unknown-linux-gnu-binutils-2.40.drv', but I am a 'aarch64-linux' with features {benchmark, big-parallel, gccarch-armv8-a, kvm, nixos-test}
[ERROR]  failure) Child process exited with error code: 1
[ERROR] Failed to complete requested operation - Last 1 lines of logs:
[ERROR]  failure) Child process exited with error code: 1
[ERROR] -----
[ERROR] Operation failed with error: Child process exited with error code: 1
Hint: Backtrace available - Use `RUST_BACKTRACE=1` environment variable to display a backtrace

Altering system in here to aarch64_system didn't help either

I guess I'm missing something very essential... Still learning nix.

TIA

wireguard: DNS stop to work after `wg-quick down xxx` on macOS

Run this command after disable VPN fix this problem:

sudo /usr/sbin/networksetup -setdnsservers Wi-Fi "Empty"

or add it into wireguard config:

[Interface]
# emit configs ......

# Commands to clear DNS on macOS, otherwise DNS will not work after disable VPN!
# https://ivans.io/wireguard-on-macos/
POSTDOWN = if [ -x /usr/sbin/networksetup ]; then /usr/sbin/networksetup -setdnsservers Wi-Fi "Empty"; fi

[Peer]
# emit other configuration....

Related:

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.