{"records":[{"uri":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.document/ikclcv2lsid36","cid":"bafyreibtq3miavk4rfcbj3gnca5nlvk2usutpcrb6j5udyce3egt33lipy","value":{"path":"/blog/obsidian-garbletext","site":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.publication/3lwafzkjqm25s","tags":[],"$type":"site.standard.document","title":"TIL: Obsidian garbleText","description":"Learned about obsidian `garbleText` which can hide all the text in the Obsidian Window. This can come in handy when you want to show the ...","publishedAt":"2021-06-22T00:00:00.000Z","textContent":"Learned about obsidian `garbleText` which can hide all the text in the Obsidian Window. This can come in handy when you want to show the overview of your obsidian but are not sure but also want to make sure to not show content.\n\n## How to Trigger\n\nIt can be triggered with `app.garbleText()` or `document.querySelector('.app-container').classList.toggle('is-text-garbled')` \n\n## Output\n\n![[📂 Assets/Obsidian Garbled Text.png]]"}},{"uri":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.document/ifli77liiv6om","cid":"bafyreihutfwbjbbdtgoej2dswtycywbbazhsnu7tyalufy3u7vbpngbnhe","value":{"path":"/blog/keywords-in-package-json","site":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.publication/3lwafzkjqm25s","tags":[],"$type":"site.standard.document","title":"Keywords in package . json","description":"Here's the definition from","publishedAt":"2021-07-04T00:00:00.000Z","textContent":"Here's the definition from \n\n> Put keywords in it. It's an array of strings. This helps people discover your package as it's listed in `npm search`.\n\n---\n**Learned on** : [[🧔 Private/Planners/Day Planners/04-Jul-2021]]"}},{"uri":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.document/idtkq4snuha6s","cid":"bafyreigivw7x64mwtxprihq47giyxmqsh7wivogbugotb3visgsd2teyby","value":{"path":"/blog/multiple-backgrounds-with-css-background","site":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.publication/3lwafzkjqm25s","tags":[],"$type":"site.standard.document","title":"Multiple Backgrounds with CSS background","description":"Using multiple images and gradients in a single CSS background declaration.","publishedAt":"2021-06-30T00:00:00.000Z","textContent":"Today I discovered a clever trick with CSS background images. It's possible to have multiple images in a single `background-image` declaration, which is unique and can come in handy for many use cases.\n\n## How to do it\n\n```html\n<section>\n<section />\n```\n\n```css\nsection {\n  background-image: url(\"https://source.unsplash.com/random/150x150\"),\n    url(\"https://source.unsplash.com/random/150x200\"),\n    url(\"https://source.unsplash.com/random/150x250\"),\n    linear-gradient(\n      90deg,\n      rgba(52, 130, 253, 1) 43%,\n      rgba(255, 255, 255, 1) 80%\n    );\n  background-position: top left, bottom right, center;\n  background-repeat: no-repeat;\n  height: 300px;\n  width: 100%;\n}\n```\n\nYou can also play with this on CodePen:\n\n- https://codepen.io/ritikpatni/pen/eYWNxqr"}},{"uri":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.document/i2rttkkpcbf7g","cid":"bafyreiekxyqk4j4adlaw35ecwtjul4aykhg7tjlmygv5x7xc24anssd3va","value":{"path":"/blog/field-notes-macro-walks","site":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.publication/3lwafzkjqm25s","tags":[],"$type":"site.standard.document","title":"Field notes from macro walks","description":"Tiny observations that change how I frame details.","publishedAt":"2021-06-17T00:00:00.000Z","textContent":"Draft note. This should stay hidden from the live blog listing."}},{"uri":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.document/hxxeotfucztra","cid":"bafyreifra6tqraq5dg2qbqjkkelaz3ktkbdzs5ff3iqfozobzp76cbh5mi","value":{"path":"/blog/what-is-a-gauge-chart","site":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.publication/3lwafzkjqm25s","tags":[],"$type":"site.standard.document","title":"What is a gauge Chart?","description":"_Imported from Obsidian. Content was empty in source note._","publishedAt":"2021-06-18T00:00:00.000Z","textContent":"_Imported from Obsidian. Content was empty in source note._"}},{"uri":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.document/hfvoaprvd5hxr","cid":"bafyreifu7m7qxm25ldyleioeqk5jt2gecsb2dlzx4si3te42uu2jhjsv4q","value":{"path":"/blog/keyboard-shortcut-for-taking-screenshots-in-firefox","site":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.publication/3lwafzkjqm25s","tags":[],"$type":"site.standard.document","title":"Keyboard Shortcut for taking screenshots in Firefox","description":"`Ctrl` + `Shift` + `S`","publishedAt":"2021-06-09T00:00:00.000Z","textContent":"`Ctrl` + `Shift` + `S`"}},{"uri":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.document/fuwnhboedcdd7","cid":"bafyreidp5im2c5mfda4hyi44vyyyqess43wdcwjc435z66cmlqlfiwjy2i","value":{"path":"/blog/2021-w22","site":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.publication/3lwafzkjqm25s","tags":[],"$type":"site.standard.document","title":"2021 — Week 22","description":"This week's weekly blog includes:","publishedAt":"2021-01-01T00:00:00.000Z","textContent":"## Asking Questions\n\nAsking questions is a very useful skill that will help you in each and every aspect of your life.\n[How to ask Useful questions](https://joshkaufman.net/how-to-ask-useful-questions/)\n\n## Form Name Inputs\n\nBasically, if your form can’t register Beyoncé – it has failed.\n[What are \"unusual characters\"](https://shkspr.mobi/blog/2021/05/what-are-unusual-characters/)\n\n## Thank you for reading!\n\nAnd that's a wrap for the first Weekly Blog! If you enjoy it, I'd love you to tell others about it. ♥️\n\n- [Share it on Twitter](https://twitter.com/intent/tweet?text=I%20like%20@03ritikpatni%20weekly%blog&url=https://www.stefanjudis.com/blog/2021-W{{WEEK_NUMBER}}/).\n- Forward it to someone who might like it."}},{"uri":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.document/fnvgtxajixsj3","cid":"bafyreigog3uj6uytfupirxprsrru6fwzbwf6udkzhah4qt34ndo5dojnza","value":{"path":"/blog/gold-will-become-gray-if-it-comes-in-contact-with-mercury","site":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.publication/3lwafzkjqm25s","tags":[],"$type":"site.standard.document","title":"TIL: Gold will become gray if it comes in contact with Mercury","description":"Learned what happens when Gold comes in contact with mercury and a ton of Chemistry and interesting stuff around it.","publishedAt":"2021-06-25T00:00:00.000Z","textContent":"Learned what happens when Gold comes in contact with mercury and a ton of Chemistry and interesting stuff around it.\n\n## Reference Links\n\n- [Why does mercury de-colorize a gold ring](https://chemistry.stackexchange.com/questions/76757/why-does-mercury-decolourise-a-gold-ring)\n- [Dissolving Gold in Mercury](https://www.youtube.com/watch?v=yAGYGGmUmUw)"}},{"uri":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.document/flopovobhbqqu","cid":"bafyreib6h7dwpi5mi7n6bjdhtxf2ay7auncp4qynefxzcjdybnkltscxhy","value":{"path":"/blog/shipping-without-chaos","site":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.publication/3lwafzkjqm25s","tags":[],"$type":"site.standard.document","title":"Netlify has dark mode","description":"A tiny note from my old TIL logs.","publishedAt":"2021-06-17T00:00:00.000Z","textContent":"Netlify has dark mode."}},{"uri":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.document/fki4wh3zbihlq","cid":"bafyreibwzbkmlgja723p23nhxwj76vd5goyisv4seujuqldc4oqn7ur5lm","value":{"path":"/blog/types-of-usb-c","site":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.publication/3lwafzkjqm25s","tags":[],"$type":"site.standard.document","title":"Types of USB C","description":"There are 8 types of USB C's that exist right now.","publishedAt":"2021-07-18T00:00:00.000Z","textContent":"There are 8 types of USB C's that exist right now.\n\n---\n**Learned on** : [18-Jul-2021](🧔%20Private/Planners/Day%20Planners/18-Jul-2021.md)\n\n\n---\n\n## Additional Metadata\n\n**🏷 Tags**\n\n- 🗂 Types:: #type/til \n- 🧠 Modes:: #mode/text \n- 📼 Format:: #format/text \n- 🌎 Areas:: #area/tech\n- 🙌 Teams:: #team/personal \n- 💬 Topics:: #topic/cables, #topic/type-c\n\n**🖇️ Related Links**\n\n- 👤 Creators:: [@Me](🧔%20Private/Uncategorized%20Notes/@Me.md)\n- 🔮 Origin:: [Twitter](🧔%20Private/Uncategorized%20Notes/Twitter.md)\n- 🔗 Links:: \n\t- [https://sa.lj.am/usbccccc/](https://sa.lj.am/usbccccc/)\n\t- [https://people.kernel.org/bleung/now-how-many-usb-c-to-usb-c-cables-are-there-usb4-update-september-12](https://people.kernel.org/bleung/now-how-many-usb-c-to-usb-c-cables-are-there-usb4-update-september-12)"}},{"uri":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.document/fajgaqzi5bsz5","cid":"bafyreidkbnnoha3vj54ybae4wzvtgwu7uzqg5k3bfvn3kliifehrniiqze","value":{"path":"/blog/html-legend-has-an-align-attribute","site":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.publication/3lwafzkjqm25s","tags":[],"$type":"site.standard.document","title":"TIL: HTML legend has an align attribute","description":"Had a unique use case today where I needed a title in the middle of border and while I was aware that something like `<fieldset><legend><...","publishedAt":"2021-06-23T00:00:00.000Z","textContent":"Had a unique use case today where I needed a title in the middle of border and while I was aware that something like `<fieldset><legend></legend></fieldset>` exists but then I needed that title and wasn't sure the best approach to do it. After some browsing I came across `align` attribute for `<legend>` tag which can help you center the text and I learned how to center the `<legend>` tag.\n\n## How to do it\n\n```html\n<fieldset>\n\t<legend align='center'>Title</legend>\n\t<p>Add Content here</p>\n</fieldset>\n```"}},{"uri":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.document/eoodrmh2zj46c","cid":"bafyreiffut4w6hi6zoilema7ule2ce77patjuv2fjbpnuljzvyrvpn3jdm","value":{"path":"/blog/working-with-webcam","site":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.publication/3lwafzkjqm25s","tags":[],"$type":"site.standard.document","title":"Working with webcam","description":"_Imported from Obsidian. Content was empty in source note._","publishedAt":"2021-06-18T00:00:00.000Z","textContent":"_Imported from Obsidian. Content was empty in source note._"}},{"uri":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.document/ds3l5jelr7lyb","cid":"bafyreibwuzqgpnxiaewxgsdw7xcv26vgtmwbsb3wok5qle2w3xn4zl3be4","value":{"path":"/blog/edm-eisenhower-decision-matrix","site":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.publication/3lwafzkjqm25s","tags":[],"$type":"site.standard.document","title":"EDM - Eisenhower Decision Matrix","description":"_Imported from Obsidian. Content was empty in source note._","publishedAt":"2021-06-05T00:00:00.000Z","textContent":"_Imported from Obsidian. Content was empty in source note._"}},{"uri":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.document/cl367l4mb5366","cid":"bafyreifl4snc33s6ur4bki6re4hmwhqfx27iihx7uses2cxejzls4bgrr4","value":{"path":"/blog/nomophobia","site":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.publication/3lwafzkjqm25s","tags":[],"$type":"site.standard.document","title":"Nomophobia","description":"Nomophobia is the fancy term for the fear of being without Cell Phone","publishedAt":"2021-07-08T00:00:00.000Z","textContent":"Nomophobia is the fancy term for the fear of being without Cell Phone\n\n---\n**Learned on** : [[🧔 Private/Planners/Day Planners/08-Jul-2021]]\n**Source** : [[NYC Mini\t]]"}},{"uri":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.document/ciqjg362ghvzj","cid":"bafyreidiy4uatcr2otbu5vddfmdcro5kpfongk2y6berlwa7m77wipvcmy","value":{"path":"/blog/blog-ideas","site":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.publication/3lwafzkjqm25s","tags":[],"$type":"site.standard.document","title":"Blog Ideas","description":"1. Releases with Commitizen and Sentry","publishedAt":"2021-05-10T00:00:00.000Z","textContent":"1. Releases with Commitizen and Sentry\n2. Uses page on my blog\n3. Beginners Guide to Gitlab CI/CD\n4. Dataview JS and what you can do with it"}},{"uri":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.document/chfblmwltshdp","cid":"bafyreihobt25ghgosoox6esimmwca5t5o3zcl6epbunz2lvdrdnn4xs65e","value":{"path":"/blog/releases-with-commitizen","site":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.publication/3lwafzkjqm25s","tags":[],"$type":"site.standard.document","title":"Managing your CI pipeline with GitLab S3, Commitizen and Husky","description":"- Part 1: Husky","publishedAt":"2021-05-10T00:00:00.000Z","textContent":"- Part 1: Husky\n- Part 2: S3\n- Part 3: Commitizen\n- Part 4: CI provider of your choice\n\n\nAs a front-end developer release management is something that most people often overlook mostly because unlike Mobile Apps there is not hard rule for this on web. But managing releases can be often helpful in keeping track of how things are moving forward and how well your product is progressing"}},{"uri":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.document/cgcqsxx3acmme","cid":"bafyreigfhp4chek42ddto3m5gnty5vmw4fvevbraq2xtfkzhinn4ka3pni","value":{"path":"/blog/css-read-only-attribute","site":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.publication/3lwafzkjqm25s","tags":[],"$type":"site.standard.document","title":"CSS read-only attribute","description":"Why `:read-only` helped when disabled fields were not an option in a form flow.","publishedAt":"2021-06-05T00:00:00.000Z","textContent":"While working on a no-framework HTML page (FTL page), I realized I couldn't use the disabled HTML attribute because disabled fields don't pass value through form submission.\n\nAfter looking for options, I discovered HTML `readonly`. But I had already styled disabled states and had never looked into styling read-only fields.\n\nMy first thought was selectors like `.class-name[readonly]`. That works, but I had to handle both forms used in HTML:\n\n- `.class[readonly]`\n- `.class[readonly=\"readonly\"]`\n\nI wanted a cleaner approach similar to `:disabled`, then came across `:read-only`.\n\nAnother useful selector is `:read-write`, which can help when styling editable content such as a `<p>` tag with `contenteditable`."}},{"uri":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.document/cf3lxzhgawfdh","cid":"bafyreibloztraeoa4ykzvd7mkekinqqs4vdpj3vmin35zha7tniobqndhm","value":{"path":"/blog/til-using-different-language-fonts-when-one-font-doesn-t-contain-all-the-characters","site":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.publication/3lwafzkjqm25s","tags":[],"$type":"site.standard.document","title":"TIL Using different language fonts when one font doesn't contain all the characters","description":"You can use different font files for different languages in the following way","publishedAt":"2021-09-20T00:00:00.000Z","textContent":"You can use different font files for different languages in the following way\n\n## Importing multilanguage fonts\n\n```css\n@font-face {\nfont-family: \"Myriad Pro\";\nsrc: url(\"./assets/fonts/MyriadPro-Regular.otf\") format(\"opentype\");\\\nfont-display: swap;\\\n}\n\n@font-face {\nfont-family: \"Myriad Pro\";\nfont-weight: bold;\nsrc: url(\"./assets/fonts/MyriadPro-Bold.otf\") format(\"opentype\");\nfont-display: swap;\n}\n\n@font-face {\nfont-family: \"Myriad Pro\";\nfont-weight: 600;\nsrc: url(\"./assets/fonts/MyriadPro-SemiBold.otf\") format(\"opentype\");\nfont-display: swap;\n}\n\n@font-face {\nfont-family: \"Mangal\";\nsrc: url(\"./assets/fonts/Mangal\\ Regular.ttf\") format(\"truetype\");\nfont-display: swap;\n}\n```\n\n## Font Declarations\n\n```css\nfont-family: Myriad Pro, Mangal, sans-serif;\n```\n\n## TODO: Add Codepen Demo"}},{"uri":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.document/bvwo3ihuhrzzz","cid":"bafyreih6bmkeyxurs6xf4tw3eir6gljjzulxeid4ae7czwvyt5nvoozogm","value":{"path":"/blog/you-can-add-separators-in-writing-numbers-in-js","site":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.publication/3lwafzkjqm25s","tags":[],"$type":"site.standard.document","title":"TIL: You can add separators in writing numbers in JS","description":"It's an awesome new thing in JS where you can write numbers as 1_000_000_000 and that will mean 1000000000 which at times becomes become ...","publishedAt":"2021-06-18T00:00:00.000Z","textContent":"It's an awesome new thing in JS where you can write numbers as 1_000_000_000 and that will mean 1000000000 which at times becomes become pretty unreadable.\n\n---\n**Source**: [Tweet Link](https://twitter.com/cassidoo/status/1405952703143059465?s=20) \n[Blog Link](https://davidwalsh.name/numeric-separators)\nShared by [[🧔 Private/People/@cassidoo]]\n**Learned on** : [[🧔 Private/Planners/Day Planners/Archives/June 2021/18-Jun-2021]]"}},{"uri":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.document/blnkm3f55mwnm","cid":"bafyreib7uyuxaqefkofhcch4wgr6to3j64jmlaejuggp6nuwigqdhd2gcu","value":{"path":"/blog/learned-how-to-debug-css-in-obsidian","site":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.publication/3lwafzkjqm25s","tags":[],"$type":"site.standard.document","title":"TIL: Learned about debugging in Obsidian and adding custom CSS","description":"Today when I was checking out preview mode for one of my notes I noticed that emojis were taking complete line instead of staying in the ...","publishedAt":"2021-06-03T00:00:00.000Z","textContent":"Today when I was checking out preview mode for one of my notes I noticed that emojis were taking complete line instead of staying in the same line which annoyed me because it was looking really weird. After a bit of googling I figured out that it was because the emojis in Obsidian are rendered as `<image>` tags as it was currently taking `display: block`.\n\n## Fix for the problem\n\n```css\n.emoji{\n    display: inline-block\n}\n```\n \nAdding the above snippet solves the problem as it makes the display `inline-block` which doesn't use separate line."}},{"uri":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.document/bbzpcdc4agt56","cid":"bafyreiggodey7xrwkosr4maymnfxwzk2cyzx6b35pe7buhlc2cc6gza5b4","value":{"path":"/blog/condition-for-closing-browser-tab","site":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.publication/3lwafzkjqm25s","tags":[],"$type":"site.standard.document","title":"Condition for closing browser tab","description":"The below excerpt is from official [w3 spec reference](https://www.w3.org/TR/html51/browsers.html#script-closable)","publishedAt":"2021-07-08T00:00:00.000Z","textContent":"The below excerpt is from official [w3 spec reference](https://www.w3.org/TR/html51/browsers.html#script-closable)\n> A [browsing context](https://www.w3.org/TR/html51/browsers.html#browsing-context) is script-closable if it is an [auxiliary browsing context](https://www.w3.org/TR/html51/browsers.html#auxiliary-browsing-contexts) that was created by a script (as opposed to by an action of the user), or if it is a [top-level browsing context](https://www.w3.org/TR/html51/browsers.html#top-level-browsing-context) whose [session history](https://www.w3.org/TR/html51/browsers.html#session-history) contains only one `[Document](https://html.spec.whatwg.org/multipage/dom.html#document)`.\n\n> The `closed` attribute on `Window` objects must return true if the `Window` object’s [browsing context](https://www.w3.org/TR/html51/browsers.html#browsing-context) has been [discarded](https://www.w3.org/TR/html51/browsers.html#a-browsing-context-is-discarded), and false otherwise.\n\n## When does it work then\nIf the above excerpt was not clear then it works in following conditions\n- When user has opened a new tab using `window.open` method\n- When it's the top level page on browser meaning it is a **new tab** or a link was opened in a new tab.\n\n---\n**Learned on** : [08-Jul-2021](🧔%20Private/Planners/Day%20Planners/08-Jul-2021.md)\n**Source** : [w3 Org#script-closable](https://www.w3.org/TR/html51/browsers.html#script-closable)"}},{"uri":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.document/b5l75hrkxwele","cid":"bafyreidsjir26hqgbfxdkn3vquhspaezro4tdfjuiervtv42xjw6wzvlnm","value":{"path":"/blog/edc-everyday-cary","site":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.publication/3lwafzkjqm25s","tags":[],"$type":"site.standard.document","title":"EDC-Everyday Carry","description":"---","publishedAt":"2021-01-01T00:00:00.000Z","textContent":"---\n---\n\n\nLearned that EDC means everyday carry ex. Pens, Knives, Flashlights, etc."}},{"uri":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.document/aggeyrfhoamed","cid":"bafyreicdqmtwl44wjrenrwz5tv5aadwhyrhgcihlv7522eyoxq677j27my","value":{"path":"/blog/netlify-has-dark-mode","site":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.publication/3lwafzkjqm25s","tags":[],"$type":"site.standard.document","title":"Netlify has dark mode","description":"_Imported from Obsidian. Content was empty in source note._","publishedAt":"2021-06-17T00:00:00.000Z","textContent":"_Imported from Obsidian. Content was empty in source note._"}},{"uri":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.document/6mov527pwcm4c","cid":"bafyreif55c7ezjvb4j6jpaz3qmmefcanoe6ekfxb2ni7zmlohe2wlmbkmy","value":{"path":"/blog/custom-domains-with-obsidian-publish","site":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.publication/3lwafzkjqm25s","tags":[],"$type":"site.standard.document","title":"Custom Domains with Obsidian Publish","description":"In order to set a custom domain you need to create a `netlify.toml` file in your root directory and add the following","publishedAt":"2021-09-21T00:00:00.000Z","textContent":"## Custom Domains with Obsidian Publish and Netlify\n\n\nIn order to set a custom domain you need to create a `netlify.toml` file in your root directory and add the following\n\n```\n[[redirects]]\n  from = \"https://mysite.com/my-notes/*\"\n  to = \"https://publish.obsidian.md/serve?url=mysite.com/my-notes/:splat\"\n  status = 200\n  force = true\n```\n\n> Note: Make sure to change `https://publish.obsidian.md/serve` to your own Obsidian publish domain. Ex: [https://publish.obsidian.md/ritik](https://publish.obsidian.md/serve)."}},{"uri":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.document/6ecqb3q5eboak","cid":"bafyreigiytga2pfhhoccxpcfy53s3fecosbypitldixnqcqtf4xnr23rve","value":{"path":"/blog/little-wins","site":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.publication/3lwafzkjqm25s","tags":[],"$type":"site.standard.document","title":"Little Wins","description":"- Worked with Angular for the first time","publishedAt":"2021-06-12T00:00:00.000Z","textContent":"## Joined Brainplay as a front-end developer\n\n- Worked with Angular for the first time\n- Worked with React Native for the first time\n- Experimented with GraphQL\n- Made a workable carousel\n- Made a dashboard for analyzing hotel reviews and stuff with Angular\n- Made an App with React Native\n-"}},{"uri":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.document/5h2gmkuolzg7k","cid":"bafyreidsag2qolpmeswktsxjf5ni6q7kywkgouqkf6k4vl7dz3hqwv7p4u","value":{"path":"/blog/array-splice-method-also-alters-the-original-array","site":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.publication/3lwafzkjqm25s","tags":[],"$type":"site.standard.document","title":"Array Splice Method also alters the original array","description":"Array splice method will alter the actual array. Usually I use the splice approach as in most cases the original array is not required bu...","publishedAt":"2021-07-10T00:00:00.000Z","textContent":"Array splice method will alter the actual array. Usually I use the splice approach as in most cases the original array is not required but in case that is required you can create a copy of original Array using \n```javascript \nconst clonedArray = JSON.Parse(JSON.stringify(array));\n``` \nand then apply splice on `clonedArray` like\n```javascript\nconst firstEightArrayKeys = clonedArray.splice(0,8);\n```\n\n---\n**Learned on** : [10-Jul-2021](🧔%20Private/Planners/Day%20Planners/10-Jul-2021.md)\n**Source** :"}},{"uri":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.document/5eg2ry7ec4r4w","cid":"bafyreibxlp6pmy6hmkxm6lnpi2tsiwzqjoz6d6np5qavxvtwn5cldtwr5m","value":{"path":"/blog/tally-marks-around-the-world","site":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.publication/3lwafzkjqm25s","tags":[],"$type":"site.standard.document","title":"Tally Marks Around the world","description":"- **Reddit Link**:: https://www.reddit.com/r/coolguides/comments/o46pw2/tally_marks_are_different_around_the_world/","publishedAt":"2021-06-21T00:00:00.000Z","textContent":"[Tally Marks in different parts of the world](<![https://preview.redd.it/v91lprfbjf671.jpg?auto=webp&s=f45de744219f37ec649782ae1043eded4723de12](https://preview.redd.it/v91lprfbjf671.jpg?auto=webp&s=f45de744219f37ec649782ae1043eded4723de12)>)(Local Obsidian asset omitted in web import.)\n\n- **Reddit Link**:: https://www.reddit.com/r/coolguides/comments/o46pw2/tally_marks_are_different_around_the_world/\n- **Shared By**:: [@cassidoo](🧔%20Private/People/@cassidoo.md)"}},{"uri":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.document/5b2ig3d7yw326","cid":"bafyreibaxf2xxnqdlvygylubqqlyumuhikax24n3lj4nflb3miqktauyyi","value":{"path":"/blog/adding-custom-scripts-with-templater","site":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.publication/3lwafzkjqm25s","tags":[],"$type":"site.standard.document","title":"TIL: Adding custom scripts with templater","description":"I learned how we can create custom scripts in Obsidian with templater and now it opens another set of possible things that I can do with ...","publishedAt":"2021-06-23T00:00:00.000Z","textContent":"I learned how we can create custom scripts in Obsidian with templater and now it opens another set of possible things that I can do with obsidian.\n\n## How to do it\n\n### Create a script with whatever you want to do\n\nFor my case I needed to strip first character of File named with an @ which I usually use for naming humans/companies/organizations.\n\n- **Step 1**: Create a script file with name humanSnip.js or whatever you want\n```js\nfunction humanSnip(human) {\n\tconst fileName = human.file.title;\n\treturn fileName.slice(1, fileName.length);\n}\nmodule.exports = humanSnip;\n```\n- **Step 2**: Put this file in some place of your vault except `.obsidian` folder as this folder is not accessible via templater plugin.\n- **Step 3**: Add the folder location in templater script locations\n\t\n\t(Local Obsidian asset omitted in web import.)(Where to set script in templater)\n- **Step 4**: Use the script as `tp.user.humanSnip(tp)` or whatever the name of your script was\n\n\n---\n## Additional Metadata\n\nSuggested by:: [@Ximena](🧔%20Private/Uncategorized%20Notes/@Ximena.md)"}},{"uri":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.document/4v5o5ga26cgtn","cid":"bafyreiffrsxl4vnlu3psphzmxy7fww4awuh6tfpavk3jvtbu3ebk6g2piu","value":{"path":"/blog/css-clamp","site":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.publication/3lwafzkjqm25s","tags":[],"$type":"site.standard.document","title":"CSS Clamp","description":"_Imported from Obsidian. Content was empty in source note._","publishedAt":"2021-07-14T00:00:00.000Z","textContent":"_Imported from Obsidian. Content was empty in source note._"}},{"uri":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.document/4sica2gc3546c","cid":"bafyreihbbsytdcjyb2trwofgr57jfepfqqlvkn5ddfiahk3jeokcyehg5e","value":{"path":"/blog/opinions-that-i-ve-changed-over-years","site":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.publication/3lwafzkjqm25s","tags":[],"$type":"site.standard.document","title":"Opinions that I've changed over years","description":"_Imported from Obsidian. Content was empty in source note._","publishedAt":"2021-06-12T00:00:00.000Z","textContent":"_Imported from Obsidian. Content was empty in source note._"}},{"uri":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.document/3vukzvc67rwrm","cid":"bafyreich3vg4ke544aykppbl6eecwx3w3sl2kqv6ro4cesptfxmuexmdoi","value":{"path":"/blog/building-quality-gated-ai-code-review-loops","site":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.publication/3lwafzkjqm25s","tags":[],"$type":"site.standard.document","title":"Building Quality-Gated AI Code Review Loops","description":"How to implement planner, executor, auditor, and quality-gate loops that keep AI-generated code reviewable before delivery.","publishedAt":"2026-08-07T00:00:00.000Z","textContent":"AI coding agents are fast. They are also wrong often enough that speed without verification becomes a liability. The problem is not generation; it is allowing generated code to receive one cursory pass and land in a repository unchecked.\n\nThe fix is a **quality-gated loop**: a small pipeline in which each stage has one job, every handoff is explicit, and nothing reaches a user until an independent gate approves it.\n\nThis article covers two practical patterns: one for improving an existing codebase and one for building from a blank canvas.\n\n---\n\n## The two loops\n\n| | **Audit-review loop** | **Complete reviewer loop** |\n|---|---|---|\n| **When to use** | You already have code and want it reviewed and improved. | You are building something from scratch. |\n| **Flow** | Reviewer → Enhancer → Quality gate | Planner → Executor → Auditor → Quality gate |\n| **Key difference** | Starts with an existing implementation. | Starts with a plan and a blank canvas. |\n\nThe names are deliberately boring. That is useful: the quality comes from the boundaries between stages, not from giving one agent an impressive title.\n\n---\n\n## Pattern 1: Audit-review loop\n\nUse this when the code already exists and you want a focused improvement pass.\n\n### The flow\n\n_Diagram drawn with [Koboyo](https://koboyo.com)._\n\n<picture>\n  <source media=\"(prefers-color-scheme: dark)\" srcset=\"/diagrams/audit-review-loop.dark.svg\">\n  <img alt=\"Audit-review loop: Existing code → Reviewer → Enhancer → Quality gate → Approved, or back to Enhancer\" src=\"/diagrams/audit-review-loop.svg\">\n</picture>\n\n\n### Why separate the roles?\n\nThe reviewer is optimised for depth. It should find edge cases, logic errors, missing tests, and violations of the existing design.\n\nThe enhancer is optimised for accurate execution. It should not spend its context budget rediscovering the repository or inventing a different solution. It receives a concrete handoff and applies it.\n\nThe quality gate is deliberately independent. It gets a fresh view of the result and checks whether the requested change actually works, whether the constraints were respected, and whether the fix introduced a new problem.\n\nThe point is not to use three different brands. The point is to prevent the same reasoning process from writing, approving, and rationalising its own work.\n\n### Make the review actionable\n\nA weak review says:\n\n> Fix the error handling.\n\nA useful review gives the enhancer enough information to act without another discovery expedition:\n\n```\nISSUE: Failed requests can leave the cache marked as fresh.\nSEVERITY: High\nLOCATION: src/cache/refresh.ts, refreshCache()\nCHANGE: Move the freshness update after the awaited request succeeds.\nVERIFY: Run npm test -- cache/refresh.test.ts\n```\n\nThe reviewer should provide exact file paths, relevant symbols or line ranges, expected behaviour, and verification commands. The enhancer should not need to run a second search just to understand the assignment.\n\n### The loop budget\n\nSet a hard limit, usually three rounds. If the quality gate keeps rejecting the result, the problem is probably structural: the review missed a constraint, the handoff is ambiguous, or the requested change is larger than the loop can safely handle.\n\nDo not let an automated loop become an endless argument. Stop, surface the unresolved issue, and return to planning.\n\n---\n\n## Pattern 2: Complete reviewer loop\n\nUse this when there is no implementation yet and the work needs more than a quick edit.\n\n### The flow\n\n_Diagram drawn with [Koboyo](https://koboyo.com)._\n\n<picture>\n  <source media=\"(prefers-color-scheme: dark)\" srcset=\"/diagrams/complete-reviewer-loop.dark.svg\">\n  <img alt=\"Complete reviewer loop: User task → Planner → Executor → Auditor → Quality gate → Done, or back to Executor\" src=\"/diagrams/complete-reviewer-loop.svg\">\n</picture>\n\n\n\n### The handoff packet\n\nThe handoff is the most important artifact in the system. The planner creates it, the executor follows it, and the auditor checks against it.\n\n```text\n---HANDOFF PACKET---\nGOAL: Add a dark-mode toggle to settings\n\nFILE PATHS (already found):\n  src/components/ThemeToggle.astro — new component\n  src/layouts/BaseLayout.astro — add toggle to header\n  src/styles/theme.scss — add dark-mode variables\n\nCONSTRAINTS:\n- Do not modify src/styles/reset.scss — it is canonical.\n- Keep light mode as the default; avoid a flash on load.\n- Match existing component patterns.\n\nSTEPS:\n1. Create ThemeToggle.astro with persistence for the selected theme.\n2. Add the component to the existing header navigation.\n3. Add dark-mode variables without changing light-mode defaults.\n4. Run npm run build.\n5. Run the relevant component and integration tests.\n\nDELIVERABLES:\n- src/components/ThemeToggle.astro\n- src/layouts/BaseLayout.astro\n- src/styles/theme.scss\n\nVERIFICATION:\n- Build passes with zero errors.\n- Light mode remains the default.\n- The component follows existing project conventions.\n---END HANDOFF---\n```\n\nA good handoff removes ambiguity before implementation starts. It identifies the files, constraints, sequence, and proof required for completion.\n\n### Why planning includes discovery\n\nImplementation agents are expensive when they spend half their time looking for files, reading command documentation, or guessing at interfaces. The planner should do that discovery once and put the findings in the handoff.\n\nThe executor can then spend its context on changing the right things and verifying them. This also makes the work easier to audit: the reviewer can compare the final diff with a concrete plan instead of a vague request.\n\n---\n\n## Implementation with Hermes Agent\n\nThe architecture is independent of provider or model brand. Configure your planner, executor, auditor, and quality gate according to the strengths and cost limits of your environment.\n\n### Role-based routing\n\n```bash\n# Route delegated implementation work to the executor configuration.\nhermes config set delegation.provider <executor-provider>\nhermes config set delegation.model <executor-model>\nhermes config set delegation.max_iterations 12\n```\n\nThe main session can handle planning and auditing, while the quality gate can run as a separate one-shot process:\n\n```bash\nhermes chat \\\n  --provider <quality-gate-provider> \\\n  --model <quality-gate-model> \\\n  -q \"<review prompt>\" \\\n  --quiet\n```\n\nThe placeholders are intentional. The workflow should survive a provider change without rewriting the engineering process.\n\n### Dispatch the executor\n\n```python\ndelegate_task(\n    goal=\"Execute the plan from the HANDOFF PACKET\",\n    context=\"<complete HANDOFF PACKET>\",\n    toolsets=[\"terminal\", \"file\"],\n)\n```\n\n### Routing table\n\n| Role | Responsibility |\n|------|----------------|\n| Planner | Clarifies the task, researches the repository, and writes the handoff. |\n| Executor | Applies the handoff literally and runs the verification commands. |\n| Auditor | Checks the result against the plan and the stated constraints. |\n| Quality gate | Provides an independent final verdict with evidence. |\n\nThe roles matter more than the labels attached to the tools performing them.\n\n---\n\n## Pitfalls\n\n**Do not let one stage approve its own work.** The quality gate needs a genuinely fresh perspective. It should not inherit the executor's assumptions or treat an implementation summary as proof.\n\n**Do not skip stages because the diff looks good.** The auditor catches plan-level mistakes; the quality gate catches problems that both the planner and executor missed.\n\n**Keep the handoff self-contained.** A delegated executor has no useful context beyond what you provide. Include paths, interfaces, constraints, commands, and acceptance criteria.\n\n**Respect the loop budget.** Three rounds is usually enough. Repeated rejection is a signal to revisit the plan, not permission to keep applying random patches.\n\n**Do not trust self-reports.** \"Done\" is not evidence. Confirm that the files exist, the tests ran, the build passed, and the resulting behaviour matches the request.\n\n---\n\n## When to use which\n\n- **Existing codebase, want a review?** → Audit-review loop.\n- **Building something new?** → Complete reviewer loop.\n- **Quick one-off edit?** → Neither. Do not over-engineer it.\n- **Trivial change in one file?** → A single pass is enough.\n\nThe threshold is simple: if the task has three or more meaningful steps across two or more files, a loop usually earns its overhead. If it is a one-line change, use the shortest reliable path.\n\n---\n\nThe core insight is not a particular model or provider. Those will change. It is the pattern: **clear plan → literal execution → independent audit → quality gate**. Each stage has one job, and nothing ships until someone who did not write the code says it is good."}},{"uri":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.document/3qckui2qfzybs","cid":"bafyreig36lghdzybd3f7pd5in33vaqx2stheujylwyeil52zqplltrdofm","value":{"path":"/blog/creating-ci-pipeline-with-aws-cli-and-gitlab-ci","site":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.publication/3lwafzkjqm25s","tags":[],"$type":"site.standard.document","title":"Creating CI pipeline with AWS CLI and Gitlab CI","description":"_Imported from Obsidian. Content was empty in source note._","publishedAt":"2021-06-18T00:00:00.000Z","textContent":"_Imported from Obsidian. Content was empty in source note._"}},{"uri":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.document/3hehume72wku5","cid":"bafyreifhuxfweccgs6ulbcpsc3uhso2jwzoso6tyfmrhflsoivkmaobvm4","value":{"path":"/blog/obsidian-dataview","site":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.publication/3lwafzkjqm25s","tags":[],"$type":"site.standard.document","title":"Obsidian Dataview","description":"_Imported from Obsidian. Content was empty in source note._","publishedAt":"2021-06-05T00:00:00.000Z","textContent":"_Imported from Obsidian. Content was empty in source note._"}},{"uri":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.document/2pnzgdylvepmq","cid":"bafyreidr656qnkbrrmiaabqyptio6lbqbfdkofjbptmengvn3yh3indrde","value":{"path":"/blog/setting-up-commitizen-with-gitlab-ci","site":"at://did:plc:53jkze3ofomdesnodoz5i34y/site.standard.publication/3lwafzkjqm25s","tags":[],"$type":"site.standard.document","title":"Setting up Commitizen with Gitlab CI","description":"_Imported from Obsidian. Content was empty in source note._","publishedAt":"2021-06-18T00:00:00.000Z","textContent":"_Imported from Obsidian. Content was empty in source note._"}}],"cursor":"2pnzgdylvepmq"}