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 <meta
name="description" 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" /> <link rel="stylesheet" href="style.css" />
</head> </head>
<body> <body>
<!-- ═══════════════════════════════ NAV ═══════════════════════════════ -->
<header class="site-header"> <header class="site-header">
<div class="container nav"> <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> <nav>
<ul class="nav-links"> <ul class="nav-links">
<li><a href="#snapshot">Snapshot</a></li> <li><a href="#snapshot">Snapshot</a></li>
<li><a href="#noc">NOC</a></li>
<li><a href="#about">About</a></li> <li><a href="#about">About</a></li>
<li><a href="#projects">Projects</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="#resume">Resume</a></li>
<li><a href="#contact">Contact</a></li> <li><a href="#contact">Contact</a></li>
</ul> </ul>
@@ -32,74 +64,115 @@
</header> </header>
<main id="top"> <main id="top">
<!-- ═══════════════════════════════ HERO ═══════════════════════════════ -->
<section class="hero"> <section class="hero">
<div class="container hero-grid"> <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"> <p class="lead">
I’m Chase Dumphord — a hands-on systems builder focused on digital infrastructure, Chase Dumphord — infrastructure builder running Proxmox, K3s, TrueNAS, and APRS RF edge systems out of Oxford, MS.
Linux systems, homelab engineering, Raspberry Pi deployments, networking, automation, I build things that actually work, then document how they work.
and real-world technical problem solving.
</p> </p>
<div class="hero-actions"> <div class="hero-actions">
<a class="btn btn-primary" href="#projects">View Projects</a> <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> </div>
<ul class="quick-facts"> <ul class="quick-facts">
<li>Oxford, MS</li> <li>📍 Oxford, MS</li>
<li> <li>
GitHub: <a href="https://github.com/ced4568" target="_blank" rel="noopener noreferrer">
<a href="https://github.com/ced4568" target="_blank" rel="noopener noreferrer">ced4568</a> ⌥ github/ced4568
</a>
</li> </li>
<li> <li>
Email: <a href="mailto:[email protected]">✉ [email protected]</a>
<a href="mailto:[email protected]">[email protected]</a>
</li> </li>
</ul> </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>
<div class="hero-panel"> <div class="hero-panel">
<img <div class="hero-image-card">
src="assets/images/ChaseD_headshot.jpg" <img
alt="Headshot of Chase Dumphord" src="assets/images/ChaseD_headshot.jpg"
class="hero-image" alt="Chase Dumphord"
/> class="hero-image"
/>
</div>
<div class="terminal-card"> <div class="terminal-card">
<div class="terminal-top"> <div class="terminal-top">
<span></span> <span class="dot red"></span>
<span></span> <span class="dot yellow"></span>
<span></span> <span class="dot green"></span>
<span class="terminal-title">ced's@homelab ~ $</span>
</div> </div>
<pre><code><span class="t-prompt">ced's@homelab:~$</span> whoami
<span class="t-val">systems_builder</span>
<pre><code>$ whoami <span class="t-prompt">ced's@homelab:~$</span> uptime
systems_builder <span class="t-val">12+ nodes • 10+ services • always_on</span>
$ focus <span class="t-prompt">ced's@homelab:~$</span> cat focus.txt
infrastructure <span class="t-val">infrastructure
networking networking
automation automation
edge_systems rf_edge_systems</span>
$ status <span class="t-prompt">ced's@homelab:~$</span> systemctl status life
building_real_systems</code></pre> <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> </div>
</div> </div>
</section> </section>
<!-- ═══════════════════════════════ SNAPSHOT ═══════════════════════════════ -->
<section id="snapshot" class="section section-alt"> <section id="snapshot" class="section section-alt">
<div class="container"> <div class="container">
<div class="section-heading"> <div class="section-heading">
<p class="section-label">Environment</p> <p class="section-label">// environment</p>
<h2>Systems Snapshot</h2> <h2>Systems Snapshot</h2>
<p class="section-intro"> <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> </p>
</div> </div>
@@ -107,21 +180,18 @@ building_real_systems</code></pre>
<div class="stat-card"> <div class="stat-card">
<h3>12+</h3> <h3>12+</h3>
<p>Nodes</p> <p>Nodes</p>
<span>K3s cluster environment</span> <span>K3s cluster • Raspberry Pi</span>
</div> </div>
<div class="stat-card"> <div class="stat-card">
<h3>10+</h3> <h3>10+</h3>
<p>Services</p> <p>Services</p>
<span>Self-hosted stack</span> <span>Self-hosted stack</span>
</div> </div>
<div class="stat-card"> <div class="stat-card">
<h3>4</h3> <h3>4</h3>
<p>VLANs</p> <p>VLANs</p>
<span>Segmented network design</span> <span>Segmented UniFi network</span>
</div> </div>
<div class="stat-card"> <div class="stat-card">
<h3>2</h3> <h3>2</h3>
<p>iGate Nodes</p> <p>iGate Nodes</p>
@@ -131,37 +201,103 @@ building_real_systems</code></pre>
</div> </div>
</section> </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"> <section id="about" class="section">
<div class="container"> <div class="container">
<div class="section-heading"> <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> <h2>Hands-on systems builder with a digital infrastructure mindset</h2>
</div> </div>
<div class="content-grid"> <div class="content-grid">
<div class="card"> <div class="card">
<p> <p>
I’m a technical professional focused on digital systems, infrastructure, networking, I'm a technical professional focused on digital systems, infrastructure, networking,
automation, and hands-on system integration. I enjoy building systems that are practical, automation, and hands-on system integration. I build things that are practical,
reliable, and well documented — from homelab services and dashboards to Raspberry Pi reliable, and well-documented — from homelab services and live dashboards to Raspberry Pi
deployments, APRS iGates, and troubleshooting workflows. deployments, APRS iGates, and complex troubleshooting workflows.
</p> </p>
<p> <p>
My background blends field engineering, industrial technology, software-oriented thinking, My background blends field engineering, industrial technology, and infrastructure
and infrastructure problem solving. I’m especially interested in projects that connect the problem solving. Increasingly I'm integrating AI tooling — using LLMs for system
physical and digital worlds through monitoring, networking, automation, and resilient design. documentation, automated diagnostics, and workflow acceleration — as part of how
modern infrastructure gets built and maintained.
</p> </p>
</div> </div>
<div class="card"> <div class="card">
<h3>Core Focus Areas</h3> <h3>Core Focus Areas</h3>
<ul class="clean-list"> <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>Linux systems and service management</li>
<li>Networking, VLANs, failover, and connectivity troubleshooting</li> <li>Networking, VLANs, failover, and connectivity troubleshooting</li>
<li>Raspberry Pi and edge-device deployments</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> <li>Documentation, process building, and reproducible project design</li>
</ul> </ul>
</div> </div>
@@ -169,240 +305,384 @@ building_real_systems</code></pre>
</div> </div>
</section> </section>
<!-- ═══════════════════════════════ PROJECTS ═══════════════════════════════ -->
<section id="projects" class="section section-alt"> <section id="projects" class="section section-alt">
<div class="container"> <div class="container">
<div class="section-heading"> <div class="section-heading">
<p class="section-label">Projects</p> <p class="section-label">// projects</p>
<h2>🔧 Infrastructure & Systems Projects</h2> <h2>Infrastructure & Systems Projects</h2>
<p class="section-intro"> <p class="section-intro">Built on real systems. Not demos, not tutorials — running infrastructure.</p>
These projects are built around real systems, networking, Linux services, edge devices,
and practical documentation.
</p>
</div> </div>
<div class="projects-grid"> <div class="projects-grid">
<article class="project-card featured-project"> <article class="project-card featured-project">
<div class="project-top"> <div class="project-top">
<h3>🧠 Ced’s HomeLab Infrastructure</h3> <h3>Ced's HomeLab Infrastructure</h3>
<span class="status-pill">Flagship</span> <span class="status-pill">Flagship</span>
</div> </div>
<p class="tags">Infrastructure • Networking • Virtualization • Monitoring • Self-Hosting</p> <p class="tags">Infrastructure • Networking • Virtualization • Monitoring • Self-Hosting</p>
<p class="project-impact"> <p class="project-impact">
Designed as a practical infrastructure environment for networking, monitoring, Full homelab environment built for real network segmentation, service hosting, and architecture documentation.
service hosting, and documentation.
</p> </p>
<p>
Personal infrastructure lab focused on network segmentation, virtualization,
self-hosted services, monitoring, and architecture documentation.
</p>
<ul class="clean-list"> <ul class="clean-list">
<li>VLAN segmentation and network design</li> <li>Proxmox VE virtualization platform</li>
<li>Proxmox virtualization</li> <li>VLAN segmentation via UniFi (Main / IoT / HomeLab / Guest)</li>
<li>Self-hosted services and monitoring</li> <li>Self-hosted services behind Nginx Proxy Manager + Cloudflare Tunnels</li>
<li>System architecture documentation</li> <li>Uptime Kuma + Grafana monitoring stack</li>
</ul> </ul>
<a href="https://github.com/ced4568/ceds-homelab" target="_blank" rel="noopener noreferrer" class="project-link"> <a href="https://github.com/ced4568/ceds-homelab" target="_blank" rel="noopener noreferrer" class="project-link">
View Project → View on GitHub →
</a> </a>
</article> </article>
<article class="project-card"> <article class="project-card">
<div class="project-top"> <div class="project-top">
<h3>☸️ K3s Kubernetes Cluster</h3> <h3>K3s Kubernetes Cluster</h3>
<span class="status-pill">Infrastructure</span> <span class="status-pill">Infrastructure</span>
</div> </div>
<p class="tags">Kubernetes • Containers • Linux • Automation</p>
<p class="tags">Kubernetes • Containers • Linux • Infrastructure • Automation</p>
<p class="project-impact"> <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>
<p>
Multi-node K3s cluster built for container orchestration, service deployment,
and infrastructure experimentation.
</p>
<ul class="clean-list"> <ul class="clean-list">
<li>Multi-node cluster setup</li> <li>Multi-node cluster setup and management</li>
<li>Containerized workloads</li> <li>Containerized workload deployment</li>
<li>Service deployment</li> <li>Infrastructure automation via manifest-driven configuration</li>
<li>Infrastructure automation</li>
</ul> </ul>
<a href="https://github.com/ced4568/ced-k3s-homelab" target="_blank" rel="noopener noreferrer" class="project-link"> <a href="https://github.com/ced4568/ced-k3s-homelab" target="_blank" rel="noopener noreferrer" class="project-link">
View Project → View on GitHub →
</a> </a>
</article> </article>
<article class="project-card"> <article class="project-card">
<div class="project-top"> <div class="project-top">
<h3>📡 APRS iGate System</h3> <h3>APRS iGate System</h3>
<span class="status-pill">Edge System</span> <span class="status-pill">Edge System</span>
</div> </div>
<p class="tags">RF • Linux • Raspberry Pi • APRS-IS • Edge Systems</p>
<p class="tags">RF • Linux • Raspberry Pi • Networking • APRS-IS • Edge Systems</p>
<p class="project-impact"> <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>
<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"> <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>APRS-IS uplink verified on aprs.fi</li>
<li>HomeLab WiFi + mobile hotspot failover</li> <li>HomeLab WiFi + mobile hotspot failover</li>
<li>Mobile build includes ETH-USB-HUB-BOX expansion</li> <li>Mobile build with ETH-USB-HUB-BOX expansion</li>
<li>Documented configs, architecture, and troubleshooting</li>
</ul> </ul>
<a href="https://github.com/ced4568/ceds-aprs-igate" target="_blank" rel="noopener noreferrer" class="project-link"> <a href="https://github.com/ced4568/ceds-aprs-igate" target="_blank" rel="noopener noreferrer" class="project-link">
View Project → View on GitHub →
</a> </a>
</article> </article>
</div> </div>
</div> </div>
</section> </section>
<!-- ═══════════════════════════════ NOC ROADMAP ═══════════════════════════════ -->
<section class="section noc-section"> <section class="section noc-section">
<div class="container"> <div class="container">
<div class="section-heading"> <div class="section-heading">
<p class="section-label">Future Buildout</p> <p class="section-label">// noc roadmap</p>
<h2>📊 Ced’s NOC Vision</h2> <h2>Ced's NOC Vision</h2>
<p class="section-intro"> <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> </p>
</div> </div>
<div class="noc-grid"> <div class="noc-grid">
<div class="noc-card"> <div class="noc-card">
<h3>Monitoring</h3> <div class="noc-card-badge done">✅ Live</div>
<p>Grafana, Prometheus, Uptime Kuma, and service-level visibility.</p> <h3>Portfolio NOC</h3>
<p>
JSON-driven dashboard showing real inventory, online/offline checks, service labels,
latency, and last-check timestamps.
</p>
</div> </div>
<div class="noc-card"> <div class="noc-card">
<h3>Infrastructure</h3> <div class="noc-card-badge next">⚙️ Next</div>
<p>HomeLab services, K3s nodes, VLANs, and self-hosted systems.</p> <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>
<div class="noc-card"> <div class="noc-card">
<h3>Edge Systems</h3> <div class="noc-card-badge future">📈 Future</div>
<p>APRS iGate nodes, Raspberry Pi devices, and field/mobile deployments.</p> <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>
</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> </div>
</section> </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"> <section id="resume" class="section">
<div class="container"> <div class="container">
<div class="section-heading"> <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> <h2>Technical experience that bridges field work and digital systems</h2>
</div> </div>
<div class="content-grid"> <div class="resume-grid">
<div class="card">
<h3>What I Bring</h3>
<div class="card resume-card">
<h3>What I Bring</h3>
<ul class="clean-list"> <ul class="clean-list">
<li>Industrial and field-service technical experience</li> <li>Industrial and field-service technical background — hands-on problem solving under real constraints</li>
<li>Linux, Raspberry Pi, and systems administration work</li> <li>Linux systems administration — service management, troubleshooting, automation</li>
<li>Networking, connectivity, and troubleshooting depth</li> <li>Networking depth — VLANs, DNS, reverse proxy, firewall config, failover design</li>
<li>Documentation, process building, and reproducible project 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> </ul>
</div> </div>
<div class="card"> <div class="card resume-card">
<h3>Current Direction</h3> <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> <div class="resume-note">
I’m positioning myself around digital systems, infrastructure, networking, <p>
automation, and technical operations — especially roles where hands-on problem Currently positioning around digital systems, infrastructure, and technical operations —
solving and system integration matter. especially roles where hands-on problem solving and system integration matter more than certifications.
</p> </p>
</div>
<p>
More detailed resume content will be added here as the portfolio grows.
</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>
</div> </div>
</section> </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"> <section class="section section-alt personal-section">
<div class="container personal-grid"> <div class="container personal-grid">
<div class="personal-image-wrap"> <div class="personal-image-wrap">
<img <img
src="assets/images/lakephotopinkpants.png" 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" class="personal-image"
/> />
</div> </div>
<div class="card"> <div class="card">
<p class="section-label">Personal Note</p> <p class="section-label">// personal</p>
<h2>Technical, curious, and always building</h2> <h2>Technical, curious, and always building</h2>
<p> <p>
Outside of work, I enjoy electronics, self-hosting, coding, drones, radio, and Outside of work I'm into electronics, self-hosting, coding, drones, ham radio, and
hands-on technical projects that push me to learn something useful. That curiosity hands-on projects that force me to learn something real. Ball pythons and dogs round
carries directly into the way I build and document systems. out the home lab. That curiosity carries directly into how I build and document systems.
</p> </p>
</div> </div>
</div> </div>
</section> </section>
<!-- ═══════════════════════════════ CONTACT ═══════════════════════════════ -->
<section id="contact" class="section"> <section id="contact" class="section">
<div class="container"> <div class="container">
<div class="section-heading"> <div class="section-heading">
<p class="section-label">Contact</p> <p class="section-label">// contact</p>
<h2>Let’s connect</h2> <h2>Let's connect</h2>
</div> </div>
<div class="contact-grid"> <div class="contact-grid">
<div class="card"> <div class="card">
<h3>Contact Info</h3> <h3>Reach Out</h3>
<p>Email: <a href="mailto:[email protected]">[email protected]</a></p> <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>Location: Oxford, MS</p>
<p> <p>GitHub: <a href="https://github.com/ced4568" target="_blank" rel="noopener noreferrer">github.com/ced4568</a></p>
GitHub: <p>LinkedIn: <a href="https://www.linkedin.com/in/chase-dumphord/" target="_blank" rel="noopener noreferrer">linkedin.com/in/chase-dumphord</a></p>
<a href="https://github.com/ced4568" target="_blank" rel="noopener noreferrer">github.com/ced4568</a>
</p>
</div> </div>
<div class="card"> <div class="card">
<h3>What I’m Open To</h3> <h3>Open To</h3>
<ul class="clean-list"> <ul class="clean-list">
<li>Digital systems and infrastructure roles</li> <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>Automation and monitoring projects</li>
<li>Projects involving hardware + software integration</li> <li>Hardware + software integration work</li>
</ul> </ul>
</div> </div>
</div> </div>
</div> </div>
</section> </section>
</main> </main>
<!-- ═══════════════════════════════ FOOTER ═══════════════════════════════ -->
<footer class="site-footer"> <footer class="site-footer">
<div class="container footer-content"> <div class="container footer-content">
<p>© Chase Dumphord</p> <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> <a href="#top" class="back-to-top">↑ back to top</a>
</div> </div>
</footer> </footer>
<script src="script.js"></script> <script src="script.js"></script>
</body> </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", () => { document.addEventListener("DOMContentLoaded", () => {
// Set copyright year
const yearSpan = document.querySelector("[data-year]"); const yearSpan = document.querySelector("[data-year]");
if (yearSpan) { if (yearSpan) yearSpan.textContent = new Date().getFullYear();
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