Compare commits
43 Commits
wip/feeds
...
wip/feeds3
Author | SHA1 | Date | |
---|---|---|---|
a829a8e027 | |||
d742ae83bd | |||
110ab1a794 | |||
7d5a81e542 | |||
1af2a3f329 | |||
3fa9e910a9 | |||
6befc40700 | |||
29db2d8dc5 | |||
36d8052982 | |||
48115231a3 | |||
8b56ddd1ca | |||
c1457f5bfb | |||
7dfaf77a71 | |||
72dc7029e6 | |||
95f3215b00 | |||
baac8df8c2 | |||
dc6a08a12b | |||
2413e2eb5f | |||
7327128493 | |||
ed8059f4c4 | |||
3a72295610 | |||
e6d9edf27d | |||
78782d5f7e | |||
91275f3723 | |||
8115edea8d | |||
4c475bbf9c | |||
7040e1f07c | |||
aafa64942c | |||
a44a99e371 | |||
a7ff90c843 | |||
d4996d6f31 | |||
bd5209c655 | |||
9588108fd5 | |||
942e302afb | |||
2bd98e6764 | |||
7b9910f287 | |||
917afe209e | |||
cc5cf9b6f4 | |||
57d95dd298 | |||
0b78df53be | |||
c8dcb4ac59 | |||
241f4ae58f | |||
965d7eedbb |
52
flake.lock
generated
52
flake.lock
generated
@@ -53,27 +53,29 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"nixpkgs": {
|
"nixpkgs": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixpkgs-unpatched"
|
||||||
|
]
|
||||||
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1672953546,
|
"lastModified": 1,
|
||||||
"narHash": "sha256-oz757DnJ1ITvwyTovuwG3l9cX6j9j6/DH9eH+cXFJmc=",
|
"narHash": "sha256-RM4ZprjMlUTMD0huOPQceF0ujXG2xk7LE1fGXfcg71g=",
|
||||||
"owner": "NixOS",
|
"path": "nixpatches",
|
||||||
"repo": "nixpkgs",
|
"type": "path"
|
||||||
"rev": "a518c77148585023ff56022f09c4b2c418a51ef5",
|
|
||||||
"type": "github"
|
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"id": "nixpkgs",
|
"path": "nixpatches",
|
||||||
"ref": "nixos-unstable",
|
"type": "path"
|
||||||
"type": "indirect"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"nixpkgs-stable": {
|
"nixpkgs-stable": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1673163619,
|
"lastModified": 1673527292,
|
||||||
"narHash": "sha256-B33PFBL64ZgTWgMnhFL3jgheAN/DjHPsZ1Ih3z0VE5I=",
|
"narHash": "sha256-903EpRSDCfUvic7Hsiqwy+h7zlMTLAUbCXkEGGriCfM=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "8c54d842d9544361aac5f5b212ba04e4089e8efe",
|
"rev": "6a3f9996408c970b99b8b992b11bb249d1455b62",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -98,14 +100,30 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"nixpkgs-unpatched": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1673450908,
|
||||||
|
"narHash": "sha256-b8em+kwrNtnB7gR8SyVf6WuTyQ+6tHS6dzt9D9wgKF0=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "6c8644fc37b6e141cbfa6c7dc8d98846c4ff0c2e",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"id": "nixpkgs",
|
||||||
|
"ref": "nixos-unstable",
|
||||||
|
"type": "indirect"
|
||||||
|
}
|
||||||
|
},
|
||||||
"root": {
|
"root": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"home-manager": "home-manager",
|
"home-manager": "home-manager",
|
||||||
"mobile-nixos": "mobile-nixos",
|
"mobile-nixos": "mobile-nixos",
|
||||||
"nixpkgs": "nixpkgs",
|
"nixpkgs": "nixpkgs",
|
||||||
"nixpkgs-stable": "nixpkgs-stable",
|
"nixpkgs-stable": "nixpkgs-stable",
|
||||||
|
"nixpkgs-unpatched": "nixpkgs-unpatched",
|
||||||
"sops-nix": "sops-nix",
|
"sops-nix": "sops-nix",
|
||||||
"uninsane": "uninsane"
|
"uninsane-dot-org": "uninsane-dot-org"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"sops-nix": {
|
"sops-nix": {
|
||||||
@@ -116,11 +134,11 @@
|
|||||||
"nixpkgs-stable": "nixpkgs-stable_2"
|
"nixpkgs-stable": "nixpkgs-stable_2"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1673147300,
|
"lastModified": 1673481602,
|
||||||
"narHash": "sha256-gR9OEfTzWfL6vG0qkbn1TlBAOlg4LuW8xK/u0V41Ihc=",
|
"narHash": "sha256-P80X38fOM2MtoYdgkyuksGOQPDhIhNJW2W2jMeMIZzE=",
|
||||||
"owner": "Mic92",
|
"owner": "Mic92",
|
||||||
"repo": "sops-nix",
|
"repo": "sops-nix",
|
||||||
"rev": "2253120d2a6147e57bafb5c689e086221df8032f",
|
"rev": "32187b33ac6ec9b628dcd08dd941a715e6241dda",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -129,7 +147,7 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"uninsane": {
|
"uninsane-dot-org": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"flake-utils": "flake-utils",
|
"flake-utils": "flake-utils",
|
||||||
"nixpkgs": [
|
"nixpkgs": [
|
||||||
|
153
flake.nix
153
flake.nix
@@ -5,7 +5,11 @@
|
|||||||
{
|
{
|
||||||
inputs = {
|
inputs = {
|
||||||
nixpkgs-stable.url = "nixpkgs/nixos-22.11";
|
nixpkgs-stable.url = "nixpkgs/nixos-22.11";
|
||||||
nixpkgs.url = "nixpkgs/nixos-unstable";
|
nixpkgs-unpatched.url = "nixpkgs/nixos-unstable";
|
||||||
|
nixpkgs = {
|
||||||
|
url = "path:nixpatches";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs-unpatched";
|
||||||
|
};
|
||||||
mobile-nixos = {
|
mobile-nixos = {
|
||||||
url = "github:nixos/mobile-nixos";
|
url = "github:nixos/mobile-nixos";
|
||||||
flake = false;
|
flake = false;
|
||||||
@@ -18,7 +22,7 @@
|
|||||||
url = "github:Mic92/sops-nix";
|
url = "github:Mic92/sops-nix";
|
||||||
inputs.nixpkgs.follows = "nixpkgs";
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
};
|
};
|
||||||
uninsane = {
|
uninsane-dot-org = {
|
||||||
url = "git+https://git.uninsane.org/colin/uninsane";
|
url = "git+https://git.uninsane.org/colin/uninsane";
|
||||||
inputs.nixpkgs.follows = "nixpkgs";
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
};
|
};
|
||||||
@@ -28,59 +32,53 @@
|
|||||||
self,
|
self,
|
||||||
nixpkgs,
|
nixpkgs,
|
||||||
nixpkgs-stable,
|
nixpkgs-stable,
|
||||||
|
nixpkgs-unpatched,
|
||||||
mobile-nixos,
|
mobile-nixos,
|
||||||
home-manager,
|
home-manager,
|
||||||
sops-nix,
|
sops-nix,
|
||||||
uninsane
|
uninsane-dot-org
|
||||||
}: let
|
}:
|
||||||
patchedPkgs = system: nixpkgs.legacyPackages.${system}.applyPatches {
|
|
||||||
name = "nixpkgs-patched-uninsane";
|
|
||||||
src = nixpkgs;
|
|
||||||
patches = import ./nixpatches/list.nix {
|
|
||||||
inherit (nixpkgs.legacyPackages.${system}) fetchpatch;
|
|
||||||
inherit (nixpkgs.lib) fakeHash;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
# return something which behaves like `pkgs`, for the provided system
|
|
||||||
# `local` = architecture of builder. `target` = architecture of the system beying deployed to
|
|
||||||
nixpkgsFor = local: target: import (patchedPkgs target) { crossSystem = target; localSystem = local; };
|
|
||||||
# evaluate ONLY our overlay, for the provided system
|
|
||||||
customPackagesFor = local: target: import ./pkgs/overlay.nix (nixpkgsFor local target) (nixpkgsFor local target);
|
|
||||||
decl-host = { name, local, target }:
|
|
||||||
let
|
let
|
||||||
nixosSystem = import ((patchedPkgs target) + "/nixos/lib/eval-config.nix");
|
nixpkgsCompiledBy = local: nixpkgs.legacyPackages."${local}";
|
||||||
in (nixosSystem {
|
|
||||||
# by default the local system is the same as the target, employing emulation when they differ
|
evalHost = { name, local, target }:
|
||||||
|
let
|
||||||
|
# XXX: we'd prefer to use `nixosSystem = (nixpkgsCompiledBy local).nixos`
|
||||||
|
# but it doesn't propagate config to the underlying pkgs, meaning it doesn't let you use
|
||||||
|
# non-free packages even after setting nixpkgs.allowUnfree.
|
||||||
|
nixosSystem = import ((nixpkgsCompiledBy local).path + "/nixos/lib/eval-config.nix");
|
||||||
|
in
|
||||||
|
(nixosSystem {
|
||||||
|
# we use pkgs built for and *by* the target, i.e. emulation, by default.
|
||||||
|
# cross compilation only happens on explicit access to `pkgs.cross`
|
||||||
system = target;
|
system = target;
|
||||||
modules = [
|
modules = [
|
||||||
./modules
|
(import ./hosts/instantiate.nix { localSystem = local; hostName = name; })
|
||||||
(import ./hosts/instantiate.nix name)
|
self.nixosModules.default
|
||||||
home-manager.nixosModule
|
self.nixosModules.passthru
|
||||||
sops-nix.nixosModules.sops
|
|
||||||
{
|
{
|
||||||
nixpkgs.overlays = [
|
nixpkgs.overlays = [
|
||||||
(import "${mobile-nixos}/overlay/overlay.nix")
|
self.overlays.default
|
||||||
uninsane.overlay
|
self.overlays.passthru
|
||||||
(import ./pkgs/overlay.nix)
|
|
||||||
(next: prev: rec {
|
|
||||||
# non-emulated packages build *from* local *for* target.
|
|
||||||
# for large packages like the linux kernel which are expensive to build under emulation,
|
|
||||||
# the config can explicitly pull such packages from `pkgs.cross` to do more efficient cross-compilation.
|
|
||||||
cross = (nixpkgsFor local target) // (customPackagesFor local target);
|
|
||||||
stable = import nixpkgs-stable { system = target; };
|
|
||||||
|
|
||||||
# cross-compatible packages
|
|
||||||
# gocryptfs = cross.gocryptfs;
|
|
||||||
|
|
||||||
# pinned packages:
|
|
||||||
})
|
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
});
|
});
|
||||||
|
in {
|
||||||
|
nixosConfigurations = {
|
||||||
|
servo = evalHost { name = "servo"; local = "x86_64-linux"; target = "x86_64-linux"; };
|
||||||
|
desko = evalHost { name = "desko"; local = "x86_64-linux"; target = "x86_64-linux"; };
|
||||||
|
lappy = evalHost { name = "lappy"; local = "x86_64-linux"; target = "x86_64-linux"; };
|
||||||
|
moby = evalHost { name = "moby"; local = "aarch64-linux"; target = "aarch64-linux"; };
|
||||||
|
# special cross-compiled variant, to speed up deploys from an x86 box to the arm target
|
||||||
|
# note that these *do* produce different store paths, because the closure for the tools used to cross compile
|
||||||
|
# v.s. emulate differ.
|
||||||
|
# so deploying foo-cross and then foo incurs some rebuilding.
|
||||||
|
moby-cross = evalHost { name = "moby"; local = "x86_64-linux"; target = "aarch64-linux"; };
|
||||||
|
rescue = evalHost { name = "rescue"; local = "x86_64-linux"; target = "x86_64-linux"; };
|
||||||
|
};
|
||||||
|
|
||||||
decl-bootable-host = { name, local, target }: rec {
|
# unofficial output
|
||||||
nixosConfiguration = decl-host { inherit name local target; };
|
|
||||||
# this produces a EFI-bootable .img file (GPT with a /boot partition and a system (/ or /nix) partition).
|
# this produces a EFI-bootable .img file (GPT with a /boot partition and a system (/ or /nix) partition).
|
||||||
# after building this:
|
# after building this:
|
||||||
# - flash it to a bootable medium (SD card, flash drive, HDD)
|
# - flash it to a bootable medium (SD card, flash drive, HDD)
|
||||||
@@ -94,30 +92,65 @@
|
|||||||
# - if fs wasn't resized automatically, then `sudo btrfs filesystem resize max /`
|
# - if fs wasn't resized automatically, then `sudo btrfs filesystem resize max /`
|
||||||
# - checkout this flake into /etc/nixos AND UPDATE THE FS UUIDS.
|
# - checkout this flake into /etc/nixos AND UPDATE THE FS UUIDS.
|
||||||
# - `nixos-rebuild --flake './#<host>' switch`
|
# - `nixos-rebuild --flake './#<host>' switch`
|
||||||
img = nixosConfiguration.config.system.build.img;
|
imgs = builtins.mapAttrs (_: host-dfn: host-dfn.config.system.build.img) self.nixosConfigurations;
|
||||||
|
|
||||||
|
overlays = rec {
|
||||||
|
default = pkgs;
|
||||||
|
pkgs = import ./pkgs/overlay.nix;
|
||||||
|
passthru =
|
||||||
|
let
|
||||||
|
stable = next: prev: {
|
||||||
|
stable = nixpkgs-stable.legacyPackages."${prev.stdenv.hostPlatform}";
|
||||||
};
|
};
|
||||||
hosts.servo = decl-bootable-host { name = "servo"; local = "x86_64-linux"; target = "x86_64-linux"; };
|
mobile = (import "${mobile-nixos}/overlay/overlay.nix");
|
||||||
hosts.desko = decl-bootable-host { name = "desko"; local = "x86_64-linux"; target = "x86_64-linux"; };
|
uninsane = uninsane-dot-org.overlay;
|
||||||
hosts.lappy = decl-bootable-host { name = "lappy"; local = "x86_64-linux"; target = "x86_64-linux"; };
|
in
|
||||||
hosts.moby = decl-bootable-host { name = "moby"; local = "aarch64-linux"; target = "aarch64-linux"; };
|
next: prev:
|
||||||
# special cross-compiled variant, to speed up deploys from an x86 box to the arm target
|
(stable next prev) // (mobile next prev) // (uninsane next prev);
|
||||||
# note that these *do* produce different store paths, because the closure for the tools used to cross compile
|
|
||||||
# v.s. emulate differ.
|
|
||||||
# so deploying foo-cross and then foo incurs some rebuilding.
|
|
||||||
hosts.moby-cross = decl-bootable-host { name = "moby"; local = "x86_64-linux"; target = "aarch64-linux"; };
|
|
||||||
hosts.rescue = decl-bootable-host { name = "rescue"; local = "x86_64-linux"; target = "x86_64-linux"; };
|
|
||||||
in {
|
|
||||||
nixosConfigurations = builtins.mapAttrs (name: value: value.nixosConfiguration) hosts;
|
|
||||||
imgs = builtins.mapAttrs (name: value: value.img) hosts;
|
|
||||||
packages = let
|
|
||||||
allPkgsFor = sys: (customPackagesFor sys sys) // {
|
|
||||||
nixpkgs = nixpkgsFor sys sys;
|
|
||||||
uninsane = uninsane.packages."${sys}";
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
nixosModules = rec {
|
||||||
|
default = sane;
|
||||||
|
sane = import ./modules;
|
||||||
|
passthru = { ... }: {
|
||||||
|
imports = [
|
||||||
|
home-manager.nixosModule
|
||||||
|
sops-nix.nixosModules.sops
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# this includes both our native packages and all the nixpkgs packages.
|
||||||
|
legacyPackages =
|
||||||
|
let
|
||||||
|
allPkgsFor = sys: (nixpkgsCompiledBy sys).appendOverlays [
|
||||||
|
self.overlays.passthru self.overlays.pkgs
|
||||||
|
];
|
||||||
in {
|
in {
|
||||||
x86_64-linux = allPkgsFor "x86_64-linux";
|
x86_64-linux = allPkgsFor "x86_64-linux";
|
||||||
aarch64-linux = allPkgsFor "aarch64-linux";
|
aarch64-linux = allPkgsFor "aarch64-linux";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
# extract only our own packages from the full set
|
||||||
|
packages = builtins.mapAttrs
|
||||||
|
(_: full: full.sane // { inherit (full) sane uninsane-dot-org; })
|
||||||
|
self.legacyPackages;
|
||||||
|
|
||||||
|
apps."x86_64-linux" =
|
||||||
|
let
|
||||||
|
pkgs = self.legacyPackages."x86_64-linux";
|
||||||
|
in {
|
||||||
|
update-feeds = {
|
||||||
|
type = "app";
|
||||||
|
program = "${pkgs.feeds.passthru.updateScript}";
|
||||||
|
};
|
||||||
|
|
||||||
|
init-feed = {
|
||||||
|
type = "app";
|
||||||
|
program = "${pkgs.feeds.passthru.initFeedScript}";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
templates = {
|
templates = {
|
||||||
python-data = {
|
python-data = {
|
||||||
# initialize with:
|
# initialize with:
|
||||||
|
15
hosts/common/cross.nix
Normal file
15
hosts/common/cross.nix
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
{ ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
# the configuration of which specific package set `pkgs.cross` refers to happens elsewhere;
|
||||||
|
# here we just define them all.
|
||||||
|
nixpkgs.overlays = [
|
||||||
|
(next: prev: {
|
||||||
|
# non-emulated packages build *from* local *for* target.
|
||||||
|
# for large packages like the linux kernel which are expensive to build under emulation,
|
||||||
|
# the config can explicitly pull such packages from `pkgs.cross` to do more efficient cross-compilation.
|
||||||
|
crossFrom."x86_64-linux" = (prev.forceSystem "x86_64-linux" null).appendOverlays next.overlays;
|
||||||
|
crossFrom."aarch64-linux" = (prev.forceSystem "aarch64-linux" null).appendOverlays next.overlays;
|
||||||
|
})
|
||||||
|
];
|
||||||
|
}
|
@@ -2,6 +2,7 @@
|
|||||||
{
|
{
|
||||||
imports = [
|
imports = [
|
||||||
./bluetooth.nix
|
./bluetooth.nix
|
||||||
|
./cross.nix
|
||||||
./feeds.nix
|
./feeds.nix
|
||||||
./fs.nix
|
./fs.nix
|
||||||
./hardware
|
./hardware
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
{ ... }:
|
{ lib, sane-data, ... }:
|
||||||
let
|
let
|
||||||
hourly = { freq = "hourly"; };
|
hourly = { freq = "hourly"; };
|
||||||
daily = { freq = "daily"; };
|
daily = { freq = "daily"; };
|
||||||
@@ -12,6 +12,8 @@ let
|
|||||||
tech = { cat = "tech"; };
|
tech = { cat = "tech"; };
|
||||||
uncat = { cat = "uncat"; };
|
uncat = { cat = "uncat"; };
|
||||||
|
|
||||||
|
text = { format = "text"; };
|
||||||
|
|
||||||
mkRss = format: url: { inherit url format; } // uncat // infrequent;
|
mkRss = format: url: { inherit url format; } // uncat // infrequent;
|
||||||
# format-specific helpers
|
# format-specific helpers
|
||||||
mkText = mkRss "text";
|
mkText = mkRss "text";
|
||||||
@@ -21,48 +23,72 @@ let
|
|||||||
# host-specific helpers
|
# host-specific helpers
|
||||||
mkSubstack = subdomain: { substack = subdomain; };
|
mkSubstack = subdomain: { substack = subdomain; };
|
||||||
|
|
||||||
|
fromDb = name:
|
||||||
|
let
|
||||||
|
raw = sane-data.feeds."${name}";
|
||||||
|
in {
|
||||||
|
url = raw.url;
|
||||||
|
# not sure the exact mapping with velocity here: entries per day?
|
||||||
|
freq = lib.mkDefault (
|
||||||
|
if raw.velocity or 0 > 2 then
|
||||||
|
"hourly"
|
||||||
|
else if raw.velocity or 0 > 0.5 then
|
||||||
|
"daily"
|
||||||
|
else if raw.velocity or 0 > 0.1 then
|
||||||
|
"weekly"
|
||||||
|
else
|
||||||
|
"infrequent"
|
||||||
|
);
|
||||||
|
} // lib.optionalAttrs (raw.is_podcast or false) {
|
||||||
|
format = "podcast";
|
||||||
|
};
|
||||||
|
|
||||||
podcasts = [
|
podcasts = [
|
||||||
(mkPod "https://lexfridman.com/feed/podcast/" // rat // weekly)
|
(fromDb "lexfridman.com/podcast" // rat)
|
||||||
|
# (mkPod "https://lexfridman.com/feed/podcast/" // rat // weekly)
|
||||||
## Astral Codex Ten
|
## Astral Codex Ten
|
||||||
(mkPod "http://feeds.libsyn.com/108018/rss" // rat // daily)
|
(fromDb "sscpodcast.libsyn.com" // rat)
|
||||||
## Econ Talk
|
## Econ Talk
|
||||||
(mkPod "https://feeds.simplecast.com/wgl4xEgL" // rat // daily)
|
(fromDb "feeds.simplecast.com/wgl4xEgL" // rat)
|
||||||
## Cory Doctorow
|
## Cory Doctorow -- both podcast & text entries
|
||||||
(mkPod "https://feeds.feedburner.com/doctorow_podcast" // pol // infrequent)
|
(fromDb "craphound.com" // pol)
|
||||||
(mkPod "https://congressionaldish.libsyn.com/rss" // pol // infrequent)
|
(mkPod "https://congressionaldish.libsyn.com/rss" // pol // infrequent)
|
||||||
## Civboot
|
## Civboot -- https://anchor.fm/civboot
|
||||||
(mkPod "https://anchor.fm/s/34c7232c/podcast/rss" // tech // infrequent)
|
(fromDb "anchor.fm/s/34c7232c/podcast/rss" // tech)
|
||||||
(mkPod "https://feeds.feedburner.com/80000HoursPodcast" // rat // weekly)
|
(fromDb "feeds.feedburner.com/80000HoursPodcast" // rat)
|
||||||
(mkPod "https://allinchamathjason.libsyn.com/rss" // pol // weekly)
|
(fromDb "allinchamathjason.libsyn.com" // pol)
|
||||||
(mkPod "https://acquired.libsyn.com/rss" // tech // infrequent)
|
(fromDb "acquired.libsyn.com" // tech)
|
||||||
(mkPod "https://rss.acast.com/deconstructed" // pol // infrequent)
|
# The Intercept - Deconstructed; also available: <rss.acast.com/deconstructed>
|
||||||
|
(fromDb "rss.prod.firstlook.media/deconstructed/podcast.rss" // pol)
|
||||||
## The Daily
|
## The Daily
|
||||||
(mkPod "https://feeds.simplecast.com/54nAGcIl" // pol // daily)
|
(mkPod "https://feeds.simplecast.com/54nAGcIl" // pol // daily)
|
||||||
(mkPod "https://rss.acast.com/intercepted-with-jeremy-scahill" // pol // weekly)
|
# The Intercept - Intercepted; also available: <https://rss.acast.com/intercepted-with-jeremy-scahill>
|
||||||
(mkPod "https://podcast.posttv.com/itunes/post-reports.xml" // pol // weekly)
|
(fromDb "rss.prod.firstlook.media/intercepted/podcast.rss" // pol)
|
||||||
|
(fromDb "podcast.posttv.com/itunes/post-reports.xml" // pol)
|
||||||
## Eric Weinstein
|
## Eric Weinstein
|
||||||
(mkPod "https://rss.art19.com/the-portal" // rat // infrequent)
|
(fromDb "rss.art19.com/the-portal" // rat)
|
||||||
(mkPod "https://feeds.megaphone.fm/darknetdiaries" // tech // infrequent)
|
(fromDb "darknetdiaries.com" // tech)
|
||||||
(mkPod "http://feeds.wnyc.org/radiolab" // pol // infrequent)
|
## Radiolab -- also available here, but ONLY OVER HTTP: <http://feeds.wnyc.org/radiolab>
|
||||||
(mkPod "https://wakingup.libsyn.com/rss" // pol // infrequent)
|
(fromDb "feeds.feedburner.com/radiolab" // pol)
|
||||||
## 99% Invisible
|
## Sam Harris
|
||||||
(mkPod "https://feeds.simplecast.com/BqbsxVfO" // pol // infrequent)
|
(fromDb "wakingup.libsyn.com" // pol)
|
||||||
(mkPod "https://rss.acast.com/ft-tech-tonic" // tech // infrequent)
|
## 99% Invisible -- also available here: <https://feeds.simplecast.com/BqbsxVfO>
|
||||||
(mkPod "https://feeds.feedburner.com/dancarlin/history?format=xml" // rat // infrequent)
|
(fromDb "feeds.99percentinvisible.org/99percentinvisible" // pol)
|
||||||
## 60 minutes (NB: this features more than *just* audio?)
|
(fromDb "rss.acast.com/ft-tech-tonic" // tech)
|
||||||
(mkPod "https://www.cbsnews.com/latest/rss/60-minutes" // pol // infrequent)
|
(fromDb "feeds.feedburner.com/dancarlin/history" // rat)
|
||||||
|
(fromDb "rss.art19.com/60-minutes" // pol)
|
||||||
## The Verge - Decoder
|
## The Verge - Decoder
|
||||||
(mkPod "https://feeds.megaphone.fm/recodedecode" // tech // weekly)
|
(fromDb "feeds.megaphone.fm/recodedecode" // tech)
|
||||||
## Matrix (chat) Live
|
## Matrix (chat) Live
|
||||||
(mkPod "https://feed.podbean.com/matrixlive/feed.xml" // tech // weekly)
|
(fromDb "feed.podbean.com/matrixlive/feed.xml" // tech)
|
||||||
## Michael Malice - Your Welcome
|
## Michael Malice - Your Welcome -- also available here: <https://origin.podcastone.com/podcast?categoryID2=2232>
|
||||||
(mkPod "https://www.podcastone.com/podcast?categoryID2=2232" // pol // weekly)
|
(fromDb "rss.art19.com/your-welcome" // pol)
|
||||||
];
|
];
|
||||||
|
|
||||||
texts = [
|
texts = [
|
||||||
# AGGREGATORS (> 1 post/day)
|
# AGGREGATORS (> 1 post/day)
|
||||||
(mkText "https://www.lesswrong.com/feed.xml" // rat // hourly)
|
(fromDb "lesswrong.com" // rat)
|
||||||
(mkText "http://www.econlib.org/index.xml" // pol // hourly)
|
(fromDb "econlib.org" // pol)
|
||||||
|
|
||||||
# AGGREGATORS (< 1 post/day)
|
# AGGREGATORS (< 1 post/day)
|
||||||
(mkText "https://palladiummag.com/feed" // uncat // weekly)
|
(mkText "https://palladiummag.com/feed" // uncat // weekly)
|
||||||
@@ -75,10 +101,10 @@ let
|
|||||||
(mkText "https://www.rifters.com/crawl/?feed=rss2" // uncat // weekly)
|
(mkText "https://www.rifters.com/crawl/?feed=rss2" // uncat // weekly)
|
||||||
|
|
||||||
# DEVELOPERS
|
# DEVELOPERS
|
||||||
(mkText "https://uninsane.org/atom.xml" // infrequent // tech)
|
(fromDb "uninsane.org" // tech)
|
||||||
(mkText "https://mg.lol/blog/rss/" // infrequent // tech)
|
(fromDb "mg.lol" // tech)
|
||||||
## Ken Shirriff
|
## Ken Shirriff
|
||||||
(mkText "https://www.righto.com/feeds/posts/default" // tech // infrequent)
|
(fromDb "righto.com" // tech)
|
||||||
## Vitalik Buterin
|
## Vitalik Buterin
|
||||||
(mkText "https://vitalik.ca/feed.xml" // tech // infrequent)
|
(mkText "https://vitalik.ca/feed.xml" // tech // infrequent)
|
||||||
## ian (Sanctuary)
|
## ian (Sanctuary)
|
||||||
@@ -94,7 +120,7 @@ let
|
|||||||
(mkText "https://pomeroyb.com/feed.xml" // tech // infrequent)
|
(mkText "https://pomeroyb.com/feed.xml" // tech // infrequent)
|
||||||
|
|
||||||
# (TECH; POL) COMMENTATORS
|
# (TECH; POL) COMMENTATORS
|
||||||
(mkSubstack "edwardsnowden" // pol // infrequent)
|
(fromDb "edwardsnowden.substack.com" // pol // text)
|
||||||
(mkText "http://benjaminrosshoffman.com/feed" // pol // weekly)
|
(mkText "http://benjaminrosshoffman.com/feed" // pol // weekly)
|
||||||
## Ben Thompson
|
## Ben Thompson
|
||||||
(mkText "https://www.stratechery.com/rss" // pol // weekly)
|
(mkText "https://www.stratechery.com/rss" // pol // weekly)
|
||||||
@@ -148,4 +174,11 @@ let
|
|||||||
in
|
in
|
||||||
{
|
{
|
||||||
sane.feeds = texts ++ images ++ podcasts;
|
sane.feeds = texts ++ images ++ podcasts;
|
||||||
|
|
||||||
|
assertions = builtins.map
|
||||||
|
(p: {
|
||||||
|
assertion = p.format or "unknown" == "podcast";
|
||||||
|
message = ''${p.url} is not a podcast: ${p.format or "unknown"}'';
|
||||||
|
})
|
||||||
|
podcasts;
|
||||||
}
|
}
|
||||||
|
@@ -1,10 +1,23 @@
|
|||||||
# trampoline from flake.nix into the specific host definition, while doing a tiny bit of common setup
|
# trampoline from flake.nix into the specific host definition, while doing a tiny bit of common setup
|
||||||
|
|
||||||
hostName: { ... }: {
|
{ hostName, localSystem }:
|
||||||
|
{ ... }:
|
||||||
|
|
||||||
|
{
|
||||||
imports = [
|
imports = [
|
||||||
./${hostName}
|
./${hostName}
|
||||||
./common
|
./common
|
||||||
];
|
];
|
||||||
|
|
||||||
networking.hostName = hostName;
|
networking.hostName = hostName;
|
||||||
|
|
||||||
|
nixpkgs.overlays = [
|
||||||
|
(next: prev: {
|
||||||
|
# for local != target we by default just emulate the target while building.
|
||||||
|
# provide a `pkgs.cross.<pkg>` alias that consumers can use instead of `pkgs.<foo>`
|
||||||
|
# to explicitly opt into non-emulated cross compilation for any specific package.
|
||||||
|
# this is most beneficial for large packages with few pre-requisites -- like Linux.
|
||||||
|
cross = next.crossFrom."${localSystem}";
|
||||||
|
})
|
||||||
|
];
|
||||||
}
|
}
|
||||||
|
@@ -2,21 +2,19 @@
|
|||||||
|
|
||||||
let
|
let
|
||||||
inherit (builtins) concatLists concatStringsSep foldl' fromJSON map readDir readFile;
|
inherit (builtins) concatLists concatStringsSep foldl' fromJSON map readDir readFile;
|
||||||
inherit (lib) init mapAttrsToList removePrefix removeSuffix splitString;
|
inherit (lib) hasSuffix listToAttrs mapAttrsToList removeSuffix splitString;
|
||||||
inherit (lib.attrsets) recursiveUpdate setAttrByPath;
|
|
||||||
inherit (lib.filesystem) listFilesRecursive;
|
|
||||||
|
|
||||||
# given a path to a .json file relative to sources, construct the best feed object we can.
|
# given a path to a .json file relative to sources, construct the best feed object we can.
|
||||||
# the .json file could be empty, in which case we make assumptions about the feed based
|
# the .json file could be empty, in which case we make assumptions about the feed based
|
||||||
# on its fs path.
|
# on its fs path.
|
||||||
# Type: feedFromSourcePath :: String -> { path = [String]; value = feed; }
|
# Type: feedFromSourcePath :: String -> { name = String; value = feed; }
|
||||||
feedFromSourcePath = json-path:
|
feedFromSourcePath = json-path:
|
||||||
|
assert hasSuffix "/default.json" json-path;
|
||||||
let
|
let
|
||||||
canonical-name = removeSuffix "/default" (lib.removeSuffix ".json" json-path);
|
canonical-name = removeSuffix "/default.json" json-path;
|
||||||
default-url = "https://${canonical-name}";
|
default-url = "https://${canonical-name}";
|
||||||
attr-path = splitString "/" canonical-name;
|
|
||||||
feed-details = { url = default-url; } // (tryImportJson (./sources/${json-path}));
|
feed-details = { url = default-url; } // (tryImportJson (./sources/${json-path}));
|
||||||
in { path = attr-path; value = mkFeed feed-details; };
|
in { name = canonical-name; value = mkFeed feed-details; };
|
||||||
|
|
||||||
# TODO: for now, feeds are just ordinary Attrs.
|
# TODO: for now, feeds are just ordinary Attrs.
|
||||||
# in the future, we'd like to set them up with an update script.
|
# in the future, we'd like to set them up with an update script.
|
||||||
@@ -49,10 +47,5 @@ let
|
|||||||
)
|
)
|
||||||
(readDir base)
|
(readDir base)
|
||||||
);
|
);
|
||||||
|
|
||||||
# like listToAttrs, except takes { path, value } pairs instead of { name, value } pairs.
|
|
||||||
# Type: listToAttrsByPath :: [{ path = [String]; value = Any; }] -> Attrs
|
|
||||||
listToAttrsByPath = items:
|
|
||||||
foldl' (acc: { path, value }: recursiveUpdate acc (setAttrByPath path value)) {} items;
|
|
||||||
in
|
in
|
||||||
listToAttrsByPath (map feedFromSourcePath sources)
|
listToAttrs (map feedFromSourcePath sources)
|
||||||
|
21
modules/data/feeds/sources/acquired.libsyn.com/default.json
Normal file
21
modules/data/feeds/sources/acquired.libsyn.com/default.json
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"bozo": 0,
|
||||||
|
"content_length": 1369733,
|
||||||
|
"content_type": "application/rss+xml; charset=utf-8",
|
||||||
|
"description": "Every company has a story. Learn the playbooks that built the world’s greatest companies — and how you can apply them as a founder, operator, or investor.",
|
||||||
|
"favicon": null,
|
||||||
|
"hubs": [],
|
||||||
|
"is_podcast": true,
|
||||||
|
"is_push": false,
|
||||||
|
"item_count": 173,
|
||||||
|
"last_seen": "2023-01-11T15:26:37.515527+00:00",
|
||||||
|
"last_updated": "2022-12-19T07:22:28+00:00",
|
||||||
|
"score": 18,
|
||||||
|
"self_url": "https://acquired.libsyn.com/rss",
|
||||||
|
"site_name": null,
|
||||||
|
"site_url": null,
|
||||||
|
"title": "Acquired",
|
||||||
|
"url": "https://acquired.libsyn.com/rss",
|
||||||
|
"velocity": 0.066,
|
||||||
|
"version": "rss20"
|
||||||
|
}
|
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"bozo": 0,
|
||||||
|
"content_length": 1030773,
|
||||||
|
"content_type": "application/rss+xml; charset=utf-8",
|
||||||
|
"description": "Industry veterans, degenerate gamblers & besties Chamath Palihapitiya, Jason Calacanis, David Sacks & David Friedberg cover all things economic, tech, political, social & poker.",
|
||||||
|
"favicon": null,
|
||||||
|
"hubs": [],
|
||||||
|
"is_podcast": true,
|
||||||
|
"is_push": false,
|
||||||
|
"item_count": 124,
|
||||||
|
"last_seen": "2023-01-11T12:44:53.606606+00:00",
|
||||||
|
"last_updated": "2023-01-06T10:51:00+00:00",
|
||||||
|
"score": 18,
|
||||||
|
"self_url": "https://allinchamathjason.libsyn.com/rss",
|
||||||
|
"site_name": "All-In with Chamath, Jason, Sacks & Friedberg",
|
||||||
|
"site_url": "https://allinchamathjason.libsyn.com",
|
||||||
|
"title": "All-In with Chamath, Jason, Sacks & Friedberg",
|
||||||
|
"url": "https://allinchamathjason.libsyn.com/rss",
|
||||||
|
"velocity": 0.12,
|
||||||
|
"version": "rss20"
|
||||||
|
}
|
@@ -0,0 +1,23 @@
|
|||||||
|
{
|
||||||
|
"bozo": 0,
|
||||||
|
"content_length": 13316,
|
||||||
|
"content_type": "application/rss+xml; charset=utf-8",
|
||||||
|
"description": "A podcast around the idea of creating a Civilizational Bootstrapper, a set of tools and technology that can be used to replicate the foundations of civilization along with itself.",
|
||||||
|
"favicon": null,
|
||||||
|
"hubs": [
|
||||||
|
"https://pubsubhubbub.appspot.com/"
|
||||||
|
],
|
||||||
|
"is_podcast": true,
|
||||||
|
"is_push": true,
|
||||||
|
"item_count": 6,
|
||||||
|
"last_seen": "2023-01-11T16:11:01.720399+00:00",
|
||||||
|
"last_updated": "2022-04-13T19:37:17+00:00",
|
||||||
|
"score": 22,
|
||||||
|
"self_url": "https://anchor.fm/s/34c7232c/podcast/rss",
|
||||||
|
"site_name": "Anchor",
|
||||||
|
"site_url": "https://anchor.fm",
|
||||||
|
"title": "Civboot",
|
||||||
|
"url": "https://anchor.fm/s/34c7232c/podcast/rss",
|
||||||
|
"velocity": 0.009,
|
||||||
|
"version": "rss20"
|
||||||
|
}
|
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"bozo": 0,
|
||||||
|
"content_length": 12669,
|
||||||
|
"content_type": "application/rss+xml; charset=utf-8",
|
||||||
|
"description": "The territory is a map of the map.",
|
||||||
|
"favicon": "http://benjaminrosshoffman.com/favicon.ico",
|
||||||
|
"hubs": [],
|
||||||
|
"is_podcast": false,
|
||||||
|
"is_push": false,
|
||||||
|
"item_count": 10,
|
||||||
|
"last_seen": "2023-01-11T12:32:52.176940+00:00",
|
||||||
|
"last_updated": "2023-01-09T04:33:31+00:00",
|
||||||
|
"score": -15,
|
||||||
|
"self_url": "http://benjaminrosshoffman.com/comments/feed/",
|
||||||
|
"site_name": "Compass Rose",
|
||||||
|
"site_url": "http://benjaminrosshoffman.com",
|
||||||
|
"title": "Comments for Compass Rose",
|
||||||
|
"url": "http://benjaminrosshoffman.com/comments/feed/",
|
||||||
|
"velocity": 0.312,
|
||||||
|
"version": "rss20"
|
||||||
|
}
|
21
modules/data/feeds/sources/craphound.com/default.json
Normal file
21
modules/data/feeds/sources/craphound.com/default.json
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"bozo": 0,
|
||||||
|
"content_length": 56666,
|
||||||
|
"content_type": "application/rss+xml; charset=utf-8",
|
||||||
|
"description": "Cory Doctorow's Literary Works",
|
||||||
|
"favicon": "https://craphound.com/favicon.ico",
|
||||||
|
"hubs": [],
|
||||||
|
"is_podcast": true,
|
||||||
|
"is_push": false,
|
||||||
|
"item_count": 20,
|
||||||
|
"last_seen": "2023-01-11T12:55:10.545856+00:00",
|
||||||
|
"last_updated": "2022-12-12T14:46:35+00:00",
|
||||||
|
"score": 12,
|
||||||
|
"self_url": "https://craphound.com/feed/",
|
||||||
|
"site_name": "Cory Doctorow's craphound.com | Cory Doctorow's Literary Works",
|
||||||
|
"site_url": "https://craphound.com",
|
||||||
|
"title": "Cory Doctorow's craphound.com",
|
||||||
|
"url": "https://craphound.com/feed/",
|
||||||
|
"velocity": 0.069,
|
||||||
|
"version": "rss20"
|
||||||
|
}
|
21
modules/data/feeds/sources/darknetdiaries.com/default.json
Normal file
21
modules/data/feeds/sources/darknetdiaries.com/default.json
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"bozo": 0,
|
||||||
|
"content_length": 227480,
|
||||||
|
"content_type": "application/xml; charset=utf-8",
|
||||||
|
"description": "True stories from the dark side of the Internet",
|
||||||
|
"favicon": "https://darknetdiaries.com/imgs/favicon.png",
|
||||||
|
"hubs": [],
|
||||||
|
"is_podcast": true,
|
||||||
|
"is_push": false,
|
||||||
|
"item_count": 131,
|
||||||
|
"last_seen": "2023-01-11T14:49:53.136566+00:00",
|
||||||
|
"last_updated": "2022-12-27T08:00:00+00:00",
|
||||||
|
"score": 20,
|
||||||
|
"self_url": "https://darknetdiaries.com/feedfree.xml",
|
||||||
|
"site_name": "Darknet Diaries – True stories from the dark side of the Internet.",
|
||||||
|
"site_url": "https://darknetdiaries.com",
|
||||||
|
"title": "Darknet Diaries (ad free)",
|
||||||
|
"url": "https://darknetdiaries.com/feedfree.xml",
|
||||||
|
"velocity": 0.067,
|
||||||
|
"version": "rss20"
|
||||||
|
}
|
21
modules/data/feeds/sources/econlib.org/default.json
Normal file
21
modules/data/feeds/sources/econlib.org/default.json
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"bozo": 0,
|
||||||
|
"content_length": 66775,
|
||||||
|
"content_type": "application/rss+xml; charset=utf-8",
|
||||||
|
"description": "The Library of Economics and Liberty",
|
||||||
|
"favicon": null,
|
||||||
|
"hubs": [],
|
||||||
|
"is_podcast": false,
|
||||||
|
"is_push": false,
|
||||||
|
"item_count": 10,
|
||||||
|
"last_seen": "2023-01-11T10:46:38.526754+00:00",
|
||||||
|
"last_updated": "2023-01-10T05:21:31+00:00",
|
||||||
|
"score": 14,
|
||||||
|
"self_url": "https://www.econlib.org/feed/",
|
||||||
|
"site_name": "Econlib",
|
||||||
|
"site_url": "https://www.econlib.org",
|
||||||
|
"title": "Econlib",
|
||||||
|
"url": "https://www.econlib.org/feed/",
|
||||||
|
"velocity": 2.549,
|
||||||
|
"version": "rss20"
|
||||||
|
}
|
21
modules/data/feeds/sources/econtalk.org/default.json
Normal file
21
modules/data/feeds/sources/econtalk.org/default.json
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"bozo": 0,
|
||||||
|
"content_length": 27185,
|
||||||
|
"content_type": "application/rss+xml; charset=utf-8",
|
||||||
|
"description": "The Library of Economics and Liberty",
|
||||||
|
"favicon": null,
|
||||||
|
"hubs": [],
|
||||||
|
"is_podcast": false,
|
||||||
|
"is_push": false,
|
||||||
|
"item_count": 10,
|
||||||
|
"last_seen": "2023-01-11T13:05:47.318206+00:00",
|
||||||
|
"last_updated": "2023-01-09T11:30:25+00:00",
|
||||||
|
"score": 14,
|
||||||
|
"self_url": "https://www.econtalk.org/feed/",
|
||||||
|
"site_name": null,
|
||||||
|
"site_url": null,
|
||||||
|
"title": "EconTalk Podcast – Econlib",
|
||||||
|
"url": "https://www.econtalk.org/feed",
|
||||||
|
"velocity": 0.143,
|
||||||
|
"version": "rss20"
|
||||||
|
}
|
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"bozo": 0,
|
||||||
|
"content_length": 429348,
|
||||||
|
"content_type": "application/rss+xml; charset=utf-8",
|
||||||
|
"description": "The world's most famous whistleblower writes from exile on the intersection of technology, humanity, and power.",
|
||||||
|
"favicon": "https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/2a7d3aa2-3c2f-4196-ab7c-31541be1272e/favicon.ico",
|
||||||
|
"hubs": [],
|
||||||
|
"is_podcast": true,
|
||||||
|
"is_push": false,
|
||||||
|
"item_count": 16,
|
||||||
|
"last_seen": "2023-01-11T12:32:02.320483+00:00",
|
||||||
|
"last_updated": "2022-09-20T13:03:59+00:00",
|
||||||
|
"score": 14,
|
||||||
|
"self_url": "https://edwardsnowden.substack.com/feed",
|
||||||
|
"site_name": "Continuing Ed — with Edward Snowden",
|
||||||
|
"site_url": "https://edwardsnowden.substack.com",
|
||||||
|
"title": "Continuing Ed — with Edward Snowden",
|
||||||
|
"url": "https://edwardsnowden.substack.com/feed",
|
||||||
|
"velocity": 0.032,
|
||||||
|
"version": "rss20"
|
||||||
|
}
|
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"bozo": 0,
|
||||||
|
"content_length": 281377,
|
||||||
|
"content_type": "text/xml; charset=utf-8",
|
||||||
|
"description": "Matrix Live, now as an audio podcast",
|
||||||
|
"favicon": "https://feed.podbean.com/favicon.ico",
|
||||||
|
"hubs": [],
|
||||||
|
"is_podcast": true,
|
||||||
|
"is_push": false,
|
||||||
|
"item_count": 100,
|
||||||
|
"last_seen": "2023-01-11T15:54:24.440541+00:00",
|
||||||
|
"last_updated": "2023-01-06T16:45:00+00:00",
|
||||||
|
"score": 18,
|
||||||
|
"self_url": "https://feed.podbean.com/matrixlive/feed.xml",
|
||||||
|
"site_name": null,
|
||||||
|
"site_url": "https://feed.podbean.com",
|
||||||
|
"title": "Matrix Live",
|
||||||
|
"url": "https://feed.podbean.com/matrixlive/feed.xml",
|
||||||
|
"velocity": 0.12,
|
||||||
|
"version": "rss20"
|
||||||
|
}
|
@@ -0,0 +1,23 @@
|
|||||||
|
{
|
||||||
|
"bozo": 0,
|
||||||
|
"content_length": 1600578,
|
||||||
|
"content_type": "application/xml; charset=utf-8",
|
||||||
|
"description": "Design is everywhere in our lives, perhaps most importantly in the places where we've just stopped noticing. 99% Invisible is a weekly exploration of the process and power of design and architecture. From award winning producer Roman Mars. Learn more at 99percentinvisible.org.",
|
||||||
|
"favicon": null,
|
||||||
|
"hubs": [
|
||||||
|
"https://simplecast.superfeedr.com/"
|
||||||
|
],
|
||||||
|
"is_podcast": true,
|
||||||
|
"is_push": true,
|
||||||
|
"item_count": 577,
|
||||||
|
"last_seen": "2023-01-11T15:25:01.536556+00:00",
|
||||||
|
"last_updated": "2023-01-10T23:46:05+00:00",
|
||||||
|
"score": 4,
|
||||||
|
"self_url": "https://feeds.simplecast.com/BqbsxVfO",
|
||||||
|
"site_name": null,
|
||||||
|
"site_url": null,
|
||||||
|
"title": "99% Invisible",
|
||||||
|
"url": "https://feeds.simplecast.com/BqbsxVfO",
|
||||||
|
"velocity": 0.128,
|
||||||
|
"version": "rss20"
|
||||||
|
}
|
@@ -0,0 +1,23 @@
|
|||||||
|
{
|
||||||
|
"bozo": 0,
|
||||||
|
"content_length": 1505641,
|
||||||
|
"content_type": "text/xml; charset=utf-8",
|
||||||
|
"description": "<p>Unusually in-depth conversations about the world's most pressing problems and what you can do to solve them.<br /></p>",
|
||||||
|
"favicon": null,
|
||||||
|
"hubs": [
|
||||||
|
"https://pubsubhubbub.appspot.com/"
|
||||||
|
],
|
||||||
|
"is_podcast": true,
|
||||||
|
"is_push": true,
|
||||||
|
"item_count": 181,
|
||||||
|
"last_seen": "2023-01-11T13:29:43.501516+00:00",
|
||||||
|
"last_updated": "2023-01-09T22:57:00+00:00",
|
||||||
|
"score": 14,
|
||||||
|
"self_url": "https://feeds.backtracks.fm/feeds/80000hours/80000-hours-podcast-with-rob-wiblin/feed.xml",
|
||||||
|
"site_name": null,
|
||||||
|
"site_url": null,
|
||||||
|
"title": "80,000 Hours Podcast with Rob Wiblin",
|
||||||
|
"url": "https://feeds.feedburner.com/80000HoursPodcast",
|
||||||
|
"velocity": 0.087,
|
||||||
|
"version": "rss20"
|
||||||
|
}
|
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"bozo": 0,
|
||||||
|
"content_length": 23712,
|
||||||
|
"content_type": "text/xml; charset=utf-8",
|
||||||
|
"description": "This isn't academic history (and Carlin isn't a historian) but the podcast's unique blend of high drama, masterful narration and Twilight Zone-style twists has entertained millions of listeners.",
|
||||||
|
"favicon": null,
|
||||||
|
"hubs": [],
|
||||||
|
"is_podcast": true,
|
||||||
|
"is_push": false,
|
||||||
|
"item_count": 13,
|
||||||
|
"last_seen": "2023-01-11T15:05:34.359948+00:00",
|
||||||
|
"last_updated": "2022-03-06T19:08:44+00:00",
|
||||||
|
"score": 2,
|
||||||
|
"self_url": "https://feeds.feedburner.com/dancarlin/history?format=xml",
|
||||||
|
"site_name": null,
|
||||||
|
"site_url": null,
|
||||||
|
"title": "Dan Carlin's Hardcore History",
|
||||||
|
"url": "https://feeds.feedburner.com/dancarlin/history",
|
||||||
|
"velocity": 0.005,
|
||||||
|
"version": "rss20"
|
||||||
|
}
|
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"bozo": 0,
|
||||||
|
"content_length": 62633,
|
||||||
|
"content_type": "text/xml; charset=utf-8",
|
||||||
|
"description": "Articles, speeches, stories and novels by an award-winning science fiction writer, read aloud in small regular chunks",
|
||||||
|
"favicon": null,
|
||||||
|
"hubs": [],
|
||||||
|
"is_podcast": true,
|
||||||
|
"is_push": false,
|
||||||
|
"item_count": 20,
|
||||||
|
"last_seen": "2023-01-11T12:57:50.103797+00:00",
|
||||||
|
"last_updated": "2022-12-12T14:46:35+00:00",
|
||||||
|
"score": 4,
|
||||||
|
"self_url": "https://craphound.com/category/podcast/feed/",
|
||||||
|
"site_name": null,
|
||||||
|
"site_url": null,
|
||||||
|
"title": "Podcast – Cory Doctorow's craphound.com",
|
||||||
|
"url": "https://feeds.feedburner.com/doctorow_podcast",
|
||||||
|
"velocity": 0.068,
|
||||||
|
"version": "rss20"
|
||||||
|
}
|
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"bozo": 0,
|
||||||
|
"content_length": 1315558,
|
||||||
|
"content_type": "text/xml; charset=utf-8",
|
||||||
|
"description": "Radiolab",
|
||||||
|
"favicon": null,
|
||||||
|
"hubs": [],
|
||||||
|
"is_podcast": true,
|
||||||
|
"is_push": false,
|
||||||
|
"item_count": 150,
|
||||||
|
"last_seen": "2023-01-11T15:01:17.273650+00:00",
|
||||||
|
"last_updated": "2023-01-06T15:00:00+00:00",
|
||||||
|
"score": 4,
|
||||||
|
"self_url": "https://www.wnycstudios.org/feeds/series/podcasts",
|
||||||
|
"site_name": null,
|
||||||
|
"site_url": null,
|
||||||
|
"title": "Radiolab",
|
||||||
|
"url": "https://feeds.feedburner.com/radiolab",
|
||||||
|
"velocity": 0.139,
|
||||||
|
"version": "rss20"
|
||||||
|
}
|
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"bozo": 0,
|
||||||
|
"content_length": 2976783,
|
||||||
|
"content_type": "application/xml; charset=utf-8",
|
||||||
|
"description": "A business show about big ideas — and other problems.",
|
||||||
|
"favicon": null,
|
||||||
|
"hubs": [],
|
||||||
|
"is_podcast": true,
|
||||||
|
"is_push": false,
|
||||||
|
"item_count": 660,
|
||||||
|
"last_seen": "2023-01-11T15:51:13.652417+00:00",
|
||||||
|
"last_updated": "2023-01-10T10:00:00+00:00",
|
||||||
|
"score": 14,
|
||||||
|
"self_url": "https://feeds.megaphone.fm/recodedecode",
|
||||||
|
"site_name": null,
|
||||||
|
"site_url": null,
|
||||||
|
"title": "Decoder with Nilay Patel",
|
||||||
|
"url": "https://feeds.megaphone.fm/recodedecode",
|
||||||
|
"velocity": 0.24,
|
||||||
|
"version": "rss20"
|
||||||
|
}
|
@@ -0,0 +1,23 @@
|
|||||||
|
{
|
||||||
|
"bozo": 0,
|
||||||
|
"content_length": 2940192,
|
||||||
|
"content_type": "application/xml; charset=utf-8",
|
||||||
|
"description": "EconTalk: Conversations for the Curious is an award-winning weekly podcast hosted by Russ Roberts of Shalem College in Jerusalem and Stanford's Hoover Institution. The eclectic guest list includes authors, doctors, psychologists, historians, philosophers, economists, and more. Learn how the health care system really works, the serenity that comes from humility, the challenge of interpreting data, how potato chips are made, what it's like to run an upscale Manhattan restaurant, what caused the 2008 financial crisis, the nature of consciousness, and more. EconTalk has been taking the Monday out of Mondays since 2006. All 800+ episodes are available in the archive. Go to EconTalk.org for transcripts, related resources, and comments.",
|
||||||
|
"favicon": null,
|
||||||
|
"hubs": [
|
||||||
|
"https://simplecast.superfeedr.com/"
|
||||||
|
],
|
||||||
|
"is_podcast": true,
|
||||||
|
"is_push": true,
|
||||||
|
"item_count": 875,
|
||||||
|
"last_seen": "2023-01-11T14:31:49.308489+00:00",
|
||||||
|
"last_updated": "2023-01-09T11:30:00+00:00",
|
||||||
|
"score": 24,
|
||||||
|
"self_url": "https://feeds.simplecast.com/wgl4xEgL",
|
||||||
|
"site_name": null,
|
||||||
|
"site_url": null,
|
||||||
|
"title": "EconTalk",
|
||||||
|
"url": "https://feeds.simplecast.com/wgl4xEgL",
|
||||||
|
"velocity": 0.142,
|
||||||
|
"version": "rss20"
|
||||||
|
}
|
21
modules/data/feeds/sources/lesswrong.com/default.json
Normal file
21
modules/data/feeds/sources/lesswrong.com/default.json
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"bozo": 0,
|
||||||
|
"content_length": 337440,
|
||||||
|
"content_type": "application/rss+xml; charset=utf-8",
|
||||||
|
"description": "A community blog devoted to refining the art of rationality",
|
||||||
|
"favicon": "https://res.cloudinary.com/lesswrong-2-0/image/upload/v1497915096/favicon_lncumn.ico",
|
||||||
|
"hubs": [],
|
||||||
|
"is_podcast": false,
|
||||||
|
"is_push": false,
|
||||||
|
"item_count": 10,
|
||||||
|
"last_seen": "2023-01-11T10:39:58.575828+00:00",
|
||||||
|
"last_updated": "2023-01-11T09:58:49+00:00",
|
||||||
|
"score": 32,
|
||||||
|
"self_url": "https://www.lesswrong.com/feed.xml?view=rss&karmaThreshold=2",
|
||||||
|
"site_name": "LessWrong",
|
||||||
|
"site_url": "https://www.lesswrong.com",
|
||||||
|
"title": "LessWrong",
|
||||||
|
"url": "https://www.lesswrong.com/feed.xml",
|
||||||
|
"velocity": 12.052,
|
||||||
|
"version": "rss20"
|
||||||
|
}
|
@@ -0,0 +1,23 @@
|
|||||||
|
{
|
||||||
|
"bozo": 0,
|
||||||
|
"content_length": 841679,
|
||||||
|
"content_type": "application/rss+xml; charset=utf-8",
|
||||||
|
"description": "Conversations about AI, science, technology, history, philosophy and the nature of intelligence, consciousness, love, and power.",
|
||||||
|
"favicon": "https://lexfridman.com/wordpress/wp-content/uploads/2017/06/cropped-lex-favicon-4-1-32x32.png",
|
||||||
|
"hubs": [
|
||||||
|
"https://pubsubhubbub.appspot.com/"
|
||||||
|
],
|
||||||
|
"is_podcast": true,
|
||||||
|
"is_push": true,
|
||||||
|
"item_count": 300,
|
||||||
|
"last_seen": "2023-01-11T12:40:59.343327+00:00",
|
||||||
|
"last_updated": "2022-12-29T17:35:50+00:00",
|
||||||
|
"score": 20,
|
||||||
|
"self_url": "https://lexfridman.com/feed/podcast/",
|
||||||
|
"site_name": "Lex Fridman",
|
||||||
|
"site_url": "https://lexfridman.com",
|
||||||
|
"title": "Lex Fridman Podcast",
|
||||||
|
"url": "https://lexfridman.com/feed/podcast/",
|
||||||
|
"velocity": 0.265,
|
||||||
|
"version": "rss20"
|
||||||
|
}
|
21
modules/data/feeds/sources/mg.lol/default.json
Normal file
21
modules/data/feeds/sources/mg.lol/default.json
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"bozo": 0,
|
||||||
|
"content_length": 83074,
|
||||||
|
"content_type": "text/xml; charset=utf-8",
|
||||||
|
"description": "projects & research",
|
||||||
|
"favicon": null,
|
||||||
|
"hubs": [],
|
||||||
|
"is_podcast": false,
|
||||||
|
"is_push": false,
|
||||||
|
"item_count": 14,
|
||||||
|
"last_seen": "2023-01-11T12:28:34.383284+00:00",
|
||||||
|
"last_updated": "2021-07-29T05:10:05+00:00",
|
||||||
|
"score": 14,
|
||||||
|
"self_url": "https://mg.lol/blog/rss/",
|
||||||
|
"site_name": null,
|
||||||
|
"site_url": "https://mg.lol",
|
||||||
|
"title": "MG",
|
||||||
|
"url": "https://mg.lol/blog/rss/",
|
||||||
|
"velocity": 0.004,
|
||||||
|
"version": "rss20"
|
||||||
|
}
|
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"bozo": 0,
|
||||||
|
"content_length": 3568150,
|
||||||
|
"content_type": "application/rss+xml; charset=utf-8",
|
||||||
|
"description": "Post Reports",
|
||||||
|
"favicon": null,
|
||||||
|
"hubs": [],
|
||||||
|
"is_podcast": true,
|
||||||
|
"is_push": false,
|
||||||
|
"item_count": 1070,
|
||||||
|
"last_seen": "2023-01-11T14:37:23.650030+00:00",
|
||||||
|
"last_updated": "2023-01-10T21:40:40+00:00",
|
||||||
|
"score": 14,
|
||||||
|
"self_url": "https://podcast.posttv.com/itunes/post-reports.xml",
|
||||||
|
"site_name": null,
|
||||||
|
"site_url": null,
|
||||||
|
"title": "Post Reports",
|
||||||
|
"url": "https://podcast.posttv.com/itunes/post-reports.xml",
|
||||||
|
"velocity": 0.711,
|
||||||
|
"version": "rss20"
|
||||||
|
}
|
23
modules/data/feeds/sources/righto.com/default.json
Normal file
23
modules/data/feeds/sources/righto.com/default.json
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
{
|
||||||
|
"bozo": 0,
|
||||||
|
"content_length": 862917,
|
||||||
|
"content_type": "application/atom+xml; charset=utf-8",
|
||||||
|
"description": "Computer history, restoring vintage computers, IC reverse engineering, and whatever",
|
||||||
|
"favicon": "https://www.blogger.com/about/favicon/favicon.ico",
|
||||||
|
"hubs": [
|
||||||
|
"http://pubsubhubbub.appspot.com/"
|
||||||
|
],
|
||||||
|
"is_podcast": false,
|
||||||
|
"is_push": true,
|
||||||
|
"item_count": 25,
|
||||||
|
"last_seen": "2023-01-11T12:29:19.820378+00:00",
|
||||||
|
"last_updated": "2023-01-10T18:21:20.265000+00:00",
|
||||||
|
"score": -2,
|
||||||
|
"self_url": "https://www.blogger.com/feeds/6264947694886887540/posts/default",
|
||||||
|
"site_name": "Blogger.com - Create a unique and beautiful blog easily.",
|
||||||
|
"site_url": "https://www.blogger.com",
|
||||||
|
"title": "Ken Shirriff's blog",
|
||||||
|
"url": "https://www.blogger.com/feeds/6264947694886887540/posts/default",
|
||||||
|
"velocity": 0.12,
|
||||||
|
"version": "atom10"
|
||||||
|
}
|
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"bozo": 0,
|
||||||
|
"content_length": 550915,
|
||||||
|
"content_type": "application/xml; charset=utf-8",
|
||||||
|
"description": "The show that looks at the way technology is changing our economies, societies and daily lives.",
|
||||||
|
"favicon": null,
|
||||||
|
"hubs": [],
|
||||||
|
"is_podcast": true,
|
||||||
|
"is_push": false,
|
||||||
|
"item_count": 160,
|
||||||
|
"last_seen": "2023-01-11T15:31:40.303733+00:00",
|
||||||
|
"last_updated": "2022-11-22T05:00:36+00:00",
|
||||||
|
"score": 10,
|
||||||
|
"self_url": "https://feeds.acast.com/public/shows/125ef5a6-6c61-4024-b70e-3487a971a26c",
|
||||||
|
"site_name": null,
|
||||||
|
"site_url": null,
|
||||||
|
"title": "FT Tech Tonic",
|
||||||
|
"url": "https://feeds.acast.com/public/shows/125ef5a6-6c61-4024-b70e-3487a971a26c",
|
||||||
|
"velocity": 0.072,
|
||||||
|
"version": "rss20"
|
||||||
|
}
|
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"bozo": 0,
|
||||||
|
"content_length": 1041745,
|
||||||
|
"content_type": "application/rss+xml; charset=utf-8",
|
||||||
|
"description": "<p>Get the best reporting and storytelling on television from 60 Minutes - on your schedule. Now you can listen to the show in its entirety every week. 60 Minutes is the most successful broadcast in television history with more than 80 Emmys under its belt. 60 Minutes offers unbiased reporting on politics, in-depth investigations and important adventures from around the world- like no one else. </p>",
|
||||||
|
"favicon": "https://rss.art19.com/favicon.ico",
|
||||||
|
"hubs": [],
|
||||||
|
"is_podcast": true,
|
||||||
|
"is_push": false,
|
||||||
|
"item_count": 374,
|
||||||
|
"last_seen": "2023-01-11T15:45:07.189940+00:00",
|
||||||
|
"last_updated": "2023-01-09T03:00:00+00:00",
|
||||||
|
"score": 18,
|
||||||
|
"self_url": "https://rss.art19.com/60-minutes",
|
||||||
|
"site_name": null,
|
||||||
|
"site_url": "https://rss.art19.com",
|
||||||
|
"title": "60 Minutes",
|
||||||
|
"url": "https://rss.art19.com/60-minutes",
|
||||||
|
"velocity": 0.082,
|
||||||
|
"version": "rss20"
|
||||||
|
}
|
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"bozo": 0,
|
||||||
|
"content_length": 235911,
|
||||||
|
"content_type": "application/xml; charset=utf-8",
|
||||||
|
"description": "<p>The Portal is an exploration into discovery, including conversations with thought leaders. Host Eric Weinstein, Managing Director of Thiel Capital, brings his unique expertise and diverse roster of guests for a wide range of discussions, including science, culture, business, and capitalism. The show will feature people whose lives demonstrate that portals into what we would normally consider impossible, are indeed possible. Guests include presidential candidate Andrew Yang, NY Times bestselling author Sam Harris, and retired Navy Seal and creator of the hit business podcast Jocko Willink.</p>",
|
||||||
|
"favicon": null,
|
||||||
|
"hubs": [],
|
||||||
|
"is_podcast": true,
|
||||||
|
"is_push": false,
|
||||||
|
"item_count": 44,
|
||||||
|
"last_seen": "2023-01-11T14:47:44.995855+00:00",
|
||||||
|
"last_updated": "2020-12-02T07:50:55+00:00",
|
||||||
|
"score": -12,
|
||||||
|
"self_url": "https://www.omnycontent.com/d/playlist/9b7dacdf-a925-4f95-84dc-ac46003451ff/1713c520-edb6-43a3-b1b9-acb8002fdae7/58e33a0c-f86b-41c5-a11c-acb8002fdaf5/podcast.rss",
|
||||||
|
"site_name": null,
|
||||||
|
"site_url": null,
|
||||||
|
"title": "The Portal",
|
||||||
|
"url": "https://www.omnycontent.com/d/playlist/9b7dacdf-a925-4f95-84dc-ac46003451ff/1713c520-edb6-43a3-b1b9-acb8002fdae7/58e33a0c-f86b-41c5-a11c-acb8002fdaf5/podcast.rss",
|
||||||
|
"velocity": 0.082,
|
||||||
|
"version": "rss20"
|
||||||
|
}
|
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"bozo": 0,
|
||||||
|
"content_length": 1462485,
|
||||||
|
"content_type": "text/xml; charset=utf-8",
|
||||||
|
"description": "Michael Malice brings his unique perspective – and plenty of sick burns – as he discusses everything from north Korea to American politics and culture with a bevy of guests.",
|
||||||
|
"favicon": null,
|
||||||
|
"hubs": [],
|
||||||
|
"is_podcast": true,
|
||||||
|
"is_push": false,
|
||||||
|
"item_count": 238,
|
||||||
|
"last_seen": "2023-01-11T15:58:45.264936+00:00",
|
||||||
|
"last_updated": "2023-01-04T10:40:00+00:00",
|
||||||
|
"score": -10,
|
||||||
|
"self_url": "http://origin.podcastone.com/podcast?categoryID2=2232",
|
||||||
|
"site_name": null,
|
||||||
|
"site_url": null,
|
||||||
|
"title": "\"YOUR WELCOME\" with Michael Malice",
|
||||||
|
"url": "https://www.podcastone.com/podcast?categoryID2=2232",
|
||||||
|
"velocity": 0.141,
|
||||||
|
"version": "rss20"
|
||||||
|
}
|
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"bozo": 0,
|
||||||
|
"content_length": 809084,
|
||||||
|
"content_type": "application/xml+rss; charset=utf-8",
|
||||||
|
"description": "A show that cuts through all the political drivel and media misinformation to give you a straight take on one big news story of the week.",
|
||||||
|
"favicon": null,
|
||||||
|
"hubs": [],
|
||||||
|
"is_podcast": true,
|
||||||
|
"is_push": false,
|
||||||
|
"item_count": 217,
|
||||||
|
"last_seen": "2023-01-11T13:40:50.240217+00:00",
|
||||||
|
"last_updated": "2023-01-06T10:37:50+00:00",
|
||||||
|
"score": 16,
|
||||||
|
"self_url": "https://feeds.acast.com/public/shows/1d1223a2-9d05-473b-9e79-c2b65b71d676",
|
||||||
|
"site_name": null,
|
||||||
|
"site_url": null,
|
||||||
|
"title": "Deconstructed",
|
||||||
|
"url": "https://rss.prod.firstlook.media/deconstructed/podcast.rss",
|
||||||
|
"velocity": 0.122,
|
||||||
|
"version": "rss20"
|
||||||
|
}
|
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"bozo": 0,
|
||||||
|
"content_length": 1034995,
|
||||||
|
"content_type": "application/xml+rss; charset=utf-8",
|
||||||
|
"description": "The people behind The Intercept’s fearless reporting and incisive commentary discuss the crucial issues of our time.",
|
||||||
|
"favicon": null,
|
||||||
|
"hubs": [],
|
||||||
|
"is_podcast": true,
|
||||||
|
"is_push": false,
|
||||||
|
"item_count": 243,
|
||||||
|
"last_seen": "2023-01-11T14:04:41.283509+00:00",
|
||||||
|
"last_updated": "2022-12-21T10:30:43+00:00",
|
||||||
|
"score": 16,
|
||||||
|
"self_url": "https://feeds.acast.com/public/shows/f5b64019-68c3-57d4-b70b-043e63e5cbf6",
|
||||||
|
"site_name": null,
|
||||||
|
"site_url": null,
|
||||||
|
"title": "Intercepted",
|
||||||
|
"url": "https://rss.prod.firstlook.media/intercepted/podcast.rss",
|
||||||
|
"velocity": 0.112,
|
||||||
|
"version": "rss20"
|
||||||
|
}
|
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"bozo": 0,
|
||||||
|
"content_length": 3905927,
|
||||||
|
"content_type": "application/rss+xml; charset=utf-8",
|
||||||
|
"description": "The official audio version of Astral Codex Ten, with an archive of posts from Slate Star Codex. It's just me reading Scott Alexander's blog posts.",
|
||||||
|
"favicon": null,
|
||||||
|
"hubs": [],
|
||||||
|
"is_podcast": true,
|
||||||
|
"is_push": false,
|
||||||
|
"item_count": 739,
|
||||||
|
"last_seen": "2023-01-11T11:05:40.604126+00:00",
|
||||||
|
"last_updated": "2023-01-11T05:13:00+00:00",
|
||||||
|
"score": 18,
|
||||||
|
"self_url": "https://sscpodcast.libsyn.com/rss",
|
||||||
|
"site_name": "Astral Codex Ten Podcast",
|
||||||
|
"site_url": "https://sscpodcast.libsyn.com",
|
||||||
|
"title": "Astral Codex Ten Podcast",
|
||||||
|
"url": "https://sscpodcast.libsyn.com/rss",
|
||||||
|
"velocity": 0.384,
|
||||||
|
"version": "rss20"
|
||||||
|
}
|
21
modules/data/feeds/sources/uninsane.org/default.json
Normal file
21
modules/data/feeds/sources/uninsane.org/default.json
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"bozo": 1,
|
||||||
|
"content_length": 178687,
|
||||||
|
"content_type": "text/xml; charset=utf-8",
|
||||||
|
"description": null,
|
||||||
|
"favicon": null,
|
||||||
|
"hubs": [],
|
||||||
|
"is_podcast": false,
|
||||||
|
"is_push": false,
|
||||||
|
"item_count": 6,
|
||||||
|
"last_seen": "2023-01-11T10:51:13.435393+00:00",
|
||||||
|
"last_updated": "2022-10-13T00:00:00+00:00",
|
||||||
|
"score": -4,
|
||||||
|
"self_url": "https://uninsane.org/atom.xml",
|
||||||
|
"site_name": "Perfectly Sane",
|
||||||
|
"site_url": "https://uninsane.org",
|
||||||
|
"title": "Perfectly Sane",
|
||||||
|
"url": "https://uninsane.org/atom.xml",
|
||||||
|
"velocity": 0.025,
|
||||||
|
"version": "atom10"
|
||||||
|
}
|
21
modules/data/feeds/sources/wakingup.libsyn.com/default.json
Normal file
21
modules/data/feeds/sources/wakingup.libsyn.com/default.json
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"bozo": 0,
|
||||||
|
"content_length": 825822,
|
||||||
|
"content_type": "application/rss+xml; charset=utf-8",
|
||||||
|
"description": "Join neuroscientist, philosopher, and best-selling author Sam Harris as he explores questions about the human mind, society, and current events.",
|
||||||
|
"favicon": null,
|
||||||
|
"hubs": [],
|
||||||
|
"is_podcast": true,
|
||||||
|
"is_push": false,
|
||||||
|
"item_count": 326,
|
||||||
|
"last_seen": "2023-01-11T15:13:28.154435+00:00",
|
||||||
|
"last_updated": "2023-01-05T18:36:25+00:00",
|
||||||
|
"score": 18,
|
||||||
|
"self_url": "https://wakingup.libsyn.com/rss",
|
||||||
|
"site_name": "Making Sense with Sam Harris",
|
||||||
|
"site_url": "https://wakingup.libsyn.com",
|
||||||
|
"title": "Making Sense with Sam Harris",
|
||||||
|
"url": "https://wakingup.libsyn.com/rss",
|
||||||
|
"velocity": 0.096,
|
||||||
|
"version": "rss20"
|
||||||
|
}
|
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"bozo": 0,
|
||||||
|
"content_length": 2302,
|
||||||
|
"content_type": "text/xml; charset=utf-8",
|
||||||
|
"description": null,
|
||||||
|
"favicon": "https://xkcd.com/s/919f27.ico",
|
||||||
|
"hubs": [],
|
||||||
|
"is_podcast": false,
|
||||||
|
"is_push": false,
|
||||||
|
"item_count": 4,
|
||||||
|
"last_seen": "2023-01-11T10:29:36.530001+00:00",
|
||||||
|
"last_updated": "2023-01-09T00:00:00+00:00",
|
||||||
|
"score": 16,
|
||||||
|
"self_url": null,
|
||||||
|
"site_name": "xkcd",
|
||||||
|
"site_url": "https://xkcd.com",
|
||||||
|
"title": "xkcd.com",
|
||||||
|
"url": "https://xkcd.com/atom.xml",
|
||||||
|
"velocity": 0.429,
|
||||||
|
"version": "atom10"
|
||||||
|
}
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
{ lib, ... }:
|
{ lib, sane-data, ... }:
|
||||||
|
|
||||||
with lib;
|
with lib;
|
||||||
let
|
let
|
||||||
|
@@ -82,7 +82,7 @@ in
|
|||||||
in
|
in
|
||||||
lib.mkIf cfg.enable
|
lib.mkIf cfg.enable
|
||||||
{
|
{
|
||||||
system.build.img-without-firmware = with pkgs; imageBuilder.diskImage.makeGPT {
|
system.build.img-without-firmware = with pkgs; pkgs.imageBuilder.diskImage.makeGPT {
|
||||||
name = "nixos";
|
name = "nixos";
|
||||||
diskID = vfatUuidFromFs bootFs;
|
diskID = vfatUuidFromFs bootFs;
|
||||||
# leave some space for firmware
|
# leave some space for firmware
|
||||||
|
@@ -212,6 +212,7 @@ let
|
|||||||
jq
|
jq
|
||||||
killall
|
killall
|
||||||
lsof
|
lsof
|
||||||
|
nano
|
||||||
netcat
|
netcat
|
||||||
nethogs
|
nethogs
|
||||||
nmap
|
nmap
|
||||||
|
@@ -103,7 +103,7 @@ let
|
|||||||
(orig: lib.recursiveUpdate
|
(orig: lib.recursiveUpdate
|
||||||
(builtins.removeAttrs orig ["user" "group" "mode" ])
|
(builtins.removeAttrs orig ["user" "group" "mode" ])
|
||||||
{
|
{
|
||||||
acl = sane-lib.filterByName ["user" "group" "mode"] (orig.acl or {});
|
acl = sane-lib.filterByName ["user" "group" "mode"] orig;
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
to;
|
to;
|
||||||
|
26
nixpatches/flake.lock
generated
Normal file
26
nixpatches/flake.lock
generated
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1673163619,
|
||||||
|
"narHash": "sha256-B33PFBL64ZgTWgMnhFL3jgheAN/DjHPsZ1Ih3z0VE5I=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "8c54d842d9544361aac5f5b212ba04e4089e8efe",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"id": "nixpkgs",
|
||||||
|
"ref": "nixos-22.11",
|
||||||
|
"type": "indirect"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": "nixpkgs"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
26
nixpatches/flake.nix
Normal file
26
nixpatches/flake.nix
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
{
|
||||||
|
inputs = {
|
||||||
|
nixpkgs.url = "nixpkgs/nixos-22.11";
|
||||||
|
};
|
||||||
|
outputs = { self, nixpkgs }:
|
||||||
|
let
|
||||||
|
patchedPkgsFor = system: nixpkgs.legacyPackages.${system}.applyPatches {
|
||||||
|
name = "nixpkgs-patched-uninsane";
|
||||||
|
src = nixpkgs;
|
||||||
|
patches = import ./list.nix {
|
||||||
|
inherit (nixpkgs.legacyPackages.${system}) fetchpatch;
|
||||||
|
inherit (nixpkgs.lib) fakeHash;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
patchedFlakeFor = system: import "${patchedPkgsFor system}/flake.nix";
|
||||||
|
patchedFlakeOutputsFor = system:
|
||||||
|
(patchedFlakeFor system).outputs { inherit self; };
|
||||||
|
in
|
||||||
|
{
|
||||||
|
legacyPackages = builtins.mapAttrs
|
||||||
|
(system: _:
|
||||||
|
(patchedFlakeOutputsFor system).legacyPackages."${system}"
|
||||||
|
)
|
||||||
|
nixpkgs.legacyPackages;
|
||||||
|
};
|
||||||
|
}
|
@@ -16,7 +16,7 @@
|
|||||||
# kiwix-tools: init at 3.4.0
|
# kiwix-tools: init at 3.4.0
|
||||||
(fetchpatch {
|
(fetchpatch {
|
||||||
url = "https://github.com/NixOS/nixpkgs/pull/206254.diff";
|
url = "https://github.com/NixOS/nixpkgs/pull/206254.diff";
|
||||||
sha256 = "sha256-Z4V9mOv4HYg3kDnWoYcxz3ch03I/1USrLjzlq4X9YqI=";
|
sha256 = "sha256-Cendm7a23qj/YRBj5qVM8jhl9oTpztaDEkXcSG4dJys=";
|
||||||
})
|
})
|
||||||
|
|
||||||
./2022-12-19-i2p-aarch64.patch
|
./2022-12-19-i2p-aarch64.patch
|
||||||
|
42
pkgs/feeds/default.nix
Normal file
42
pkgs/feeds/default.nix
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
{ lib
|
||||||
|
, pkgs
|
||||||
|
}:
|
||||||
|
|
||||||
|
(lib.makeScope pkgs.newScope (self:
|
||||||
|
let
|
||||||
|
# TODO: dependency-inject this.
|
||||||
|
sane-data = import ../../modules/data { inherit lib; };
|
||||||
|
template = self.callPackage ./template.nix;
|
||||||
|
feed-pkgs = lib.mapAttrs
|
||||||
|
(name: feed-details: template {
|
||||||
|
feedName = name;
|
||||||
|
jsonPath = "modules/data/feeds/sources/${name}/default.json";
|
||||||
|
inherit (feed-details) url;
|
||||||
|
})
|
||||||
|
sane-data.feeds;
|
||||||
|
update-scripts = lib.mapAttrsToList
|
||||||
|
(name: feed: builtins.concatStringsSep " " feed.passthru.updateScript)
|
||||||
|
feed-pkgs;
|
||||||
|
in
|
||||||
|
feed-pkgs // {
|
||||||
|
passthru.updateScript = pkgs.writeShellScript
|
||||||
|
"feeds-update"
|
||||||
|
(builtins.concatStringsSep "\n" update-scripts);
|
||||||
|
|
||||||
|
passthru.initFeedScript = pkgs.writeShellScript
|
||||||
|
"init-feed"
|
||||||
|
''
|
||||||
|
sources_dir=modules/data/feeds/sources
|
||||||
|
name="$1"
|
||||||
|
url="https://$name"
|
||||||
|
json_path="$sources_dir/$name/default.json"
|
||||||
|
|
||||||
|
# the name could have slashes in it, so we want to mkdir -p that
|
||||||
|
# but in a way where the least could go wrong.
|
||||||
|
pushd "$sources_dir"; mkdir -p "$name"; popd
|
||||||
|
|
||||||
|
${./update.sh} "$url" "$json_path"
|
||||||
|
cat "$json_path"
|
||||||
|
'';
|
||||||
|
}
|
||||||
|
))
|
28
pkgs/feeds/template.nix
Normal file
28
pkgs/feeds/template.nix
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
{ lib
|
||||||
|
, stdenv
|
||||||
|
, callPackage
|
||||||
|
, fetchurl
|
||||||
|
# feed-specific args
|
||||||
|
, feedName
|
||||||
|
, jsonPath
|
||||||
|
, url
|
||||||
|
}:
|
||||||
|
|
||||||
|
stdenv.mkDerivation {
|
||||||
|
pname = feedName;
|
||||||
|
version = "20230112";
|
||||||
|
src = fetchurl {
|
||||||
|
inherit url;
|
||||||
|
};
|
||||||
|
passthru.updateScript = [ ./update.sh url jsonPath ];
|
||||||
|
# passthru.updateScript = callPackage ./update.nix {
|
||||||
|
# inherit url jsonPath;
|
||||||
|
# };
|
||||||
|
meta = {
|
||||||
|
description = "metadata about any feeds available at ${feedName}";
|
||||||
|
homepage = feedName;
|
||||||
|
maintainers = with lib.maintainers; [ colinsane ];
|
||||||
|
platforms = lib.platforms.all;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
18
pkgs/feeds/update.nix
Normal file
18
pkgs/feeds/update.nix
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
{ lib
|
||||||
|
, curl
|
||||||
|
, jq
|
||||||
|
, runtimeShell
|
||||||
|
, writeScript
|
||||||
|
# feed-specific args
|
||||||
|
, jsonPath
|
||||||
|
, url
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
apiQuery = "https://feedsearch.dev/api/v1/search?url=${url}";
|
||||||
|
in
|
||||||
|
writeScript "update-feed" ''
|
||||||
|
#!${runtimeShell}
|
||||||
|
PATH=${lib.makeBinPath [ curl jq ]}
|
||||||
|
curl -X GET '${apiQuery}' | jq '.[-1]' > '${jsonPath}'
|
||||||
|
''
|
10
pkgs/feeds/update.sh
Executable file
10
pkgs/feeds/update.sh
Executable file
@@ -0,0 +1,10 @@
|
|||||||
|
#!/usr/bin/env nix-shell
|
||||||
|
#!nix-shell -i bash -p curl jq
|
||||||
|
|
||||||
|
set -xeu -o pipefail
|
||||||
|
|
||||||
|
url="$1"
|
||||||
|
jsonPath="$2"
|
||||||
|
|
||||||
|
apiQuery="https://feedsearch.dev/api/v1/search?url=$url"
|
||||||
|
curl -X GET "$apiQuery" | jq '.[0]' > "$jsonPath"
|
@@ -1,6 +1,9 @@
|
|||||||
(next: prev: rec {
|
(next: prev:
|
||||||
|
let
|
||||||
|
sane = rec {
|
||||||
#### my own, non-upstreamable packages:
|
#### my own, non-upstreamable packages:
|
||||||
sane-scripts = prev.callPackage ./sane-scripts { };
|
sane-scripts = prev.callPackage ./sane-scripts { };
|
||||||
|
feeds = prev.callPackage ./feeds { };
|
||||||
tow-boot-pinephone = prev.callPackage ./tow-boot-pinephone { };
|
tow-boot-pinephone = prev.callPackage ./tow-boot-pinephone { };
|
||||||
tow-boot-rpi4 = prev.callPackage ./tow-boot-rpi4 { };
|
tow-boot-rpi4 = prev.callPackage ./tow-boot-rpi4 { };
|
||||||
bootpart-uefi-x86_64 = prev.callPackage ./bootpart-uefi-x86_64 { };
|
bootpart-uefi-x86_64 = prev.callPackage ./bootpart-uefi-x86_64 { };
|
||||||
@@ -51,5 +54,7 @@
|
|||||||
splatmoji = prev.callPackage ./splatmoji { };
|
splatmoji = prev.callPackage ./splatmoji { };
|
||||||
# trust-dns = prev.callPackage ./trust-dns { };
|
# trust-dns = prev.callPackage ./trust-dns { };
|
||||||
# kaiteki = prev.kaiteki;
|
# kaiteki = prev.kaiteki;
|
||||||
})
|
};
|
||||||
|
in sane // { inherit sane; }
|
||||||
|
)
|
||||||
|
|
||||||
|
41
readme.md
41
readme.md
@@ -1,7 +1,7 @@
|
|||||||
to deploy:
|
to deploy:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
nixos-rebuild --flake "./#servo" {build,switch}
|
nixos-rebuild --flake ".#servo" {build,switch}
|
||||||
```
|
```
|
||||||
|
|
||||||
if the target is the same as the host, nix will grab the hostname automatically:
|
if the target is the same as the host, nix will grab the hostname automatically:
|
||||||
@@ -20,7 +20,7 @@ nix flake show
|
|||||||
## secrets
|
## secrets
|
||||||
|
|
||||||
i use [sops](https://github.com/Mic92/sops-nix) for secrets.
|
i use [sops](https://github.com/Mic92/sops-nix) for secrets.
|
||||||
see `modules/universal/secrets.nix` for some tips.
|
see `hosts/common/secrets.nix` for some tips.
|
||||||
|
|
||||||
## building images
|
## building images
|
||||||
|
|
||||||
@@ -34,31 +34,34 @@ refer to flake.nix for more details.
|
|||||||
|
|
||||||
## building packages
|
## building packages
|
||||||
|
|
||||||
to build one of the custom sane packages, just name it:
|
build anything with
|
||||||
|
```
|
||||||
```sh
|
nix build .#<pkgname>
|
||||||
nix build ./#fluffychat-moby
|
|
||||||
```
|
```
|
||||||
|
|
||||||
to build a nixpkg:
|
specifically, i pass the full package closure to the `legacyPackages` flake output. that includes both my own packages and upstream packages.
|
||||||
|
|
||||||
|
on the other hand the `packages` output contains only my own packages.
|
||||||
|
|
||||||
|
in addition, my packages are placed into both the global scope and a `sane` scope.
|
||||||
|
so use the scoped path when you want to be explicit.
|
||||||
|
|
||||||
```sh
|
|
||||||
nix build ./#nixpkgs.curl
|
|
||||||
```
|
```
|
||||||
|
nix build sane.linux-megous
|
||||||
to build a package for another platform:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
nix build ./#packages.aarch64-linux.nixpkgs.ubootRaspberryPi4_64bit
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## using this repo in your own config
|
## using this repo in your own config
|
||||||
|
|
||||||
i try to ensure everything in the `modules/` directory is hidden behind some enable flag or other.
|
this should be a pretty "standard" flake. just reference it, and import either
|
||||||
it should be possible to copy that whole directory into your own config, and then selectively
|
- `nixosModules.sane` (for the modules)
|
||||||
populate what you want (like the impermenance paths, etc).
|
- `overlays.pkgs` (for the packages)
|
||||||
more practically, a lot of things in there still assume a user named `colin`, so you'll probably
|
|
||||||
want to patch it for your name -- or just use it as a reference.
|
`nixosModules.sane` corresponds to everything in the `modules/` directory.
|
||||||
|
it's a mix of broad and narrow scope options.
|
||||||
|
e.g. `sane.fs` is a completely standalone thing,
|
||||||
|
whereas `sane.web-browser` is highly personalized and doesn't *really* make sense to export.
|
||||||
|
regardless of scope, i do try to ensure that everything in `modules/` is hidden behind some enable flag
|
||||||
|
so that the disorganization isn't that critical.
|
||||||
|
|
||||||
## contact
|
## contact
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user