
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    
      
      
      
    [{"authors":null,"categories":null,"content":"I have added rust support to flags.gg and by that I mean you can now call flags.gg inside rust\nbut you can also turn flags on locally\nuse flags_rs::{Auth, Client}; #[tokio::main] async fn main() -\u0026gt; Result\u0026lt;(), Box\u0026lt;dyn std::error::Error\u0026gt;\u0026gt; { // Initialize the client let client = Client::builder() .with_auth(Auth { project_id: \u0026#34;your-project-id\u0026#34;.to_string(), agent_id: \u0026#34;your-agent-id\u0026#34;.to_string(), environment_id: \u0026#34;your-environment-id\u0026#34;.to_string(), }) .with_memory_cache() .build(); // Check if a flag is enabled let is_feature_enabled = client.is(\u0026#34;my-feature\u0026#34;).enabled().await; println!(\u0026#34;Feature \u0026#39;my-feature\u0026#39; is enabled: {}\u0026#34;, is_feature_enabled); // List all flags let all_flags = client.list().await?; println!(\u0026#34;All flags:\u0026#34;); for flag in all_flags { println!(\u0026#34; {} ({}): {}\u0026#34;, flag.details.name, flag.details.id, flag.enabled); } Ok(()) } ","date":1747267200,"expirydate":-62135596800,"kind":"page","lang":"en","lastmod":1747267200,"objectID":"7599f0cc296ca39355153d3263c3a15a","permalink":"https://keloran.dev/post/flags_rust/","publishdate":"2025-05-15T00:00:00Z","relpermalink":"/post/flags_rust/","section":"post","summary":"I have added rust support to flags.gg and by that I mean you can now call flags.gg inside rust\nbut you can also turn flags on locally\nuse flags_rs::{Auth, Client}; #[tokio::main] async fn main() -\u003e Result\u003c(), Box\u003cdyn std::error::Error\u003e\u003e { // Initialize the client let client = Client::builder() .with_auth(Auth { project_id: \"your-project-id\".to_string(), agent_id: \"your-agent-id\".to_string(), environment_id: \"your-environment-id\".to_string(), }) .with_memory_cache() .build(); // Check if a flag is enabled let is_feature_enabled = client.is(\"my-feature\").enabled().await; println!(\"Feature 'my-feature' is enabled: {}\", is_feature_enabled); // List all flags let all_flags = client.list().await?; println!(\"All flags:\"); for flag in all_flags { println!(\" {} ({}): {}\", flag.details.name, flag.details.id, flag.enabled); } Ok(()) } ","tags":["flags"],"title":"Flags.gg Rust Support","type":"post"},{"authors":null,"categories":null,"content":"I have added Golang support to flags.gg and by that I mean you can now call flags.gg inside go\nbut you can also turn flags on locally\npackage main import ( \u0026#34;github.com/flags-gg/go-flags\u0026#34; \u0026#34;log\u0026#34; \u0026#34;os\u0026#34; ) func main() { flags := flags.NewClient(flags.WithAuth(flags.Auth{ ProjectID: \u0026#34;tester\u0026#34;, AgentID: \u0026#34;tester\u0026#34;, EnvironmentID: \u0026#34;tester\u0026#34;, })) if flags.Is(\u0026#34;test-flag\u0026#34;).Enabled() { log.Println(\u0026#34;test-flag enabled\u0026#34;) } if flags.Is(\u0026#34;test flag 2\u0026#34;).Enabled() { log.Println(\u0026#34;test flag 2 enabled\u0026#34;) } _ = os.Setenv(\u0026#34;FLAGS_TEST_FLAG_3\u0026#34;, \u0026#34;true\u0026#34;) if flags.Is(\u0026#34;test flag 3\u0026#34;).Enabled() { log.Println(\u0026#34;test flag 3 enabled\u0026#34;) } _ = os.Setenv(\u0026#34;FLAGS_TEST_FLAG_4\u0026#34;, \u0026#34;true\u0026#34;) if flags.Is(\u0026#34;test-flag-4\u0026#34;).Enabled() { log.Println(\u0026#34;test flag 4 enabled\u0026#34;) } log.Println(\u0026#34;flags enabled or disabled\u0026#34;) } ","date":1743375600,"expirydate":-62135596800,"kind":"page","lang":"en","lastmod":1743375600,"objectID":"eb13aa684344171cf0e0692e16d7c0ea","permalink":"https://keloran.dev/post/flags_go/","publishdate":"2025-03-30T23:00:00Z","relpermalink":"/post/flags_go/","section":"post","summary":"I have added Golang support to flags.gg and by that I mean you can now call flags.gg inside go\nbut you can also turn flags on locally\npackage main import ( \"github.com/flags-gg/go-flags\" \"log\" \"os\" ) func main() { flags := flags.NewClient(flags.WithAuth(flags.Auth{ ProjectID: \"tester\", AgentID: \"tester\", EnvironmentID: \"tester\", })) if flags.Is(\"test-flag\").Enabled() { log.Println(\"test-flag enabled\") } if flags.Is(\"test flag 2\").Enabled() { log.Println(\"test flag 2 enabled\") } _ = os.Setenv(\"FLAGS_TEST_FLAG_3\", \"true\") if flags.Is(\"test flag 3\").Enabled() { log.Println(\"test flag 3 enabled\") } _ = os.Setenv(\"FLAGS_TEST_FLAG_4\", \"true\") if flags.Is(\"test-flag-4\").Enabled() { log.Println(\"test flag 4 enabled\") } log.Println(\"flags enabled or disabled\") } ","tags":["flags"],"title":"Flags.gg Golang Support","type":"post"},{"authors":null,"categories":null,"content":"CV and Description Its probably a good idea to have a CV and description of somewhere.\nI have been a software engineer for over 25 years, working on various projects and for some very well known companies.\nPersonal projects All these github orgs are mine, I also recently soft-launched a side project of Flags.gg which is a feature flag system like LaunchDarkly\nLinkedIn My LinkedIn Account\nKeloran My Personal github account\nTrackLin.es Initial phases of a bug tracking system, that is still in development, paused at the moment\nRetro-board.it A retro board and scrum poker system, that is in active development at the moment\nChewedFeed The parent site for all my sub projects\nBugFix.es This is a bug triaging system designed to push bug to a bug tracking system of choice, and bump the status of a bug dependant on its frequency and crash status, so you dont need to trawl through logs to find issues or wait for someone to report it, think datadog but with automatic ticket creation\nK8sDeploy This is my deployment system, for kubernetes, up until fairly recently most deployment systems didnt work on ARM, and so I needed to be able to deploy code to my kubernetes cluster which was running on 40% ARM based architecture\nFlags.gg This is my feature flag system, that has recently soft launched,\n1tn.pw This is a very simple URL shortening service that has been active for about 1 year\nSkills 3+ years Kubernetes\n7+ years AWS\n6+ years Docker\n2+ years Azure\n2+ years Azure-DevOps/VSTS\n3+ years Jenkins\n2+ years Travis\n2+ years GitLab-CI\nLanguages 7+ years GO (preferred)\n3+ years Typescript\n1+ year Python\n2+ years Objective-C\n2+ years Swift\n3+ years Java\nHistory CITI Bank - 2023–08-01 - CURRENT • Senior Software Engineer Technology Used: Go, Typescript, Python I have been part of the Controls Team, we have the task for writing a natural english language parser to turn Citi’s policies into controls a simple example of this is\nA #User# can get a driving license if their __age__ is greater than or equal to 18 and their __driving_score__ is over 60 a user then sends the data for this as\n{ \u0026#34;User\u0026#34;: { \u0026#34;name\u0026#34;: \u0026#34;bob\u0026#34; \u0026#34;age\u0026#34;: 19 \u0026#34;drivingScore\u0026#34;: 91 } } which would respond true\nEPAM systems - 2022-03 - 2023-08-01 • Go Engineer Technology Used: Go I was the first GO Engineer EPAM hired, and was contracted out to Shell Oil where I was tasked with building a reporting system for Shell Oils system integrations, working out which internal teams were talking to what systems and how the performance of those integrations was causing a degradation of performance further down the chain.\nSamKnows - 2021-11 - 2022-03 • Software Engineer Technology Used: Java, Docker, Kubernetes Part of the network testing and analysis team, we took various data points to detect if the network was down and display that in various dashboards so that engineers could tell where and if they were having issues on the network, an example of this is used by virgin to detect if your node is down, because there are already other systems detect if a town has gone down, this is more granular to detect if a street is down\nBud Finance - 2020-11 - 2021-11 • Software Engineer Technology Used: Go, Docker, Kubernetes Part of the integration team, we were the part that took the data from the banks that you have linked, and send the data to the internal format, that is then parsed and turned into useful data, integrating with OpenBanking, Starling, and AMEX\nTote Sport - 2019-11 - 2020-11 • Software Engineer Technology Used: Go, PHP, Docker Started the migration to GCP from in house servers, and built some of the betting components that became part of the “instant plays” during the initial part of the pandemic when in-person betting became impossible\nAuden • 2017-10 – 2019-11 • Site Reliability Engineer Technology Used: GO, Node, Docker, C# Built the pipeline and full deployment system for the company, initiated the transition from Azure to AWS,\nBuilt a project bot that allowed developers to start projects, create GitHub repositories, create artifactory links, VSTS (Azure DevOps) pipelines, and initial templates just by asking the bot in Slack to start it\nThe Hut Group (THG) • 2016-03 – 2017-10 • Senior software engineer Technology Used: PHP, Java, GO, Node, Docker, Vagrant I was a senior developer in the content delivery team (blog team), and checkout team, I was one of the main architects behind the blog platform and moving it entirely into AWS, changing it from a dynamic wordpress delivery system to a statically generated one, this took the render and delivery time from 1.2seconds to under 200milliseconds\nI also helped build the deployment dashboard using react so that we could see when deployments were happening, what the status of them was, and if there were any issues (e.g. failing tests)\nRentalcars • 2015-09 – 2016-03 • senior software engineer Technology Used: PHP, GO, Docker, Vagrant, C# I was one of a team of 3 developers that maintained the main booking system, this was the system …","date":1742860800,"expirydate":-62135596800,"kind":"page","lang":"en","lastmod":1742860800,"objectID":"f4243be994d20a5e700df9ef97124b33","permalink":"https://keloran.dev/post/cv/","publishdate":"2025-03-25T00:00:00Z","relpermalink":"/post/cv/","section":"post","summary":"CV and Description Its probably a good idea to have a CV and description of somewhere.\nI have been a software engineer for over 25 years, working on various projects and for some very well known companies.\nPersonal projects All these github orgs are mine, I also recently soft-launched a side project of Flags.gg which is a feature flag system like LaunchDarkly\nLinkedIn My LinkedIn Account\nKeloran My Personal github account\n","tags":null,"title":"CV","type":"post"},{"authors":null,"categories":null,"content":"Flags.gg Launched On 2024-12-24 I soft launched (soft because not all features are finished yet, but enough to get it launched) the service\nThe service is works with the majority of features in place\nLive Features Multi Project\nIf you have a plan that supports multiple projects, then the support exists that flags don’t clash with each other\nMulti Agent\nYou might need multi agents, e.g. a dashboard and a landing page (like flags.gg)\nMulti environment\nYou hopefully will have multiple environments, e.g. production and development\nSecret Menus\nEach environment can have its own secret menu, and its own trigger, so for example development might want to test something, rather than having to goto flags.gg to activate that thing, instead you trigger the secret menu, and turn it on for just you, and since by default secret-menus are disabled, you don’t need to worry about general users turning on features that you havent yet finished but are in production behind a flag\nUser invites, and company invite codes\nYou might need more than you on the the system, in which case you can invite someone onto your company account, and they can maniupulate the flags\nIn Works Features RBAC\nThose people you invited, everyone is currently an admin, this needs to change so that people can have different permissions, granular to the environment\nConflict Flags\nYou might need to have conflict flags, e.g. v1 and v2, well those cant be on at the same time, so turning one on should turn the other off\nEnvironment Promotion\nIf you create a flag in development, then you should be able to promote that flag into production, rather than having to create it again\nTraffic Based Flags\nIf you want 10% if your users to see a feature turned on to test it out, then that should be an option\nServerside Libraries\nYou might want to integrate feature flags into your Go, Python, or NextJS serverside, whilst these wont be secret-menu triggerable they should at least be an option, at the moment only clientside for React/NextJS works, but they will be coming\nVue Library\nAt the moment only React/NextJS is supported, but we are developing a vue library aswell, this is on a slow burn because we don’t use vue internally\nTimeline of future features The timeline for the future features is not set in stone, but they will be coming depending on demand\n","date":1736172625,"expirydate":-62135596800,"kind":"page","lang":"en","lastmod":1736172625,"objectID":"64eacbb20941cc90acae09a831deb059","permalink":"https://keloran.dev/post/flags.gg/","publishdate":"2025-01-06T14:10:25Z","relpermalink":"/post/flags.gg/","section":"post","summary":"Flags.gg Launched On 2024-12-24 I soft launched (soft because not all features are finished yet, but enough to get it launched) the service\nThe service is works with the majority of features in place\nLive Features Multi Project\nIf you have a plan that supports multiple projects, then the support exists that flags don’t clash with each other\nMulti Agent\nYou might need multi agents, e.g. a dashboard and a landing page (like flags.gg)\n","tags":null,"title":"Flags.gg","type":"post"},{"authors":null,"categories":null,"content":"This is a very simple url shortner, it does exactly that\nIt has an increadbly simple API Very simple API\nCreate curl --request POST \\ --url http://api.1tn.pw/create \\ --header \u0026#39;Content-Type: application/json\u0026#39; \\ --data \u0026#39;{ \u0026#34;url\u0026#34;: \u0026#34;https://keloran.dev\u0026#34; }\u0026#39; Returns\n{ \u0026#34;short\u0026#34;: \u0026#34;yJjWqM\u0026#34;, \u0026#34;url\u0026#34;: \u0026#34;https://keloran.dev\u0026#34; } Get curl --request GET \\ --url https://api.1tn.pw/yJjWqM \\ Returns\n{ \u0026#34;long\u0026#34;: \u0026#34;https://keloran.dev\u0026#34; } Github Link\nCompany Site\n","date":1734303787,"expirydate":-62135596800,"kind":"page","lang":"en","lastmod":1734303787,"objectID":"5688014d2f1db188b38e83654243c886","permalink":"https://keloran.dev/current/1tn-pw/","publishdate":"2024-12-15T23:03:07Z","relpermalink":"/current/1tn-pw/","section":"current","summary":"This is a very simple url shortner, it does exactly that\nIt has an increadbly simple API Very simple API\nCreate curl --request POST \\ --url http://api.1tn.pw/create \\ --header 'Content-Type: application/json' \\ --data '{ \"url\": \"https://keloran.dev\" }' Returns\n{ \"short\": \"yJjWqM\", \"url\": \"https://keloran.dev\" } Get curl --request GET \\ --url https://api.1tn.pw/yJjWqM \\ Returns\n{ \"long\": \"https://keloran.dev\" } Github Link\nCompany Site\n","tags":["projects","1tn-pw","chewedfeed"],"title":"1tn.pw","type":"project_current"},{"authors":null,"categories":null,"content":"This is a feature flag system, I have been designing for a few months now,\nit has a few nice features and works in React and NextJS\nit will soft launch on Boxing Day 2024\nImplemented features * NextJS clientside support * React support * multi project * multi agent * multi Environment * secret menus with custom keycombos * golang agent now supports local override of flags Planned features * Flag promotion from dev to production * NextJS server support for reading if flag is enabled * RBAC support Github Link\nCompany Site\n","date":1734217200,"expirydate":-62135596800,"kind":"page","lang":"en","lastmod":1734217200,"objectID":"b0c6535ea4bb58bfc5f752f241e741c9","permalink":"https://keloran.dev/current/flags/","publishdate":"2024-12-15T00:00:00+01:00","relpermalink":"/current/flags/","section":"current","summary":"This is a feature flag system, I have been designing for a few months now,\nit has a few nice features and works in React and NextJS\nit will soft launch on Boxing Day 2024\nImplemented features * NextJS clientside support * React support * multi project * multi agent * multi Environment * secret menus with custom keycombos * golang agent now supports local override of flags Planned features * Flag promotion from dev to production * NextJS server support for reading if flag is enabled * RBAC support Github Link\n","tags":["projects","flags","chewedfeed"],"title":"Flags.gg","type":"project_current"},{"authors":null,"categories":null,"content":"Another project So I decided to create another project, this was mainly to re-learn react, and to get back into the swing of things, so what is it\nWell if you can’t guess by the title, its a todo-list, specifically Todo-List.app\nFeatures Entirly private, encryption happens in browser Storage is only of the encrypted form Login is using Keycloak, so no “real” details are retained Export/Import todo.txt Unfinished features Project support (its a very simple todo, only items and sub-items atm) Github Link\nCompany Site\n","date":1702973884,"expirydate":-62135596800,"kind":"page","lang":"en","lastmod":1702973884,"objectID":"90df9d03f26978e61d37dc4e38c75439","permalink":"https://keloran.dev/current/todo-list/","publishdate":"2023-12-19T08:18:04Z","relpermalink":"/current/todo-list/","section":"current","summary":"Another project So I decided to create another project, this was mainly to re-learn react, and to get back into the swing of things, so what is it\nWell if you can’t guess by the title, its a todo-list, specifically Todo-List.app\nFeatures Entirly private, encryption happens in browser Storage is only of the encrypted form Login is using Keycloak, so no “real” details are retained Export/Import todo.txt Unfinished features Project support (its a very simple todo, only items and sub-items atm) Github Link\n","tags":["todo-list","chewedfeed","projects"],"title":"Todo List","type":"project_current"},{"authors":null,"categories":null,"content":"Cluster Update My kubernetes cluster runs on a mix of RaspberryPI 4s, and x86(AMD64) machines, but because I built it originally with only the raspberrys, my control plane was on a PI\nWell that was working fine for nearly 2 years, but the SD card on the control plane died, which wasn’t a good time\nSo I decided to what I always do, and go nuts\nSpending spree So I purchased a few things to tackle this issue\nDL360g8 This is a server that is slightly overkill, it has 24 cores (2x Xeon E5-2420), and currently 32Gb of RAM (128Gb on order) R715 If the last one was overkill, it has 32cores (2x Opteron 6200), and currently 32Gb of RAM (128Gb on order) DL160g6 This server is mainly used as a database runner, it has 16 cores (2x Xeon L5630), and has 96Gb of RAM EX2200-48p-4g This is a fully managed POE switch, but I am considering changing the entire network to Ubiquity Changes With these purchases I decided to reconfigure the cluster, so rather than 4 worker PIs, 1 control PI, 2 x86 workers I now have the following\n5 Raspberry PI4s as workers DL360g8, as control, and master (4Tb Longhorn) R715, as worker and master (4Tb Longhorn) DL160g6, as database runner ML110g7, as a worker (3Tb Longhorn) N40L, as a worker (2Tb Longhorn) At the same time I switched to a FTTP provider, and now I have 1gb synchronous instead of 1gb/30mb\nHopefully this means I should have less issues, and less downtime\n","date":1679998865,"expirydate":-62135596800,"kind":"page","lang":"en","lastmod":1679998865,"objectID":"e90b8dd7adefbd34b86ea3e62e63d682","permalink":"https://keloran.dev/post/cluster_update/","publishdate":"2023-03-28T11:21:05+01:00","relpermalink":"/post/cluster_update/","section":"post","summary":"Cluster Update My kubernetes cluster runs on a mix of RaspberryPI 4s, and x86(AMD64) machines, but because I built it originally with only the raspberrys, my control plane was on a PI\nWell that was working fine for nearly 2 years, but the SD card on the control plane died, which wasn’t a good time\nSo I decided to what I always do, and go nuts\nSpending spree So I purchased a few things to tackle this issue\n","tags":["kubernetes"],"title":"Cluster Update","type":"post"},{"authors":null,"categories":null,"content":"Old iPads with a Modern Use I have gone quite heavy into home automation, not too extreme (mainly because I don’t have a lot of automated products) but enough that it has made an impact on my life, I have the following automations\nAutomatic lights in a few rooms Kitchen: the light comes on when you enter the room, and only turns off after it has been vacant for 5 minutes (if your stood at the stove and haven’t moved much I don’t want the light to go off) Dining Room: light comes on when you go past a sensor in the hall/stairs (there isn’t a sensor in the dining room) Living Room: light comes on when you enter the room, and goes off if there is no activity for 5 minutes and the TV isn’t on (sat at the sofa watching something shouldn’t turn the lights off) Stairs: Turn on when you enter the stairs either from the top or the bottom, turn off after 1 minute of no activity Bedroom: Turn on in the morning, turn off when everyone “should” have left the bedroom Future plans There are plans for future automations, every room has a temperature sensor in it, and will have wall heaters (I live in the UK) that turn on when the sensor detects the temperature not the heater detecting the temperature, this is to avoid it thinking “I’m nice and warm and 10ft from the nearest person screw them”\nWhere do the iPads come in I decided that it would be nice to have a way of controling the house on a simple interface, now I can just get wireless buttons that do things, I have automatic light switches, so thats not a problem, but what if you want to know the temperature, or want to know the house calendar items, well thats where a visual interface comes in\nEveryone in the house has a phone that is connected to HomeAssistant but I want something that isn’t required to be on the network or know the address (e.g. if a guest wants to turn the heater on)\nSo with that I have decided to stick an iPad on the wall in every room in the house, not just a tablet specificly an iPad, well that was a fun idea\nWhats the problem I went on eBay and set about getting cheap used iPads these were the following “so far”\n1 iPad 1st gen (iOS 5.1) 2 iPad 2nd gen (iOS 9.3) 1 iPad 3rd gen (iOS 9.3) 1 iPad Mini 1st gen (iOS 9.3) 1 iPad Mini 2nd gen (iOS 12.5) I got all of these for a grand total of ₤100, which is cheaper (at time of writing) than 2 raspberry pi’s, that doesn’t sound too bad, well anything below iOS 10 can’t interface with Home Assistant due the way the website is written, infact most websites written in the last 3 years can’t really be accessed from these devices\nSo how to solve this issue, VNC is your friend, pretty much every device needs a web connection to home assistant, so for each of them there is a seperate headless VNC server running Firefox this then runs on my kubernetes cluster, then the issue is getting VNC on the devices, well because I don’t want these iPds on my or the families apple account, they are on a seperate account\nSo the latest iOS iPad can still (for now) download apps from the app store, all the others are jailbroken with the only app really installed is an app called aDowngrader what this allows me to do is download VNC on the latest iOS, then on the older iPads it pulls the version that is the oldest compatiable with that iPad\nI then run VNC on these in “touch panel” mode, which means there isn’t a cursor, and it behaves as you would expect a native iPad to behave\nNow I can run a newer version of Firefox that the iPad supports without worry (or at least not the worry of that)\nExploding Batteries Another “fun” part about iOS is that it didn’t have any over-voltage/battery protection until iOS 11.3 so Home assistant also has the following automation setup\nDetect the battery percentage as reported by Apple using “find my” If the battery is below 20% turn on the plug used to charge the iPad If the battery is above 80% turn off the plug used to charge the iPad The optimal amount of fill most batteries if they are plugged in all the time is about 80% so this has a buffer to turn on and off the plug\nRecomendations If you were to do this, and you don’t care about e-waste then I would say get a cheap Fire tablet from Amazon and do it that way, if on the other hand you want to avoid throwing away devices that “should” be fine to access websites, that is how you do it\n","date":1675503477,"expirydate":-62135596800,"kind":"page","lang":"en","lastmod":1675503477,"objectID":"6c745eaf4eed76c2099dde12341c7cb4","permalink":"https://keloran.dev/post/ipads/","publishdate":"2023-02-04T09:37:57Z","relpermalink":"/post/ipads/","section":"post","summary":"Old iPads with a Modern Use I have gone quite heavy into home automation, not too extreme (mainly because I don’t have a lot of automated products) but enough that it has made an impact on my life, I have the following automations\nAutomatic lights in a few rooms Kitchen: the light comes on when you enter the room, and only turns off after it has been vacant for 5 minutes (if your stood at the stove and haven’t moved much I don’t want the light to go off) Dining Room: light comes on when you go past a sensor in the hall/stairs (there isn’t a sensor in the dining room) Living Room: light comes on when you enter the room, and goes off if there is no activity for 5 minutes and the TV isn’t on (sat at the sofa watching something shouldn’t turn the lights off) Stairs: Turn on when you enter the stairs either from the top or the bottom, turn off after 1 minute of no activity Bedroom: Turn on in the morning, turn off when everyone “should” have left the bedroom Future plans There are plans for future automations, every room has a temperature sensor in it, and will have wall heaters (I live in the UK) that turn on when the sensor detects the temperature not the heater detecting the temperature, this is to avoid it thinking “I’m nice and warm and 10ft from the nearest person screw them”\n","tags":["home assistant","ipad"],"title":"Old iPads Modern Use","type":"post"},{"authors":null,"categories":null,"content":"Inverse Images in Mailspring So I run most apps in darkmode, and this can lead to a few issues, namely in Mailspring which does darkmode in the “easy” method, which is to inverse(100%) everything now this makes general emails really easy, the problem is when you get to images, because inversed images are horrible to look at\nSo I got bored over new year, and decided I was sick of looking at them, and because I use Dracula for everything, I set off on my journey\nDracula Now Dracula is an awesome set of themes, that has pretty much support in every app that most devs use, if it doesnt then its probably coming soon\nMailspring Mailspring is an email client that was started by the people who did N1, which is another mail client, the reason I use it is because non webmail clients are becoming harder and harder to find and this one also supports Gmail, iCloud, and most important to me IMAP\nThe Journey begins The problem of inverse images has existed in mailspring for a while, and there is no easy solution for this, and the “fix” I implemented is not a solution by any stretch of the imagination, it is a bandaid\nThe first thing I did was look at how the them did its thing, I was hoping it was a sensible method of doing style replacement, or a clever method of doing the same thing, instead if like all darkmode in Mailspring was doing inverse(100%) on email content this is not good, because it means every element is inversed and I had to re-inverse or stop the inversion on images\nSo that was the intial tact find the “img” tags and stop the inversion, this worked and was a lot easier than I thought, horray, so clicked through some emails and everything seemed fine, that was until I got to an email that was using “background-image” and now the problem exited again, damn it\nI wasn’t the first to notice that background image inversion was nasty, it was spotted reported in 2018 and in 2021 it was moved to the forum, so this bug has existed for a while\nLuckly because Mailspring supports themes and plugins and is written in electron, I can hijack the element and inject some JS into it, so I did it with brute force and got it working\nexport default class BackgroundImageFix extends MessageViewExtension { static renderedMessageBodyIntoDocument({document, message, iframe}) { const frameDocument = iframe.contentWindow.document; const tags = frameDocument.querySelectorAll(\u0026#34;*\u0026#34;); tags.forEach(tag =\u0026gt; { let fixInvert = false; if (getComputedStyle(tag).backgroundImage !== \u0026#39;none\u0026#39;) { fixInvert = true; } if (tag.tagName === \u0026#34;IMG\u0026#34;) { fixInvert = true; } // using this method so more can be added later if (fixInvert) { tag.style.filter = \u0026#34;invert(1)\u0026#34;; tag.style.color = \u0026#34;#000\u0026#34;; } }) } } Released Now this method is not good, its very system intensive, but it works, and it gets destroyed and re-initiated on each mail opened, which is the nature of the plugins in mailspring\nBut it works, and is now part of the Dracula official theme for Mailspring\n","date":1673302797,"expirydate":-62135596800,"kind":"page","lang":"en","lastmod":1673302797,"objectID":"9ac9c911b22d0a8e44b2e23fe8d955bd","permalink":"https://keloran.dev/post/mailspring_inverse/","publishdate":"2023-01-09T22:19:57Z","relpermalink":"/post/mailspring_inverse/","section":"post","summary":"Inverse Images in Mailspring So I run most apps in darkmode, and this can lead to a few issues, namely in Mailspring which does darkmode in the “easy” method, which is to inverse(100%) everything now this makes general emails really easy, the problem is when you get to images, because inversed images are horrible to look at\nSo I got bored over new year, and decided I was sick of looking at them, and because I use Dracula for everything, I set off on my journey\n","tags":["darkmode","Mailspring","Dracula"],"title":"Mailspring Inverse Images","type":"post"},{"authors":null,"categories":null,"content":"Well that was annoying So I run arch on my framework, and because I’m slightly an idiot I didn’t have linux/linux-headers in the do not upgrade filter, now thats a lesson I won’t forget soon\nI did the standard upgrade, which brought with it the latest (5.9.12) kernel with it, wish I remembered it did that, because when I rebooted, my display no longer worked, and once it got to sway, and didn’t initiate the eGPU, my FPS on sway was about 0.000005 so impossible to do anything\nNow I thought oh, I’ve been messing with sway configs, and eGPU settings since I last rebooted, it’s prob me being an idiot so ill SSH in, and then delete the sway config, and see if that fixes it NOPE, awesome, guess it’s something else\nA journey of pain Decided it was prob a good idea to flash my machine, meant I could go back to ext4 and not use systemd-homed (which caused other issues see previous posts)\nbooted into the latest live version of endevour and it works, cool, ill flash\nrebooted and nope display no longer works, WTF\nokay maybe its because its because I did a connected install and it grabbed a version of the GPU driver that was bad, NOPE\nnow to spend the next 16h not thinking its the kernel thats broken, I mean i915 is on every single intel cpu (that has built in graphics) they cant have broken it for that, I mean thats got so much test coverage and the patches for i915 are actually made my intel themselves\nThe kernel is fucked So fine i’ll see what version of kernel is on the live version, 5.9.6, okay what version is installed when I do an install 5.9.12\ntime to look at the changelog, and 5.9.12 had a change in the i915 module, right lets see what happens if I install and then force downgrade in chroot to 5.9.11\nsudo pacman -U https://archive.archlinux.org/packages/l/linux/linux-5.19.11.arch1-1-x86_64.pkg.tar.zst sudo pacman -U https://archive.archlinux.org/packages/l/linux-headers/linux-headers-5.19.11.arch1-1-x86_64.pkg.tar.zst HALLELUJAHj\nit works\nGuess I won’t be upgrading to kernel 6 that released today unless they have reverted that patch\nAdd linux/linux-headers to ignore Update the line in /etc/pacman.conf\nIgnorePkg = linux-headers linux\n","date":1664806101,"expirydate":-62135596800,"kind":"page","lang":"en","lastmod":1664806101,"objectID":"6cf6f39a7ebd95ffad59b9c8a5ebd061","permalink":"https://keloran.dev/post/broken_i915/","publishdate":"2022-10-03T15:08:21+01:00","relpermalink":"/post/broken_i915/","section":"post","summary":"Well that was annoying So I run arch on my framework, and because I’m slightly an idiot I didn’t have linux/linux-headers in the do not upgrade filter, now thats a lesson I won’t forget soon\nI did the standard upgrade, which brought with it the latest (5.9.12) kernel with it, wish I remembered it did that, because when I rebooted, my display no longer worked, and once it got to sway, and didn’t initiate the eGPU, my FPS on sway was about 0.000005 so impossible to do anything\n","tags":["linux","framework"],"title":"Broken i915","type":"post"},{"authors":null,"categories":null,"content":"Premise So I decided to switch my home directory to use systemd-homed, now this is a cool system that works with btrfs and does snapshoting built in, this led to a few issues though\nIssue So because of the way containerd and buildkit use squashfs it can’t submount inside the homed directory\nFix If you have multiple hdds then this is easier, if not your gonna have to create a directory on your system, doing it where I did it is not a good idea, but I’m not an expert\nsudo mkdir /builds sudo chown keloran:keloran builds ln -s /builds /home/keloran/.local/share/buildkit Hopefully Fixed Hopefully you can now build again\n","date":1661261649,"expirydate":-62135596800,"kind":"page","lang":"en","lastmod":1661261649,"objectID":"3debfb86f71275dd701d8b5661d1d091","permalink":"https://keloran.dev/post/systemd-homed-buildkit/","publishdate":"2022-08-23T14:34:09+01:00","relpermalink":"/post/systemd-homed-buildkit/","section":"post","summary":"Premise So I decided to switch my home directory to use systemd-homed, now this is a cool system that works with btrfs and does snapshoting built in, this led to a few issues though\nIssue So because of the way containerd and buildkit use squashfs it can’t submount inside the homed directory\nFix If you have multiple hdds then this is easier, if not your gonna have to create a directory on your system, doing it where I did it is not a good idea, but I’m not an expert\n","tags":["framework","nerdctl","arch","linux"],"title":"Systemd Homed Buildkit","type":"post"},{"authors":null,"categories":null,"content":"ArchLinux NerdCTL Arch is a lot like Slackware and Gentoo, whilst it does have a package manager, you have to know what you want before things work\nso NerdCTL has the ability to use buildkit to install stuff on multi-arch but that isn’t as easy as you would like and as such there are a few things that need installing to make it work\nSteps This will need YAY (well there are others but if you copy paste then its yay)\nInstall yay -S nerdctl kubectl qemu-user-static rootlesskit slirp4netns buildkit\nSetup sudo loginctl enable-linger $(whoami) sudo vi /etc/sysctl.d/99-rootless.conf\nkernel.unprivileged_userns_clone=1 net.ipv4.ping_group_range = 0 2147483647 net.ipv4.ip_unprivileged_port_start=0 sudo touch /etc/subuid /etc/subgid sudo sudo usermod --add-subuids 100000-165535 --add-subgids 100000-165535 $(whoami)\nRootless containerd-rootless-setuptool.sh install \u0026amp;\u0026amp; containerd-rootless-setuptool.sh install-buildkit\nsystemctl enable --user --now containerd \u0026amp;\u0026amp; systemctl enable --user --now buildkit\nContainerd needs to also be run as root in order to do multi-arch sudo systemctl enable --now containerd sudo nerdctl run --privileged --rm tonistiigi/binfmt --install all\n[Unit] Description=MultiArch After=containerd.service [Service] Type=simple ExecStart=nerdctl run --privileged --rm tonistiigi/binfmt --install all \u0026gt; /dev/null [Install] WantedBy=multi-user.target sudo systemctl enable --now multi-arch\nReason This is mainly for me so I have a backup of the requirements for next time I need to install it\n","date":1650991310,"expirydate":-62135596800,"kind":"page","lang":"en","lastmod":1650991310,"objectID":"2750e9c17f8c3a65600b8ddd50a826b9","permalink":"https://keloran.dev/post/nerdctl_archlinux/","publishdate":"2022-04-26T17:41:50+01:00","relpermalink":"/post/nerdctl_archlinux/","section":"post","summary":"ArchLinux NerdCTL Arch is a lot like Slackware and Gentoo, whilst it does have a package manager, you have to know what you want before things work\nso NerdCTL has the ability to use buildkit to install stuff on multi-arch but that isn’t as easy as you would like and as such there are a few things that need installing to make it work\nSteps This will need YAY (well there are others but if you copy paste then its yay)\n","tags":["framework","nerdctl","arch","kubernetes","linux"],"title":"NerdCTL on ArchLinux","type":"post"},{"authors":null,"categories":null,"content":"Framework Laptop My MBP decided the touchbar and bridgeos was going to basiclly blow up, so because of this I decided it was time I tried to daily drive linux again\nI bought a framework laptop with the following specs\ni7-1165G7 64Gb DDR4-3200 1TB SN850 US Keyboard UK PowerSupply Expansions MicroSD 250Gb DisplayPort 2x USB-C USB-A I decided to get the UK powersupply so that my wife could keep using my MBPs for her work laptop and it means that I have a pretty small power supply that can also be used with my soldering iron\nOrder Experience So I wouldn’t say that purchasing the laptop was the smoothest experience, I put this down to the fact that the company hasn’t been around for very long, there is a war going on, and there is a global chip shortage, and a pandemic is still going on, but some of the communication could have been better\nSo I ordered my laptop on the 4th of March (I originally ordered on the 15th of Feb, but had to cancel that order) the “Batch” I was in was supposed to be delivered at the end of March\nI experienced a few delays,\non the 31st of March, I got an email saying that due to a covid issue, the packaging, and at the same time a national holiday in Taiwan, so my order would be delayed for at least 4 days on the 8th of April, I got an email saying that due to the global chip shortage my hdd wasn’t in stock, and my ordered would be delayed for at least 4 more days You will have noticed that 4 days seem to be missing on when there was no communication of if my order was being dealt with, I finally got a shipping notice on 13th and then my laptop arrived on the 20th\nLaptop Experience I decided that because I was going to daily drive Linux, I went with EndevourOS as my dist of choice, this is based on Arch with a few tweaks\nI went with XFCE as my DE, but quickly decided to change to Sway, now what I should have done is reinstalled the OS with Sway as a choice, because Endevour has a Sway option which could have saved my some time, but all of my stuff works despite doing it manually when I didn’t have to\nI hit one big problem which is that my eGPU didn’t/doesn’t really work with the laptop this is more of a linux issue, because people have got it working fine on Windows, so I am instead using an Anker Apex as my dock to connect to my peripherals, and a thunderbolt-\u0026gt;displayport\nnow you might be thinking why am I not using the displayport expansion card, well at the same time as this happening my new work laptop arrived which is an M1 and cant use the eGPU at all, so in order to swap between I went with a cable so that I could use the full resolution (Apex doesnt support 5120x1440 over HDMI)\nRecommendation Would I recommend a Framework laptop, I would have to say yes and no, if you need a laptop tomorrow, then no a Framework laptop won’t arrive in time, if you want something that has some cool features and an okay keyboard and an interesting aspect ratio screen then yes\n","date":1650963764,"expirydate":-62135596800,"kind":"page","lang":"en","lastmod":1650963764,"objectID":"d1e1dd29ac9a26a899c4fbd3a60ef963","permalink":"https://keloran.dev/post/framework_laptop/","publishdate":"2022-04-26T10:02:44+01:00","relpermalink":"/post/framework_laptop/","section":"post","summary":"Framework Laptop My MBP decided the touchbar and bridgeos was going to basiclly blow up, so because of this I decided it was time I tried to daily drive linux again\nI bought a framework laptop with the following specs\ni7-1165G7 64Gb DDR4-3200 1TB SN850 US Keyboard UK PowerSupply Expansions MicroSD 250Gb DisplayPort 2x USB-C USB-A I decided to get the UK powersupply so that my wife could keep using my MBPs for her work laptop and it means that I have a pretty small power supply that can also be used with my soldering iron\n","tags":["framework","laptop","arch","linux"],"title":"Framework Laptop","type":"post"},{"authors":null,"categories":null,"content":"Mistakes were made Well I’ve had a fun weekend, on one side I “finally” caught covid and as such my concentration levels were very low, now that doesn’t make up for what I did but at least I have 1/2 an out\nWhat happened I decided to do a little cleaning up of my kubernetes cluster, and decided that I should remove some deployments that weren’t in use, that was going fine, but then I decided to try and move some of the things that were more “central” to their correct namespace,\ncorrect is a probably the wrong word, since I do kind of follow the principle of a namespace for a service rather than a namespace for a project (e.g. all of chewedfeed\u0026#39;s stuff goes in the chewedfeed one, some things should be seperate if they are used by multiple things)\nWhich is where it went wrong, I have/had a habit of including kind: Namespace in my manifests now this can be a good idea, but I tried out a deployment, and switched it to use my namespace: chewedfeed which wouldn’t be an issue if I hadn’t then run kubectl delete -f manifest.yml which included the namespace-kind\nAnd up in smoke went the chewedfeed namespace, which also took out the PVCs, which included the one for Keycloak, which has a few undocumented “features” one of which is that getting integration in Go is not the easiest thing\nLeasons Learnt Don’t include kind: Namespace in my manifests and make that a separate manifest so it’s harder to delete a namespace in the future\nBecause I wiped out my keycloak instance, I decided it would be a good idea to update to v17, this is proving even harder to integrate with Go, but thats because the undocumented features defenatlly don’t work on this version\nSo now I am in the process of spending time trying to get v17 to work with Go, and see if I can get retro-board back on track\n","date":1647295950,"expirydate":-62135596800,"kind":"page","lang":"en","lastmod":1647295950,"objectID":"35d2c625c143d4a5764ecea532b717ee","permalink":"https://keloran.dev/post/mistakes/","publishdate":"2022-03-14T22:12:30Z","relpermalink":"/post/mistakes/","section":"post","summary":"Mistakes were made Well I’ve had a fun weekend, on one side I “finally” caught covid and as such my concentration levels were very low, now that doesn’t make up for what I did but at least I have 1/2 an out\nWhat happened I decided to do a little cleaning up of my kubernetes cluster, and decided that I should remove some deployments that weren’t in use, that was going fine, but then I decided to try and move some of the things that were more “central” to their correct namespace,\ncorrect is a probably the wrong word, since I do kind of follow the principle of a namespace for a service rather than a namespace for a project (e.g. all of chewedfeed's stuff goes in the chewedfeed one, some things should be seperate if they are used by multiple things)\n","tags":["kubernetes"],"title":"Mistakes Were Made","type":"post"},{"authors":null,"categories":null,"content":"Retro Board Update Well after a couple of months of coding ive got about 50% through doing reto-board, major progress has been made, it is now techniclly possible to sign up for it,\nyou can’t yet make any boards, but there an example version of what a board will look like non of the functionality works in the example\nit took quite a while for me to get the login to work, and the main reason to that is undocumented bits that I had to get working myself, for example “can I do this / userAllowed” is not a standard feature it seems at least not in the golang libraries for keycloak, so I had to go down a very long and winding path\nFeatures that exist At the moment, you can login, the first person to login with a google-suite account (only google-suite works at the moment)\nOnce logged in, the first person who logs in can\ncreate a company, that company will then allow anyone using the domain/google-suite to be part of that same company create a subdomain, this is more of a visual and linking purpose, it doesn’t auto filter on the subdomain for a matching domain in your company, that done through keycloak\nThis was done using kubernetes ingress, which is not as simple as you might hope, but a lot easier than messing with nginx directly The subdomain part was pretty tricky, I had to learn some more kubernetes stuff, but that allows me to progress with another project that I have in the works but thats news for later\nFeatures being worked on Board creation Role assignment, at the moment the first person gets a “Owner” status, and everyone else gets “User” status, but that will be changable later Creation of the board items Timer creation Future features Github login integration to work out which github organisation you are part of Microsoft login integration Other Keycloak compatible login integrations ","date":1645278620,"expirydate":-62135596800,"kind":"page","lang":"en","lastmod":1645278620,"objectID":"f6e89b73b2cbe1a71259cd6806dcf7a2","permalink":"https://keloran.dev/post/retro-board-update/","publishdate":"2022-02-19T13:50:20Z","relpermalink":"/post/retro-board-update/","section":"post","summary":"Retro Board Update Well after a couple of months of coding ive got about 50% through doing reto-board, major progress has been made, it is now techniclly possible to sign up for it,\nyou can’t yet make any boards, but there an example version of what a board will look like non of the functionality works in the example\nit took quite a while for me to get the login to work, and the main reason to that is undocumented bits that I had to get working myself, for example “can I do this / userAllowed” is not a standard feature it seems at least not in the golang libraries for keycloak, so I had to go down a very long and winding path\n","tags":["retro-board","projects"],"title":"Retro Board Update","type":"post"},{"authors":null,"categories":null,"content":"K3OS K3OS is kinda self explanitory if you know what K3s is, if not then k3OS is Rancher’s k3s which is a kubernetes compatible version but a lot smaller\nWhy did I tell you that Well now that bit is out of the way, I upgraded ubuntu on one of my raspberry pi 3’s, and at the same time upgraded k3s to the latest version, and that pi became almost impossible to use with kubernetes, pods failing all the time,\nsince I needed to wipe it anyway, and possibly replace with a pi4 (which are harder to find than rocking-horse-{redacted}) why not give k3os a shot, this is where the fun began\nDocumentation So the documentation for k3os isnt the best, its a beta os for a reason, so I didn’t expect the docs to be perfect, but I kinda wanted some instructions, hehe\nTime to go looking for a guide on the web, and a guide I found but slightly out of date at this point, it pointed to a project that can build in image easily\nUnfortunately it was also out of date, so I have forked it and done some slight changes\nChanges I have added The only real changes I made are updating the base images and adding a latest option for K3OS_VERSION\nSo whats it like Well it performs a lot better than ubuntu, the biggest issue is that it doesn’t appear to have a few things that I would prefer to be there, those can be added by altering the base image, one of the things ive added to the script,\nbut haven’t tested yet is rsyslog, if that does work (I’ll test it when I create my 2nd set of pi’s for the cluster, using k3os rather than ubuntu) excellent\nThe other “big” issue is that there doesn’t appear to be a way of setting an IP address, now that shouldn’t really matter, since my local DNS server can just point at it, but I would prefer to have an option of giving it a fixed IP\n","date":1644169964,"expirydate":-62135596800,"kind":"page","lang":"en","lastmod":1644169964,"objectID":"ded0477b22312adbfd7d85716cfede29","permalink":"https://keloran.dev/post/k3os/","publishdate":"2022-02-06T17:52:44Z","relpermalink":"/post/k3os/","section":"post","summary":"K3OS K3OS is kinda self explanitory if you know what K3s is, if not then k3OS is Rancher’s k3s which is a kubernetes compatible version but a lot smaller\nWhy did I tell you that Well now that bit is out of the way, I upgraded ubuntu on one of my raspberry pi 3’s, and at the same time upgraded k3s to the latest version, and that pi became almost impossible to use with kubernetes, pods failing all the time,\nsince I needed to wipe it anyway, and possibly replace with a pi4 (which are harder to find than rocking-horse-{redacted}) why not give k3os a shot, this is where the fun began\n","tags":["kubernetes"],"title":"K3OS","type":"post"},{"authors":null,"categories":null,"content":"Issue So you are already using RancherDesktop and NerdCTL from the betas congrats, but you want to use the multi-platform build\nso you need to update Rancher and Nerd, well thats where the issue exists, Lima doesnt update NerdCTL automatically so you need to update your instances version\nFix First you need to get into the instance\nLIMA_HOME=/Users/\u0026lt;username\u0026gt;/Library/Application\\ Support/rancher-desktop/lima \\ /Applications/Rancher\\ Desktop.app/Contents/Resources/resources/darwin/lima/bin/limactl \\ shell 0 sudo --preserve-env=CONTAINERD_ADDRESS sh Now that your in the instance, you need to update NerdCTL\nI always make a copy of the original version just incase\ncd /usr/local/bin/ cp nerdctl nerdctl-old Now update nerdctl the download is different on M1 so go to NerdCTL Releases and choose the latest one\ncd /usr/local/bin wget https://github.com/containerd/nerdctl/releases/download/v0.16.1/nerdctl-0.16.1-linux-amd64.tar.gz tar -xf nerdctl-0.16.1-linux-amd64.tar.gz rm nerdctl-0.16.1-linux-amd64.tar.gz Now if you go onto a seperate terminal and do nerdctl -v you should now have the latest version of NerdCTL installed\nSomething to remember If you are using NerdCTL to build multi-platform images, then remember to add --all-platforms to your push command\n","date":1643885216,"expirydate":-62135596800,"kind":"page","lang":"en","lastmod":1643885216,"objectID":"9dcbbd5d806367723e4c918cbf6929ce","permalink":"https://keloran.dev/post/nerdctl/","publishdate":"2022-02-03T10:46:56Z","relpermalink":"/post/nerdctl/","section":"post","summary":"Issue So you are already using RancherDesktop and NerdCTL from the betas congrats, but you want to use the multi-platform build\nso you need to update Rancher and Nerd, well thats where the issue exists, Lima doesnt update NerdCTL automatically so you need to update your instances version\nFix First you need to get into the instance\nLIMA_HOME=/Users/\u003cusername\u003e/Library/Application\\ Support/rancher-desktop/lima \\ /Applications/Rancher\\ Desktop.app/Contents/Resources/resources/darwin/lima/bin/limactl \\ shell 0 sudo --preserve-env=CONTAINERD_ADDRESS sh Now that your in the instance, you need to update NerdCTL\n","tags":["nerdctl","kubernetes","macOS"],"title":"Update NerdCTL on RancherDesktop macOS","type":"post"},{"authors":null,"categories":null,"content":"Integrating Vault with 1Password in Kubernetes I decided that I should probably get a real handle on my passwords and secrets in kubernetes, since kubernetes is not very good at keeping secrets\nSo I don’t generally take a helm chart or kube-schema at face value, this has more to do with I prefer to keep things in their own namespace rather than in “default”, because of this I tend to clone the chart first\nMy kubernetes cluster is both ARM64 and AMD64 as such, I try to only run things that have both sets of images, but if there is no ARM version then I have a fallback at least, I also use longhorn as my storage solution becuase of its ability to adapt\nHow I got it working The following is all steps that I took, they aren’t perfect, but it is working\nInstall Vault I used helm for this, with my own twist\nserver: resources: requests: memory: 256Mi limits: memory: 512Mi dataStorage: enabled: true storageClass: longhorn auditStorage: enabled: true storageClass: longhorn ui: enabled: true serviceType: LoadBalancer externalPort: 80 standalone: config: | ui = true listener \u0026#34;tcp\u0026#34; { tls_disable = 1 address = \u0026#34;[::]:8201\u0026#34; cluster_address = \u0026#34;[::]:8201\u0026#34; } storage \u0026#34;file\u0026#34; { path = \u0026#34;/vault/data\u0026#34; } plugin_directory = \u0026#34;/vault/data/plugins\u0026#34; helm install vault hashicorp/vault --namespace vault -f vault.yml this enables me to use longhorn’s storage class, and turns on the UI\nInstall OnePassword Connect The guide is pretty good on there, the only difference is I wanted it installed in the Vault namespace\nhelm install connect 1password/connect \\ --set-file connect.credentials=1password-credentials.json \\ --namespace vault Install OnePassword Vault Backend I did this part quite different, because I’m using longhorn as my storage I know that its persistent so I can login to the vault image and change the file structure\nSo the first thing I did was go into the kubernetes dashboard (rather than doing it through terminal direct, and mounting it as a proxy), and then opened a terminal into the vault pod\nBecause I have my vault running on ARM nodes, I wget the ARM zip, unzipped into the correct folder, renamed the file that comes out of the zip to op-connect, rather than vault-plugin-secrets-onepassword_v1.0.0\nThen I followed the instructions in the guide\nAs I say this isn’t a perfect guide, but hopefully it helps others and me when I rebuild my cluster in the future\n","date":1641834844,"expirydate":-62135596800,"kind":"page","lang":"en","lastmod":1641834844,"objectID":"1f14f1c351bc9537b07241be0f3a39b7","permalink":"https://keloran.dev/post/1password_vault_kubernetes/","publishdate":"2022-01-10T17:14:04Z","relpermalink":"/post/1password_vault_kubernetes/","section":"post","summary":"Integrating Vault with 1Password in Kubernetes I decided that I should probably get a real handle on my passwords and secrets in kubernetes, since kubernetes is not very good at keeping secrets\nSo I don’t generally take a helm chart or kube-schema at face value, this has more to do with I prefer to keep things in their own namespace rather than in “default”, because of this I tend to clone the chart first\n","tags":["1password","kubernetes"],"title":"Integrating Vault with 1Password in Kubernetes","type":"post"},{"authors":null,"categories":null,"content":"Retro Board Well I’ve started another project, retro-board.it this is just going to be a very simple app, that has a couple of options\nInitial Signin Ask the user what the Company name is, this is to create a subdomain with that company name (if it doesnt already exist) - if the company name already exists then enter the password for the domain Ask the user for a Team name Ask if they would like to use single sign-on (Google | Github) or accounts Team Board Setup The team board starts with the following options\nA table with the following headers - Good | Bad | Continue - they can change these to something else How many votes per column per person are allowed - default: 3 votes per person, per column How long topic creation should be - default: 5min How long topic discussions should be - default: 5min Sprint Leader - default: dictated at setup - can be chosen at “new retro” Initial Usage Sprint leader starts the board once everyone has logged in, everyone can create topics - topics are hidden from each other to stop influence of topic discussion, if the sprint leader presses the stop button, or the timer runs out (at 30 seconds a button appears to extend time by 1min) there is an option to finish your ticket if you have one in draft after all drafts are finished, the topics are un-hidden and the leader can group the topics once the topics have been grouped (if needed to be grouped), leader can press the “start vote button” each user then can do the number of votes per column allowed (multiple votes per topic allowed) {you can also remove a vote} - votes are hidden during voting when voting timer runs out, or everyone has done their votes (+ 30 seconds to let people change their mind) votes are shown and highest voted topics are sorted by highest number leader chooses a topic to talk about and timer begins (at 30 seconds a button appears to extends the time by 1min) at end of timer, leader has an option to create an action (e.g. better biscuits) once all topics have been discussed a tally is made of the topics and a score is given for the sprint, - +1 for continue - +2 for good - -1 for bad Future Usage This performs the same as initial the only difference is that before the topic creation can begin, the list of actions from last retro are displayed to see if they have been performed, and if not they are auto rolled into the actions for this retro\nGithub Site\nCompany Site\n","date":1638804696,"expirydate":-62135596800,"kind":"page","lang":"en","lastmod":1638804696,"objectID":"a9a2791b21c5d3570ab8ed8fa79f8325","permalink":"https://keloran.dev/backburner/retro-board/","publishdate":"2021-12-06T15:31:36Z","relpermalink":"/backburner/retro-board/","section":"backburner","summary":"Retro Board Well I’ve started another project, retro-board.it this is just going to be a very simple app, that has a couple of options\nInitial Signin Ask the user what the Company name is, this is to create a subdomain with that company name (if it doesnt already exist) - if the company name already exists then enter the password for the domain Ask the user for a Team name Ask if they would like to use single sign-on (Google | Github) or accounts Team Board Setup The team board starts with the following options\n","tags":["retro-board","projects","chewedfeed"],"title":"Retro Board","type":"project_current"},{"authors":null,"categories":null,"content":"Well I made Kubernetes cluster using Raspberry PIs, I largely followed the guide RasperryPI 4 Cluster\nIt has the following features\n5 Raspberry Pi 4s, 4Gb RAM 1 DualCore x64, 16Gb RAM 1 DualCore x64, 4Gb RAM 4Tb storage distributed over the whole cluster ClusterCTRL, this is so power goes through the backplane rather than having 5 seperate power sources Things that are using the cluster, well this site for one\n","date":1634204393,"expirydate":-62135596800,"kind":"page","lang":"en","lastmod":1634204393,"objectID":"23a356137af499b51df80072d778d216","permalink":"https://keloran.dev/post/raspberrypi_cluster/","publishdate":"2021-10-14T10:39:53+01:00","relpermalink":"/post/raspberrypi_cluster/","section":"post","summary":"Well I made Kubernetes cluster using Raspberry PIs, I largely followed the guide RasperryPI 4 Cluster\nIt has the following features\n5 Raspberry Pi 4s, 4Gb RAM 1 DualCore x64, 16Gb RAM 1 DualCore x64, 4Gb RAM 4Tb storage distributed over the whole cluster ClusterCTRL, this is so power goes through the backplane rather than having 5 seperate power sources Things that are using the cluster, well this site for one\n","tags":["kubernetes","raspberrypi"],"title":"RaspberryPI cluster","type":"post"},{"authors":null,"categories":null,"content":"This is a bug tracking system, any time an error happens on your site it tells bugfixes in the agent for your language,\nthen if the error occurs quickly or once in a while it informs the user some how\nnothing is public yet (the javascript version released needs fixing)\nPlanned languages supported * Go * Javascript * Swift Planned notification systems * Auto-create tickets * Jira * YouTrack * Jetbrains Space * GitHub * Channel messages * Slack * Microsoft Teams * Jetbrains Space * Email GitHub Link\nCompany Site\n","date":1634133944,"expirydate":-62135596800,"kind":"page","lang":"en","lastmod":1634133944,"objectID":"bde31b2c2f514735ecb3fbe9254af441","permalink":"https://keloran.dev/backburner/bugfixes/","publishdate":"2021-10-13T15:05:44+01:00","relpermalink":"/backburner/bugfixes/","section":"backburner","summary":"This is a bug tracking system, any time an error happens on your site it tells bugfixes in the agent for your language,\nthen if the error occurs quickly or once in a while it informs the user some how\nnothing is public yet (the javascript version released needs fixing)\nPlanned languages supported * Go * Javascript * Swift Planned notification systems * Auto-create tickets * Jira * YouTrack * Jetbrains Space * GitHub * Channel messages * Slack * Microsoft Teams * Jetbrains Space * Email GitHub Link\n","tags":["bugfixes","projects","chewedfeed"],"title":"BugFix.es","type":"project_current"},{"authors":null,"categories":null,"content":"This project is so that I can deploy projects into my cluster using github pipelines\nnow that sounds simle enough, except there aren’t any (from my limited research) deployment agents for kubernetes that work on arm\nSo whats my plan, well this system works thus\nMethod There is a github action that is triggered in your pipeline, this talks to an orchestrator on k8sdeploy\nthe orchestrator then sends a message to a queue with a topic for an agent that has been registered by you for your cluster\nthe agent in the cluster listens to the queue for instructions to go get a new deployment, the agent then goes and grabs any resources that are required for your deployment (container image for example) and deploys it\nit then sends a message back to the orchestrator to say if it was successful or not\nAgent There is an agent that sits in your cluster, it is the only one that knows any secrets in your cluster (e.g. registry logins)\nListening The agent either listens on 1 or 2 topics\n1: Agent specific topic that is only known by your agent, and the orchestrator which only knows an agentid (the orchestrator has no knowledge of any secrets or any other details) 2: an opt-in choice of auto update, there will be updates to the agent to add new functionality and it is upto you during the setup process of the agent if you want this to be done automatic or when you wish Orchestrator This sits on K8sdeploy, this asks agents for some details, e.g. deployment names, and namespaces, this is so that when an action is triggered it can direct the agent to do the correct things\nThe orchestrator gets a signal from a github action to do a deployment, depending on if the action has a valid key, it then looks for that key finds an agents associated with that key, and then triggers a deployment signal on the queue for that agent to go do the deployment\nGithub Action This sits in your github workflow, and can tell the orchestrator to do a deployment if the workflow is successful (e.g. build a new website)\nWebsite / Dashboard This is here purely to get status updates of deployments, register new agents / github actions, and to tell ask the agent to get details from the cluster, e.g. namespaces and deployment names\nGithub Link\nCompany Site\n","date":1634133944,"expirydate":-62135596800,"kind":"page","lang":"en","lastmod":1634133944,"objectID":"39261034f665414683c592c6a7cdf0a7","permalink":"https://keloran.dev/backburner/k8sdeploy/","publishdate":"2021-10-13T15:05:44+01:00","relpermalink":"/backburner/k8sdeploy/","section":"backburner","summary":"This project is so that I can deploy projects into my cluster using github pipelines\nnow that sounds simle enough, except there aren’t any (from my limited research) deployment agents for kubernetes that work on arm\nSo whats my plan, well this system works thus\nMethod There is a github action that is triggered in your pipeline, this talks to an orchestrator on k8sdeploy\nthe orchestrator then sends a message to a queue with a topic for an agent that has been registered by you for your cluster\n","tags":["k8sdeploy","projects","kubernetes","chewedfeed"],"title":"K8sDeploy.dev","type":"project_current"},{"authors":null,"categories":null,"content":"Well I’ve decided that I should probably learn kubernetes, so I built a raspberry pi cluster\nHome\n","date":1634133305,"expirydate":-62135596800,"kind":"page","lang":"en","lastmod":1634133305,"objectID":"c74408bd89c05d19e52c916b99edee9b","permalink":"https://keloran.dev/post/kubernetes/","publishdate":"2021-10-13T14:55:05+01:00","relpermalink":"/post/kubernetes/","section":"post","summary":"Well I’ve decided that I should probably learn kubernetes, so I built a raspberry pi cluster\nHome\n","tags":["kubernetes"],"title":"Kubernetes","type":"post"},{"authors":null,"categories":null,"content":"Started a index generator, all it does is reads the projects and blog directory,\nif there are pages in the project folder current folder, add to that section past folder, add to that section if its in blog folder it adds those to that section Very simple, I’ll add more features in future, but this is just very simple\nAdded a very simple editor Added an RSS generator\nFuture plans Make it a simple editor, that generates the files themselves Added RSS generator Generate HTML pages from the CommonMark so that can be hosted outside of github.io GitHub Link\n","date":1609509305,"expirydate":-62135596800,"kind":"page","lang":"en","lastmod":1609509305,"objectID":"867b8fefc140011c6b4a5a21f2782253","permalink":"https://keloran.dev/past/static_generator/","publishdate":"2021-01-01T14:55:05+01:00","relpermalink":"/past/static_generator/","section":"past","summary":"Started a index generator, all it does is reads the projects and blog directory,\nif there are pages in the project folder current folder, add to that section past folder, add to that section if its in blog folder it adds those to that section Very simple, I’ll add more features in future, but this is just very simple\nAdded a very simple editor Added an RSS generator\nFuture plans Make it a simple editor, that generates the files themselves Added RSS generator Generate HTML pages from the CommonMark so that can be hosted outside of github.io GitHub Link\n","tags":["abandoned"],"title":"Static Generator","type":"past"},{"authors":null,"categories":null,"content":"Well I finally pulled the plug and bought a Planck,\nrather than build my own though I went with a Planck EZ also rather than buy 1 like any sensible person, when it costs nearly 300 quid, I bought 2\nand because obviously I’m npt to be trusted I decided to flash one and learn Workman, I have a couple of firmwares if anyone else is insane like me\nWorkman this layout is workman, but also moves the numbers on the upper layer to a reverse T pattern is the easiest way to explain it\nKeloran this is qwerty, but with its numbers also in the reverse T pattern\nthey are really good keyboards, and I would honestly say one of the best keyboard I’ve ever owned\nHome\n","date":1587045305,"expirydate":-62135596800,"kind":"page","lang":"en","lastmod":1587045305,"objectID":"643bb97f1f7e2228e386119efbc874fa","permalink":"https://keloran.dev/post/keyboard_madness/","publishdate":"2020-04-16T14:55:05+01:00","relpermalink":"/post/keyboard_madness/","section":"post","summary":"Well I finally pulled the plug and bought a Planck,\nrather than build my own though I went with a Planck EZ also rather than buy 1 like any sensible person, when it costs nearly 300 quid, I bought 2\nand because obviously I’m npt to be trusted I decided to flash one and learn Workman, I have a couple of firmwares if anyone else is insane like me\nWorkman this layout is workman, but also moves the numbers on the upper layer to a reverse T pattern is the easiest way to explain it\n","tags":null,"title":"Keyboard Madness","type":"post"},{"authors":null,"categories":null,"content":"I decided that I should stick all my aliases and functions that I use into a zsh plugin, that way I can maintain it separately\nGithub Home\n","date":1580392505,"expirydate":-62135596800,"kind":"page","lang":"en","lastmod":1580392505,"objectID":"e6aff99c4e11dcd15f123bf720106ee5","permalink":"https://keloran.dev/post/zsh_plugin/","publishdate":"2020-01-30T14:55:05+01:00","relpermalink":"/post/zsh_plugin/","section":"post","summary":"I decided that I should stick all my aliases and functions that I use into a zsh plugin, that way I can maintain it separately\nGithub Home\n","tags":["zsh","github"],"title":"ZSH Plugin","type":"post"},{"authors":null,"categories":null,"content":"Progress has been slow to start with, but that should now speed up\nI have finished the authorizer, and moved the storage system to Postgres from Dynamo, the main reason for that is that a lot of the data is relational so it makes sense to put it in a relational database\nNest This is the service where all CRUD operations take place, it is also what triggers Hive\nHive This is the service that works out what to do with a bug, is it a new one, has it happened before, is it happening frequently, it also triggers the notification system\nI estimate that an end-to-end system with Slack as the notification result will be in place at the start of Feb\nGithub Link Home\n","date":1578405305,"expirydate":-62135596800,"kind":"page","lang":"en","lastmod":1578405305,"objectID":"3aecda8a5999ccba212c138c249f7bf6","permalink":"https://keloran.dev/post/bugfixes_progress/","publishdate":"2020-01-07T14:55:05+01:00","relpermalink":"/post/bugfixes_progress/","section":"post","summary":"Progress has been slow to start with, but that should now speed up\nI have finished the authorizer, and moved the storage system to Postgres from Dynamo, the main reason for that is that a lot of the data is relational so it makes sense to put it in a relational database\nNest This is the service where all CRUD operations take place, it is also what triggers Hive\nHive This is the service that works out what to do with a bug, is it a new one, has it happened before, is it happening frequently, it also triggers the notification system\n","tags":["bugfixes","projects"],"title":"BugFix.es Progress","type":"post"},{"authors":null,"categories":null,"content":"I have decided to go back to BugFix.es and re-start development\nmainly this is due to me needing a common bug/issue tracking system (this is not a ticket system like jira)\nBugFix.es tracks bugs, so if a bug is sent to the system and it hasn’t been seen before or was seen a long time ago, or is happening a lot in a short period of time it creates a ticket / notification so development on it can be tracked/done\nWhy is it needed If your getting a bug that occurs once every 10k hits it only triggers once, the same happens if your getting a bug that triggers every hit only create 1 ticket, don’t create hundreds\nsignal over noise is what is needed when it comes to triggered bugs, if all you get is noise you have no idea what the actual issue is and how much it actually affects\nWhat I’m doing atm So I’ve updated the NPM currently all it will do is console output since no-one has any API keys to send them to the brain\nI am also in the process of creating the API side again (it was very much unmaintainable) and then I will start issuing API keys to a select group so that the brain can start getting trained\nOnce the brain is trained I will open the API up the public\nGithub Link Home\n","date":1575554105,"expirydate":-62135596800,"kind":"page","lang":"en","lastmod":1575554105,"objectID":"6ba8681fb2765115f3be056f46d4f2cd","permalink":"https://keloran.dev/post/going_back_to_bugfixes/","publishdate":"2019-12-05T14:55:05+01:00","relpermalink":"/post/going_back_to_bugfixes/","section":"post","summary":"I have decided to go back to BugFix.es and re-start development\nmainly this is due to me needing a common bug/issue tracking system (this is not a ticket system like jira)\nBugFix.es tracks bugs, so if a bug is sent to the system and it hasn’t been seen before or was seen a long time ago, or is happening a lot in a short period of time it creates a ticket / notification so development on it can be tracked/done\n","tags":["bugfixes","projects"],"title":"Going back to BugFix.es","type":"post"},{"authors":null,"categories":null,"content":"Added a very (stupidly simple) editor to static generator\nAll it does is let me create new entires, doesn’t allow editor, if I make a mistake I have to start again\nand I can’t edit any old filess\nGitHub Link Home\n","date":1574949305,"expirydate":-62135596800,"kind":"page","lang":"en","lastmod":1574949305,"objectID":"7b27ad1b93886d49632b972664c60e6c","permalink":"https://keloran.dev/post/basic_editor/","publishdate":"2019-11-28T14:55:05+01:00","relpermalink":"/post/basic_editor/","section":"post","summary":"Added a very (stupidly simple) editor to static generator\nAll it does is let me create new entires, doesn’t allow editor, if I make a mistake I have to start again\nand I can’t edit any old filess\nGitHub Link Home\n","tags":null,"title":"Basic Editor","type":"post"},{"authors":null,"categories":null,"content":"Started a index generator, all it does is reads the projects and blog directory,\nif there are pages in the project folder current folder, add to that section past folder, add to that section if its in blog folder it adds those to that section Very simple, I’ll add more features in future, but this is just very simple\nHome\n","date":1574949305,"expirydate":-62135596800,"kind":"page","lang":"en","lastmod":1574949305,"objectID":"84781f928692de1335ee476441d12dcd","permalink":"https://keloran.dev/post/static_generator/","publishdate":"2019-11-28T14:55:05+01:00","relpermalink":"/post/static_generator/","section":"post","summary":"Started a index generator, all it does is reads the projects and blog directory,\nif there are pages in the project folder current folder, add to that section past folder, add to that section if its in blog folder it adds those to that section Very simple, I’ll add more features in future, but this is just very simple\nHome\n","tags":null,"title":"Static Generator","type":"post"}]