chore(*): drop everything that is not required for Tvix
Co-Authored-By: edef <edef@edef.eu> Co-Authored-By: Ryan Lahfa <raito@lix.systems> Change-Id: I9817214c3122e49d694c5e41818622a08d9dfe45
|
|
@ -1,3 +1 @@
|
|||
set noparent
|
||||
|
||||
flokli
|
||||
|
|
|
|||
|
|
@ -1,21 +0,0 @@
|
|||
From 9414e9bfe9aad3a87d34cb8e1cdbef081d38a37c Mon Sep 17 00:00:00 2001
|
||||
From: Florian Klink <flokli@flokli.de>
|
||||
Date: Fri, 15 Nov 2024 16:29:17 +0200
|
||||
Subject: [PATCH] custom_config: #define MIRYOKU_KLUDGE_MOUSEKEYSPR
|
||||
|
||||
---
|
||||
miryoku/custom_config.h | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/miryoku/custom_config.h b/miryoku/custom_config.h
|
||||
index 1097bcb..48a1b5f 100644
|
||||
--- a/miryoku/custom_config.h
|
||||
+++ b/miryoku/custom_config.h
|
||||
@@ -1,3 +1,4 @@
|
||||
// Copyright 2021 Manna Harbour
|
||||
// https://github.com/manna-harbour/miryoku
|
||||
|
||||
+#define MIRYOKU_KLUDGE_MOUSEKEYSPR
|
||||
--
|
||||
2.46.1
|
||||
|
||||
|
|
@ -1,25 +0,0 @@
|
|||
From 9ed3e8ee2aad704fcfef2490617e2fd22902b2c4 Mon Sep 17 00:00:00 2001
|
||||
From: Florian Klink <flokli@flokli.de>
|
||||
Date: Sun, 27 Oct 2024 12:01:13 +0100
|
||||
Subject: [PATCH] miryoku_behaviors: add quick-tap-ms, require-prior-idle-ms
|
||||
|
||||
---
|
||||
miryoku/miryoku_behaviors.dtsi | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/miryoku/miryoku_behaviors.dtsi b/miryoku/miryoku_behaviors.dtsi
|
||||
index 473df49..73211da 100644
|
||||
--- a/miryoku/miryoku_behaviors.dtsi
|
||||
+++ b/miryoku/miryoku_behaviors.dtsi
|
||||
@@ -14,6 +14,8 @@
|
||||
compatible = "zmk,behavior-hold-tap";
|
||||
#binding-cells = <2>;
|
||||
tapping-term-ms = <U_TAPPING_TERM>;
|
||||
+ quick-tap-ms = <200>;
|
||||
+ require-prior-idle-ms = <125>;
|
||||
flavor = "tap-preferred";
|
||||
bindings = <&mo>, <&kp>;
|
||||
};
|
||||
--
|
||||
2.46.1
|
||||
|
||||
|
|
@ -1,25 +0,0 @@
|
|||
From a852a9738cc7510f6d3b80d1befb3c88ef8f08f7 Mon Sep 17 00:00:00 2001
|
||||
From: Florian Klink <flokli@flokli.de>
|
||||
Date: Sun, 27 Oct 2024 11:14:30 +0100
|
||||
Subject: [PATCH] miryoku_layer_alternatives.h: expose alt-gr on G and M
|
||||
|
||||
---
|
||||
miryoku/miryoku_babel/miryoku_layer_alternatives.h | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/miryoku/miryoku_babel/miryoku_layer_alternatives.h b/miryoku/miryoku_babel/miryoku_layer_alternatives.h
|
||||
index 8044fdd..07ed9b6 100644
|
||||
--- a/miryoku/miryoku_babel/miryoku_layer_alternatives.h
|
||||
+++ b/miryoku/miryoku_babel/miryoku_layer_alternatives.h
|
||||
@@ -86,7 +86,7 @@ U_NP, U_NP, U_LT(U_MEDIA, ESC),U_LT(U_NAV, SPACE),U_LT
|
||||
|
||||
#define MIRYOKU_ALTERNATIVES_BASE_COLEMAKDH \
|
||||
&kp Q, &kp W, &kp F, &kp P, &kp B, &kp J, &kp L, &kp U, &kp Y, &kp SQT, \
|
||||
-U_MT(LGUI, A), U_MT(LALT, R), U_MT(LCTRL, S), U_MT(LSHFT, T), &kp G, &kp M, U_MT(LSHFT, N), U_MT(LCTRL, E), U_MT(LALT, I), U_MT(LGUI, O), \
|
||||
+U_MT(LGUI, A), U_MT(LALT, R), U_MT(LCTRL, S), U_MT(LSHFT, T), U_MT(RALT, G), U_MT(RALT, M), U_MT(LSHFT, N), U_MT(LCTRL, E), U_MT(LALT, I), U_MT(LGUI, O), \
|
||||
U_LT(U_BUTTON, Z), U_MT(RALT, X), &kp C, &kp D, &kp V, &kp K, &kp H, &kp COMMA, U_MT(RALT, DOT), U_LT(U_BUTTON, SLASH),\
|
||||
U_NP, U_NP, U_LT(U_MEDIA, ESC),U_LT(U_NAV, SPACE),U_LT(U_MOUSE, TAB),U_LT(U_SYM, RET), U_LT(U_NUM, BSPC), U_LT(U_FUN, DEL), U_NP, U_NP
|
||||
|
||||
--
|
||||
2.46.1
|
||||
|
||||
|
|
@ -1,29 +0,0 @@
|
|||
{ pkgs, depot, ... }:
|
||||
rec {
|
||||
firmware = depot.users.flokli.keyboards.buildSplitKeyboard {
|
||||
name = "nice_nano_v2";
|
||||
board = "nice_nano_v2";
|
||||
shield = "corne_%PART% nice_view_adapter nice_view";
|
||||
zephyrDepsHash = "sha256:1hr304xhj596a85mmy3zl2y0bl9w143h9bj5qk7wmqx46mbs4kb0";
|
||||
src = depot.users.flokli.keyboards.miryoku_config;
|
||||
extraCmakeFlags = [
|
||||
"-DCONFIG_ZMK_POINTING=y"
|
||||
"-DCONFIG_ZMK_POINTING_SMOOTH_SCROLLING=y"
|
||||
];
|
||||
};
|
||||
|
||||
config-flat = depot.users.flokli.keyboards.mkFlatConfig "corne";
|
||||
|
||||
flash-left = pkgs.writeShellScript "flash.sh" ''
|
||||
cp ${firmware}/zmk_left.uf2 /run/media/$USER/NICENANO/
|
||||
'';
|
||||
|
||||
flash-right = pkgs.writeShellScript "flash.sh" ''
|
||||
cp ${firmware}/zmk_right.uf2 /run/media/$USER/NICENANO/
|
||||
'';
|
||||
|
||||
meta.ci.targets = [
|
||||
"config-flat"
|
||||
"firmware"
|
||||
];
|
||||
}
|
||||
|
|
@ -1,28 +0,0 @@
|
|||
{ pkgs, depot, ... }:
|
||||
rec {
|
||||
firmware = depot.users.flokli.keyboards.buildSplitKeyboard {
|
||||
name = "corneish_zen_v1";
|
||||
board = "corneish_zen_v1_%PART%";
|
||||
zephyrDepsHash = "sha256-Qe9G5YLEi9iG5QdmJCxcmQTpzUCBYkfa84zk7SVRSgQ=";
|
||||
src = depot.users.flokli.keyboards.miryoku_config;
|
||||
extraCmakeFlags = [
|
||||
"-DCONFIG_ZMK_MOUSE=y"
|
||||
"-DCONFIG_ZMK_MOUSE_SMOOTH_SCROLLING=y"
|
||||
];
|
||||
};
|
||||
|
||||
config-flat = depot.users.flokli.keyboards.mkFlatConfig "corneish_zen";
|
||||
|
||||
flash-left = pkgs.writeShellScript "flash.sh" ''
|
||||
cp ${firmware}/zmk_left.uf2 /run/media/$USER/CORNEISHZEN/
|
||||
'';
|
||||
|
||||
flash-right = pkgs.writeShellScript "flash.sh" ''
|
||||
cp ${firmware}/zmk_right.uf2 /run/media/$USER/CORNEISHZEN/
|
||||
'';
|
||||
|
||||
meta.ci.targets = [
|
||||
"config-flat"
|
||||
"firmware"
|
||||
];
|
||||
}
|
||||
|
|
@ -1,54 +0,0 @@
|
|||
{ pkgs, ... }:
|
||||
|
||||
|
||||
let
|
||||
zmk-nix = pkgs.fetchFromGitHub {
|
||||
owner = "lilyinstarlight";
|
||||
repo = "zmk-nix";
|
||||
rev = "1d7d7aeef7c62d3a80a688b26c6484123c26cde6";
|
||||
hash = "sha256-7W+slivoV0zSfDxXlhMVL3yPodrhCiYQiFbtbco1r5U=";
|
||||
};
|
||||
|
||||
zmk_builders = pkgs.callPackage (import (zmk-nix + "/nix/builders.nix")) { };
|
||||
|
||||
miryoku_zmk = pkgs.fetchFromGitHub {
|
||||
owner = "manna-harbour";
|
||||
repo = "miryoku_zmk";
|
||||
rev = "a1f1eae0666b7b33ad789b10822297169754a349";
|
||||
hash = "sha256-4jYz5fudTW45hbwhRRGBdiAbu596X9zSiCio/tS85d0=";
|
||||
};
|
||||
|
||||
miryoku_zmk_patched = pkgs.runCommand "miryoku_zmk_patched" { } ''
|
||||
mkdir -p $out
|
||||
cp -r ${miryoku_zmk}/. $out/
|
||||
cd $out
|
||||
chmod -R +w $out
|
||||
patch -p1 < ${./0001-miryoku_layer_alternatives.h-expose-alt-gr-on-G-and-.patch}
|
||||
patch -p1 < ${./0001-miryoku_behaviors-add-quick-tap-ms-require-prior-idl.patch}
|
||||
patch -p1 < ${./0001-custom_config-define-MIRYOKU_KLUDGE_MOUSEKEYSPR.patch}
|
||||
'';
|
||||
|
||||
miryoku_config = pkgs.runCommand "config" { } ''
|
||||
mkdir -p $out/config
|
||||
cp -r ${miryoku_zmk_patched}/miryoku $out/
|
||||
cp ${./west.yml} $out/config/west.yml
|
||||
cp ${miryoku_zmk_patched}/config/*.keymap $out/config/
|
||||
'';
|
||||
|
||||
# helpful for debugging a resulting keymap config
|
||||
mkFlatConfig = name: pkgs.runCommand "config-flat"
|
||||
{
|
||||
nativeBuildInputs = [ pkgs.python3.pkgs.pcpp ];
|
||||
} ''
|
||||
mkdir -p $out/config
|
||||
cp ${./west.yml} $out/config/west.yml
|
||||
pcpp --passthru-unfound-includes -o $out/config/${name}.keymap ${miryoku_zmk_patched}/config/${name}.keymap
|
||||
'';
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
miryoku_zmk = miryoku_zmk_patched;
|
||||
inherit (zmk_builders) buildSplitKeyboard;
|
||||
inherit miryoku_config mkFlatConfig;
|
||||
}
|
||||
|
|
@ -1,71 +0,0 @@
|
|||
{ pkgs, ... }:
|
||||
|
||||
rec {
|
||||
qmk_firmware_src = pkgs.fetchFromGitHub {
|
||||
owner = "bastardkb";
|
||||
repo = "bastardkb-qmk";
|
||||
rev = "60f5e5ae3da7cbc724a587642b2ad36fe5fcb591"; # bkb-develop
|
||||
hash = "sha256-FRlxOdxxNAf7QYlAnD4OJ68k04oog0r9UYBmaANDFsU=";
|
||||
fetchSubmodules = true;
|
||||
};
|
||||
|
||||
qmk_userspace = pkgs.fetchFromGitHub {
|
||||
owner = "bastardkb";
|
||||
repo = "qmk_userspace";
|
||||
rev = "722fe10ae9f1249245af4852209694749207eb70"; # develop
|
||||
hash = "sha256-FY5zyM6G6DEdSWowNADrHr9P5G4mqioTDK/KM10z6t0=";
|
||||
fetchSubmodules = true;
|
||||
};
|
||||
|
||||
firmware = pkgs.stdenv.mkDerivation {
|
||||
name = "bastardkb-dilemma-firmware";
|
||||
|
||||
src = qmk_firmware_src;
|
||||
|
||||
patches = [ ./enable-taps.patch ];
|
||||
|
||||
postPatch = ''
|
||||
patchShebangs util/uf2conv.py
|
||||
'';
|
||||
|
||||
nativeBuildInputs = [
|
||||
pkgs.python3
|
||||
pkgs.qmk
|
||||
];
|
||||
|
||||
env.QMK_HOME = qmk_firmware_src;
|
||||
env.QMK_USERSPACE = "/tmp/qmk_userspace";
|
||||
env.HOME = "/tmp/qmk";
|
||||
env.SKIP_GIT = "true";
|
||||
|
||||
buildPhase = ''
|
||||
mkdir -p /tmp/qmk_userspace
|
||||
cp -r ${qmk_userspace}/. /tmp/qmk_userspace/
|
||||
chmod +w /tmp/qmk_userspace/ --recursive
|
||||
|
||||
mkdir -p /tmp/qmk_userspace/keyboards/bastardkb/dilemma/3x5_3{,_procyon}/keymaps/flokli
|
||||
cp ${./keymap.c} /tmp/qmk_userspace/keyboards/bastardkb/dilemma/3x5_3/keymaps/flokli/keymap.c
|
||||
cp ${./rules.mk} /tmp/qmk_userspace/keyboards/bastardkb/dilemma/3x5_3/keymaps/flokli/rules.mk
|
||||
cp ${./keymap.c} /tmp/qmk_userspace/keyboards/bastardkb/dilemma/3x5_3_procyon/keymaps/flokli/keymap.c
|
||||
cp ${./rules.mk} /tmp/qmk_userspace/keyboards/bastardkb/dilemma/3x5_3_procyon/keymaps/flokli/rules.mk
|
||||
|
||||
qmk compile -c -kb bastardkb/dilemma/3x5_3 -km flokli
|
||||
qmk compile -c -kb bastardkb/dilemma/3x5_3_procyon -km flokli
|
||||
'';
|
||||
|
||||
installPhase = ''
|
||||
mkdir -p $out
|
||||
cp bastardkb_dilemma_*.uf2 $out/
|
||||
'';
|
||||
};
|
||||
|
||||
flash-v2 = pkgs.writeShellScript "flash.sh" ''
|
||||
QMK_HOME=${qmk_firmware_src} ${pkgs.qmk}/bin/qmk flash ${firmware}/bastardkb_dilemma_3x5_3_flokli.uf2
|
||||
'';
|
||||
flash-v3 = pkgs.writeShellScript "flash.sh" ''
|
||||
QMK_HOME=${qmk_firmware_src} ${pkgs.qmk}/bin/qmk flash ${firmware}/bastardkb_dilemma_3x5_3_procyon_flokli.uf2
|
||||
'';
|
||||
|
||||
meta.ci.skip = true;
|
||||
meta.ci.targets = [ "firmware" ];
|
||||
}
|
||||
|
|
@ -1,24 +0,0 @@
|
|||
From 32a1b9a189c13bec03c6b0f258121c47185db0ad Mon Sep 17 00:00:00 2001
|
||||
From: Florian Klink <flokli@flokli.de>
|
||||
Date: Tue, 23 Jan 2024 11:26:10 +0200
|
||||
Subject: [PATCH] bastardkb dilemma: enable taps
|
||||
|
||||
---
|
||||
keyboards/bastardkb/dilemma/3x5_3/config.h | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/keyboards/bastardkb/dilemma/3x5_3/config.h b/keyboards/bastardkb/dilemma/3x5_3/config.h
|
||||
index ccbc4e2f58..bf17dc7e02 100644
|
||||
--- a/keyboards/bastardkb/dilemma/3x5_3/config.h
|
||||
+++ b/keyboards/bastardkb/dilemma/3x5_3/config.h
|
||||
@@ -42,6 +42,7 @@
|
||||
#define POINTING_DEVICE_CS_PIN GP21
|
||||
#undef CIRQUE_PINNACLE_DIAMETER_MM
|
||||
#define CIRQUE_PINNACLE_DIAMETER_MM 40
|
||||
+#define CIRQUE_PINNACLE_TAP_ENABLE 1
|
||||
|
||||
/* Reset. */
|
||||
#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET
|
||||
--
|
||||
2.43.0
|
||||
|
||||
|
|
@ -1,172 +0,0 @@
|
|||
/**
|
||||
* Copyright 2022 Charly Delay <charly@codesink.dev> (@0xcharly)
|
||||
* Copyright 2023 casuanoob <casuanoob@hotmail.com> (@casuanoob)
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include QMK_KEYBOARD_H
|
||||
|
||||
enum dilemma_keymap_layers {
|
||||
LAYER_BASE = 0,
|
||||
LAYER_FUNCTION,
|
||||
LAYER_NAVIGATION,
|
||||
LAYER_MEDIA,
|
||||
LAYER_POINTER,
|
||||
LAYER_NUMERAL,
|
||||
LAYER_SYMBOLS,
|
||||
};
|
||||
|
||||
// Automatically enable sniping-mode on the pointer layer.
|
||||
// #define DILEMMA_AUTO_SNIPING_ON_LAYER LAYER_POINTER
|
||||
|
||||
#define ESC_MED LT(LAYER_MEDIA, KC_ESC)
|
||||
#define SPC_NAV LT(LAYER_NAVIGATION, KC_SPC)
|
||||
#define TAB_POI LT(LAYER_POINTER, KC_TAB)
|
||||
#define ENT_SYM LT(LAYER_SYMBOLS, KC_ENT)
|
||||
#define BSP_NUM LT(LAYER_NUMERAL, KC_BSPC)
|
||||
#define DEL_FUN LT(LAYER_FUNCTION, KC_DEL)
|
||||
#define PT_Z LT(LAYER_POINTER, KC_Z)
|
||||
#define PT_SLSH LT(LAYER_POINTER, KC_SLSH)
|
||||
|
||||
#ifndef POINTING_DEVICE_ENABLE
|
||||
# define DRGSCRL KC_NO
|
||||
# define DPI_MOD KC_NO
|
||||
# define S_D_MOD KC_NO
|
||||
# define SNIPING KC_NO
|
||||
#endif // !POINTING_DEVICE_ENABLE
|
||||
|
||||
// clang-format off
|
||||
/** \brief QWERTY layout (3 rows, 10 columns). */
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
[LAYER_BASE] = LAYOUT_split_3x5_3(
|
||||
KC_Q, KC_W, KC_F, KC_P, KC_B, KC_J, KC_L, KC_U, KC_Y, KC_QUOT,
|
||||
LGUI_T(KC_A), LALT_T(KC_R), LCTL_T(KC_S), LSFT_T(KC_T), KC_G, KC_M, LSFT_T(KC_N), LCTL_T(KC_E), LALT_T(KC_I), LGUI_T(KC_O),
|
||||
PT_Z, RALT_T(KC_X), KC_C, KC_D, KC_V, KC_K, KC_H, KC_COMM, RALT_T(KC_DOT), PT_SLSH,
|
||||
ESC_MED, SPC_NAV, TAB_POI, ENT_SYM, BSP_NUM, DEL_FUN
|
||||
),
|
||||
|
||||
/*
|
||||
* Layers used on the Dilemma.
|
||||
*
|
||||
* These layers started off heavily inspired by the Miryoku layout, but trimmed
|
||||
* down and tailored for a stock experience that is meant to be fundation for
|
||||
* further personalization.
|
||||
*
|
||||
* See https://github.com/manna-harbour/miryoku for the original layout.
|
||||
*/
|
||||
|
||||
/**
|
||||
* \brief Function layer.
|
||||
*
|
||||
* Secondary right-hand layer has function keys mirroring the numerals on the
|
||||
* primary layer with extras on the pinkie column, plus system keys on the inner
|
||||
* column. App is on the tertiary thumb key and other thumb keys are duplicated
|
||||
* from the base layer to enable auto-repeat.
|
||||
*/
|
||||
[LAYER_FUNCTION] = LAYOUT_split_3x5_3(
|
||||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_PSCR, KC_F7, KC_F8, KC_F9, KC_F12,
|
||||
KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, KC_SCRL, KC_F4, KC_F5, KC_F6, KC_F11,
|
||||
XXXXXXX, KC_RALT, XXXXXXX, XXXXXXX, XXXXXXX, KC_PAUS, KC_F1, KC_F2, KC_F3, KC_F10,
|
||||
XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
|
||||
),
|
||||
|
||||
/**
|
||||
* \brief Navigation layer.
|
||||
*
|
||||
* Primary right-hand layer (left home thumb) is navigation and editing. Cursor
|
||||
* keys are on the home position, line and page movement below, clipboard above,
|
||||
* caps lock and insert on the inner column. Thumb keys are duplicated from the
|
||||
* base layer to avoid having to layer change mid edit and to enable auto-repeat.
|
||||
*/
|
||||
[LAYER_NAVIGATION] = LAYOUT_split_3x5_3(
|
||||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
|
||||
KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, KC_CAPS, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT,
|
||||
XXXXXXX, KC_RALT, XXXXXXX, XXXXXXX, XXXXXXX, KC_INS, KC_HOME, KC_PGDN, KC_PGUP, KC_END,
|
||||
XXXXXXX, XXXXXXX, _______, KC_ENT, KC_BSPC, KC_DEL
|
||||
),
|
||||
|
||||
/**
|
||||
* \brief Media layer.
|
||||
*
|
||||
* Tertiary left- and right-hand layer is media and RGB control. This layer is
|
||||
* symmetrical to accomodate the left- and right-hand trackball.
|
||||
*/
|
||||
[LAYER_MEDIA] = LAYOUT_split_3x5_3(
|
||||
XXXXXXX,RGB_RMOD, RGB_TOG, RGB_MOD, XXXXXXX, XXXXXXX,RGB_RMOD, RGB_TOG, RGB_MOD, XXXXXXX,
|
||||
KC_MPRV, KC_VOLD, KC_MUTE, KC_VOLU, KC_MNXT, KC_MPRV, KC_VOLD, KC_MUTE, KC_VOLU, KC_MNXT,
|
||||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
|
||||
_______, KC_MPLY, KC_MSTP, KC_MSTP, KC_MPLY, KC_MUTE
|
||||
),
|
||||
|
||||
/** \brief Mouse emulation and pointer functions. */
|
||||
[LAYER_POINTER] = LAYOUT_split_3x5_3(
|
||||
QK_BOOT, EE_CLR, XXXXXXX, DPI_MOD, S_D_MOD, S_D_MOD, DPI_MOD, XXXXXXX, EE_CLR, QK_BOOT,
|
||||
KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, XXXXXXX, KC_LSFT, KC_LCTL, KC_LALT, KC_LGUI,
|
||||
_______, DRGSCRL, SNIPING, KC_BTN3, XXXXXXX, XXXXXXX, KC_BTN3, SNIPING, DRGSCRL, _______,
|
||||
KC_BTN3, KC_BTN2, KC_BTN1, KC_BTN1, KC_BTN2, KC_BTN3
|
||||
),
|
||||
|
||||
/**
|
||||
* \brief Numeral layout.
|
||||
*
|
||||
* Primary left-hand layer (right home thumb) is numerals and symbols. Numerals
|
||||
* are in the standard numpad locations with symbols in the remaining positions.
|
||||
* `KC_DOT` is duplicated from the base layer.
|
||||
*/
|
||||
[LAYER_NUMERAL] = LAYOUT_split_3x5_3(
|
||||
KC_LBRC, KC_7, KC_8, KC_9, KC_RBRC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
|
||||
KC_SCLN, KC_4, KC_5, KC_6, KC_EQL, XXXXXXX, KC_LSFT, KC_LCTL, KC_LALT, KC_LGUI,
|
||||
KC_DOT, KC_1, KC_2, KC_3, KC_BSLS, XXXXXXX, XXXXXXX, XXXXXXX, KC_RALT, XXXXXXX,
|
||||
KC_DOT, KC_0, KC_MINS, XXXXXXX, _______, XXXXXXX
|
||||
),
|
||||
|
||||
/**
|
||||
* \brief Symbols layer.
|
||||
*
|
||||
* Secondary left-hand layer has shifted symbols in the same locations to reduce
|
||||
* chording when using mods with shifted symbols. `KC_LPRN` is duplicated next to
|
||||
* `KC_RPRN`.
|
||||
*/
|
||||
[LAYER_SYMBOLS] = LAYOUT_split_3x5_3(
|
||||
KC_LCBR, KC_AMPR, KC_ASTR, KC_LPRN, KC_RCBR, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
|
||||
KC_COLN, KC_DLR, KC_PERC, KC_CIRC, KC_PLUS, XXXXXXX, KC_LSFT, KC_LCTL, KC_LALT, KC_LGUI,
|
||||
KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_PIPE, XXXXXXX, XXXXXXX, XXXXXXX, KC_RALT, XXXXXXX,
|
||||
KC_LPRN, KC_GRV, KC_UNDS, _______, XXXXXXX, XXXXXXX
|
||||
),
|
||||
};
|
||||
// clang-format on
|
||||
|
||||
#ifdef POINTING_DEVICE_ENABLE
|
||||
# ifdef DILEMMA_AUTO_SNIPING_ON_LAYER
|
||||
layer_state_t layer_state_set_user(layer_state_t state) {
|
||||
dilemma_set_pointer_sniping_enabled(layer_state_cmp(state, DILEMMA_AUTO_SNIPING_ON_LAYER));
|
||||
return state;
|
||||
}
|
||||
# endif // DILEMMA_AUTO_SNIPING_ON_LAYER
|
||||
#endif // POINTING_DEVICE_ENABLE
|
||||
|
||||
#ifdef ENCODER_MAP_ENABLE
|
||||
// clang-format off
|
||||
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {
|
||||
[LAYER_BASE] = {ENCODER_CCW_CW(KC_WH_D, KC_WH_U), ENCODER_CCW_CW(KC_VOLD, KC_VOLU)},
|
||||
[LAYER_FUNCTION] = {ENCODER_CCW_CW(KC_DOWN, KC_UP), ENCODER_CCW_CW(KC_LEFT, KC_RGHT)},
|
||||
[LAYER_NAVIGATION] = {ENCODER_CCW_CW(KC_PGDN, KC_PGUP), ENCODER_CCW_CW(KC_VOLU, KC_VOLD)},
|
||||
[LAYER_MEDIA] = {ENCODER_CCW_CW(KC_PGDN, KC_PGUP), ENCODER_CCW_CW(KC_VOLU, KC_VOLD)},
|
||||
[LAYER_POINTER] = {ENCODER_CCW_CW(RGB_HUD, RGB_HUI), ENCODER_CCW_CW(RGB_SAD, RGB_SAI)},
|
||||
[LAYER_NUMERAL] = {ENCODER_CCW_CW(RGB_VAD, RGB_VAI), ENCODER_CCW_CW(RGB_SPD, RGB_SPI)},
|
||||
[LAYER_SYMBOLS] = {ENCODER_CCW_CW(RGB_RMOD, RGB_MOD), ENCODER_CCW_CW(KC_LEFT, KC_RGHT)},
|
||||
};
|
||||
// clang-format on
|
||||
#endif // ENCODER_MAP_ENABLE
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
ENCODER_MAP_ENABLE = yes
|
||||
MAXTOUCH_DEBUG = no
|
||||
OPT_DEFS += -DMK_KINETIC_SPEED=1
|
||||
|
|
@ -1,34 +0,0 @@
|
|||
manifest:
|
||||
remotes:
|
||||
- name: zmkfirmware
|
||||
url-base: https://github.com/zmkfirmware
|
||||
projects:
|
||||
- name: zephyr
|
||||
remote: zmkfirmware
|
||||
revision: f8e4d15791602c67405c0fd2651167a895939565 # v3.5.0+zmk-fixes
|
||||
import:
|
||||
name-blocklist:
|
||||
- ci-tools
|
||||
- hal_altera
|
||||
- hal_cypress
|
||||
- hal_infineon
|
||||
- hal_microchip
|
||||
- hal_nxp
|
||||
- hal_openisa
|
||||
- hal_silabs
|
||||
- hal_xtensa
|
||||
- hal_st
|
||||
- hal_ti
|
||||
- loramac-node
|
||||
- mcuboot
|
||||
- mcumgr
|
||||
- net-tools
|
||||
- openthread
|
||||
- edtt
|
||||
- trusted-firmware-m
|
||||
- name: zmk
|
||||
remote: zmkfirmware
|
||||
revision: refs/pull/2477/head # mouse move and scroll support PR
|
||||
import: app/west.yml
|
||||
self:
|
||||
path: config
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
source_up
|
||||
|
||||
PATH_add $(nix-build ../../.. -A users.flokli.nixos.deps --no-out-link)/bin
|
||||
|
|
@ -1,8 +1,6 @@
|
|||
{ depot, pkgs, lib, ... }:
|
||||
|
||||
let
|
||||
systemFor = sys: (depot.ops.nixos.nixosFor sys).system;
|
||||
|
||||
# assumes `name` is configured appropriately in your .ssh/config
|
||||
deployScript = name: sys: pkgs.writeShellScriptBin "deploy-${name}" ''
|
||||
set -eo pipefail
|
||||
|
|
|
|||
|
|
@ -1,11 +1,8 @@
|
|||
# Set of unconditional config options applicable to all archeology machines.
|
||||
|
||||
{ depot, pkgs, ... }:
|
||||
{ pkgs, ... }:
|
||||
|
||||
{
|
||||
# Use the TVL binary cache
|
||||
tvl.cache.enable = true;
|
||||
|
||||
# Start clickhose as a system service.
|
||||
services.clickhouse.enable = true;
|
||||
|
||||
|
|
|
|||
|
|
@ -1 +0,0 @@
|
|||
*.log
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
digraph {
|
||||
Builder
|
||||
Store
|
||||
Evaluator
|
||||
}
|
||||
|
|
@ -1,13 +0,0 @@
|
|||
attrpath
|
||||
: attrpath '.' attr {
|
||||
$$ = $1; $1->push_back(AttrName(data->symbols.create($3)));
|
||||
}
|
||||
| attrpath '.' string_attr
|
||||
{ $$ = $1;
|
||||
ExprString * str = dynamic_cast<ExprString *>($3);
|
||||
if (str) {
|
||||
$$->push_back(AttrName(data->symbols.create(str->s)));
|
||||
delete str;
|
||||
} else
|
||||
$$->push_back(AttrName($3));
|
||||
}
|
||||
|
|
@ -1,19 +0,0 @@
|
|||
digraph {
|
||||
bgcolor="transparent"
|
||||
node [fillcolor="lightgrey",style="filled"]
|
||||
|
||||
tvix_cli
|
||||
tvix_eval
|
||||
nix_compat
|
||||
tvix_serde
|
||||
tvix_store
|
||||
|
||||
tvix_cli -> tvix_store
|
||||
tvix_cli -> nix_compat
|
||||
tvix_cli -> tvix_eval
|
||||
|
||||
tvix_store -> nix_compat
|
||||
tvix_eval -> nix_compat
|
||||
|
||||
tvix_serde -> tvix_eval
|
||||
}
|
||||
|
|
@ -1,41 +0,0 @@
|
|||
{ depot, pkgs, ... }:
|
||||
|
||||
let
|
||||
inherit (pkgs)
|
||||
fontconfig qrencode runCommand stdenv;
|
||||
mkQr = url: runCommand "qrcode.png" { } ''
|
||||
${qrencode}/bin/qrencode -o $out -t SVG -s 5 \
|
||||
--background=fafafa \
|
||||
--foreground=000000 \
|
||||
${url}
|
||||
'';
|
||||
in
|
||||
stdenv.mkDerivation {
|
||||
name = "2023-nixcon-tvix";
|
||||
src = ./.;
|
||||
|
||||
FONTCONFIG_FILE = pkgs.makeFontsConf {
|
||||
fontDirectories = with pkgs; [ jetbrains-mono fira fira-code fira-mono lato ];
|
||||
};
|
||||
|
||||
nativeBuildInputs = [ pkgs.reveal-md pkgs.graphviz ];
|
||||
|
||||
buildPhase = ''
|
||||
cp ${depot.tvix.logo}/logo.png tvix-logo.png
|
||||
dot -Tsvg crate-deps.dot > crate-deps.svg
|
||||
cp ${mkQr "https://flokli.de"} qrcode-flokli.svg
|
||||
cp ${mkQr "https://tvix.dev"} qrcode-tvix.svg
|
||||
|
||||
mkdir -p $out
|
||||
reveal-md --static $out presentation.md
|
||||
cp tvixbolt.webm $out
|
||||
|
||||
CHROME_CONFIG_HOME=/build/.config reveal-md presentation.md --print $out/slides.pdf --puppeteer-chromium-executable="${pkgs.chromium}/bin/chromium"
|
||||
# Above command doesn't fail on error, ensure file has been created
|
||||
[[ -f "$out/slides.pdf" ]] || exit 1
|
||||
'';
|
||||
|
||||
# reveal-md presentation.md --print started timing out possibly due to
|
||||
# chromium: 133.0.6943.141 -> 134.0.6998.35
|
||||
meta.ci.skip = true;
|
||||
}
|
||||
|
|
@ -1,294 +0,0 @@
|
|||
---
|
||||
author:
|
||||
- Florian Klink
|
||||
date: 2023-09-09
|
||||
title: "Tvix: Status update"
|
||||
theme: moon
|
||||
revealOptions:
|
||||
transition: 'fade'
|
||||
---
|
||||
|
||||
# Tvix: Status update
|
||||
|
||||

|
||||
|
||||
2023-09-09
|
||||
|
||||
Florian Klink
|
||||
|
||||
---
|
||||
|
||||
## Whoami
|
||||
|
||||
- flokli
|
||||
- nixpkgs contributor since 2018, maintaining systemd, nsncd and some
|
||||
more stuff
|
||||
- Freelance Nix/DevOps consultant
|
||||
- I spend too much time on computers :-)
|
||||
|
||||
---
|
||||
|
||||
## What is Tvix?
|
||||
|
||||
- A new implementation of Nix
|
||||
- modular
|
||||
- written in Rust
|
||||
- developed in the [TVL](https://tvl.fyi) monorepo
|
||||
- subtree exported to [github:tvlfyi/tvix](https://github.com/tvlfyi/tvix)
|
||||
|
||||
---
|
||||
|
||||
## Structure
|
||||
|
||||
- strong separation between **Evaluator**, **Store** and **Builder**
|
||||
- Defined interfaces between different components (Protobuf/gRPC) <!-- .element: class="fragment" -->
|
||||
- Allows adding to/combining with your own components <!-- .element: class="fragment" -->
|
||||
- <!-- .element: class="fragment" --> A lot of helper code for some of the Nix internals in the `nix-compat` crate
|
||||
|
||||
Note: Derivation types, serializers. NAR writers, nixbase32 enc/dec, Nix Hash function, stringparsing etc.
|
||||
|
||||
----
|
||||
|
||||

|
||||
|
||||
---
|
||||
|
||||
## Evaluator: Design
|
||||
|
||||
- <!-- .element: class="fragment" -->
|
||||
Nix code is parsed via [rnix](https://github.com/nix-community/rnix-parser)
|
||||
- <!-- .element: class="fragment" -->
|
||||
AST traversal, generate bytecode (with some transformations)
|
||||
- <!-- .element: class="fragment" -->
|
||||
Bytecode is executed by an abstract machine with a Nix-specific instruction set
|
||||
|
||||
----
|
||||
|
||||
## Evaluator: Design
|
||||
|
||||
- <!-- .element: class="fragment" -->
|
||||
Builtins are separate from the "evaluator core"
|
||||
- <!-- .element: class="fragment" -->
|
||||
inject your own builtins
|
||||
- <!-- .element: class="fragment" -->
|
||||
this includes `builtins.derivation`!
|
||||
- <!-- .element: class="fragment" -->
|
||||
IO is nicely abstracted away
|
||||
- <!-- .element: class="fragment" -->
|
||||
We can run a Nixlang subset without IO in wasm (see [tvixbolt](https://bolt.tvix.dev/)),
|
||||
or parse Nix into a config struct with `tvix-serde`
|
||||
|
||||
----
|
||||
|
||||
<!-- <video class="r-stretch" src="./tvixbolt.webm"></video> -->
|
||||
<a href="./tvixbolt.webm">Tvixbolt Demo</a>
|
||||
|
||||
----
|
||||
|
||||
### Evaluator: Current Work
|
||||
|
||||
- <!-- .element: class="fragment" -->
|
||||
Current goal: **evaluate nixpkgs the same way as Nix does**
|
||||
- <!-- .element: class="fragment" -->
|
||||
Checked by comparing the calculated output paths, which checks correctness of all \"parent\" output paths too.
|
||||
- <!-- .element: class="fragment" -->
|
||||
Required implementing a lot of Nix internals in `nix-compat`, and `tvix-store` (A-Term, hash modulo, NAR writer/hasher)
|
||||
|
||||
Note: Getting output hashing correct, and exposing this in a re-usable fashion took quite some iterations to get right.
|
||||
|
||||
----
|
||||
|
||||
### Evaluator: Current Work (cont.)
|
||||
- <!-- .element: class="fragment" -->
|
||||
🎉 Already correct for (and continously checked by CI on every commit):
|
||||
- <!-- .element: class="fragment" -->
|
||||
`stdenv`, `hello`
|
||||
- <!-- .element: class="fragment" -->
|
||||
`pkgsCross.aarch64-multiplatform.stdenv`, `pkgsCross.aarch64-multiplatform.hello`
|
||||
- <!-- .element: class="fragment" -->
|
||||
Some work left for more complicated expressions
|
||||
- <!-- .element: class="fragment" -->
|
||||
infinite recursion [when inheriting from a `builtins.tryEval` multiple times](https://b.tvl.fyi/281)
|
||||
- <!-- .element: class="fragment" -->
|
||||
small details around file imports
|
||||
- <!-- .element: class="fragment" -->
|
||||
Not too much performance finetuning until we're correct first.
|
||||
|
||||
----
|
||||
|
||||
### Evaluator: Demo
|
||||
|
||||
[](https://asciinema.org/a/MH4tuVPLsKewJSGJUYEyIKUpj)
|
||||
|
||||
---
|
||||
|
||||
## Store: Design
|
||||
|
||||
- <!-- .element: class="fragment" -->
|
||||
Uses a very different underlying data model:
|
||||
- <!-- .element: class="fragment" -->
|
||||
Nix stores on a per- `StorePath` granularity
|
||||
- <!-- .element: class="fragment" -->
|
||||
tvix-store uses a Merkle DAG of directories, similar to git trees, but with [BLAKE3](https://github.com/BLAKE3-team/BLAKE3) digests as pointers.
|
||||
- <!-- .element: class="fragment" -->
|
||||
Compat layer in front to still render/calculate NAR on demand where needed
|
||||
- <!-- .element: class="fragment" -->
|
||||
Substitution, caching, ... possible to describe via composition/layering
|
||||
|
||||
----
|
||||
|
||||

|
||||
|
||||
----
|
||||
|
||||
### Store: Advantages
|
||||
|
||||
- <!-- .element: class="fragment" -->
|
||||
Less downloading of data that didn't change
|
||||
- <!-- .element: class="fragment" -->
|
||||
Less duplicate data on disk/storage
|
||||
- <!-- .element: class="fragment" -->
|
||||
Inherently content-addressed, so P2P substitution possible
|
||||
- <!-- .element: class="fragment" -->
|
||||
Allows doing verified blob streaming ([BAO](https://github.com/oconnor663/bao), [bao-tree](https://github.com/n0-computer/bao-tree))
|
||||
- <!-- .element: class="fragment" -->
|
||||
Protocol has some \"smarter\" methods to avoid roundtrips, but could all be statically pre-rendered
|
||||
- <!-- .element: class="fragment" -->
|
||||
Very little data that needs to be fetched from a trusted party (or be signed)
|
||||
|
||||
Note: Our way of addressing blobs by their raw blake3 digest is natively compatible with iroh, the IPFS Re-implementation in Rust
|
||||
|
||||
----
|
||||
|
||||
### Store: Status
|
||||
|
||||
- <!-- .element: class="fragment" -->
|
||||
Whole Merkle-based store implementation (and Nix NAR compat layer) is there
|
||||
- <!-- .element: class="fragment" -->
|
||||
exercised by the output path CI tests, and a test suite.
|
||||
- <!-- .element: class="fragment" -->
|
||||
three backends (Sled, in-memory, gRPC client)
|
||||
- <!-- .element: class="fragment" -->
|
||||
more backends and more test suites planned.
|
||||
- <!-- .element: class="fragment" -->
|
||||
FUSE filesystem to expose the store (to Tvix Builders, \"appliances\") <!-- .element: class="fragment" -->
|
||||
|
||||
Note: backends: RocksDB, sqlite, s3. fuse: lazy fetching of build input files | think about a minimal initrd to bring up network and mount the store, then run any closure.
|
||||
|
||||
----
|
||||
|
||||
### Store: Demo
|
||||
|
||||
[](https://asciinema.org/a/YFB9yycHdx0OUH9N0WdAkIYua)
|
||||
|
||||
----
|
||||
|
||||
### Store: Status (cont.)
|
||||
- <!-- .element: class="fragment" -->
|
||||
More work on store composition needed (necessary for substition and caching)
|
||||
- <!-- .element: class="fragment" -->
|
||||
More work on more granular blob substititon needed.
|
||||
- <!-- .element: class="fragment" -->
|
||||
More work on bridges with Nix needed
|
||||
- <!-- .element: class="fragment" -->
|
||||
Get Nix to talk to a tvix-store
|
||||
- <!-- .element: class="fragment" -->
|
||||
Expose existing binary caches to tvix-store
|
||||
|
||||
---
|
||||
|
||||
### Builder: Design
|
||||
|
||||
- <!-- .element: class="fragment" -->
|
||||
Build requests/Build protocol is less Nix-specific
|
||||
- <!-- .element: class="fragment" -->
|
||||
allows reusing builders for other usages (non-sandboxed builds, other build systems, playing with other addressing mechanisms)
|
||||
- <!-- .element: class="fragment" -->
|
||||
Distinction between a **specific build attempt** and the **general build recipe**
|
||||
- <!-- .element: class="fragment" -->
|
||||
allows keeping metadata about failed builds
|
||||
- <!-- .element: class="fragment" -->
|
||||
stats (memory/cpu consumption)
|
||||
- <!-- .element: class="fragment" -->
|
||||
comparing different produced binary outputs (r11y)
|
||||
|
||||
----
|
||||
|
||||
### Builder: Design
|
||||
|
||||
- <!-- .element: class="fragment" -->
|
||||
Invididual builds can be run in your desired container/virt engine/scheduler, as long as it speaks the same Build API
|
||||
- <!-- .element: class="fragment" -->
|
||||
Build API composition/proxying, similar to Store composition
|
||||
- <!-- .element: class="fragment" -->
|
||||
allows "unattended building" (evaluate nixpkgs locally and send all build requests to a remote builder)
|
||||
- <!-- .element: class="fragment" -->
|
||||
allows tailing logs from currently/already running builds
|
||||
|
||||
----
|
||||
|
||||
### Builder: Status
|
||||
|
||||
- <!-- .element: class="fragment" -->
|
||||
Dummy Builder implementation in `go-nix` (using OCI)
|
||||
- <!-- .element: class="fragment" -->
|
||||
Some scribble notes on the Build Protocol
|
||||
- <!-- .element: class="fragment" -->
|
||||
Glue code to trigger builds from inside `builtins.derivation` needs to be written
|
||||
- <!-- .element: class="fragment" -->
|
||||
Builder implementation (using `systemd-nspwan` or some container engine needs to be written.
|
||||
- <!-- .element: class="fragment" -->
|
||||
Web interface to visualize store contents and build graphs/builds/logs
|
||||
|
||||
---
|
||||
|
||||
## Contributing
|
||||
|
||||
- <!-- .element: class="fragment" -->
|
||||
Join the IRC channel (`#tvl` on `hackint`), bridged to Matrix and XMPP
|
||||
- <!-- .element: class="fragment" -->
|
||||
Check our issue tracker
|
||||
- <!-- .element: class="fragment" -->
|
||||
Try to use it and tell us how you broke it!
|
||||
- <!-- .element: class="fragment" -->
|
||||
Add various Nix bits to `nix-compat`
|
||||
|
||||
Note: or if you like what you seeing and want to sponsor parts, that's also cool :-)
|
||||
|
||||
---
|
||||
|
||||
# Thanks to...
|
||||
|
||||
- <!-- .element: class="fragment" -->
|
||||
all TVL contributors (some drive-by, some long-term contributors)
|
||||
- <!-- .element: class="fragment" -->
|
||||
countless Nix community members for their input on the architecture and rubberducking
|
||||
- <!-- .element: class="fragment" -->
|
||||
NLNET and others to sponsor parts of this
|
||||
|
||||
----
|
||||
|
||||
# Questions?
|
||||
|
||||
<style>
|
||||
.container{
|
||||
display: flex;
|
||||
}
|
||||
.col{
|
||||
flex: 1;
|
||||
}
|
||||
</style>
|
||||
|
||||
<div class="container">
|
||||
|
||||
<div class="col">
|
||||
Florian Klink / <a href="https://flokli.de">flokli.de</a><br />
|
||||
<img src="qrcode-flokli.svg" />
|
||||
</div>
|
||||
|
||||
<div class="col">
|
||||
Tvix / <a href="https://tvix.dev">tvix.dev</a><br />
|
||||
<img src="qrcode-tvix.svg" />
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
Before Width: | Height: | Size: 126 KiB |
|
|
@ -1,36 +0,0 @@
|
|||
{ depot, pkgs, ... }:
|
||||
|
||||
let
|
||||
inherit (pkgs)
|
||||
fontconfig qrencode runCommand stdenv;
|
||||
mkQr = url: runCommand "qrcode.png" { } ''
|
||||
${qrencode}/bin/qrencode -o $out -t SVG -s 5 \
|
||||
--background=fafafa \
|
||||
--foreground=000000 \
|
||||
${url}
|
||||
'';
|
||||
in
|
||||
stdenv.mkDerivation {
|
||||
name = "2023-asg-tvix-store";
|
||||
src = ./.;
|
||||
|
||||
FONTCONFIG_FILE = pkgs.makeFontsConf {
|
||||
fontDirectories = with pkgs; [ jetbrains-mono fira fira-code fira-mono lato ];
|
||||
};
|
||||
|
||||
nativeBuildInputs = [ pkgs.reveal-md pkgs.graphviz ];
|
||||
|
||||
buildPhase = ''
|
||||
cp ${depot.tvix.logo}/logo.png tvix-logo.png
|
||||
cp ${mkQr "https://flokli.de"} qrcode-flokli.svg
|
||||
cp ${mkQr "https://tvix.dev"} qrcode-tvix.svg
|
||||
|
||||
mkdir -p $out
|
||||
cp tvix-store-graph-blob-directory.svg $out/
|
||||
reveal-md --static $out presentation.md
|
||||
|
||||
CHROME_CONFIG_HOME=/build/.config reveal-md presentation.md --print $out/slides.pdf --puppeteer-chromium-executable="${pkgs.chromium}/bin/chromium"
|
||||
# Above command doesn't fail on error, ensure file has been created
|
||||
[[ -f "$out/slides.pdf" ]] || exit 1
|
||||
'';
|
||||
}
|
||||
|
|
@ -1,138 +0,0 @@
|
|||
---
|
||||
author:
|
||||
- Florian Klink
|
||||
date: 2023-09-09
|
||||
title: "tvix-store: A content-addressed file system and sync protocol"
|
||||
theme: moon
|
||||
revealOptions:
|
||||
transition: 'fade'
|
||||
---
|
||||
|
||||
## tvix-store
|
||||
### A content-addressed file system and sync protocol
|
||||
|
||||
2023-09-13
|
||||
|
||||
Florian Klink / flokli
|
||||
|
||||
---
|
||||
|
||||
## Whoami
|
||||
|
||||
- <!-- .element: class="fragment" -->
|
||||
flokli
|
||||
- <!-- .element: class="fragment" -->
|
||||
Nix/NixOS contributor
|
||||
- maintain systemd, nss and more low-level stuff there
|
||||
- <!-- .element: class="fragment" -->
|
||||
Freelance Nix/DevOps consultant
|
||||
|
||||
Note: more Kubernetes/DevOps exposure with work
|
||||
|
||||
---
|
||||
|
||||
## What is tvix-store?
|
||||
- <!-- .element: class="fragment" -->
|
||||
A new implementation of a content-addressed "storage system"
|
||||
- <!-- .element: class="fragment" -->
|
||||
part of the Tvix Project, a (WIP) reimplementation of Nix and auxillary components in Rust
|
||||
- <!-- .element: class="fragment" -->
|
||||
Storage model: think about git trees and its Merkle DAG…
|
||||
- <!-- .element: class="fragment" -->
|
||||
… but with nicer wire format (`.proto`) and hash function (blake3)
|
||||
|
||||
---
|
||||
|
||||
## Storage model
|
||||
- <!-- .element: class="fragment" -->
|
||||
Once you know the root: everything else is content-addressed
|
||||
- <!-- .element: class="fragment" -->
|
||||
No timestamps, no uid/gid, no xattrs, only one way to represent the same tree
|
||||
- <!-- .element: class="fragment" -->
|
||||
Automatic dedup of identical subtrees in different file system trees
|
||||
- <!-- .element: class="fragment" -->
|
||||
Automatic dedup of identical blobs (and you can do more chunking underneath too)
|
||||
|
||||
---
|
||||
|
||||
## Storage model (cont.)
|
||||
- <!-- .element: class="fragment" -->
|
||||
Granular seekable access into blobs
|
||||
- <!-- .element: class="fragment" -->
|
||||
verified streaming thanks to BLAKE3 and Bao, faulty data is detected early on
|
||||
- <!-- .element: class="fragment" -->
|
||||
Everything below can be retrieved from anyone without having to trust (P2P substitution, CDNs, …)
|
||||
|
||||
---
|
||||
|
||||
## Usecases
|
||||
- <!-- .element: class="fragment" -->
|
||||
File system tree delivery
|
||||
- <!-- .element: class="fragment" -->
|
||||
Container image delivery
|
||||
- <!-- .element: class="fragment" -->
|
||||
Backing store for VCS
|
||||
- <!-- .element: class="fragment" -->
|
||||
Granular access into large datasets
|
||||
|
||||
---
|
||||
|
||||
## Status
|
||||
- <!-- .element: class="fragment" -->
|
||||
In-memory backend, a local K/V backend (Sled)
|
||||
- <!-- .element: class="fragment" -->
|
||||
FUSE filesystem
|
||||
- <!-- .element: class="fragment" -->
|
||||
A gRPC API to transfer things, bindings for golang and rust
|
||||
- <!-- .element: class="fragment" -->
|
||||
some object storage backends in development (GCS, NATS)
|
||||
- <!-- .element: class="fragment" -->
|
||||
FUTUREWORK: more storage backends / store composition / in-kernel module?
|
||||
|
||||
Notes: of course you can use your own network protocol too, like HTTP CAS or iroh....plug different stores together to represent caches, blobfs
|
||||
|
||||
---
|
||||
|
||||
## Contributing
|
||||
|
||||
- <!-- .element: class="fragment" -->
|
||||
Join the IRC channel (`#tvl` on `hackint`), bridged to Matrix and XMPP
|
||||
- <!-- .element: class="fragment" -->
|
||||
Check our issue tracker
|
||||
- <!-- .element: class="fragment" -->
|
||||
Try to use it and tell us how you broke it!
|
||||
|
||||
Note: if this sounds useful to you, reach out!
|
||||
|
||||
---
|
||||
|
||||
# Thanks!
|
||||
|
||||
<style>
|
||||
.container{
|
||||
display: flex;
|
||||
}
|
||||
.col{
|
||||
flex: 1;
|
||||
}
|
||||
</style>
|
||||
|
||||
<div class="container">
|
||||
|
||||
<div class="col">
|
||||
Florian Klink / <a href="https://flokli.de">flokli.de</a><br />
|
||||
<img src="qrcode-flokli.svg" />
|
||||
</div>
|
||||
|
||||
<div class="col">
|
||||
Tvix / <a href="https://tvix.dev">tvix.dev</a><br />
|
||||
<img src="qrcode-tvix.svg" />
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
---
|
||||
|
||||
## Structure
|
||||
|
||||
[tvix-store graph](tvix-store-graph-blob-directory.svg)
|
||||
|
Before Width: | Height: | Size: 67 KiB |
|
|
@ -1 +0,0 @@
|
|||
*.log
|
||||
|
|
@ -1,39 +0,0 @@
|
|||
{ depot, pkgs, ... }:
|
||||
|
||||
let
|
||||
inherit (pkgs)
|
||||
fontconfig qrencode runCommand stdenv;
|
||||
mkQr = url: runCommand "qrcode.png" { } ''
|
||||
${qrencode}/bin/qrencode -o $out -t SVG -s 5 \
|
||||
--background=fafafa \
|
||||
--foreground=000000 \
|
||||
${url}
|
||||
'';
|
||||
in
|
||||
stdenv.mkDerivation {
|
||||
name = "2024-nixcon-tvix";
|
||||
src = ./.;
|
||||
|
||||
FONTCONFIG_FILE = pkgs.makeFontsConf {
|
||||
fontDirectories = with pkgs; [ jetbrains-mono fira fira-code fira-mono lato ];
|
||||
};
|
||||
|
||||
nativeBuildInputs = [ pkgs.reveal-md pkgs.graphviz ];
|
||||
|
||||
buildPhase = ''
|
||||
cp ${depot.tvix.logo}/logo.png tvix-logo.png
|
||||
cp ${mkQr "https://flokli.de"} qrcode-flokli.svg
|
||||
cp ${mkQr "https://tvix.dev"} qrcode-tvix.svg
|
||||
|
||||
mkdir -p $out
|
||||
reveal-md --static $out presentation.md
|
||||
|
||||
CHROME_CONFIG_HOME=/build/.config reveal-md presentation.md --print $out/slides.pdf --puppeteer-chromium-executable="${pkgs.chromium}/bin/chromium"
|
||||
# Above command doesn't fail on error, ensure file has been created
|
||||
[[ -f "$out/slides.pdf" ]] || exit 1
|
||||
'';
|
||||
|
||||
# reveal-md presentation.md --print started timing out possibly due to
|
||||
# chromium: 133.0.6943.141 -> 134.0.6998.35
|
||||
meta.ci.skip = true;
|
||||
}
|
||||
|
Before Width: | Height: | Size: 271 KiB |
|
Before Width: | Height: | Size: 372 KiB |
|
|
@ -1,261 +0,0 @@
|
|||
---
|
||||
author:
|
||||
- Florian Klink
|
||||
date: 2024-10-25
|
||||
title: "Tvix: Status update"
|
||||
theme: solarized
|
||||
revealOptions:
|
||||
transition: 'fade'
|
||||
---
|
||||
|
||||
# Tvix: Status update
|
||||
|
||||

|
||||
|
||||
2024-10-25
|
||||
|
||||
Florian Klink (flokli)
|
||||
|
||||
---
|
||||
|
||||
## Whoami
|
||||
|
||||
- flokli<!-- .element: class="fragment" -->
|
||||
- nixpkgs contributor since 2018, maintaining systemd, nsncd and more<!-- .element: class="fragment" -->
|
||||
- Freelance Nix/DevOps consultant<!-- .element: class="fragment" -->
|
||||
|
||||
---
|
||||
|
||||
## What is Tvix?
|
||||
|
||||
---
|
||||
|
||||

|
||||
<!-- .element: class="r-stretch" -->
|
||||
|
||||
---
|
||||
|
||||
## What is Tvix?
|
||||
|
||||
- A Rust re-implementation of the components of the Nix package manager<!-- .element: class="fragment" -->
|
||||
- Uses different underlying approaches while retaining Nix compatibility "on the surface"<!-- .element: class="fragment" -->
|
||||
- modular architecture, allowing to recombine aspects to solve your usecase<!-- .element: class="fragment" -->
|
||||
- No "end-user CLI" for now, focus on getting the foundational architecture right and 100% correctness with Nix<!-- .element: class="fragment" -->
|
||||
|
||||
---
|
||||
|
||||
## Topics
|
||||
- Component overview<!-- .element: class="fragment" -->
|
||||
- Recent developments<!-- .element: class="fragment" -->
|
||||
- Next steps<!-- .element: class="fragment" -->
|
||||
|
||||
Note: Component overview, to understand a bit better how it's different / updates since the last talk / outlook on roadmap
|
||||
|
||||
---
|
||||
|
||||
## Structure
|
||||
|
||||
- <!-- .element: class="fragment" -->
|
||||
**tvix-castore**, the granular data storage/syncing engine.
|
||||
- <!-- .element: class="fragment" -->
|
||||
**tvix-store**, the "Nix store implementation" on top of tvix-castore
|
||||
- <!-- .element: class="fragment" -->
|
||||
**nix-compat**, a library providing access to data formats, protocols and concepts
|
||||
- <!-- .element: class="fragment" -->
|
||||
**tvix-eval**, a bytecode interpreter evaluator and core Nix *language* concepts and builtins
|
||||
- <!-- .element: class="fragment" -->
|
||||
**tvix-build**, a generic builder interface
|
||||
- <!-- .element: class="fragment" -->
|
||||
**tvix-glue**, combines tvix-eval with tvix-[ca]store and tvix-build
|
||||
|
||||
|
||||
Note: one big cargo workspace / go into detail later! / nix-compat: concepts like output path calculation, doesn't depend on tvix crates
|
||||
tvix-eval: language concepts being Scopes, Thunks, Nix values, "core builtins"
|
||||
|
||||
----
|
||||
|
||||

|
||||
<!-- .element: class="r-stretch" -->
|
||||
|
||||
Note: Nix does do content addressing on a store path level, we're on a per-file/chunk in file. That model allows granular syncing and reuse of parts, which will speedup substitution/copying. Because everything is ca, it'll also allow decentralization and local p2p substitution. Think about everyone in the same room serving chunks. verified streaming.
|
||||
|
||||
----
|
||||
|
||||

|
||||
<!-- .element: class="r-stretch" -->
|
||||
|
||||
Note: track all metadata about store paths (think about the sqlite db), and link to castore instead of storing NAR. NarCalculation: this computation, is super nice to cache, as this info
|
||||
never needs to expire, and is reconstructable in a pure CA manner.
|
||||
|
||||
----
|
||||
|
||||

|
||||
<!-- .element: class="r-stretch" -->
|
||||
|
||||
Note: kept as a somewhat separate library, Tvix "first consumer". But use from your code, it doesn't depend on Tvix bits. Regularly factoring out Nix concepts into this library
|
||||
|
||||
----
|
||||
|
||||

|
||||
<!-- .element: class="r-stretch" -->
|
||||
|
||||
Note: only includes basic builtins, like string manipulation, math, …. Other crates can bring their own builtins
|
||||
|
||||
----
|
||||
|
||||

|
||||
<!-- .element: class="r-stretch" -->
|
||||
|
||||
Note: Not aware of Nix, store paths etc. just flexible enough to express everything in there. Use it for your own build system!
|
||||
|
||||
----
|
||||
|
||||

|
||||
<!-- .element: class="r-stretch" -->
|
||||
|
||||
Note: connects the evaluator to store and builders
|
||||
|
||||
----
|
||||
|
||||

|
||||
<!-- .element: class="r-stretch" -->
|
||||
|
||||
Note: Example on how to use this: Nix HTTP binary cache lens into tvix-[ca]store, allows Nix to download from and push into. It renders NARs on-the-fly
|
||||
|
||||
---
|
||||
|
||||
## Updates
|
||||
Rough overview. Check blog posts and `git log` for details!
|
||||
|
||||
----
|
||||
|
||||
## Updates (#1)
|
||||
|
||||
- <!-- .element: class="fragment" -->
|
||||
Fixes on error catchability and context behaviour
|
||||
- <!-- .element: class="fragment" -->
|
||||
More compact Nix Value types (memory-wise)
|
||||
- <!-- .element: class="fragment" -->
|
||||
`tvix-cli` REPL global scope manipulation (assign variables and use them in next command)
|
||||
- <!-- .element: class="fragment" -->
|
||||
`firefox.outPath` and `pkgsCross.aarch64-multiplatform.firefox.outPath` correct and added to CI 🎉
|
||||
|
||||
Notes: catchability/context to align behaviour with nix / … / assign variables and use them in the next REPL command
|
||||
|
||||
----
|
||||
|
||||
## Updates (#2)
|
||||
|
||||
- <!-- .element: class="fragment" -->
|
||||
OpenTelemetry integration, trace propagation throughout the entire stack
|
||||
- <!-- .element: class="fragment" -->
|
||||
more backends in tvix-[ca]store (`object_store`/`local fs`/`redb`/`bigtable`/…)
|
||||
- <!-- .element: class="fragment" -->
|
||||
nar-bridge RIIR, was deployed as a fetch-through cache for cache.nixos.org at Bornhack
|
||||
- <!-- .element: class="fragment" -->
|
||||
store composition/combinators
|
||||
- <!-- .element: class="fragment" -->
|
||||
wiring up of builds (without reference propagation yet, but reference scanning)
|
||||
|
||||
Notes: o11y already proven super helpful for debugging where time is spent / first version of composition / builds waiting on reference propagation
|
||||
|
||||
----
|
||||
|
||||
## Other Updates
|
||||
|
||||
- <!-- .element: class="fragment" -->
|
||||
A lot of the tooling for `cache.nixos.org` usage / closure analysis making use of and contributing to `nix-compat` (`@edef`) 🎉
|
||||
- <!-- .element: class="fragment" -->
|
||||
"Replit using `tvix-[ca]store` and reporting 10x storage reduction" (`@cbrewster`) 🎉
|
||||
- <!-- .element: class="fragment" -->
|
||||
"Devenv is switching to Tvix" (Talk on Saturday 12:55, `@domenkozar`) 🎉
|
||||
|
||||
---
|
||||
|
||||
## Next steps (in no specific order):
|
||||
|
||||
- <!-- .element: class="fragment" -->
|
||||
Test suite classification system, to decouple test cases from test runner and share with other Nix impls
|
||||
- <!-- .element: class="fragment" -->
|
||||
(Continuous) Docs deployment, website restructuring
|
||||
- <!-- .element: class="fragment" -->
|
||||
Interactions with the evaluator (LSP, DAP)
|
||||
- <!-- .element: class="fragment" -->
|
||||
Persistent deployment of nar-bridge, as fetch-through cache for `cache.nixos.org`
|
||||
- <!-- .element: class="fragment" -->
|
||||
Blob / Chunking protocol improvements (use local chunks where possible, allow readahead)
|
||||
|
||||
Note: Allows filtering, reusing test cases in Nixcpp and Lix.
|
||||
Mention some behavorial changes found.
|
||||
Mention fetchTree
|
||||
Make it easier for new contributors to get started
|
||||
LSP / Debug adapter protocol / tvix-eval jobs
|
||||
/ … / is gonna improve performance for IO into store paths
|
||||
|
||||
----
|
||||
|
||||
## Next steps (in no specific order) (cont.):
|
||||
|
||||
- <!-- .element: class="fragment" -->
|
||||
"Build/Fetch realization goal engine" (tradeoff network bandwidth and CPU time)
|
||||
- <!-- .element: class="fragment" -->
|
||||
More per-store metrics and instance names
|
||||
- <!-- .element: class="fragment" -->
|
||||
More backends (p2p discovery, ipfs, …)
|
||||
|
||||
Note: needed for builds / to get better insights into cache hit ratios etc.
|
||||
|
||||
---
|
||||
|
||||
## Contributing
|
||||
|
||||
- <!-- .element: class="fragment" -->
|
||||
Join the IRC channel (`#tvix-dev` on `hackint`), bridged to Matrix and XMPP
|
||||
- <!-- .element: class="fragment" -->
|
||||
Check our issue tracker (b.tvl.fyi), as well as `tvix/docs/src/TODO.md` (but ask!)
|
||||
- <!-- .element: class="fragment" -->
|
||||
Try to use it and tell us how you broke it!
|
||||
- <!-- .element: class="fragment" -->
|
||||
Sponsoring
|
||||
|
||||
Note: make sure to ask in the channel to ensure noone is already working on this
|
||||
|
||||
---
|
||||
|
||||
# Thanks to...
|
||||
|
||||
- <!-- .element: class="fragment" -->
|
||||
all Tvix contributors
|
||||
- <!-- .element: class="fragment" -->
|
||||
Nix community members for their input on the architecture
|
||||
- <!-- .element: class="fragment" -->
|
||||
Sponsors
|
||||
|
||||
Note: some drive-by, some sticking around longer / NLNET / Clan
|
||||
|
||||
----
|
||||
|
||||
# Questions?
|
||||
|
||||
<style>
|
||||
.container{
|
||||
display: flex;
|
||||
}
|
||||
.col{
|
||||
flex: 1;
|
||||
}
|
||||
</style>
|
||||
|
||||
<div class="container">
|
||||
|
||||
<div class="col">
|
||||
Florian Klink / <a href="https://flokli.de">flokli.de</a><br />
|
||||
<img src="qrcode-flokli.svg" />
|
||||
</div>
|
||||
|
||||
<div class="col">
|
||||
Tvix / <a href="https://tvix.dev">tvix.dev</a><br />
|
||||
<img src="qrcode-tvix.svg" />
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
Before Width: | Height: | Size: 212 KiB |
|
Before Width: | Height: | Size: 400 KiB |
|
Before Width: | Height: | Size: 242 KiB |
|
Before Width: | Height: | Size: 196 KiB |
|
Before Width: | Height: | Size: 224 KiB |
|
Before Width: | Height: | Size: 95 KiB |