Author SHA1 Message Date
ced4568 361fbc7416 NOC auto-update: 2026-05-04 15:40 UTC 2026-05-04 10:40:35 -05:00
ced4568 9e03da752c NOC auto-update: 2026-05-04 15:35 UTC 2026-05-04 10:35:34 -05:00
ced4568 0817cf3b0b NOC auto-update: 2026-05-04 15:30 UTC 2026-05-04 10:30:35 -05:00
ced4568 b487218a81 NOC auto-update: 2026-05-04 15:25 UTC 2026-05-04 10:25:33 -05:00
ced4568 f4367950b5 NOC auto-update: 2026-05-04 15:20 UTC 2026-05-04 10:20:32 -05:00
ced4568 10c37eafed NOC auto-update: 2026-05-04 15:15 UTC 2026-05-04 10:15:33 -05:00
ced4568 7c78facff3 NOC auto-update: 2026-05-04 15:10 UTC 2026-05-04 10:10:34 -05:00
ced4568 18ba36bfc6 NOC auto-update: 2026-05-04 15:05 UTC 2026-05-04 10:05:32 -05:00
ced4568 c42f0879ee NOC auto-update: 2026-05-04 15:00 UTC 2026-05-04 10:00:33 -05:00
ced4568 300df1b81a NOC auto-update: 2026-05-04 14:55 UTC 2026-05-04 09:55:33 -05:00
ced4568 cc6e62f7be NOC auto-update: 2026-05-04 14:50 UTC 2026-05-04 09:50:32 -05:00
ced4568 a92b6838be NOC auto-update: 2026-05-04 14:45 UTC 2026-05-04 09:45:32 -05:00
ced4568 e95d16fc3e NOC auto-update: 2026-05-04 14:40 UTC 2026-05-04 09:40:32 -05:00
ced4568 953dee0c7f NOC auto-update: 2026-05-04 14:35 UTC 2026-05-04 09:35:33 -05:00
ced4568 42b94b1b09 NOC auto-update: 2026-05-04 14:30 UTC 2026-05-04 09:30:33 -05:00
ced4568 db122119e6 NOC auto-update: 2026-05-04 14:25 UTC 2026-05-04 09:25:32 -05:00
ced4568 460dae1005 NOC auto-update: 2026-05-04 14:20 UTC 2026-05-04 09:20:34 -05:00
ced4568 ac32df2cc2 NOC auto-update: 2026-05-04 14:15 UTC 2026-05-04 09:15:32 -05:00
ced4568 29cf3bef40 NOC auto-update: 2026-05-04 14:10 UTC 2026-05-04 09:10:33 -05:00
ced4568 c567aae14d NOC auto-update: 2026-05-04 14:05 UTC 2026-05-04 09:05:34 -05:00
ced4568 24cd30909d NOC auto-update: 2026-05-04 14:00 UTC 2026-05-04 09:00:33 -05:00
ced4568 3149125b68 NOC auto-update: 2026-05-04 13:55 UTC 2026-05-04 08:55:32 -05:00
ced4568 af16641b00 NOC auto-update: 2026-05-04 13:50 UTC 2026-05-04 08:50:32 -05:00
ced4568 64ea55f09f NOC auto-update: 2026-05-04 13:45 UTC 2026-05-04 08:45:34 -05:00
ced4568 323ab35aa6 NOC auto-update: 2026-05-04 13:40 UTC 2026-05-04 08:40:33 -05:00
ced4568 c751968835 NOC auto-update: 2026-05-04 13:35 UTC 2026-05-04 08:35:34 -05:00
ced4568 aaadb6129b NOC auto-update: 2026-05-04 13:30 UTC 2026-05-04 08:30:33 -05:00
ced4568 2cb7ba4ded NOC auto-update: 2026-05-04 13:25 UTC 2026-05-04 08:25:32 -05:00
ced4568 e8f6b04d04 NOC auto-update: 2026-05-04 13:20 UTC 2026-05-04 08:20:32 -05:00
ced4568 769d81b122 NOC auto-update: 2026-05-04 13:15 UTC 2026-05-04 08:15:33 -05:00
ced4568 c4f19b1601 NOC auto-update: 2026-05-04 13:10 UTC 2026-05-04 08:10:32 -05:00
ced4568 6e8cfccf92 NOC auto-update: 2026-05-04 13:05 UTC 2026-05-04 08:05:33 -05:00
ced4568 7168e3cdf3 NOC auto-update: 2026-05-04 13:00 UTC 2026-05-04 08:00:32 -05:00
ced4568 3548055780 NOC auto-update: 2026-05-04 12:55 UTC 2026-05-04 07:55:32 -05:00
ced4568 ffc073e4f9 NOC auto-update: 2026-05-04 12:50 UTC 2026-05-04 07:50:33 -05:00
ced4568 0bb71afdb2 NOC auto-update: 2026-05-04 12:45 UTC 2026-05-04 07:45:32 -05:00
ced4568 965607587c NOC auto-update: 2026-05-04 12:40 UTC 2026-05-04 07:40:33 -05:00
ced4568 8c185ff083 NOC auto-update: 2026-05-04 12:35 UTC 2026-05-04 07:35:32 -05:00
ced4568 63f2212ea7 NOC auto-update: 2026-05-04 12:30 UTC 2026-05-04 07:30:35 -05:00
ced4568 3ea3b208dd NOC auto-update: 2026-05-04 12:25 UTC 2026-05-04 07:25:33 -05:00
ced4568 24b381808a NOC auto-update: 2026-05-04 12:20 UTC 2026-05-04 07:20:32 -05:00
ced4568 0d0a2fc115 NOC auto-update: 2026-05-04 12:15 UTC 2026-05-04 07:15:32 -05:00
ced4568 2a12ca2c90 NOC auto-update: 2026-05-04 12:10 UTC 2026-05-04 07:10:33 -05:00
ced4568 8c80ab77c0 NOC auto-update: 2026-05-04 12:05 UTC 2026-05-04 07:05:35 -05:00
ced4568 182755693f NOC auto-update: 2026-05-04 12:00 UTC 2026-05-04 07:00:32 -05:00
ced4568 13a8cb417c NOC auto-update: 2026-05-04 11:55 UTC 2026-05-04 06:55:33 -05:00
ced4568 ab71227824 NOC auto-update: 2026-05-04 11:50 UTC 2026-05-04 06:50:34 -05:00
ced4568 3138eac005 NOC auto-update: 2026-05-04 11:45 UTC 2026-05-04 06:45:33 -05:00
ced4568 459b78b63e NOC auto-update: 2026-05-04 11:40 UTC 2026-05-04 06:40:32 -05:00
ced4568 145bf39639 NOC auto-update: 2026-05-04 11:35 UTC 2026-05-04 06:35:33 -05:00
ced4568 07e2f5c71c NOC auto-update: 2026-05-04 11:30 UTC 2026-05-04 06:30:32 -05:00
ced4568 c2952c22bc NOC auto-update: 2026-05-04 11:25 UTC 2026-05-04 06:25:34 -05:00
ced4568 dfff88763d NOC auto-update: 2026-05-04 11:20 UTC 2026-05-04 06:20:34 -05:00
ced4568 8f521feaaf NOC auto-update: 2026-05-04 11:15 UTC 2026-05-04 06:15:33 -05:00
ced4568 e100c53522 NOC auto-update: 2026-05-04 11:10 UTC 2026-05-04 06:10:32 -05:00
ced4568 1fda69a887 NOC auto-update: 2026-05-04 11:05 UTC 2026-05-04 06:05:33 -05:00
ced4568 462b99d365 NOC auto-update: 2026-05-04 11:00 UTC 2026-05-04 06:00:32 -05:00
ced4568 aab8682175 NOC auto-update: 2026-05-04 10:55 UTC 2026-05-04 05:55:33 -05:00
ced4568 4eb87f0f9d NOC auto-update: 2026-05-04 10:50 UTC 2026-05-04 05:50:32 -05:00
ced4568 6e40e47de7 NOC auto-update: 2026-05-04 10:45 UTC 2026-05-04 05:45:35 -05:00
ced4568 e3cc066073 NOC auto-update: 2026-05-04 10:40 UTC 2026-05-04 05:40:33 -05:00
ced4568 bf6443fca4 NOC auto-update: 2026-05-04 10:35 UTC 2026-05-04 05:35:33 -05:00
ced4568 b269bce196 NOC auto-update: 2026-05-04 10:30 UTC 2026-05-04 05:30:32 -05:00
ced4568 87b5a9b795 NOC auto-update: 2026-05-04 10:25 UTC 2026-05-04 05:25:35 -05:00
ced4568 5821d5f7ee NOC auto-update: 2026-05-04 10:20 UTC 2026-05-04 05:20:32 -05:00
ced4568 fc9a4ee8f5 NOC auto-update: 2026-05-04 10:15 UTC 2026-05-04 05:15:32 -05:00
ced4568 762b7d60e3 NOC auto-update: 2026-05-04 10:10 UTC 2026-05-04 05:10:34 -05:00
ced4568 85194b90e9 NOC auto-update: 2026-05-04 10:05 UTC 2026-05-04 05:05:32 -05:00
ced4568 239bb2d7f4 NOC auto-update: 2026-05-04 10:00 UTC 2026-05-04 05:00:33 -05:00
ced4568 298d8ec9ee NOC auto-update: 2026-05-04 09:55 UTC 2026-05-04 04:55:33 -05:00
ced4568 0ecd691e64 NOC auto-update: 2026-05-04 09:50 UTC 2026-05-04 04:50:33 -05:00
ced4568 286bec018c NOC auto-update: 2026-05-04 09:45 UTC 2026-05-04 04:45:34 -05:00
ced4568 6206411b7d NOC auto-update: 2026-05-04 09:40 UTC 2026-05-04 04:40:33 -05:00
ced4568 571ca91403 NOC auto-update: 2026-05-04 09:35 UTC 2026-05-04 04:35:32 -05:00
ced4568 3e9ea2fc71 NOC auto-update: 2026-05-04 09:30 UTC 2026-05-04 04:30:35 -05:00
ced4568 0b67d3c2b5 NOC auto-update: 2026-05-04 09:25 UTC 2026-05-04 04:25:33 -05:00
ced4568 e7be216a79 NOC auto-update: 2026-05-04 09:20 UTC 2026-05-04 04:20:32 -05:00
ced4568 dea224e90c NOC auto-update: 2026-05-04 09:15 UTC 2026-05-04 04:15:33 -05:00
ced4568 0db9df80d1 NOC auto-update: 2026-05-04 09:10 UTC 2026-05-04 04:10:32 -05:00
ced4568 63f95ba65c NOC auto-update: 2026-05-04 09:05 UTC 2026-05-04 04:05:33 -05:00
ced4568 2c42d6fe47 NOC auto-update: 2026-05-04 09:00 UTC 2026-05-04 04:00:32 -05:00
ced4568 c8531eb33f NOC auto-update: 2026-05-04 08:55 UTC 2026-05-04 03:55:32 -05:00
ced4568 7f898eb29b NOC auto-update: 2026-05-04 08:50 UTC 2026-05-04 03:50:32 -05:00
ced4568 d790058e12 NOC auto-update: 2026-05-04 08:45 UTC 2026-05-04 03:45:34 -05:00
ced4568 52bdf2e975 NOC auto-update: 2026-05-04 08:40 UTC 2026-05-04 03:40:33 -05:00
ced4568 42b2e64c76 NOC auto-update: 2026-05-04 08:35 UTC 2026-05-04 03:35:32 -05:00
ced4568 8519cf6368 NOC auto-update: 2026-05-04 08:30 UTC 2026-05-04 03:30:33 -05:00
ced4568 367086f953 NOC auto-update: 2026-05-04 08:25 UTC 2026-05-04 03:25:32 -05:00
ced4568 c5a597830e NOC auto-update: 2026-05-04 08:20 UTC 2026-05-04 03:20:33 -05:00
ced4568 9ae0a0e80c NOC auto-update: 2026-05-04 08:15 UTC 2026-05-04 03:15:32 -05:00
ced4568 abb37a030b NOC auto-update: 2026-05-04 08:10 UTC 2026-05-04 03:10:32 -05:00
ced4568 a7d7688353 NOC auto-update: 2026-05-04 08:05 UTC 2026-05-04 03:05:35 -05:00
ced4568 9da624e2e0 NOC auto-update: 2026-05-04 08:00 UTC 2026-05-04 03:00:32 -05:00
ced4568 01e93025dd NOC auto-update: 2026-05-04 07:55 UTC 2026-05-04 02:55:32 -05:00
ced4568 7cb5f2bbc5 NOC auto-update: 2026-05-04 07:50 UTC 2026-05-04 02:50:33 -05:00
ced4568 5b73dbc3f3 NOC auto-update: 2026-05-04 07:45 UTC 2026-05-04 02:45:32 -05:00
ced4568 034ddc2dc0 NOC auto-update: 2026-05-04 07:40 UTC 2026-05-04 02:40:32 -05:00
ced4568 30c33d61f9 NOC auto-update: 2026-05-04 07:35 UTC 2026-05-04 02:35:33 -05:00
ced4568 1031ade2b6 NOC auto-update: 2026-05-04 07:30 UTC 2026-05-04 02:30:32 -05:00
ced4568 5d3291e8db NOC auto-update: 2026-05-04 07:25 UTC 2026-05-04 02:25:32 -05:00
ced4568 a0163bb188 NOC auto-update: 2026-05-04 07:20 UTC 2026-05-04 02:20:32 -05:00
ced4568 fcbe79327c NOC auto-update: 2026-05-04 07:15 UTC 2026-05-04 02:15:32 -05:00
ced4568 a23ba3441e NOC auto-update: 2026-05-04 07:10 UTC 2026-05-04 02:10:32 -05:00
ced4568 09858410eb NOC auto-update: 2026-05-04 07:05 UTC 2026-05-04 02:05:33 -05:00
ced4568 7f5c44e3d9 NOC auto-update: 2026-05-04 07:00 UTC 2026-05-04 02:00:32 -05:00
ced4568 e1fe951aa9 NOC auto-update: 2026-05-04 06:55 UTC 2026-05-04 01:55:32 -05:00
ced4568 0f3dbd7ca3 NOC auto-update: 2026-05-04 06:50 UTC 2026-05-04 01:50:34 -05:00
ced4568 51675d140c NOC auto-update: 2026-05-04 06:45 UTC 2026-05-04 01:45:33 -05:00
ced4568 41b2151716 NOC auto-update: 2026-05-04 06:40 UTC 2026-05-04 01:40:32 -05:00
ced4568 7e48f76aed NOC auto-update: 2026-05-04 06:35 UTC 2026-05-04 01:35:33 -05:00
ced4568 55f195097c NOC auto-update: 2026-05-04 06:30 UTC 2026-05-04 01:30:34 -05:00
ced4568 111c8e1701 NOC auto-update: 2026-05-04 06:25 UTC 2026-05-04 01:25:32 -05:00
ced4568 2364adfba2 NOC auto-update: 2026-05-04 06:20 UTC 2026-05-04 01:20:33 -05:00
ced4568 0ed26f88ac NOC auto-update: 2026-05-04 06:15 UTC 2026-05-04 01:15:32 -05:00
ced4568 f9aea1b3d5 NOC auto-update: 2026-05-04 06:10 UTC 2026-05-04 01:10:32 -05:00
ced4568 d2da8f477d NOC auto-update: 2026-05-04 06:05 UTC 2026-05-04 01:05:33 -05:00
ced4568 53ad76813e NOC auto-update: 2026-05-04 06:00 UTC 2026-05-04 01:00:32 -05:00
ced4568 ba6cb3b8e0 NOC auto-update: 2026-05-04 05:55 UTC 2026-05-04 00:55:32 -05:00
ced4568 e236e02eee NOC auto-update: 2026-05-04 05:50 UTC 2026-05-04 00:50:32 -05:00
ced4568 d3c463f983 NOC auto-update: 2026-05-04 05:45 UTC 2026-05-04 00:45:33 -05:00
ced4568 f38c081d8e NOC auto-update: 2026-05-04 05:40 UTC 2026-05-04 00:40:34 -05:00
ced4568 da875b6e96 NOC auto-update: 2026-05-04 05:35 UTC 2026-05-04 00:35:34 -05:00
ced4568 35cc8b8dd3 NOC auto-update: 2026-05-04 05:30 UTC 2026-05-04 00:30:32 -05:00
ced4568 261aeb3e9c NOC auto-update: 2026-05-04 05:25 UTC 2026-05-04 00:25:32 -05:00
ced4568 12292fa985 NOC auto-update: 2026-05-04 05:20 UTC 2026-05-04 00:20:34 -05:00
ced4568 48423e45f1 NOC auto-update: 2026-05-04 05:15 UTC 2026-05-04 00:15:33 -05:00
ced4568 5128da09b0 NOC auto-update: 2026-05-04 05:10 UTC 2026-05-04 00:10:32 -05:00
ced4568 d915e99884 NOC auto-update: 2026-05-04 05:05 UTC 2026-05-04 00:05:34 -05:00
ced4568 7c68b720f2 NOC auto-update: 2026-05-04 05:02 UTC 2026-05-04 00:02:04 -05:00
ced4568 3358341330 changed a linkedin lable url 2026-05-04 00:00:03 -05:00
ced4568 6712f6c8ed NOC auto-update: 2026-05-04 04:55 UTC 2026-05-03 23:55:32 -05:00
ced4568 43a51fc19a describe what you changed 2026-05-03 23:54:13 -05:00
ced4568 e758a34852 NOC auto-update: 2026-05-04 04:50 UTC 2026-05-03 23:50:32 -05:00
ced4568 25ddf9567f Fix LinkedIn URL and resume path 2026-05-03 23:47:43 -05:00
ced4568 ba17723775 NOC auto-update: 2026-05-04 04:45 UTC 2026-05-03 23:45:33 -05:00
ced4568 41bd1b12d4 NOC auto-update: 2026-05-04 04:40 UTC 2026-05-03 23:40:34 -05:00
ced4568 66d20c374f NOC auto-update: 2026-05-04 04:35 UTC 2026-05-03 23:35:33 -05:00
ced4568 d699ae32fb your message 2026-05-03 23:32:41 -05:00
ced4568 a8e63663d8 NOC auto-update: 2026-05-04 04:30 UTC 2026-05-03 23:30:32 -05:00
ced4568 7910bdf2fd NOC auto-update: 2026-05-04 04:29 UTC 2026-05-03 23:29:17 -05:00
ced4568 89cec8b18e NOC auto-update: 2026-05-04 04:25 UTC 2026-05-03 23:25:30 -05:00
ced4568 ee5946d863 NOC auto-update: 2026-05-04 04:20 UTC 2026-05-03 23:20:30 -05:00
ced4568 73f5295354 NOC auto-update: 2026-05-04 04:15 UTC 2026-05-03 23:15:30 -05:00
ced4568 9ea685d3bd NOC auto-update: 2026-05-04 04:10 UTC 2026-05-03 23:10:33 -05:00
ced4568 7bdafb9c56 NOC auto-update: 2026-05-04 04:05 UTC 2026-05-03 23:05:30 -05:00
ced4568 2904d77d70 NOC auto-update: 2026-05-04 04:00 UTC 2026-05-03 23:00:30 -05:00
ced4568 6e9b9340e7 NOC auto-update: 2026-05-04 03:55 UTC 2026-05-03 22:55:30 -05:00
ced4568 b7e2bf426f NOC auto-update: 2026-05-04 03:50 UTC 2026-05-03 22:50:30 -05:00
ced4568 d1171375b8 NOC auto-update: 2026-05-04 03:45 UTC 2026-05-03 22:45:30 -05:00
ced4568 b9f011bfb8 NOC auto-update: 2026-05-04 03:40 UTC 2026-05-03 22:40:30 -05:00
ced4568 cd9f6e1478 NOC auto-update: 2026-05-04 03:35 UTC 2026-05-03 22:35:30 -05:00
ced4568 e3019d155f NOC auto-update: 2026-05-04 03:30 UTC 2026-05-03 22:30:32 -05:00
ced4568 1f90f95f85 NOC auto-update: 2026-05-04 03:25 UTC 2026-05-03 22:25:30 -05:00
ced4568 ea58ec4d99 NOC auto-update: 2026-05-04 03:20 UTC 2026-05-03 22:20:30 -05:00
ced4568 53a1f0fff9 NOC auto-update: 2026-05-04 03:15 UTC 2026-05-03 22:15:32 -05:00
ced4568 eefa06ce72 NOC auto-update: 2026-05-04 03:10 UTC 2026-05-03 22:10:30 -05:00
ced4568 6907022126 NOC auto-update: 2026-05-04 03:05 UTC 2026-05-03 22:05:30 -05:00
ced4568 408146f5d1 NOC auto-update: 2026-05-04 03:00 UTC 2026-05-03 22:00:32 -05:00
ced4568 989a019d69 NOC auto-update: 2026-05-04 02:55 UTC 2026-05-03 21:55:30 -05:00
ced4568 e781afe19d NOC auto-update: 2026-05-04 02:50 UTC 2026-05-03 21:50:30 -05:00
ced4568 71f1948ee4 NOC auto-update: 2026-05-04 02:45 UTC 2026-05-03 21:45:31 -05:00
ced4568 58de1ff16a NOC auto-update: 2026-05-04 02:40 UTC 2026-05-03 21:40:31 -05:00
ced4568 05a41cd2dc NOC auto-update: 2026-05-04 02:35 UTC 2026-05-03 21:35:30 -05:00
ced4568 08a1b2def5 NOC auto-update: 2026-05-04 02:30 UTC 2026-05-03 21:30:30 -05:00
ced4568 6752589a98 NOC auto-update: 2026-05-04 02:25 UTC 2026-05-03 21:25:30 -05:00
ced4568 8090158869 NOC auto-update: 2026-05-04 02:20 UTC 2026-05-03 21:20:32 -05:00
ced4568 df4ebe465c NOC auto-update: 2026-05-04 02:15 UTC 2026-05-03 21:15:31 -05:00
ced4568 dfafee6c66 NOC auto-update: 2026-05-04 02:10 UTC 2026-05-03 21:10:30 -05:00
ced4568 210aec460b NOC auto-update: 2026-05-04 02:05 UTC 2026-05-03 21:05:30 -05:00
ced4568 cd7f8d3d10 NOC auto-update: 2026-05-04 02:00 UTC 2026-05-03 21:00:30 -05:00
ced4568 0346280185 NOC auto-update: 2026-05-04 01:55 UTC 2026-05-03 20:55:31 -05:00
ced4568 076e4b85dc NOC auto-update: 2026-05-04 01:50 UTC 2026-05-03 20:50:30 -05:00
ced4568 8adcb18fb4 NOC auto-update: 2026-05-04 01:45 UTC 2026-05-03 20:45:30 -05:00
ced4568 40b7c2c269 NOC auto-update: 2026-05-04 01:40 UTC 2026-05-03 20:40:30 -05:00
ced4568 eb26006dbe NOC auto-update: 2026-05-04 01:35 UTC 2026-05-03 20:35:30 -05:00
ced4568 681568824e NOC auto-update: 2026-05-04 01:30 UTC 2026-05-03 20:30:30 -05:00
ced4568 731011add6 NOC auto-update: 2026-05-04 01:25 UTC 2026-05-03 20:25:32 -05:00
ced4568 76354d602f NOC auto-update: 2026-05-04 01:20 UTC 2026-05-03 20:20:30 -05:00
ced4568 b3edf696f7 NOC auto-update: 2026-05-04 01:15 UTC 2026-05-03 20:15:30 -05:00
ced4568 be9bd5e15d NOC auto-update: 2026-05-04 01:10 UTC 2026-05-03 20:10:30 -05:00
ced4568 8ac0c77a9c NOC auto-update: 2026-05-04 01:05 UTC 2026-05-03 20:05:30 -05:00
ced4568 4639b830de NOC auto-update: 2026-05-04 01:00 UTC 2026-05-03 20:00:30 -05:00
ced4568 fb60fe0875 NOC auto-update: 2026-05-04 00:55 UTC 2026-05-03 19:55:30 -05:00
ced4568 b5b6e14b8d NOC auto-update: 2026-05-04 00:50 UTC 2026-05-03 19:50:31 -05:00
ced4568 6c898b0df6 NOC auto-update: 2026-05-04 00:45 UTC 2026-05-03 19:45:30 -05:00
ced4568 dfac9e9e68 NOC auto-update: 2026-05-04 00:40 UTC 2026-05-03 19:40:30 -05:00
ced4568 89dd4db659 NOC auto-update: 2026-05-04 00:35 UTC 2026-05-03 19:35:32 -05:00
ced4568 42cb1a2158 NOC auto-update: 2026-05-04 00:30 UTC 2026-05-03 19:30:30 -05:00
ced4568 aec09e46bd NOC auto-update: 2026-05-04 00:25 UTC 2026-05-03 19:25:30 -05:00
ced4568 862b5d3d80 NOC auto-update: 2026-05-04 00:20 UTC 2026-05-03 19:20:30 -05:00
ced4568 b2dd29c4fb NOC auto-update: 2026-05-04 00:15 UTC 2026-05-03 19:15:30 -05:00
ced4568 7284541bbf NOC auto-update: 2026-05-04 00:10 UTC 2026-05-03 19:10:30 -05:00
ced4568 3d08dd1940 NOC auto-update: 2026-05-04 00:05 UTC 2026-05-03 19:05:30 -05:00
ced4568 bb69575045 NOC auto-update: 2026-05-04 00:00 UTC 2026-05-03 19:00:30 -05:00
ced4568 9ce330be4f NOC auto-update: 2026-05-03 23:55 UTC 2026-05-03 18:55:30 -05:00
ced4568 8ef194c3c9 NOC auto-update: 2026-05-03 23:50 UTC 2026-05-03 18:50:30 -05:00
ced4568 052fab6ef1 NOC auto-update: 2026-05-03 23:49 UTC 2026-05-03 18:49:06 -05:00
ced4568 8a15180759 Fix date format 2026-05-03 18:17:43 -05:00
ced4568 499c5063ba NOC auto-update: 2026-05-03 20:05 UTC 2026-05-03 15:05:29 -05:00
ced4568 e86f7b9df4 NOC auto-update: 2026-05-03 20:00 UTC 2026-05-03 15:00:30 -05:00
ced4568 20701f7e8d NOC auto-update: 2026-05-03 19:55 UTC 2026-05-03 14:55:31 -05:00
ced4568 7555871713 NOC auto-update: 2026-05-03 19:50 UTC 2026-05-03 14:50:30 -05:00
ced4568 da1f640a9d NOC auto-update: 2026-05-03 19:45 UTC 2026-05-03 14:45:32 -05:00
ced4568 3f9ae13bd5 NOC auto-update: 2026-05-03 19:40 UTC 2026-05-03 14:40:30 -05:00
ced4568 8e4930a761 NOC auto-update: 2026-05-03 19:35 UTC 2026-05-03 14:35:30 -05:00
ced4568 f34ccf4003 NOC auto-update: 2026-05-03 19:30 UTC 2026-05-03 14:30:32 -05:00
ced4568 6377bd4841 NOC auto-update: 2026-05-03 19:25 UTC 2026-05-03 14:25:30 -05:00
ced4568 f8a0539e11 NOC auto-update: 2026-05-03 19:20 UTC 2026-05-03 14:20:30 -05:00
ced4568 0054284464 NOC auto-update: 2026-05-03 19:15 UTC 2026-05-03 14:15:32 -05:00
ced4568 68462fda76 NOC auto-update: 2026-05-03 19:10 UTC 2026-05-03 14:10:30 -05:00
ced4568 7dd2a19fca NOC auto-update: 2026-05-03 19:05 UTC 2026-05-03 14:05:30 -05:00
ced4568 6ff7804ecb NOC auto-update: 2026-05-03 19:00 UTC 2026-05-03 14:00:31 -05:00
ced4568 101abf28e2 NOC auto-update: 2026-05-03 19:00 UTC 2026-05-03 14:00:14 -05:00
ced4568 e985961dfe NOC auto-update: 2026-05-03 18:56 UTC 2026-05-03 13:56:19 -05:00
ced4568 238b3061a4 NOC auto-update: 2026-05-03 18:55 UTC 2026-05-03 13:55:34 -05:00
ced4568 db7b229d1f NOC auto-update: 2026-05-03 18:50 UTC 2026-05-03 13:50:30 -05:00
ced4568 2d9ab1608a NOC auto-update: 2026-05-03 18:45 UTC 2026-05-03 13:45:29 -05:00
ced4568 24cf6fe31f NOC auto-update: 2026-05-03 18:42 UTC 2026-05-03 13:42:08 -05:00
ced4568 dfcb9b17bc NOC auto-update: 2026-05-03 18:40 UTC 2026-05-03 13:41:31 -05:00
ced4568 fc3a65b2e8 NOC auto-update: 2026-05-03 18:35 UTC 2026-05-03 13:41:31 -05:00
ced4568 b9d0ef8638 NOC auto-update: 2026-05-03 18:30 UTC 2026-05-03 13:41:31 -05:00
ced4568 1fd8ea1a7b NOC auto-update: 2026-05-03 18:25 UTC 2026-05-03 13:41:31 -05:00
ced4568 886d8ec86a NOC auto-update: 2026-05-03 18:20 UTC 2026-05-03 13:41:31 -05:00
ced4568 19d5fe6fd1 NOC auto-update: 2026-05-03 18:15 UTC 2026-05-03 13:41:31 -05:00
ced4568 7ef95fdf39 NOC auto-update: 2026-05-03 18:10 UTC 2026-05-03 13:41:31 -05:00
ced4568 059e13b3df NOC auto-update: 2026-05-03 18:05 UTC 2026-05-03 13:41:31 -05:00
ced4568 90a9308cf2 NOC auto-update: 2026-05-03 18:00 UTC 2026-05-03 13:41:31 -05:00
ced4568 523785dd41 NOC auto-update: 2026-05-03 17:55 UTC 2026-05-03 13:41:31 -05:00
ced4568 a23179efd9 NOC auto-update: 2026-05-03 17:50 UTC 2026-05-03 13:41:31 -05:00
ced4568 58ebe611be NOC auto-update: 2026-05-03 17:45 UTC 2026-05-03 13:41:31 -05:00
ced4568 2f83407ea3 NOC auto-update: 2026-05-03 17:40 UTC 2026-05-03 13:41:31 -05:00
ced4568 a4800fb385 NOC auto-update: 2026-05-03 17:35 UTC 2026-05-03 13:41:31 -05:00
ced4568 e0b9370c32 NOC auto-update: 2026-05-03 17:30 UTC 2026-05-03 13:41:31 -05:00
ced4568 0b1df40420 NOC auto-update: 2026-05-03 17:25 UTC 2026-05-03 13:41:31 -05:00
ced4568 0731ac005d NOC auto-update: 2026-05-03 17:20 UTC 2026-05-03 13:41:31 -05:00
ced4568 979ed53297 NOC auto-update: 2026-05-03 17:15 UTC 2026-05-03 13:41:31 -05:00
ced4568 9677685704 NOC auto-update: 2026-05-03 17:10 UTC 2026-05-03 13:41:31 -05:00
ced4568 e76093a40d NOC auto-update: 2026-05-03 17:05 UTC 2026-05-03 13:41:31 -05:00
ced4568 147b2b3329 NOC auto-update: 2026-05-03 17:00 UTC 2026-05-03 13:41:31 -05:00
ced4568 f944bf2290 NOC auto-update: 2026-05-03 16:55 UTC 2026-05-03 13:41:31 -05:00
ced4568 b18ff2b04e NOC auto-update: 2026-05-03 16:50 UTC 2026-05-03 13:41:31 -05:00
ced4568 e9341a4f7e NOC auto-update: 2026-05-03 16:45 UTC 2026-05-03 13:41:31 -05:00
ced4568 f7b3e96035 NOC auto-update: 2026-05-03 16:40 UTC 2026-05-03 13:41:31 -05:00
ced4568 37ea10b0ee NOC auto-update: 2026-05-03 16:35 UTC 2026-05-03 13:41:31 -05:00
ced4568 8e68264894 NOC auto-update: 2026-05-03 16:30 UTC 2026-05-03 13:41:31 -05:00
ced4568 0d07c5eea5 NOC auto-update: 2026-05-03 16:25 UTC 2026-05-03 13:41:31 -05:00
ced4568 9677c6c30f NOC auto-update: 2026-05-03 16:20 UTC 2026-05-03 13:41:31 -05:00
ced4568 ed63db2197 NOC auto-update: 2026-05-03 16:15 UTC 2026-05-03 13:41:31 -05:00
ced4568 7185d72e5b NOC auto-update: 2026-05-03 16:10 UTC 2026-05-03 13:41:31 -05:00
ced4568 3714c1f5af NOC auto-update: 2026-05-03 16:05 UTC 2026-05-03 13:41:31 -05:00
ced4568 9f66c5e185 NOC auto-update: 2026-05-03 16:00 UTC 2026-05-03 13:41:31 -05:00
ced4568 a8e8891fec NOC auto-update: 2026-05-03 15:55 UTC 2026-05-03 13:41:31 -05:00
ced4568 e4c4552903 NOC auto-update: 2026-05-03 15:50 UTC 2026-05-03 13:41:31 -05:00
ced4568 90d7ea750b NOC auto-update: 2026-05-03 15:45 UTC 2026-05-03 13:41:31 -05:00
ced4568 15dabf72b6 NOC auto-update: 2026-05-03 15:40 UTC 2026-05-03 13:41:31 -05:00
ced4568 16815d79ba NOC auto-update: 2026-05-03 15:35 UTC 2026-05-03 13:41:31 -05:00
ced4568 d1a6766211 NOC auto-update: 2026-05-03 15:30 UTC 2026-05-03 13:41:31 -05:00
ced4568 5e44c47275 NOC auto-update: 2026-05-03 15:25 UTC 2026-05-03 13:41:31 -05:00
ced4568 6ccf121a80 NOC auto-update: 2026-05-03 15:20 UTC 2026-05-03 13:41:31 -05:00
ced4568 4b4df4b5dc NOC auto-update: 2026-05-03 15:15 UTC 2026-05-03 13:41:31 -05:00
ced4568 bbf54379c5 NOC auto-update: 2026-05-03 15:10 UTC 2026-05-03 13:41:31 -05:00
ced4568 a255c7847a NOC auto-update: 2026-05-03 15:05 UTC 2026-05-03 13:41:31 -05:00
ced4568 0480ff7467 NOC auto-update: 2026-05-03 15:00 UTC 2026-05-03 13:41:31 -05:00
ced4568 1ed31b84e2 NOC auto-update: 2026-05-03 14:55 UTC 2026-05-03 13:41:31 -05:00
ced4568 6002290702 NOC auto-update: 2026-05-03 14:50 UTC 2026-05-03 13:41:31 -05:00
ced4568 1988c4639e NOC auto-update: 2026-05-03 14:45 UTC 2026-05-03 13:41:31 -05:00
ced4568 281b3294d6 NOC auto-update: 2026-05-03 14:40 UTC 2026-05-03 13:41:31 -05:00
ced4568 cee99b43fe NOC auto-update: 2026-05-03 14:35 UTC 2026-05-03 13:41:31 -05:00
ced4568 c6f40983de NOC auto-update: 2026-05-03 14:30 UTC 2026-05-03 13:41:31 -05:00
ced4568 d70587f1fa NOC auto-update: 2026-05-03 14:25 UTC 2026-05-03 13:41:31 -05:00
ced4568 b04a710394 NOC auto-update: 2026-05-03 14:20 UTC 2026-05-03 13:41:31 -05:00
ced4568 0a485a9888 NOC auto-update: 2026-05-03 14:15 UTC 2026-05-03 13:41:31 -05:00
ced4568 1fc1034e47 NOC auto-update: 2026-05-03 14:10 UTC 2026-05-03 13:41:31 -05:00
ced4568 7961f149f4 NOC auto-update: 2026-05-03 14:05 UTC 2026-05-03 13:41:31 -05:00
ced4568 1473fda4de NOC auto-update: 2026-05-03 14:00 UTC 2026-05-03 13:41:31 -05:00
ced4568 ff18e9a8a8 NOC auto-update: 2026-05-03 13:55 UTC 2026-05-03 13:41:31 -05:00
ced4568 ca22613094 NOC auto-update: 2026-05-03 13:50 UTC 2026-05-03 13:41:31 -05:00
ced4568 98a7b694fd NOC auto-update: 2026-05-03 13:45 UTC 2026-05-03 13:41:31 -05:00
ced4568 b140d90abc NOC auto-update: 2026-05-03 13:40 UTC 2026-05-03 13:41:31 -05:00
ced4568 654d65799c NOC auto-update: 2026-05-03 13:35 UTC 2026-05-03 13:41:31 -05:00
ced4568 1eb91748c2 NOC auto-update: 2026-05-03 13:30 UTC 2026-05-03 13:41:31 -05:00
ced4568 393fc31f02 NOC auto-update: 2026-05-03 13:25 UTC 2026-05-03 13:41:31 -05:00
ced4568 f2ba966089 NOC auto-update: 2026-05-03 13:20 UTC 2026-05-03 13:41:31 -05:00
ced4568 e885db4886 NOC auto-update: 2026-05-03 13:15 UTC 2026-05-03 13:41:31 -05:00
ced4568 356d61308a NOC auto-update: 2026-05-03 13:10 UTC 2026-05-03 13:41:31 -05:00
ced4568 d100d5cd97 NOC auto-update: 2026-05-03 13:05 UTC 2026-05-03 13:41:31 -05:00
ced4568 a0ae730753 NOC auto-update: 2026-05-03 13:00 UTC 2026-05-03 13:41:31 -05:00
ced4568 061d422baa NOC auto-update: 2026-05-03 12:55 UTC 2026-05-03 13:41:31 -05:00
ced4568 e249b5a2ee NOC auto-update: 2026-05-03 12:50 UTC 2026-05-03 13:41:31 -05:00
ced4568 3a0388a206 NOC auto-update: 2026-05-03 12:45 UTC 2026-05-03 13:41:31 -05:00
ced4568 ff0a2f9c5c NOC auto-update: 2026-05-03 12:40 UTC 2026-05-03 13:41:31 -05:00
ced4568 f60fed7f83 NOC auto-update: 2026-05-03 12:35 UTC 2026-05-03 13:41:31 -05:00
ced4568 d74d1a7bf8 NOC auto-update: 2026-05-03 12:30 UTC 2026-05-03 13:41:31 -05:00
ced4568 734e0d727e NOC auto-update: 2026-05-03 12:25 UTC 2026-05-03 13:41:31 -05:00
ced4568 da848ab004 NOC auto-update: 2026-05-03 12:20 UTC 2026-05-03 13:41:31 -05:00
ced4568 28f0021a61 NOC auto-update: 2026-05-03 12:15 UTC 2026-05-03 13:41:31 -05:00
ced4568 b81ba4351f NOC auto-update: 2026-05-03 12:10 UTC 2026-05-03 13:41:31 -05:00
ced4568 33f18f8bd5 NOC auto-update: 2026-05-03 12:05 UTC 2026-05-03 13:41:31 -05:00
ced4568 5d31500772 NOC auto-update: 2026-05-03 12:00 UTC 2026-05-03 13:41:31 -05:00
ced4568 514fa29c65 NOC auto-update: 2026-05-03 11:55 UTC 2026-05-03 13:41:31 -05:00
ced4568 de8577c868 NOC auto-update: 2026-05-03 11:50 UTC 2026-05-03 13:41:31 -05:00
ced4568 f15ec64dd8 NOC auto-update: 2026-05-03 11:45 UTC 2026-05-03 13:41:31 -05:00
ced4568 824591e199 NOC auto-update: 2026-05-03 11:40 UTC 2026-05-03 13:41:31 -05:00
ced4568 2b346dfcb7 NOC auto-update: 2026-05-03 11:35 UTC 2026-05-03 13:41:31 -05:00
ced4568 93af46c9b6 NOC auto-update: 2026-05-03 11:30 UTC 2026-05-03 13:41:31 -05:00
ced4568 c19f033ba7 NOC auto-update: 2026-05-03 11:25 UTC 2026-05-03 13:41:31 -05:00
ced4568 55cc70bb3a NOC auto-update: 2026-05-03 11:20 UTC 2026-05-03 13:41:31 -05:00
ced4568 4861ef3c17 NOC auto-update: 2026-05-03 11:15 UTC 2026-05-03 13:41:31 -05:00
ced4568 c168950f5d NOC auto-update: 2026-05-03 11:10 UTC 2026-05-03 13:41:31 -05:00
ced4568 77cd9e4276 NOC auto-update: 2026-05-03 11:05 UTC 2026-05-03 13:41:31 -05:00
ced4568 1cd98cb351 NOC auto-update: 2026-05-03 11:00 UTC 2026-05-03 13:41:31 -05:00
ced4568 92fd1fc679 NOC auto-update: 2026-05-03 10:55 UTC 2026-05-03 13:41:31 -05:00
ced4568 7f523505a4 NOC auto-update: 2026-05-03 10:50 UTC 2026-05-03 13:41:31 -05:00
ced4568 b577d69aa1 NOC auto-update: 2026-05-03 10:45 UTC 2026-05-03 13:41:31 -05:00
ced4568 0aefb7c6e9 NOC auto-update: 2026-05-03 10:40 UTC 2026-05-03 13:41:31 -05:00
ced4568 0f9ecd28cc NOC auto-update: 2026-05-03 10:35 UTC 2026-05-03 13:41:31 -05:00
ced4568 5e8f0a032f NOC auto-update: 2026-05-03 10:30 UTC 2026-05-03 13:41:31 -05:00
ced4568 aae8519ec7 NOC auto-update: 2026-05-03 10:25 UTC 2026-05-03 13:41:31 -05:00
ced4568 f9588e9f13 NOC auto-update: 2026-05-03 10:20 UTC 2026-05-03 13:41:31 -05:00
ced4568 09cf85896d NOC auto-update: 2026-05-03 10:15 UTC 2026-05-03 13:41:31 -05:00
ced4568 4d8b6a48f1 NOC auto-update: 2026-05-03 10:10 UTC 2026-05-03 13:41:31 -05:00
ced4568 40ddbdcd52 NOC auto-update: 2026-05-03 10:05 UTC 2026-05-03 13:41:31 -05:00
ced4568 c2f8926ba9 NOC auto-update: 2026-05-03 10:00 UTC 2026-05-03 13:41:31 -05:00
ced4568 9a13177fef NOC auto-update: 2026-05-03 09:55 UTC 2026-05-03 13:41:31 -05:00
ced4568 88f5d97b16 NOC auto-update: 2026-05-03 09:50 UTC 2026-05-03 13:41:31 -05:00
ced4568 cc7cab1fe1 NOC auto-update: 2026-05-03 09:45 UTC 2026-05-03 13:41:31 -05:00
ced4568 83885c164a NOC auto-update: 2026-05-03 09:40 UTC 2026-05-03 13:41:31 -05:00
ced4568 04e748beeb NOC auto-update: 2026-05-03 09:35 UTC 2026-05-03 13:41:30 -05:00
ced4568 59d3395dd4 NOC auto-update: 2026-05-03 09:30 UTC 2026-05-03 13:41:30 -05:00
ced4568 d8e3896ef2 NOC auto-update: 2026-05-03 09:25 UTC 2026-05-03 13:41:30 -05:00
ced4568 68afecc99d NOC auto-update: 2026-05-03 09:20 UTC 2026-05-03 13:41:30 -05:00
ced4568 b760001eba NOC auto-update: 2026-05-03 09:15 UTC 2026-05-03 13:41:30 -05:00
ced4568 fa79e7a612 NOC auto-update: 2026-05-03 09:10 UTC 2026-05-03 13:41:30 -05:00
ced4568 49c5f72698 NOC auto-update: 2026-05-03 09:05 UTC 2026-05-03 13:41:30 -05:00
ced4568 79e884a7ad NOC auto-update: 2026-05-03 09:00 UTC 2026-05-03 13:41:30 -05:00
ced4568 c142a7e935 NOC auto-update: 2026-05-03 08:55 UTC 2026-05-03 13:41:30 -05:00
ced4568 f6c10ca88c NOC auto-update: 2026-05-03 08:50 UTC 2026-05-03 13:41:30 -05:00
ced4568 cfaa9c9e27 NOC auto-update: 2026-05-03 08:45 UTC 2026-05-03 13:41:30 -05:00
ced4568 bdf5fe1d5c NOC auto-update: 2026-05-03 08:40 UTC 2026-05-03 13:41:30 -05:00
ced4568 86ef80d16d NOC auto-update: 2026-05-03 08:35 UTC 2026-05-03 13:41:30 -05:00
ced4568 086262f7f7 NOC auto-update: 2026-05-03 08:30 UTC 2026-05-03 13:41:30 -05:00
ced4568 950d4bd846 NOC auto-update: 2026-05-03 08:25 UTC 2026-05-03 13:41:30 -05:00
ced4568 2238005774 NOC auto-update: 2026-05-03 08:20 UTC 2026-05-03 13:41:30 -05:00
ced4568 c4350c8369 NOC auto-update: 2026-05-03 08:15 UTC 2026-05-03 13:41:30 -05:00
ced4568 518fb78781 NOC auto-update: 2026-05-03 08:10 UTC 2026-05-03 13:41:30 -05:00
ced4568 dccff393da NOC auto-update: 2026-05-03 08:05 UTC 2026-05-03 13:41:30 -05:00
ced4568 51167db84b NOC auto-update: 2026-05-03 08:00 UTC 2026-05-03 13:41:30 -05:00
ced4568 6b9b970464 NOC auto-update: 2026-05-03 07:55 UTC 2026-05-03 13:41:30 -05:00
ced4568 663794061d NOC auto-update: 2026-05-03 07:50 UTC 2026-05-03 13:41:30 -05:00
ced4568 0ba7e8a95b Merge branch 'main' of https://github.com/ced4568/ced-portfolio 2026-05-03 02:49:43 -05:00
ced4568 d4214b6dd8 updated README>md 2026-05-03 02:49:38 -05:00
ced4568 4ce6fcec75 NOC auto-update: 2026-05-03 07:45 UTC 2026-05-03 02:45:30 -05:00
ced4568 b36d7c5acc NOC auto-update: 2026-05-03 07:40 UTC 2026-05-03 02:40:29 -05:00
ced4568 44a16bd862 NOC auto-update: 2026-05-03 07:35 UTC 2026-05-03 02:35:30 -05:00
ced4568 bb6cf0db4f NOC auto-update: 2026-05-03 07:30 UTC 2026-05-03 02:30:30 -05:00
ced4568 1094e77ec1 NOC auto-update: 2026-05-03 07:25 UTC 2026-05-03 02:25:30 -05:00
ced4568 40705cb1bf NOC auto-update: 2026-05-03 07:20 UTC 2026-05-03 02:20:29 -05:00
ced4568 16f2bac0fb NOC auto-update: 2026-05-03 07:15 UTC 2026-05-03 02:15:30 -05:00
ced4568 5bb55994f7 NOC auto-update: 2026-05-03 07:10 UTC 2026-05-03 02:10:30 -05:00
ced4568 7be9a3f7b2 NOC auto-update: 2026-05-03 07:05 UTC 2026-05-03 02:05:30 -05:00
ced4568 bf4eb46335 NOC auto-update: 2026-05-03 07:00 UTC 2026-05-03 02:00:29 -05:00
ced4568 93707196e7 NOC auto-update: 2026-05-03 06:55 UTC 2026-05-03 01:55:30 -05:00
ced4568 6eb2f74118 NOC auto-update: 2026-05-03 06:50 UTC 2026-05-03 01:50:30 -05:00
ced4568 bc8182aa3f NOC auto-update: 2026-05-03 06:45 UTC 2026-05-03 01:45:29 -05:00
ced4568 c597890d06 NOC auto-update: 2026-05-03 06:40 UTC 2026-05-03 01:40:29 -05:00
ced4568 39a8ef74fb NOC auto-update: 2026-05-03 06:35 UTC 2026-05-03 01:35:30 -05:00
ced4568 ebfad8112c NOC auto-update: 2026-05-03 06:30 UTC 2026-05-03 01:30:30 -05:00
ced4568 55a238b32c NOC auto-update: 2026-05-03 06:25 UTC 2026-05-03 01:25:29 -05:00
ced4568 2bec8f92e6 NOC auto-update: 2026-05-03 06:20 UTC 2026-05-03 01:20:30 -05:00
ced4568 16133b017f NOC auto-update: 2026-05-03 06:15 UTC 2026-05-03 01:15:30 -05:00
ced4568 31ab20e352 NOC auto-update: 2026-05-03 06:10 UTC 2026-05-03 01:10:30 -05:00
ced4568 0b29d4223b NOC auto-update: 2026-05-03 06:05 UTC 2026-05-03 01:05:29 -05:00
ced4568 625337489e NOC auto-update: 2026-05-03 06:00 UTC 2026-05-03 01:00:30 -05:00
ced4568 0413ec1c19 NOC auto-update: 2026-05-03 05:55 UTC 2026-05-03 00:55:30 -05:00
ced4568 889fd5215c NOC auto-update: 2026-05-03 05:50 UTC 2026-05-03 00:50:30 -05:00
ced4568 3b892a7d02 NOC auto-update: 2026-05-03 05:45 UTC 2026-05-03 00:45:29 -05:00
ced4568 de464a62b8 NOC auto-update: 2026-05-03 05:40 UTC 2026-05-03 00:40:30 -05:00
ced4568 b909022d66 NOC auto-update: 2026-05-03 05:35 UTC 2026-05-03 00:35:30 -05:00
ced4568 f06ea0e95a NOC auto-update: 2026-05-03 05:31 UTC 2026-05-03 00:31:30 -05:00
ced4568 c69c94ab57 NOC auto-update: 2026-05-03 05:25 UTC 2026-05-03 00:25:07 -05:00
ced4568 1a9d299f10 Fix renderAlerts missing function declaration 2026-05-02 21:35:20 -05:00
ced4568 d49a0d73a3 Fix NOC fetch URL for both domains, remove .claude 2026-05-02 20:53:58 -05:00
ced4568 6420c21d6a Remove .claude submodule and gitmodules 2026-05-02 20:31:23 -05:00
ced4568 68cd97803d Re-add favicons with correct filenames 2026-05-02 20:00:43 -05:00
ced4568 95133ccbe8 Remove favicons from git tracking 2026-05-02 20:00:31 -05:00
ced4568 1ab362a86e Rename favicon files to match HTML paths 2026-05-02 17:51:07 -05:00
ced4568 0d61e55557 Add redesigned site files 2026-05-02 17:15:20 -05:00
ced4568 cbdae40a08 Redesign: new UI, resume, NOC page, favicons, sitemap 2026-05-02 16:58:21 -05:00
ced4568 9b489462eb favicons added 2026-05-02 16:40:26 -05:00
ced4568 3917c1bded Finalize portfolio README with live NOC integration 2026-04-27 00:08:23 -05:00
ced4568 c079f67c1c made small changes 2026-04-26 22:04:05 -05:00
ced4568 c85f0401b1 Merge branch 'main' of https://github.com/ced4568/ced-portfolio 2026-04-26 21:28:30 -05:00
ced4568 8053fb889a added cname 2026-04-26 21:28:26 -05:00
Chase DumphordandGitHub 0a36f6f536 Create CNAME 2026-04-26 21:26:23 -05:00
Chase DumphordandGitHub 18a47b96f2 Delete CNAME 2026-04-26 21:25:45 -05:00
Chase DumphordandGitHub fed2b30f60 Create CNAME 2026-04-26 21:17:28 -05:00
ced4568 d6f3cd3b50 Upgrade NOC badge to severity-based alerts (V6) 2026-04-26 21:13:30 -05:00
ced4568 b5e097f0fb Add real-time NOC status badge 2026-04-26 17:52:06 -05:00
ced4568 c7c1028462 Add NOC screenshots + status badges 2026-04-26 17:43:03 -05:00
ced4568 1b734a756c v3 updates that techstack 2026-04-26 17:16:25 -05:00
ced4568 ca391b2a9c updated readme v2 2026-04-26 16:24:43 -05:00
ced4568 f2306bcda0 README.md v2 2026-04-26 16:20:06 -05:00
ced4568 d6de99ba90 added a README.md page 2026-04-26 16:16:35 -05:00
ced4568 d934f9bb47 Add APRS Home iGate to NOC dashboard 2026-04-26 16:04:09 -05:00
ced4568 385abd1b2d Add NOC alert panel while preserving portfolio layout 2026-04-25 18:41:45 -05:00
ced4568 cee5f45252 Add NOC alert panel V3.5 2026-04-25 18:33:21 -05:00
ced4568 e11463a0e4 Clean NOC structure V3.5 2026-04-25 18:22:43 -05:00
ced4568 f03f0cb7de Upgrade NOC dashboard to V3 with latency and roadmap 2026-04-25 17:45:59 -05:00
ced4568 0028475380 added python 2026-04-25 17:00:52 -05:00
ced4568 15de7b7f29 Update NOC JSON to real data V2 2026-04-25 16:59:08 -05:00
ced4568 bb4e4c4b10 moved the location of my data folder 2026-04-25 15:10:18 -05:00
ced4568 8926acb805 Clean NOC dashboard UI with real inventory data 2026-04-25 15:04:02 -05:00
ced4568 bf510d74a4 Build V3 NOC dashboard portfolio layout 2026-04-25 02:03:46 -05:00
22 changed files with 2863 additions and 376 deletions
BIN
View File
Binary file not shown.
+1
View File
@@ -0,0 +1 @@
chasedumphord.com
+122
View File
@@ -0,0 +1,122 @@
# Hi, I'm Chase (Ced) Dumphord
### Digital Systems Engineer | Infrastructure | Automation | RF Edge Systems
> **Live Portfolio:** https://chasedumphord.com
> **Live NOC Dashboard:** https://noc.chasedumphord.com
---
## 🧠 About
Digital Systems Engineer with 10+ years of experience across industrial automation, manufacturing systems, and data-driven infrastructure. Currently at GE Aerospace Digital Team specializing in machine data integration, dashboard development, and system-level visibility. Hands-on homelab engineer bridging physical equipment with modern digital platforms. Increasingly integrating AI tooling for system documentation, automated diagnostics, and workflow acceleration.
---
## 🌐 Live Sites
| Site | URL | Description |
|------|-----|-------------|
| Portfolio | https://chasedumphord.com | Personal portfolio — projects, stack, resume |
| NOC Dashboard | https://noc.chasedumphord.com | Live infrastructure visibility — 28 systems |
---
## 📊 Ced's NOC — Live Infrastructure Observability
Real-time network operations center dashboard monitoring 28 homelab systems across 6 infrastructure layers.
### How It Works
```
Proxmox Biggie (Cron every 5min)
→ noc_update.py pings 28 systems
→ writes data/noc-status.json
→ git push to ced-portfolio
→ GitHub Pages deploys (~30s)
→ Browser fetches every 30s
→ Live dashboard updates
```
### Systems Monitored
- **6-node Proxmox Cluster** — BigWorld, Biggie, Snoop, TooShort, Tupac, DrDre
- **12-node K3s Cluster** — 3 control plane (django-1/2/3) + 9 workers (ingress, data, monitoring groups)
- **TrueNAS** — Network attached storage
- **Nginx Proxy Manager** — Reverse proxy layer
- **Prometheus + Grafana + Uptime Kuma** — Full observability stack (Prometheus actively scraping)
- **Dashy + Home Assistant + PrimeStation** — Services layer
- **APRS iGate x2** — RF edge systems (home + mobile)
### Automation
- Script: `~/scripts/noc_update.py` running on Biggie (`10.10.30.192`)
- Cron: `*/5 * * * *` — every 5 minutes
- Log: `/var/log/noc_update.log`
- Auth: GitHub Personal Access Token via baked remote URL
---
## 🏗️ Infrastructure Overview
| Layer | Systems | Count |
|-------|---------|-------|
| Compute | Proxmox VE cluster | 6 nodes |
| Orchestration | K3s Kubernetes | 12 nodes |
| Storage | TrueNAS | 1 |
| Networking | Nginx Proxy Manager, Cloudflare Tunnels, UniFi VLANs | 4 VLANs |
| Monitoring | Prometheus, Grafana, Uptime Kuma, Custom NOC | 4 services |
| Edge | APRS iGate (home + mobile), Direwolf TNC | 2 nodes |
---
## 🔥 Featured Projects
### 📊 Ced's NOC Dashboard
Real-time monitoring system with live system health, latency tracking, severity-based alerts, and layer filtering.
- **Live:** https://noc.chasedumphord.com
- **Source:** https://github.com/ced4568/ceds-noc
### 🧱 Ced's HomeLab
Full enterprise-style homelab with Proxmox clustering, K3s orchestration, VLAN segmentation, and full observability stack including Prometheus scraping.
- **Source:** https://github.com/ced4568/ceds-homelab
### 📡 APRS iGate (RF Edge System)
Dual-node RF-to-internet gateway. Raspberry Pi + Direwolf TNC. Live on aprs.fi.
- **Source:** https://github.com/ced4568/ceds-aprs-igate
---
## 🧰 Tech Stack
**Infrastructure:** Proxmox VE • K3s • Docker • TrueNAS • Nginx Proxy Manager • Cloudflare Tunnels
**Monitoring:** Prometheus • Grafana • Uptime Kuma • Custom NOC Dashboard
**Networking:** UniFi • VLAN Segmentation • Cloudflare DNS
**Edge / RF:** Direwolf • APRS-IS • Raspberry Pi • RTL-SDR
**Development:** Python • Bash • JavaScript • HTML/CSS • Git
**AI & Automation:** Claude (Anthropic) • LLM-assisted Documentation • Prompt Engineering
---
## 👤 Connect
[![LinkedIn](https://img.shields.io/badge/LinkedIn-Connect-blue?style=for-the-badge&logo=linkedin)](https://www.linkedin.com/in/toochase-dumphord/)
[![GitHub](https://img.shields.io/badge/GitHub-ced4568-black?style=for-the-badge&logo=github)](https://github.com/ced4568)
[![Portfolio](https://img.shields.io/badge/Portfolio-Live-brightgreen?style=for-the-badge)](https://chasedumphord.com)
[![NOC](https://img.shields.io/badge/NOC-Live-cyan?style=for-the-badge)](https://noc.chasedumphord.com)
📧 chasedumphord@gmail.com | 📍 Oxford, MS
---
> This is not a static portfolio — it is a live representation of working systems.
+93
View File
@@ -0,0 +1,93 @@
%PDF-1.4
%“Œ‹ž ReportLab Generated PDF document (opensource)
1 0 obj
<<
/F1 2 0 R /F2 3 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
>>
endobj
4 0 obj
<<
/Contents 9 0 R /MediaBox [ 0 0 612 792 ] /Parent 8 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
5 0 obj
<<
/Contents 10 0 R /MediaBox [ 0 0 612 792 ] /Parent 8 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
6 0 obj
<<
/PageMode /UseNone /Pages 8 0 R /Type /Catalog
>>
endobj
7 0 obj
<<
/Author (\(anonymous\)) /CreationDate (D:20260502182436+00'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260502182436+00'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (\(anonymous\)) /Trapped /False
>>
endobj
8 0 obj
<<
/Count 2 /Kids [ 4 0 R 5 0 R ] /Type /Pages
>>
endobj
9 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2874
>>
stream
Gb!SmgN)%.&q0LUoM\eYQ"42Il>79h:,K5HN29,5<qunG+UK*Ni..UD:$ou>2ZZfUXG^Abg+#m'YpC#r!/IIJ?YG(G5Bc]]9E79#iV^h&gO]/%Cp3<Dr#.3NB7HH)Au%NTHQES"Ibu7*'YMo(HtsE]h\oYkBE3J8*s;Z^eFG00)1`/Zc9[@Or2;S+IQ=_a><&9^cDm1OSh4ObE"dP_(XKA%$1nq$/=7lU]0=FP[,?I5*RYggL!F5JEXimsP-(O;hS]9K0`Qh8s+WaTj0l.NDqXd(VX9Nmg=qDlpK`FQXnP>:jc1>E#IkN4>_o4)=:DNY?LT4qbB,12c5#-h_]__&Kjo>$b-39+X*8e3.e1-d)<8#a#qL[&p"5=l0]l!i)%686%6LrUm;(:U1\@7''Ma(6+mt`C1%9h2nXr,=SWRRF3Uem#@-B:OIOl&40&4YNW\&>lU]1<L`9B:jf5hq`IWdLmZm,\H5F)ThEBf]0ZZ-9$WdLIDk95mK,hB:FYt2Y$8>OcYOe*@e<n;W*q88->ZtJ=qp=%n;,gWU&n(6@PER/LtKh_PsJ@Xkb('<]H[QPTm,G[[dCJ#*6g@;8%PNV*_qu,YhI.shXO4UIJ%q"7ScP]AK)HS"[.t1K=_=JWq7LUl4KW4XL[B76G]n>fu+3tpOWcZ%2"FS6;+g;!,mkj.m"dUuU"74D)]b0lWca@%`d&m<GF@HD\+)"C_RfgoImA0Wmn-Ktf;u[>Cc;Y9o!W5I-Q/HAtJVE<*3J`YjZGn9(OKc)s0QLE\/g8i4]>2i#,$(pSUr4KRCH+CbbLQJD.@&n,&[+L[JnPgWcu)5Y`JSSZ44N#WF-^nkcZk88&V&4C*1jAGBCT_:r*Jlh10]]>^3YlW,B0305Oqog$*LA=WqY>-krLqa>WdgE'^PV^R?A0MQpcb.O$^sQVWN=%KTl!K?J[j^N\\\U1/2J8aKZhDr6^5EDVf7(0io[9*RF@!`aA1HE-DIJ>4NS&\9F$=%n]5_ZBD?@\HicKr^SE;mH[9/aG?l2+p1XWZN;F&_$s/g:iVf]A;%HY"\juSbq;gT@_.4kbdnA-YU&fE61_lP5#]:`WQY_^RYUedeb;K`T+J#aa'<-25N4l@'D/DTS@@d1-PDX=Gk1[OI_:fnXLTRo%<QQfARhpr?pL"Pn7UWI*9S0YjucnF16tSLo4'ifCpSco=\uc)^B7`3_76qg!I'4;7f/s32oKLA*X[g,B/'%pC/Pnh1+>n\>>ui[*@$R]FcIBJ?>VMYAolQq%\)6rZ7V9PcLKn!NRGFEq35Z8&\FoESVuk-JrQS@K+$2B]d0rSCprNo>Vt).J-,+'qnijq=plfb["\-a5*9R%6i(K7Qo5*])94kh9(M*0%)*%*[8iYc,-GjW5_^,/iCd4-7/U30aPPr"Jr]jlM/_dRfYFM,mVF8CLCnX@f>QYQg_Qt0kDfiRnEmLhf-2e$0Jp$7,6ZeG5*ld.l+GsMrVJ3PaRD8m?+@j-n=p=;CW&2D9=d*>AJm(/L,>E1\Dct,YsI<L;ZV(e;c-'mqhIJD:'K?A`>3^\MCT"RoUs,>oK2Ss_riek)\^Fl0VQ5Z14]m)mlM1(r@OqJp[8V8':]Ds>@(-*49eJu.U9\nO)NDZF0S+t\jMNX=O^=j6/p\Fg&s^S;K4"oE$Z3J@W@@PR4cGWN=IZ45ESpQMRn#=Cn]njV@l4JPI]H@"DKPZ)+o5t'T6F\d*)V_h5]8re'7N42Aok\&O6(6F`q8*W_SkB7WOo;9&]Q6''"UTnkMWNQGO]]au^JAlXE;7quIh:$bru;2@Gek:t._SDm%D61F1I?;&J+M!.f2@if'd+Qq\[\+:KVrkXj"@L_FRP@\mT^66aSFohCKUWL-U:I'K4fO/Jl-_*Xu`,a2>A78mtB;M>.AMD^Uj"0"PA<EZTAQE>CQU7B#T*mDj&?/mnH,,pAs%>7kM'/:nB_:YVX.b''3B>npDf\MBL9_K54:,"_CnSn<MYEsI^bM1/#Oo4#Qg7*dler7+TWpjNA&"HR`%urm,><^tdDbg+cf&X!RS(m\lm6_+JFJ0u`[\fK6"HMg:Ca+lO,5eBTjA0QkP0mXk>lphT'ao.5hf?L7b3f"2h^*76PB:ouY9nSQX1NmD+!itj"p6DrI=r#+M4im2W.qh.!QkGh>?]m!%m*+*a0f8KD?DZq*,'lgAEkIh<3pJCB\_-#rV>\"OGR$Im81F(g)4eo`Q^&SDssaLO*%_+bVH/TG(6OV[nmTG];;q"#'I2tUPY8%OWi2ZWa%F@@?iM<&p>u#1QYd@e(B#bOB/@&VSAEuW&,VS]cdi#Ah#nGNLEcS<NQY'.02`#7912$XgDe]7>L/3NM[^)hEF6'VE)[UF``<?<QpL=[E_uaeU/qoL]iigjA77HAQC`BEFoY>?S#k+dN$"BK+d4sRj[@B34L`SI"fS;BoSo%Kj]R)%\\WGkh>GID_VnO]8UN;[[k,Upb>bHiS,aD=/Lk>X1BZb2k(,;73,q7-HJN)!I0NqVRNXO/6K$QH-#"-$^iJcoCXN-erJ?/3_ck`Y>&>qVX2Pmp-r)H\eps?"HOeOK@Q_&\aBKV:p:Y2;k9qq$K4%20oZ&qUa9nDL753^el`=@-V[4])KI)J6%iSCibra)dKgu''c0u?o;7nRQnaeE8Ubm5fs!Ybo+ErUF*+S;Pa8"B8kV-4=!gnu#WtT7[(;b]HF]5;:p#?:Jk1\g[boe9l;If=`7H5ANrB*ZT5cJOj3u8[Jq<ba/B_K7l@9H9/=()-`@dB++(ChFUtfL,AVNL%dn<LCWu`MN@/E[V&JTl45dkl(%)`)N,H#_!Wa8*UiJLQ5V+sOSV2g^I`L[W&'/:;7N!#%\DS918!o)(;.T&2&08mU56N~>endstream
endobj
10 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2700
>>
stream
Gb!TY>C5)6(5D;L/(R^EAl!An2GC:[8QquO23?MgU,TrT5uZJ-82^eSIP8e[aFUp>nhcgm:BRj*Q9MGDY(Q+lNB`I!*G5@B@lQSn^i<eQK&^'!N6gEm]_BaDZQ/3uQL@3%"]c2o8+;IScH,6Vo3pC$fR<D>qBC.a#Hj,5<WM.g*)DV[4E[?q&#<Sn[aPU)I!#P+LG.JdlNMMRfH4*^+_1oJi0Y9b/2EZ\E0="":9".#`dbo$htkcnnRm8q5O^8N`A_B=QL"3K-NqUKs1n3k^[$$DVs!Bfl","hX7EjuMf>'jm(9]A_\^o6!T,o^`B,#+<YP<,E'g.Yde-X=Y1Dsm]rpaT(&3e&4eC/$1Ta]e<i_hErhq)?bub!V)UEH?`KX6-?'0F7G-m^RrM<_9ZhVd.[@F2P&_Has03Tf\47`PApV/[bA7gSFg-0Cq7aA[rFffs[N8<im':,![T-c7eKU4J;Glj.l"HOu8+pA$H/gc6=asepeOfB,+a@)jITq'B,>_!M%;79%3p,pOTFifX]RH?i0@^T0-n@=jGaQ/XXH2pR5Ac5@7@!O5Y.V0?]Q))3[Wi1MKM@<+W9)M+5r"e[eXn"p:h7'lp)HVcAPu:Qp:=W$oP3#W`86un2N+Rp&.h*k(16I2mW01bkR?4)-#SRB,k%qYAmaC/[5GE-7oN(,Lj##U"g9&S%&pi%"BMS,cf%=Cc,<60f^RW5;Dae.4-V,6Rd7VDkPIR7/[3E_]`![DZ3G3=^O@.@IICcN25=%O0g.BtgnVF5e5YnmN)lNjp76[UW+n;[$AOPQ$#>5?SgmKt+iB1u*3T9CiV-aq,TlPj_$&_H89*gfJO8T+@N62Rh(s<2^4OXD2G_p)Lk]d<Nk*SOV5tias;+8><MR@54D^A*(MdDN"+#/_l$)_bl%9n9E=J?!N:@BRG&p/bm"3W!gE/r<^qW3[b')*B0?m85aB3KI<#^a/oQAnSAc<CXmcr#<Gm/nA]r_p)='EobJ!i7*2"'Nd#nX%1QZa)_M%a^_hSgNXar_q<:<$f9D4KlP:K,X86$dg+hkCD9>3[Mrt,/hE=e5;JV:"qMq]A'=D"g:IVCE5h8I]nru?Or0)"cheZ^u9Sm#EHP%_m3sC-P^7`%(CF*EGO<>4*jQX_!"<:($"C2_]YHq-C<<f@:n@j/!f,:SBb5qaZYji_m)b:pbBl]M4_[HW=9u!ceX#">Y-tHQ9Ii,N,fGE+-^@hU&M1]X>@bf>bD#0*7"#-:Cq)_/e!6^+^D^Lg*%Z@DJ\!<@>BVWFaa)Ka^@5GS'hXaGZd,Dl[`XAo]:'7K!61Xe8rS5\*9`Ck)uWE1KHP?>tOQF`iE,l]I%)l*aZk*rPQ#eN;sc;rF+$+gV)C$cO^imU(Z@((d7[phH!JMY5O6N*mitT$8*q9R["JTBhKE%ml"EGFG2t,3c6V/R&J\+T`=rlSqgF+iQrM,I?TYo5e_NHL#fu(I6!JR,.?JK_6@3V`D"@kMF@a'lX>[0Y9s,76S,s!Zq^M!3\umq:*qRTL9g/0kDqIQJ`u5<Y;;W;QFB20h.X5^N'sF=1O[O]bpM9G1UZAn`Xm4nQE!+3IC4nK]n(XtT;0Sf:*NQ"*&'8`81@Fe@B/6rTp?tUENlOK:?RH04C6N[4N$)RpL*=V8iW(^k`c1uc]*T?(J/BHmY,SPdFuX&fTA#0e9e&em:HX53YbR1=!cR(B0o9.f'$(pSFZE)d]f^RER5%K-Dcfnq1iRY[cis6gK"XZ2pcA('br'#B'm0VRT=)d+!aF_[Xm=Y0[48kUQkn#02S<i`a?,(dqS4En7A6R>0/42LALIFX*36eY+GNZ:"MF<I`-B$+eMH`4OHPI,Z\ssUZ^=>_#OEM.6Zht]<EmGY`>-46>;ohfPdEI)g4&f[HlUZiXTFX<?VQ7%;a(ec[G?uI&\[email protected]#:1nFA5_ca5mB*=Gp:!pC24T:Gm&GOg@qV;oiXTr6Z)>?irY!E)W-oj&;5*2JJmEODXr=f"^Ds3n<UU$s-0'2.m&0Ed#U^A!i03K]jEp:JNmH!3s6_X%*T.W03AY4?]if%"&CrIPGF0?(5qEoDHF70Y;o5N+Wfq$g.H=oa'1T9Sd(U-V4Nff;ESN9UfP(6Y"`W?gd03D)<Sn<#mkcc.]V^I00r3isP)b"5)qg%VCGV4jf&h/\ir@5c$;I2Ap;7I*<kL'g)Y0@cNA4Rok]aqfkCXR(chBKT=N_cMrQ0/>Aq*%&7bJND\!q7[VJ?"BE9@NXWek3n61;FB])HbY$WAQ.$+ahnGPTn39HN`+^PP)9.P-Pc>9@UkE`=b.MXfkXK5`(F1BgO.Dcf;<Qua;<R06^PH^-7eGNg2VG[TXW9K9j.=^mFR2b_D[-11nFE;j:;O@abrfhY2G]gmmCB>n4kN!8U8tF;hSB1B1c23,]:RYo<lMt_HZtLZ]d;sRY?iD;Bpd-II4Opef!c[i8sa4Y((<Ts<Oja=hDI60d*W)MF,Jr*`6u@t,%_*RXFQ?$A$dh(3;+:>JPheD4RBsVVc0P?mo[aCF.IV0CY?:dBnfpCM3o?,`<k[-8Sb`go3^76T!-T3C=%2SJq$`r1_e57\J/\!k+%fBk1\TRriS>9os9h;-dp<%.K>momU.A@qn!RHCQI(s4RMaf;bpmST@?sJp?t]fh'OLj&?3JaWK-FOh6,5^Z/!c-rh5)<.a>X+h+L1FmscnqLjf~>endstream
endobj
xref
0 11
0000000000 65535 f
0000000061 00000 n
0000000102 00000 n
0000000209 00000 n
0000000321 00000 n
0000000514 00000 n
0000000708 00000 n
0000000776 00000 n
0000001056 00000 n
0000001121 00000 n
0000004086 00000 n
trailer
<<
/ID
[<451d734656bfda21b00c95ac21a36c22><451d734656bfda21b00c95ac21a36c22>]
% ReportLab generated PDF document -- digest (opensource)
/Info 7 0 R
/Root 6 0 R
/Size 11
>>
startxref
6878
%%EOF
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

+6
View File
@@ -0,0 +1,6 @@
{
"schemaVersion": 1,
"label": "Ced's NOC",
"message": "Healthy | 8/8 online | 0 offline",
"color": "brightgreen"
}
+321
View File
@@ -0,0 +1,321 @@
{
"nocName": "Ced's NOC",
"status": "1 System(s) Degraded",
"lastUpdated": "2026-05-04T15:40:01Z",
"summary": {
"nodes": "12+ Pi",
"services": "27/28",
"vlans": 4,
"edgeSystems": 2
},
"systems": [
{
"name": "Proxmox \u2014 BigWorld",
"type": "Proxmox VE Hypervisor",
"layer": "Infrastructure",
"label": "Compute",
"address": "10.10.30.250",
"status": "Online",
"severity": "Healthy",
"latency": "0.2ms",
"lastCheck": "2026-05-04 15:40 UTC"
},
{
"name": "Proxmox \u2014 Biggie",
"type": "Proxmox VE Hypervisor",
"layer": "Infrastructure",
"label": "Compute",
"address": "10.10.30.192",
"status": "Online",
"severity": "Healthy",
"latency": "0.1ms",
"lastCheck": "2026-05-04 15:40 UTC"
},
{
"name": "Proxmox \u2014 Snoop",
"type": "Proxmox VE Hypervisor",
"layer": "Infrastructure",
"label": "Compute",
"address": "10.10.30.153",
"status": "Online",
"severity": "Healthy",
"latency": "0.2ms",
"lastCheck": "2026-05-04 15:40 UTC"
},
{
"name": "Proxmox \u2014 TooShort",
"type": "Proxmox VE Hypervisor",
"layer": "Infrastructure",
"label": "Compute",
"address": "10.10.30.120",
"status": "Online",
"severity": "Healthy",
"latency": "0.7ms",
"lastCheck": "2026-05-04 15:40 UTC"
},
{
"name": "Proxmox \u2014 Tupac",
"type": "Proxmox VE Hypervisor",
"layer": "Infrastructure",
"label": "Compute",
"address": "10.10.30.74",
"status": "Online",
"severity": "Healthy",
"latency": "0.5ms",
"lastCheck": "2026-05-04 15:40 UTC"
},
{
"name": "Proxmox \u2014 DrDre",
"type": "Proxmox VE Hypervisor",
"layer": "Infrastructure",
"label": "Compute",
"address": "10.10.30.227",
"status": "Online",
"severity": "Healthy",
"latency": "0.3ms",
"lastCheck": "2026-05-04 15:40 UTC"
},
{
"name": "K3s Control \u2014 django-1",
"type": "K3s Control Plane",
"layer": "Orchestration",
"label": "K3s",
"address": "10.10.30.72",
"status": "Online",
"severity": "Healthy",
"latency": "0.2ms",
"lastCheck": "2026-05-04 15:40 UTC"
},
{
"name": "K3s Control \u2014 django-2",
"type": "K3s Control Plane",
"layer": "Orchestration",
"label": "K3s",
"address": "10.10.30.245",
"status": "Online",
"severity": "Healthy",
"latency": "0.2ms",
"lastCheck": "2026-05-04 15:40 UTC"
},
{
"name": "K3s Control \u2014 django-3",
"type": "K3s Control Plane",
"layer": "Orchestration",
"label": "K3s",
"address": "10.10.30.128",
"status": "Online",
"severity": "Healthy",
"latency": "0.2ms",
"lastCheck": "2026-05-04 15:40 UTC"
},
{
"name": "K3s Ingress \u2014 node-1",
"type": "K3s Worker / Ingress",
"layer": "Orchestration",
"label": "K3s",
"address": "10.10.30.219",
"status": "Online",
"severity": "Healthy",
"latency": "0.2ms",
"lastCheck": "2026-05-04 15:40 UTC"
},
{
"name": "K3s Ingress \u2014 node-2",
"type": "K3s Worker / Ingress",
"layer": "Orchestration",
"label": "K3s",
"address": "10.10.30.134",
"status": "Online",
"severity": "Healthy",
"latency": "0.2ms",
"lastCheck": "2026-05-04 15:40 UTC"
},
{
"name": "K3s Ingress \u2014 node-3",
"type": "K3s Worker / Ingress",
"layer": "Orchestration",
"label": "K3s",
"address": "10.10.222",
"status": "Offline",
"severity": "Critical",
"latency": "N/A",
"lastCheck": "2026-05-04 15:40 UTC"
},
{
"name": "K3s Data \u2014 node-4",
"type": "K3s Worker / Data",
"layer": "Orchestration",
"label": "K3s",
"address": "10.10.30.126",
"status": "Online",
"severity": "Healthy",
"latency": "0.3ms",
"lastCheck": "2026-05-04 15:40 UTC"
},
{
"name": "K3s Data \u2014 node-5",
"type": "K3s Worker / Data",
"layer": "Orchestration",
"label": "K3s",
"address": "10.10.30.239",
"status": "Online",
"severity": "Healthy",
"latency": "0.4ms",
"lastCheck": "2026-05-04 15:40 UTC"
},
{
"name": "K3s Data \u2014 node-6",
"type": "K3s Worker / Data",
"layer": "Orchestration",
"label": "K3s",
"address": "10.10.30.208",
"status": "Online",
"severity": "Healthy",
"latency": "0.3ms",
"lastCheck": "2026-05-04 15:40 UTC"
},
{
"name": "K3s Monitor \u2014 node-7",
"type": "K3s Worker / Monitoring",
"layer": "Orchestration",
"label": "K3s",
"address": "10.10.30.198",
"status": "Online",
"severity": "Healthy",
"latency": "0.3ms",
"lastCheck": "2026-05-04 15:40 UTC"
},
{
"name": "K3s Monitor \u2014 node-8",
"type": "K3s Worker / Monitoring",
"layer": "Orchestration",
"label": "K3s",
"address": "10.10.30.216",
"status": "Online",
"severity": "Healthy",
"latency": "0.2ms",
"lastCheck": "2026-05-04 15:40 UTC"
},
{
"name": "K3s Monitor \u2014 node-9",
"type": "K3s Worker / Monitoring",
"layer": "Orchestration",
"label": "K3s",
"address": "10.10.30.29",
"status": "Online",
"severity": "Healthy",
"latency": "0.4ms",
"lastCheck": "2026-05-04 15:40 UTC"
},
{
"name": "TrueNAS",
"type": "Network Attached Storage",
"layer": "Infrastructure",
"label": "Storage",
"address": "10.10.30.143",
"status": "Online",
"severity": "Healthy",
"latency": "0.6ms",
"lastCheck": "2026-05-04 15:40 UTC"
},
{
"name": "Nginx Proxy Manager",
"type": "Reverse Proxy",
"layer": "Networking",
"label": "Access",
"address": "10.10.30.210",
"status": "Online",
"severity": "Healthy",
"latency": "0.3ms",
"lastCheck": "2026-05-04 15:40 UTC"
},
{
"name": "Prometheus",
"type": "Metrics Collection",
"layer": "Monitoring",
"label": "Observability",
"address": "10.10.30.140",
"status": "Online",
"severity": "Healthy",
"latency": "0.2ms",
"lastCheck": "2026-05-04 15:40 UTC"
},
{
"name": "Grafana",
"type": "Metrics Dashboard",
"layer": "Monitoring",
"label": "Observability",
"address": "10.10.30.68",
"status": "Online",
"severity": "Healthy",
"latency": "0.3ms",
"lastCheck": "2026-05-04 15:40 UTC"
},
{
"name": "Uptime Kuma",
"type": "Service Monitor",
"layer": "Monitoring",
"label": "Observability",
"address": "10.10.30.14",
"status": "Online",
"severity": "Healthy",
"latency": "0.3ms",
"lastCheck": "2026-05-04 15:40 UTC"
},
{
"name": "Dashy",
"type": "HomeLab Dashboard",
"layer": "Services",
"label": "Dashboard",
"address": "10.10.30.61",
"status": "Online",
"severity": "Healthy",
"latency": "0.3ms",
"lastCheck": "2026-05-04 15:40 UTC"
},
{
"name": "Home Assistant",
"type": "Home Automation",
"layer": "Services",
"label": "Automation",
"address": "10.10.30.104",
"status": "Online",
"severity": "Healthy",
"latency": "0.6ms",
"lastCheck": "2026-05-04 15:40 UTC"
},
{
"name": "PrimeStation",
"type": "Media / Game Server",
"layer": "Services",
"label": "Media",
"address": "10.10.30.233",
"status": "Online",
"severity": "Healthy",
"latency": "0.3ms",
"lastCheck": "2026-05-04 15:40 UTC"
},
{
"name": "APRS iGate \u2014 Home",
"type": "RF Edge / APRS-IS Gateway",
"layer": "Edge",
"label": "RF",
"address": "10.10.30.129",
"status": "Online",
"severity": "Healthy",
"latency": "3.7ms",
"lastCheck": "2026-05-04 15:40 UTC"
},
{
"name": "APRS iGate \u2014 Mobile",
"type": "RF Edge / Mobile Node",
"layer": "Edge",
"label": "RF",
"address": "10.10.30.35",
"status": "Online",
"severity": "Healthy",
"latency": "47.2ms",
"lastCheck": "2026-05-04 15:40 UTC"
}
]
}
+436 -156
View File
@@ -8,22 +8,54 @@
<meta
name="description"
content="Chase Dumphord portfolio - digital systems, infrastructure, networking, automation, homelab engineering, and real-world technical projects."
content="Chase Dumphord — digital systems builder focused on infrastructure, Linux, K3s, Proxmox, APRS RF edge systems, and real-world technical problem solving."
/>
<!-- Open Graph for LinkedIn / Discord sharing -->
<meta property="og:title" content="Chase Dumphord | Digital Systems & Infrastructure" />
<meta property="og:description" content="Hands-on systems builder. Proxmox • K3s • APRS • HomeLab. Based in Oxford, MS." />
<meta property="og:type" content="website" />
<meta property="og:url" content="https://chasedumphord.com" />
<!-- ── Favicon set (from ced-logo-pack) ── -->
<link rel="icon" type="image/png" sizes="32x32" href="assets/favicons/favicon-32x32.png" />
<link rel="icon" type="image/png" sizes="16x16" href="assets/favicons/favicon-16x16.png" />
<link rel="icon" type="image/png" sizes="192x192" href="assets/favicons/favicon-192x192.png" />
<link rel="apple-touch-icon" sizes="512x512" href="assets/favicons/favicon-512x512.png" />
<link rel="shortcut icon" href="assets/favicons/favicon.ico" />
<!-- ── Sitemap hint for crawlers ── -->
<link rel="sitemap" type="application/xml" href="/sitemap.xml" />
<!-- ── Search engine indexing ── -->
<meta name="robots" content="index, follow" />
<meta name="author" content="Chase Dumphord" />
<!-- ── Social verification (rel=me) ── -->
<link rel="me" href="https://www.linkedin.com/in/chase-dumphord/" />
<link rel="me" href="https://github.com/ced4568" />
<!-- Fonts: JetBrains Mono for terminal/code feel, Syne for headings -->
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;700&family=Syne:wght@700;800&family=DM+Sans:wght@400;500;700&display=swap" rel="stylesheet" />
<link rel="stylesheet" href="style.css" />
</head>
<body>
<!-- ═══════════════════════════════ NAV ═══════════════════════════════ -->
<header class="site-header">
<div class="container nav">
<a href="#top" class="logo">Chase Dumphord</a>
<a href="#top" class="logo">Ced<span class="logo-cursor">_</span></a>
<nav>
<ul class="nav-links">
<li><a href="#snapshot">Snapshot</a></li>
<li><a href="#noc">NOC</a></li>
<li><a href="#about">About</a></li>
<li><a href="#projects">Projects</a></li>
<li><a href="#stack">Stack</a></li>
<li><a href="#resume">Resume</a></li>
<li><a href="#contact">Contact</a></li>
</ul>
@@ -32,74 +64,115 @@
</header>
<main id="top">
<!-- ═══════════════════════════════ HERO ═══════════════════════════════ -->
<section class="hero">
<div class="container hero-grid">
<div class="hero-text">
<p class="eyebrow">Digital Systems • Infrastructure • Networking • Automation • Edge Systems</p>
<h1>I build practical systems that connect hardware, networks, software, and operations.</h1>
<div class="hero-text">
<p class="eyebrow">
<span class="eyebrow-dot"></span>
Digital Systems • Infrastructure • Networking • Automation • Edge Systems
</p>
<h1>I build systems that <span class="accent-word">connect</span> hardware, networks, and operations.</h1>
<p class="lead">
I’m Chase Dumphord — a hands-on systems builder focused on digital infrastructure,
Linux systems, homelab engineering, Raspberry Pi deployments, networking, automation,
and real-world technical problem solving.
Chase Dumphord — infrastructure builder running Proxmox, K3s, TrueNAS, and APRS RF edge systems out of Oxford, MS.
I build things that actually work, then document how they work.
</p>
<div class="hero-actions">
<a class="btn btn-primary" href="#projects">View Projects</a>
<a class="btn btn-secondary" href="#contact">Contact Me</a>
<a class="btn btn-secondary" href="https://noc.chasedumphord.com" target="_blank" rel="noopener noreferrer">
<span class="btn-dot"></span> Live NOC
</a>
<a class="btn btn-ghost" href="#contact">Contact</a>
</div>
<ul class="quick-facts">
<li>Oxford, MS</li>
<li>📍 Oxford, MS</li>
<li>
GitHub:
<a href="https://github.com/ced4568" target="_blank" rel="noopener noreferrer">ced4568</a>
<a href="https://github.com/ced4568" target="_blank" rel="noopener noreferrer">
⌥ github/ced4568
</a>
</li>
<li>
Email:
<a href="mailto:[email protected]">[email protected]</a>
<a href="mailto:[email protected]">✉ [email protected]</a>
</li>
</ul>
<!-- LinkedIn badge — prominent social proof row -->
<div class="hero-badges">
<a
href="https://www.linkedin.com/in/chase-dumphord/"
target="_blank"
rel="noopener noreferrer"
class="badge-link linkedin-badge"
>
<svg class="badge-icon" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true">
<path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 01-2.063-2.065 2.064 2.064 0 112.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/>
</svg>
Connect on LinkedIn
</a>
<a
href="https://github.com/ced4568"
target="_blank"
rel="noopener noreferrer"
class="badge-link github-badge"
>
<svg class="badge-icon" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true">
<path d="M12 0C5.374 0 0 5.373 0 12c0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23A11.509 11.509 0 0112 5.803c1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576C20.566 21.797 24 17.3 24 12c0-6.627-5.373-12-12-12z"/>
</svg>
github/ced4568
</a>
</div>
</div>
<div class="hero-panel">
<img
src="assets/images/ChaseD_headshot.jpg"
alt="Headshot of Chase Dumphord"
class="hero-image"
/>
<div class="hero-image-card">
<img
src="assets/images/ChaseD_headshot.jpg"
alt="Chase Dumphord"
class="hero-image"
/>
</div>
<div class="terminal-card">
<div class="terminal-top">
<span></span>
<span></span>
<span></span>
<span class="dot red"></span>
<span class="dot yellow"></span>
<span class="dot green"></span>
<span class="terminal-title">ced's@homelab ~ $</span>
</div>
<pre><code><span class="t-prompt">ced's@homelab:~$</span> whoami
<span class="t-val">systems_builder</span>
<pre><code>$ whoami
systems_builder
<span class="t-prompt">ced's@homelab:~$</span> uptime
<span class="t-val">12+ nodes • 10+ services • always_on</span>
$ focus
infrastructure
<span class="t-prompt">ced's@homelab:~$</span> cat focus.txt
<span class="t-val">infrastructure
networking
automation
edge_systems
rf_edge_systems</span>
$ status
building_real_systems</code></pre>
<span class="t-prompt">ced's@homelab:~$</span> systemctl status life
<span class="t-val">● building_real_systems.service</span>
<span class="t-muted"> Active: active (running)</span><span class="t-cursor">▌</span></code></pre>
</div>
</div>
</div>
</section>
<!-- ═══════════════════════════════ SNAPSHOT ═══════════════════════════════ -->
<section id="snapshot" class="section section-alt">
<div class="container">
<div class="section-heading">
<p class="section-label">Environment</p>
<p class="section-label">// environment</p>
<h2>Systems Snapshot</h2>
<p class="section-intro">
A quick look at the infrastructure and systems I’m actively building and documenting.
Live infrastructure I'm actively running, building, and documenting.
</p>
</div>
@@ -107,21 +180,18 @@ building_real_systems</code></pre>
<div class="stat-card">
<h3>12+</h3>
<p>Nodes</p>
<span>K3s cluster environment</span>
<span>K3s cluster • Raspberry Pi</span>
</div>
<div class="stat-card">
<h3>10+</h3>
<p>Services</p>
<span>Self-hosted stack</span>
</div>
<div class="stat-card">
<h3>4</h3>
<p>VLANs</p>
<span>Segmented network design</span>
<span>Segmented UniFi network</span>
</div>
<div class="stat-card">
<h3>2</h3>
<p>iGate Nodes</p>
@@ -131,37 +201,103 @@ building_real_systems</code></pre>
</div>
</section>
<!-- ═══════════════════════════════ NOC ═══════════════════════════════ -->
<section id="noc" class="section noc-dashboard">
<div class="container">
<div class="section-heading">
<p class="section-label">// ced's noc</p>
<h2>Live Systems Overview</h2>
<p class="section-intro">
Real infrastructure inventory from Ced's HomeLab, K3s cluster, and APRS edge systems.
Data refreshes every 30s.
</p>
</div>
<div class="noc-command-bar">
<span class="status-dot" id="noc-dot"></span>
<span id="noc-status-text">Connecting to NOC feed...</span>
<span class="noc-refresh-badge" id="noc-refresh-badge"></span>
</div>
<p class="noc-proof">
Proxmox • K3s • TrueNAS • VLAN segmentation • APRS RF Edge Systems
</p>
<div class="noc-metrics-grid">
<div class="noc-metric">
<h3 id="metric-nodes">--</h3>
<p>Infrastructure Nodes</p>
</div>
<div class="noc-metric">
<h3 id="metric-services">--</h3>
<p>Services Online</p>
</div>
<div class="noc-metric">
<h3 id="metric-vlans">--</h3>
<p>Network Segments</p>
</div>
<div class="noc-metric">
<h3 id="metric-edge">--</h3>
<p>Edge Systems</p>
</div>
</div>
<div class="noc-alert-panel">
<div class="noc-alert-header">
<h3>🚨 Alert Panel</h3>
<span>Top 3 System Notes</span>
</div>
<div id="noc-alert-list" class="noc-alert-list">
<p class="noc-loading">Awaiting data feed...</p>
</div>
</div>
<div id="noc-system-grid" class="noc-system-grid"></div>
<!-- Fallback shown when data can't load -->
<div id="noc-fallback" class="noc-fallback" style="display:none;">
<p class="noc-fallback-msg">
📡 NOC feed unavailable from this context — systems run locally.<br/>
<a href="https://noc.chasedumphord.com" target="_blank" rel="noopener noreferrer">
View the live NOC dashboard →
</a>
</p>
</div>
</div>
</section>
<!-- ═══════════════════════════════ ABOUT ═══════════════════════════════ -->
<section id="about" class="section">
<div class="container">
<div class="section-heading">
<p class="section-label">About</p>
<p class="section-label">// about</p>
<h2>Hands-on systems builder with a digital infrastructure mindset</h2>
</div>
<div class="content-grid">
<div class="card">
<p>
I’m a technical professional focused on digital systems, infrastructure, networking,
automation, and hands-on system integration. I enjoy building systems that are practical,
reliable, and well documented — from homelab services and dashboards to Raspberry Pi
deployments, APRS iGates, and troubleshooting workflows.
I'm a technical professional focused on digital systems, infrastructure, networking,
automation, and hands-on system integration. I build things that are practical,
reliable, and well-documented — from homelab services and live dashboards to Raspberry Pi
deployments, APRS iGates, and complex troubleshooting workflows.
</p>
<p>
My background blends field engineering, industrial technology, software-oriented thinking,
and infrastructure problem solving. I’m especially interested in projects that connect the
physical and digital worlds through monitoring, networking, automation, and resilient design.
My background blends field engineering, industrial technology, and infrastructure
problem solving. Increasingly I'm integrating AI tooling — using LLMs for system
documentation, automated diagnostics, and workflow acceleration — as part of how
modern infrastructure gets built and maintained.
</p>
</div>
<div class="card">
<h3>Core Focus Areas</h3>
<ul class="clean-list">
<li>Digital systems and infrastructure</li>
<li>Digital systems and infrastructure engineering</li>
<li>Linux systems and service management</li>
<li>Networking, VLANs, failover, and connectivity troubleshooting</li>
<li>Raspberry Pi and edge-device deployments</li>
<li>AI-assisted automation, documentation, and diagnostic workflows</li>
<li>Documentation, process building, and reproducible project design</li>
</ul>
</div>
@@ -169,240 +305,384 @@ building_real_systems</code></pre>
</div>
</section>
<!-- ═══════════════════════════════ PROJECTS ═══════════════════════════════ -->
<section id="projects" class="section section-alt">
<div class="container">
<div class="section-heading">
<p class="section-label">Projects</p>
<h2>🔧 Infrastructure & Systems Projects</h2>
<p class="section-intro">
These projects are built around real systems, networking, Linux services, edge devices,
and practical documentation.
</p>
<p class="section-label">// projects</p>
<h2>Infrastructure & Systems Projects</h2>
<p class="section-intro">Built on real systems. Not demos, not tutorials — running infrastructure.</p>
</div>
<div class="projects-grid">
<article class="project-card featured-project">
<div class="project-top">
<h3>🧠 Ced’s HomeLab Infrastructure</h3>
<h3>Ced's HomeLab Infrastructure</h3>
<span class="status-pill">Flagship</span>
</div>
<p class="tags">Infrastructure • Networking • Virtualization • Monitoring • Self-Hosting</p>
<p class="project-impact">
Designed as a practical infrastructure environment for networking, monitoring,
service hosting, and documentation.
Full homelab environment built for real network segmentation, service hosting, and architecture documentation.
</p>
<p>
Personal infrastructure lab focused on network segmentation, virtualization,
self-hosted services, monitoring, and architecture documentation.
</p>
<ul class="clean-list">
<li>VLAN segmentation and network design</li>
<li>Proxmox virtualization</li>
<li>Self-hosted services and monitoring</li>
<li>System architecture documentation</li>
<li>Proxmox VE virtualization platform</li>
<li>VLAN segmentation via UniFi (Main / IoT / HomeLab / Guest)</li>
<li>Self-hosted services behind Nginx Proxy Manager + Cloudflare Tunnels</li>
<li>Uptime Kuma + Grafana monitoring stack</li>
</ul>
<a href="https://github.com/ced4568/ceds-homelab" target="_blank" rel="noopener noreferrer" class="project-link">
View Project →
View on GitHub →
</a>
</article>
<article class="project-card">
<div class="project-top">
<h3>☸️ K3s Kubernetes Cluster</h3>
<h3>K3s Kubernetes Cluster</h3>
<span class="status-pill">Infrastructure</span>
</div>
<p class="tags">Kubernetes • Containers • Linux • Infrastructure • Automation</p>
<p class="tags">Kubernetes • Containers • Linux • Automation</p>
<p class="project-impact">
Built to simulate distributed infrastructure, container orchestration, and scalable service deployment.
12-node K3s cluster on Raspberry Pi built to simulate distributed infrastructure and container orchestration at scale.
</p>
<p>
Multi-node K3s cluster built for container orchestration, service deployment,
and infrastructure experimentation.
</p>
<ul class="clean-list">
<li>Multi-node cluster setup</li>
<li>Containerized workloads</li>
<li>Service deployment</li>
<li>Infrastructure automation</li>
<li>Multi-node cluster setup and management</li>
<li>Containerized workload deployment</li>
<li>Infrastructure automation via manifest-driven configuration</li>
</ul>
<a href="https://github.com/ced4568/ced-k3s-homelab" target="_blank" rel="noopener noreferrer" class="project-link">
View Project →
View on GitHub →
</a>
</article>
<article class="project-card">
<div class="project-top">
<h3>📡 APRS iGate System</h3>
<h3>APRS iGate System</h3>
<span class="status-pill">Edge System</span>
</div>
<p class="tags">RF • Linux • Raspberry Pi • Networking • APRS-IS • Edge Systems</p>
<p class="tags">RF • Linux • Raspberry Pi • APRS-IS • Edge Systems</p>
<p class="project-impact">
Bridges RF communication into IP-based infrastructure using Linux, Direwolf, and APRS-IS.
Operational dual-node RF-to-internet gateway. Decodes real beacon packets and uplinks live to aprs.fi.
</p>
<p>
Operational dual-node APRS iGate system built with Raspberry Pi, Direwolf, APRS-IS,
RF radios, HomeLab network integration, and planned mobile GPS support.
</p>
<ul class="clean-list">
<li>RF packet decoding with Direwolf</li>
<li>Direwolf APRS TNC with tuned audio chain (target: 50–60 level)</li>
<li>APRS-IS uplink verified on aprs.fi</li>
<li>HomeLab WiFi + mobile hotspot failover</li>
<li>Mobile build includes ETH-USB-HUB-BOX expansion</li>
<li>Documented configs, architecture, and troubleshooting</li>
<li>Mobile build with ETH-USB-HUB-BOX expansion</li>
</ul>
<a href="https://github.com/ced4568/ceds-aprs-igate" target="_blank" rel="noopener noreferrer" class="project-link">
View Project →
View on GitHub →
</a>
</article>
</div>
</div>
</section>
<!-- ═══════════════════════════════ NOC ROADMAP ═══════════════════════════════ -->
<section class="section noc-section">
<div class="container">
<div class="section-heading">
<p class="section-label">Future Buildout</p>
<h2>📊 Ced’s NOC Vision</h2>
<p class="section-label">// noc roadmap</p>
<h2>Ced's NOC Vision</h2>
<p class="section-intro">
The long-term goal is to bring these systems together into a unified network operations view.
Staged monitoring and systems-visibility platform built on real infrastructure.
</p>
</div>
<div class="noc-grid">
<div class="noc-card">
<h3>Monitoring</h3>
<p>Grafana, Prometheus, Uptime Kuma, and service-level visibility.</p>
<div class="noc-card-badge done">✅ Live</div>
<h3>Portfolio NOC</h3>
<p>
JSON-driven dashboard showing real inventory, online/offline checks, service labels,
latency, and last-check timestamps.
</p>
</div>
<div class="noc-card">
<h3>Infrastructure</h3>
<p>HomeLab services, K3s nodes, VLANs, and self-hosted systems.</p>
<div class="noc-card-badge next">⚙️ Next</div>
<h3>Automated Data Updates</h3>
<p>
Scheduled local scripts will auto-refresh system status and push dashboard-ready
JSON on a cron interval — no manual updates.
</p>
</div>
<div class="noc-card">
<h3>Edge Systems</h3>
<p>APRS iGate nodes, Raspberry Pi devices, and field/mobile deployments.</p>
<div class="noc-card-badge future">📈 Future</div>
<h3>Grafana + Prometheus</h3>
<p>
Full observability stack for Proxmox, TrueNAS, K3s, Raspberry Pi nodes, Uptime Kuma,
and APRS edge systems with real-time metrics ingestion.
</p>
</div>
</div>
<!-- CTA to live NOC -->
<div class="noc-roadmap-cta">
<a
href="https://noc.chasedumphord.com"
target="_blank"
rel="noopener noreferrer"
class="btn btn-secondary"
>
<span class="btn-dot"></span> View Live NOC Dashboard
</a>
<span class="noc-cta-sub">noc.chasedumphord.com — live infrastructure visibility</span>
</div>
</div>
</section>
<!-- ═══════════════════════════════ TECH STACK ═══════════════════════════════ -->
<section id="stack" class="section section-alt">
<div class="container">
<div class="section-heading">
<p class="section-label">// tech stack</p>
<h2>Tools & Technologies</h2>
</div>
<div class="stack-groups">
<div class="stack-group">
<h4 class="stack-group-label">Infrastructure</h4>
<div class="stack-pills">
<span class="stack-pill">Proxmox VE</span>
<span class="stack-pill">K3s</span>
<span class="stack-pill">Docker</span>
<span class="stack-pill">TrueNAS</span>
<span class="stack-pill">Nginx Proxy Manager</span>
<span class="stack-pill">Cloudflare Tunnels</span>
</div>
</div>
<div class="stack-group">
<h4 class="stack-group-label">Monitoring & Observability</h4>
<div class="stack-pills">
<span class="stack-pill">Grafana</span>
<span class="stack-pill">Prometheus</span>
<span class="stack-pill">Uptime Kuma</span>
<span class="stack-pill">Custom NOC Dashboard</span>
</div>
</div>
<div class="stack-group">
<h4 class="stack-group-label">Networking</h4>
<div class="stack-pills">
<span class="stack-pill">UniFi</span>
<span class="stack-pill">VLAN Segmentation</span>
<span class="stack-pill">pfSense</span>
<span class="stack-pill">Cloudflare DNS</span>
</div>
</div>
<div class="stack-group">
<h4 class="stack-group-label">RF & Edge</h4>
<div class="stack-pills">
<span class="stack-pill">Direwolf</span>
<span class="stack-pill">APRS-IS</span>
<span class="stack-pill">Raspberry Pi</span>
<span class="stack-pill">RTL-SDR</span>
</div>
</div>
<div class="stack-group">
<h4 class="stack-group-label">Development</h4>
<div class="stack-pills">
<span class="stack-pill">Python</span>
<span class="stack-pill">Bash</span>
<span class="stack-pill">JavaScript</span>
<span class="stack-pill">HTML / CSS</span>
<span class="stack-pill">Git</span>
<span class="stack-pill">Linux</span>
</div>
</div>
<div class="stack-group">
<h4 class="stack-group-label">AI & Automation</h4>
<div class="stack-pills">
<span class="stack-pill">Claude (Anthropic)</span>
<span class="stack-pill">ChatGPT</span>
<span class="stack-pill">LLM-assisted Documentation</span>
<span class="stack-pill">AI-driven Diagnostics</span>
<span class="stack-pill">Prompt Engineering</span>
</div>
</div>
</div>
</div>
</section>
<!-- ═══════════════════════════════ RESUME ═══════════════════════════════ -->
<section id="resume" class="section">
<div class="container">
<div class="section-heading">
<p class="section-label">Resume Snapshot</p>
<p class="section-label">// resume snapshot</p>
<h2>Technical experience that bridges field work and digital systems</h2>
</div>
<div class="content-grid">
<div class="card">
<h3>What I Bring</h3>
<div class="resume-grid">
<div class="card resume-card">
<h3>What I Bring</h3>
<ul class="clean-list">
<li>Industrial and field-service technical experience</li>
<li>Linux, Raspberry Pi, and systems administration work</li>
<li>Networking, connectivity, and troubleshooting depth</li>
<li>Documentation, process building, and reproducible project design</li>
<li>Industrial and field-service technical background — hands-on problem solving under real constraints</li>
<li>Linux systems administration — service management, troubleshooting, automation</li>
<li>Networking depth — VLANs, DNS, reverse proxy, firewall config, failover design</li>
<li>Infrastructure-as-documentation mindset — everything I build gets written up</li>
<li>Homelab → production thinking — I build lab environments that mirror real-world system design</li>
</ul>
</div>
<div class="card">
<h3>Current Direction</h3>
<div class="card resume-card">
<h3>Target Roles</h3>
<ul class="clean-list">
<li>Systems / Infrastructure Engineer</li>
<li>NOC Technician / Network Operations</li>
<li>Linux Systems Administrator</li>
<li>Technical Operations / IT Infrastructure</li>
<li>Edge Systems / Field Technical Roles</li>
</ul>
<p>
I’m positioning myself around digital systems, infrastructure, networking,
automation, and technical operations — especially roles where hands-on problem
solving and system integration matter.
</p>
<p>
More detailed resume content will be added here as the portfolio grows.
</p>
<div class="resume-note">
<p>
Currently positioning around digital systems, infrastructure, and technical operations —
especially roles where hands-on problem solving and system integration matter more than certifications.
</p>
</div>
</div>
<div class="card resume-card resume-card-full">
<h3>Currently Learning / Building Toward</h3>
<div class="learning-grid">
<div class="learning-item">
<span class="learning-icon">📈</span>
<span>Grafana + Prometheus full observability stack</span>
</div>
<div class="learning-item">
<span class="learning-icon">☸️</span>
<span>Kubernetes production patterns (GitOps, Helm, ArgoCD)</span>
</div>
<div class="learning-item">
<span class="learning-icon">🔐</span>
<span>Network security and zero-trust architecture</span>
</div>
<div class="learning-item">
<span class="learning-icon">📡</span>
<span>Mobile APRS iGate deployment</span>
</div>
</div>
</div>
<!-- Resume download CTA -->
<div class="resume-download-row">
<a
href="assets/ChaseD_Resume.pdf"
target="_blank"
rel="noopener noreferrer"
class="btn btn-primary"
download
>
↓ Download Resume (PDF)
</a>
<span class="resume-download-note">Updated 2025 • PDF format</span>
</div>
</div>
</div>
</section>
<!-- ═══════════════════════════════ GITHUB REPOS ═══════════════════════════════ -->
<section id="repos" class="section section-alt">
<div class="container">
<div class="section-heading">
<p class="section-label">// github</p>
<h2>Pinned Repositories</h2>
<p class="section-intro">
Active projects on GitHub — source code, configs, and documentation for everything I'm building.
</p>
</div>
<div id="github-repos" class="repos-grid">
<!-- Populated by script.js via GitHub API -->
<div class="repo-loading">
<span class="noc-loading">Fetching repositories...</span>
</div>
</div>
<div class="repos-footer">
<a
href="https://github.com/ced4568"
target="_blank"
rel="noopener noreferrer"
class="btn btn-ghost"
>
View all repositories on GitHub →
</a>
</div>
</div>
</section>
<!-- ═══════════════════════════════ PERSONAL ═══════════════════════════════ -->
<section class="section section-alt personal-section">
<div class="container personal-grid">
<div class="personal-image-wrap">
<img
src="assets/images/lakephotopinkpants.png"
alt="Chase Dumphord standing by a fence with a lake view in the background"
alt="Chase Dumphord"
class="personal-image"
/>
</div>
<div class="card">
<p class="section-label">Personal Note</p>
<p class="section-label">// personal</p>
<h2>Technical, curious, and always building</h2>
<p>
Outside of work, I enjoy electronics, self-hosting, coding, drones, radio, and
hands-on technical projects that push me to learn something useful. That curiosity
carries directly into the way I build and document systems.
Outside of work I'm into electronics, self-hosting, coding, drones, ham radio, and
hands-on projects that force me to learn something real. Ball pythons and dogs round
out the home lab. That curiosity carries directly into how I build and document systems.
</p>
</div>
</div>
</section>
<!-- ═══════════════════════════════ CONTACT ═══════════════════════════════ -->
<section id="contact" class="section">
<div class="container">
<div class="section-heading">
<p class="section-label">Contact</p>
<h2>Let’s connect</h2>
<p class="section-label">// contact</p>
<h2>Let's connect</h2>
</div>
<div class="contact-grid">
<div class="card">
<h3>Contact Info</h3>
<h3>Reach Out</h3>
<p>Email: <a href="mailto:[email protected]">[email protected]</a></p>
<p>Phone: <a href="tel:+16622142231">662-214-2231</a></p>
<p>Location: Oxford, MS</p>
<p>
GitHub:
<a href="https://github.com/ced4568" target="_blank" rel="noopener noreferrer">github.com/ced4568</a>
</p>
<p>GitHub: <a href="https://github.com/ced4568" target="_blank" rel="noopener noreferrer">github.com/ced4568</a></p>
<p>LinkedIn: <a href="https://www.linkedin.com/in/chase-dumphord/" target="_blank" rel="noopener noreferrer">linkedin.com/in/chase-dumphord</a></p>
</div>
<div class="card">
<h3>What I’m Open To</h3>
<h3>Open To</h3>
<ul class="clean-list">
<li>Digital systems and infrastructure roles</li>
<li>Networking and technical operations work</li>
<li>Networking and technical operations</li>
<li>Automation and monitoring projects</li>
<li>Projects involving hardware + software integration</li>
<li>Hardware + software integration work</li>
</ul>
</div>
</div>
</div>
</section>
</main>
<!-- ═══════════════════════════════ FOOTER ═══════════════════════════════ -->
<footer class="site-footer">
<div class="container footer-content">
<p>© Chase Dumphord</p>
<a href="#top" class="back-to-top">Back to top ↑</a>
<p>© <span data-year></span> Chase Dumphord — <span class="footer-mono">systems_builder</span></p>
<a href="#top" class="back-to-top">↑ back to top</a>
</div>
</footer>
<script src="script.js"></script>
</body>
</html>
</html>
+445
View File
@@ -0,0 +1,445 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Ced's NOC | Live Systems Dashboard</title>
<meta
name="description"
content="Ced's NOC — live network operations center dashboard showing real-time infrastructure health, service status, and edge system monitoring."
/>
<!-- Open Graph -->
<meta property="og:title" content="Ced's NOC | Live Systems Dashboard" />
<meta property="og:description" content="Live infrastructure visibility — Proxmox, K3s, TrueNAS, APRS edge systems." />
<meta property="og:type" content="website" />
<meta property="og:url" content="https://noc.chasedumphord.com" />
<!-- Favicons (path up one level since we're in /noc/) -->
<link rel="icon" type="image/png" sizes="32x32" href="../assets/favicons/favicon-32x32.png" />
<link rel="icon" type="image/png" sizes="16x16" href="../assets/favicons/favicon-16x16.png" />
<link rel="icon" type="image/png" sizes="192x192" href="../assets/favicons/favicon-192x192.png" />
<link rel="apple-touch-icon" sizes="512x512" href="../assets/favicons/favicon-512x512.png" />
<link rel="shortcut icon" href="../assets/favicons/favicon.ico" />
<meta name="robots" content="index, follow" />
<meta name="author" content="Chase Dumphord" />
<!-- Fonts — same as main site -->
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;700&family=Syne:wght@700;800&family=DM+Sans:wght@400;500;700&display=swap" rel="stylesheet" />
<!-- Shared stylesheet (up one level) -->
<link rel="stylesheet" href="../style.css" />
<!-- NOC-specific styles -->
<style>
/* ── NOC page overrides & extras ── */
.noc-page-hero {
padding: 3.5rem 0 2rem;
border-bottom: 1px solid var(--line);
}
.noc-page-hero .eyebrow {
margin-bottom: 0.6rem;
}
.noc-page-title {
font-family: var(--font-display);
font-size: clamp(2rem, 4vw, 3.2rem);
font-weight: 800;
margin: 0 0 0.75rem;
line-height: 1.1;
}
.noc-page-title span {
color: var(--accent-2);
}
.noc-page-lead {
color: var(--muted);
font-size: 1rem;
max-width: 60ch;
margin: 0 0 1.5rem;
}
.noc-page-meta {
display: flex;
flex-wrap: wrap;
gap: 0.6rem 1.4rem;
font-family: var(--font-mono);
font-size: 0.78rem;
color: var(--muted);
list-style: none;
padding: 0;
margin: 0;
}
.noc-page-meta a { color: var(--muted); }
.noc-page-meta a:hover { color: var(--accent-2); }
/* Full-width NOC content area */
.noc-full {
padding: 2.5rem 0 4rem;
}
/* Uptime summary bar */
.uptime-bar {
display: flex;
flex-wrap: wrap;
gap: 0.75rem;
margin-bottom: 1.5rem;
}
.uptime-pill {
font-family: var(--font-mono);
font-size: 0.76rem;
padding: 0.35rem 0.75rem;
border-radius: 999px;
border: 1px solid var(--line);
color: var(--muted);
background: rgba(255,255,255,0.03);
}
.uptime-pill.online {
color: var(--accent-2);
border-color: rgba(94, 250, 204, 0.3);
background: rgba(94, 250, 204, 0.06);
}
.uptime-pill.warning {
color: var(--warning);
border-color: rgba(242, 204, 96, 0.3);
background: rgba(242, 204, 96, 0.06);
}
.uptime-pill.offline {
color: var(--danger);
border-color: rgba(255, 95, 86, 0.3);
background: rgba(255, 95, 86, 0.06);
}
/* Layer filter tabs */
.layer-tabs {
display: flex;
flex-wrap: wrap;
gap: 0.5rem;
margin-bottom: 1.5rem;
}
.layer-tab {
font-family: var(--font-mono);
font-size: 0.76rem;
font-weight: 700;
padding: 0.35rem 0.85rem;
border-radius: 999px;
border: 1px solid var(--line);
color: var(--muted);
background: transparent;
cursor: pointer;
transition: all 0.15s;
}
.layer-tab:hover,
.layer-tab.active {
color: var(--accent-2);
border-color: rgba(94, 250, 204, 0.35);
background: rgba(94, 250, 204, 0.07);
}
/* Roadmap section on NOC page */
.noc-roadmap {
margin-top: 3rem;
padding-top: 2.5rem;
border-top: 1px solid var(--line);
}
/* Stack info footer on NOC page */
.noc-stack-bar {
margin-top: 2.5rem;
padding: 1rem 1.25rem;
border-radius: var(--radius);
background: rgba(0,0,0,0.2);
border: 1px solid var(--line);
font-family: var(--font-mono);
font-size: 0.78rem;
color: var(--muted);
display: flex;
flex-wrap: wrap;
gap: 0.5rem 1.5rem;
align-items: center;
}
.noc-stack-bar strong {
color: var(--accent-2);
}
@media (max-width: 620px) {
.layer-tabs { gap: 0.4rem; }
.layer-tab { font-size: 0.7rem; padding: 0.3rem 0.65rem; }
}
</style>
</head>
<body>
<!-- ═══════════════════════════════ NAV ═══════════════════════════════ -->
<header class="site-header">
<div class="container nav">
<a href="https://chasedumphord.com" class="logo">Ced<span class="logo-cursor">_</span></a>
<nav>
<ul class="nav-links">
<li><a href="https://chasedumphord.com/#snapshot">Snapshot</a></li>
<li><a href="https://chasedumphord.com/#about">About</a></li>
<li><a href="https://chasedumphord.com/#projects">Projects</a></li>
<li><a href="https://chasedumphord.com/#stack">Stack</a></li>
<li><a href="https://chasedumphord.com/#contact">Contact</a></li>
<li><a href="https://chasedumphord.com/assets/images/ChaseD_Resume.pdf" target="_blank" rel="noopener noreferrer">Resume</a></li>
</ul>
</nav>
</div>
</header>
<main id="top">
<!-- ═══════════════════════════════ NOC HERO ═══════════════════════════════ -->
<div class="noc-page-hero">
<div class="container">
<p class="eyebrow">
<span class="eyebrow-dot"></span>
Ced's NOC • Live Infrastructure Dashboard • Auto-refresh: 30s
</p>
<h1 class="noc-page-title">
Live Systems <span>Dashboard</span>
</h1>
<p class="noc-page-lead">
Real-time visibility into Ced's HomeLab infrastructure — Proxmox, K3s,
TrueNAS, APRS RF edge systems, and self-hosted services.
Not simulated. Not a demo. Running hardware.
</p>
<ul class="noc-page-meta">
<li>📍 Oxford, MS</li>
<li><a href="https://chasedumphord.com">← Portfolio</a></li>
<li><a href="https://github.com/ced4568" target="_blank" rel="noopener noreferrer">github/ced4568</a></li>
</ul>
</div>
</div>
<!-- ═══════════════════════════════ NOC DASHBOARD ═══════════════════════════════ -->
<div class="noc-full">
<div class="container">
<!-- Status command bar -->
<div class="noc-command-bar">
<span class="status-dot" id="noc-dot"></span>
<span id="noc-status-text">Connecting to NOC feed...</span>
<span class="noc-refresh-badge" id="noc-refresh-badge"></span>
</div>
<p class="noc-proof">
Proxmox • K3s • TrueNAS • VLAN Segmentation • APRS RF Edge Systems
</p>
<!-- Uptime summary pills (populated by JS) -->
<div class="uptime-bar" id="uptime-bar"></div>
<!-- Metrics -->
<div class="noc-metrics-grid">
<div class="noc-metric">
<h3 id="metric-nodes">--</h3>
<p>Infrastructure Nodes</p>
</div>
<div class="noc-metric">
<h3 id="metric-services">--</h3>
<p>Services Online</p>
</div>
<div class="noc-metric">
<h3 id="metric-vlans">--</h3>
<p>Network Segments</p>
</div>
<div class="noc-metric">
<h3 id="metric-edge">--</h3>
<p>Edge Systems</p>
</div>
</div>
<!-- Alert panel -->
<div class="noc-alert-panel">
<div class="noc-alert-header">
<h3>🚨 Alert Panel</h3>
<span>Top 3 Priority Systems</span>
</div>
<div id="noc-alert-list" class="noc-alert-list">
<p class="noc-loading">Awaiting data feed...</p>
</div>
</div>
<!-- Layer filter tabs -->
<div class="layer-tabs" id="layer-tabs">
<button class="layer-tab active" data-layer="all">All Systems</button>
</div>
<!-- System cards grid -->
<div id="noc-system-grid" class="noc-system-grid"></div>
<!-- Fallback -->
<div id="noc-fallback" class="noc-fallback" style="display:none;">
<p class="noc-fallback-msg">
📡 NOC feed unavailable from this context — systems run locally.<br/>
Data updates when the local pipeline pushes a fresh noc-status.json.
</p>
</div>
<!-- Stack info bar -->
<div class="noc-stack-bar">
<span><strong>Stack:</strong> Python health checks → JSON → JS dashboard</span>
<span><strong>Next:</strong> Grafana + Prometheus integration</span>
<span><strong>Source:</strong>
<a href="https://github.com/ced4568/ceds-homelab" target="_blank" rel="noopener noreferrer">
github/ceds-homelab
</a>
</span>
</div>
<!-- NOC Roadmap -->
<div class="noc-roadmap">
<p class="section-label">// noc roadmap</p>
<h2 class="section-h2" style="font-family:var(--font-display);font-size:1.6rem;margin:0 0 1.25rem;">Build Stages</h2>
<div class="noc-grid">
<div class="noc-card">
<div class="noc-card-badge done">✅ Live</div>
<h3>Portfolio NOC</h3>
<p>
JSON-driven dashboard showing real inventory, online/offline checks,
service labels, latency, and last-check timestamps.
</p>
</div>
<div class="noc-card">
<div class="noc-card-badge next">⚙️ Next</div>
<h3>Automated Data Updates</h3>
<p>
Scheduled scripts auto-refresh system status and push dashboard-ready
JSON on a cron interval — no manual updates.
</p>
</div>
<div class="noc-card">
<div class="noc-card-badge future">📈 Future</div>
<h3>Grafana + Prometheus</h3>
<p>
Full observability stack for Proxmox, TrueNAS, K3s, Raspberry Pi,
Uptime Kuma, and APRS edge systems with real-time metrics.
</p>
</div>
</div>
</div>
</div>
</div>
</main>
<!-- ═══════════════════════════════ FOOTER ═══════════════════════════════ -->
<footer class="site-footer">
<div class="container footer-content">
<p>© <span data-year></span> Chase Dumphord — <span class="footer-mono">noc.chasedumphord.com</span></p>
<a href="#top" class="back-to-top">↑ back to top</a>
</div>
</footer>
<!-- Shared script (up one level) -->
<script src="../script.js"></script>
<!-- NOC page extras — layer filter tabs + uptime pills -->
<script>
// ── Layer filter tabs ──────────────────────────────────────────
// Populated after NOC data loads. Filters the system grid by layer.
let allSystems = [];
const originalLoad = window.loadNocStatus;
document.addEventListener("DOMContentLoaded", () => {
// Hook into data after the shared script loads it
const observer = new MutationObserver(() => {
const cards = document.querySelectorAll(".noc-system-card");
if (cards.length > 0) {
buildLayerTabs();
buildUptimePills();
observer.disconnect();
}
});
const grid = document.getElementById("noc-system-grid");
if (grid) observer.observe(grid, { childList: true });
});
function buildLayerTabs() {
const cards = document.querySelectorAll(".noc-system-card");
const layers = new Set(["all"]);
cards.forEach(card => {
const layerEl = card.querySelector(".noc-system-top span:last-child");
if (layerEl) layers.add(layerEl.textContent.trim());
});
const tabContainer = document.getElementById("layer-tabs");
tabContainer.innerHTML = "";
layers.forEach(layer => {
const btn = document.createElement("button");
btn.className = "layer-tab" + (layer === "all" ? " active" : "");
btn.dataset.layer = layer;
btn.textContent = layer === "all" ? "All Systems" : layer;
btn.addEventListener("click", () => filterByLayer(layer, btn));
tabContainer.appendChild(btn);
});
}
function filterByLayer(layer, activeBtn) {
document.querySelectorAll(".layer-tab").forEach(t => t.classList.remove("active"));
activeBtn.classList.add("active");
document.querySelectorAll(".noc-system-card").forEach(card => {
if (layer === "all") {
card.style.display = "";
return;
}
const layerEl = card.querySelector(".noc-system-top span:last-child");
card.style.display =
layerEl && layerEl.textContent.trim() === layer ? "" : "none";
});
}
function buildUptimePills() {
const bar = document.getElementById("uptime-bar");
if (!bar) return;
const cards = document.querySelectorAll(".noc-system-card");
let online = 0, warning = 0, offline = 0;
cards.forEach(card => {
const dot = card.querySelector(".mini-status");
if (!dot) return;
if (dot.classList.contains("online")) online++;
else if (dot.classList.contains("warning")) warning++;
else if (dot.classList.contains("offline")) offline++;
});
bar.innerHTML = `
<span class="uptime-pill online">● ${online} Online</span>
${warning > 0 ? `<span class="uptime-pill warning">● ${warning} Degraded</span>` : ""}
${offline > 0 ? `<span class="uptime-pill offline">● ${offline} Offline</span>` : ""}
<span class="uptime-pill">${online + warning + offline} Total Systems</span>
`;
}
</script>
</body>
</html>
Binary file not shown.

After

Width:  |  Height:  |  Size: 301 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 180 KiB

+277 -3
View File
@@ -1,6 +1,280 @@
// ═══════════════════════════════════════════════
// Ced's Portfolio — script.js
// NOC data loads from data/noc-status.json
// Refreshes every 30s. Graceful fallback on fail.
// ═══════════════════════════════════════════════
document.addEventListener("DOMContentLoaded", () => {
// Set copyright year
const yearSpan = document.querySelector("[data-year]");
if (yearSpan) {
yearSpan.textContent = new Date().getFullYear();
if (yearSpan) yearSpan.textContent = new Date().getFullYear();
// NOC data
loadNocStatus();
setInterval(loadNocStatus, 30000);
// GitHub pinned repos
loadGithubRepos();
});
// Track consecutive failures so we can show the fallback
let failCount = 0;
const MAX_FAILS = 3;
async function loadNocStatus() {
const dot = document.getElementById("noc-dot");
const statusText = document.getElementById("noc-status-text");
const badge = document.getElementById("noc-refresh-badge");
const nodes = document.getElementById("metric-nodes");
const services = document.getElementById("metric-services");
const vlans = document.getElementById("metric-vlans");
const edge = document.getElementById("metric-edge");
const grid = document.getElementById("noc-system-grid");
const alertList = document.getElementById("noc-alert-list");
const fallback = document.getElementById("noc-fallback");
try {
// Cache-bust to always get fresh data
// Use absolute URL when on NOC subdomain, relative when on main portfolio
const nocDataUrl = window.location.hostname === 'noc.chasedumphord.com'
? `https://chasedumphord.com/data/noc-status.json?t=${Date.now()}`
: `data/noc-status.json?t=${Date.now()}`;
const res = await fetch(nocDataUrl);
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const data = await res.json();
// Reset fail counter on success
failCount = 0;
// ── Status bar ──
if (dot) {
dot.className = "status-dot live";
}
if (statusText) {
const d = new Date(data.lastUpdated);
const formatted = d.toLocaleString('en-US', { month: 'long', day: 'numeric', year: 'numeric', hour: 'numeric', minute: '2-digit', hour12: true });
statusText.textContent = `${data.nocName} — ${data.status} — Last updated: ${formatted}`;
}
if (badge) {
badge.textContent = `Auto-refresh: 30s`;
}
// Hide fallback if it was showing
if (fallback) fallback.style.display = "none";
// ── Metrics ──
if (nodes) animateMetric(nodes, data.summary.nodes);
if (services) animateMetric(services, data.summary.services);
if (vlans) animateMetric(vlans, data.summary.vlans);
if (edge) animateMetric(edge, data.summary.edgeSystems);
// ── System cards ──
if (grid) {
grid.innerHTML = "";
data.systems.forEach((system) => {
const card = document.createElement("article");
card.className = "noc-system-card";
const rawStatus = system.status.toLowerCase();
const statusClass =
rawStatus.includes("online") || rawStatus.includes("operational") ? "online"
: rawStatus.includes("building") || rawStatus.includes("tuning") || rawStatus.includes("active") ? "warning"
: "offline";
card.innerHTML = `
<div class="noc-system-top">
<span class="mini-status ${statusClass}"></span>
<span>${system.layer}</span>
</div>
<div class="system-label">${system.label || "System"}</div>
<div class="severity-pill ${(system.severity || "unknown").toLowerCase()}">
${system.severity || "Unknown"}
</div>
<h3>${system.name}</h3>
<p>${system.type}</p>
<code>${system.address}</code>
<div class="system-meta">
<small>Status: ${system.status}</small>
<small>Latency: ${system.latency || "N/A"}</small>
<small>Last Check: ${system.lastCheck || "Manual"}</small>
</div>
`;
grid.appendChild(card);
});
}
// ── Alerts ──
if (alertList) renderAlerts(data.systems, alertList);
} catch (err) {
failCount++;
console.warn(`[NOC] Fetch failed (${failCount}/${MAX_FAILS}):`, err.message);
// Update dot to error state
if (dot) dot.className = "status-dot error";
if (statusText) {
statusText.textContent = failCount >= MAX_FAILS
? "NOC feed offline — view live dashboard at noc.chasedumphord.com"
: `NOC data unavailable — retrying... (${failCount}/${MAX_FAILS})`;
}
if (badge) badge.textContent = "";
// After MAX_FAILS attempts, show the fallback block
if (failCount >= MAX_FAILS && fallback) {
fallback.style.display = "block";
}
}
});
}
// Animate a number metric with a quick pop
function animateMetric(el, value) {
el.classList.remove("metric-pop");
el.textContent = value;
void el.offsetWidth; // force reflow
el.classList.add("metric-pop");
}
// ═══════════════════════════════════════════════
// GitHub Repos — fetches public repos for ced4568
// Sorted by last pushed, capped at 6 cards
// ═══════════════════════════════════════════════
// Language → color map (subset of GitHub's palette)
const LANG_COLORS = {
Python: "#3572A5",
JavaScript: "#f1e05a",
Shell: "#89e051",
HTML: "#e34c26",
CSS: "#563d7c",
Dockerfile: "#384d54",
YAML: "#cb171e",
Makefile: "#427819",
};
async function loadGithubRepos() {
const container = document.getElementById("github-repos");
if (!container) return;
try {
const res = await fetch(
"https://api.github.com/users/ced4568/repos?sort=pushed&per_page=6",
{ headers: { Accept: "application/vnd.github+json" } }
);
if (!res.ok) throw new Error(`GitHub API ${res.status}`);
const repos = await res.json();
// Filter out forks for cleaner display
const ownRepos = repos.filter((r) => !r.fork).slice(0, 6);
if (ownRepos.length === 0) {
container.innerHTML = `<p class="noc-loading">No public repositories found.</p>`;
return;
}
container.innerHTML = ownRepos.map((repo) => {
const langColor = LANG_COLORS[repo.language] || "var(--accent-2)";
const desc = repo.description
? repo.description
: "No description provided.";
const updatedDate = new Date(repo.pushed_at).toLocaleDateString("en-US", {
month: "short",
year: "numeric",
});
return `
<div class="repo-card">
<div class="repo-card-top">
<span class="repo-icon">📁</span>
<a
class="repo-name"
href="${repo.html_url}"
target="_blank"
rel="noopener noreferrer"
title="${repo.name}"
>${repo.name}</a>
<span class="repo-visibility">${repo.private ? "private" : "public"}</span>
</div>
<p class="repo-desc">${desc}</p>
<div class="repo-meta">
${repo.language
? `<span>
<span class="repo-lang-dot" style="background:${langColor}"></span>
${repo.language}
</span>`
: ""}
<span>★ ${repo.stargazers_count}</span>
<span>Updated ${updatedDate}</span>
</div>
</div>
`;
}).join("");
} catch (err) {
console.warn("[GitHub] Failed to load repos:", err.message);
if (container) {
container.innerHTML = `
<div class="repo-loading">
<p class="noc-loading">
Could not load repositories.
<a href="https://github.com/ced4568" target="_blank" rel="noopener noreferrer">
View on GitHub →
</a>
</p>
</div>
`;
}
}
}
// Build the alert panel from system data
function renderAlerts(systems, alertList) {
const scored = systems
.map((sys) => {
const sev = (sys.severity || "").toLowerCase();
const status = (sys.status || "").toLowerCase();
let score = 0;
if (sev.includes("critical") || status.includes("offline")) score = 3;
else if (sev.includes("degraded")) score = 2;
else if (sev.includes("unknown")) score = 1;
return { ...sys, score };
})
.filter((s) => s.score > 0)
.sort((a, b) => b.score - a.score)
.slice(0, 3);
if (scored.length === 0) {
alertList.innerHTML = `
<div class="noc-alert healthy">
<strong>All monitored systems nominal</strong>
<span>No critical or degraded systems detected.</span>
</div>
`;
return;
}
alertList.innerHTML = scored.map((sys) => {
const cls =
sys.score === 3 ? "critical"
: sys.score === 2 ? "degraded"
: "unknown";
return `
<div class="noc-alert ${cls}">
<strong>${sys.name}</strong>
<span>${sys.severity || sys.status} • ${sys.layer} • Latency: ${sys.latency || "N/A"}</span>
</div>
`;
}).join("");
}
+42
View File
@@ -0,0 +1,42 @@
import json
from pathlib import Path
ROOT = Path(__file__).resolve().parent.parent
NOC_FILE = ROOT / "data" / "noc-status.json"
BADGE_FILE = ROOT / "data" / "noc-badge.json"
with open(NOC_FILE, "r", encoding="utf-8") as file:
data = json.load(file)
status = data.get("status", "Unknown")
summary = data.get("summary", {})
online = int(summary.get("online", 0))
offline = int(summary.get("offline", 0))
total = online + offline
# 🔥 Determine severity
if offline == 0:
severity = "Healthy"
color = "brightgreen"
elif offline <= 2:
severity = "Degraded"
color = "yellow"
else:
severity = "Critical"
color = "red"
# 🔥 Build message
message = f"{severity} | {online}/{total} online | {offline} offline"
badge = {
"schemaVersion": 1,
"label": "Ced's NOC",
"message": message,
"color": color
}
with open(BADGE_FILE, "w", encoding="utf-8") as file:
json.dump(badge, file, indent=2)
print(f"NOC badge updated: {message}")
+181
View File
@@ -0,0 +1,181 @@
import json
import socket
import time
from datetime import datetime
from pathlib import Path
OUTPUT_FILE = Path(__file__).resolve().parent.parent / "data" / "noc-status.json"
SYSTEMS = [
{
"name": "Proxmox VE",
"type": "Virtualization Platform",
"host": "10.10.30.250",
"port": 8006,
"address": "10.10.30.250:8006",
"layer": "Core Infrastructure",
"label": "Hypervisor"
},
{
"name": "TrueNAS",
"type": "Storage Platform",
"host": "10.10.30.143",
"port": 80,
"address": "10.10.30.143",
"layer": "Storage",
"label": "NAS"
},
{
"name": "Nginx Proxy Manager",
"type": "Reverse Proxy",
"host": "10.10.30.210",
"port": 81,
"address": "10.10.30.210:81",
"layer": "Access Layer",
"label": "Proxy"
},
{
"name": "Dashy",
"type": "Service Dashboard",
"host": "10.10.30.61",
"port": 4000,
"address": "10.10.30.61:4000",
"layer": "Dashboard",
"label": "Portal"
},
{
"name": "Jellyfin",
"type": "Media Service",
"host": "10.10.30.143",
"port": 30013,
"address": "10.10.30.143:30013",
"layer": "Application Service",
"label": "App"
},
{
"name": "K3s API",
"type": "Kubernetes API",
"host": "10.10.30.72",
"port": 6443,
"address": "10.10.30.72:6443",
"layer": "Compute Cluster",
"label": "Cluster"
},
{
"name": "APRS Home iGate",
"type": "RF Edge Gateway",
"host": "10.10.30.129",
"port": 8001,
"address": "KJ5JCO-10 / Direwolf KISS 8001",
"layer": "Edge / RF",
"label": "iGate"
},
{
"name": "APRS-IS",
"type": "APRS Internet Service",
"host": "noam.aprs2.net",
"port": 14580,
"address": "noam.aprs2.net:14580",
"layer": "Edge / RF",
"label": "External"
}
]
def check_tcp(host, port, timeout=2):
start = time.perf_counter()
try:
with socket.create_connection((host, port), timeout=timeout):
latency_ms = round((time.perf_counter() - start) * 1000)
return True, latency_ms
except OSError:
return False, None
def severity_from_status(online, latency):
if not online:
return "Critical"
if latency is None:
return "Unknown"
if latency < 50:
return "Healthy"
if latency <= 150:
return "Degraded"
return "Critical"
def health_label(online_count, total):
if online_count == total:
return "All Systems Online"
if online_count >= max(1, total - 2):
return "Degraded"
return "Action Required"
def main():
checked_at = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
systems = []
online_count = 0
offline_count = 0
for system in SYSTEMS:
online, latency = check_tcp(system["host"], system["port"])
if online:
status = "Online"
online_count += 1
latency_value = f"{latency} ms"
else:
status = "Offline"
offline_count += 1
latency_value = "N/A"
systems.append({
"name": system["name"],
"type": system["type"],
"address": system["address"],
"status": status,
"severity": severity_from_status(online, latency),
"layer": system["layer"],
"label": system["label"],
"latency": latency_value,
"lastCheck": checked_at
})
total_systems = len(SYSTEMS)
data = {
"nocName": "Ced's NOC",
"status": health_label(online_count, total_systems),
"lastUpdated": checked_at,
"summary": {
"nodes": "12+",
"services": f"{online_count}/{total_systems}",
"online": str(online_count),
"offline": str(offline_count),
"vlans": "4",
"edgeSystems": "2"
},
"systems": systems
}
OUTPUT_FILE.parent.mkdir(parents=True, exist_ok=True)
with open(OUTPUT_FILE, "w", encoding="utf-8") as file:
json.dump(data, file, indent=2)
print(f"NOC status written to {OUTPUT_FILE}")
print(f"Online systems: {online_count}/{total_systems}")
print(f"Offline systems: {offline_count}/{total_systems}")
if __name__ == "__main__":
main()
+18
View File
@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://chasedumphord.com/</loc>
<lastmod>2025-05-01</lastmod>
<changefreq>monthly</changefreq>
<priority>1.0</priority>
</url>
<url>
<loc>https://noc.chasedumphord.com/</loc>
<lastmod>2025-05-01</lastmod>
<changefreq>weekly</changefreq>
<priority>0.8</priority>
</url>
</urlset>
+921 -217
View File
File diff suppressed because it is too large Load Diff