<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Joe Mainwaring</title>
    <description>The latest articles on DEV Community by Joe Mainwaring (@theaccordance).</description>
    <link>https://dev.to/theaccordance</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F58970%2Ff29886f7-af0c-4dfb-805b-a0e719e44fca.jpg</url>
      <title>DEV Community: Joe Mainwaring</title>
      <link>https://dev.to/theaccordance</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/theaccordance"/>
    <language>en</language>
    <item>
      <title>Do you balance High-Tech with Low-Tech?</title>
      <dc:creator>Joe Mainwaring</dc:creator>
      <pubDate>Tue, 25 Jul 2023 16:15:00 +0000</pubDate>
      <link>https://dev.to/theaccordance/do-you-balance-high-tech-with-low-tech-332a</link>
      <guid>https://dev.to/theaccordance/do-you-balance-high-tech-with-low-tech-332a</guid>
      <description>&lt;p&gt;Technology today is an immersive experience, and as professionals in the space we tend to be above average in terms of our adoption and interconnectivity.  Today we have an app for nearly every idea imaginable, providing significantly more value-add to our daily lives than the generations that preceded us.  Technology however can be a double-edged sword, and the potential value-add and ease of access to so many options can lead to behaviors detrimental to our well-being.  Doom-scrolling is a solid example of this, where apps have created such a focus on retaining attention that we spend an unhealthy amount of time glued to our screens.  &lt;/p&gt;

&lt;p&gt;In the early 2010s, I had come to this realization as I learned from the successes (and many, many failures) of my 20s, and actively began to seek out low/no technology counter-balances to foster healthier long-term personal growth.  &lt;/p&gt;

&lt;p&gt;For myself, these counter balances came in a variety of forms over the years, some that come to mind: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Note taking using Moleskine notebooks&lt;/li&gt;
&lt;li&gt;Indoor gardening &lt;/li&gt;
&lt;li&gt;Marathon training&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Have you found yourself needing to counter-balance our technology-focused lives with low/no tech? Share your own experience and ways you've created a balanced lifestyle in the comments below ⬇️&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>productivity</category>
      <category>career</category>
      <category>motivation</category>
    </item>
    <item>
      <title>Does anyone else have mixed feelings with remote work?</title>
      <dc:creator>Joe Mainwaring</dc:creator>
      <pubDate>Tue, 20 Jun 2023 21:05:09 +0000</pubDate>
      <link>https://dev.to/theaccordance/does-anyone-else-have-mixed-feelings-with-remote-work-22k4</link>
      <guid>https://dev.to/theaccordance/does-anyone-else-have-mixed-feelings-with-remote-work-22k4</guid>
      <description>&lt;p&gt;We hear a lot of backlash when prominent CEOs call for a return to office work culture, but I'm curious if others may feel opposite of the public sentiment?  &lt;/p&gt;

&lt;p&gt;I support the option for people to work remotely within an org if their roles and responsibilities can be performed asynchronously, but my personal preference has always been to operate in-office.  That was taken away from me as a result of the pandemic as my company ended up shuttering the local office.  &lt;/p&gt;

&lt;p&gt;After spending these last 3 years working 100% remotely, I find myself with a renewed desire for a hybrid working environment.  It's not an option with my current company, but I can't deny that it's what I think is best for my career progression. I'm far more effective with some in-person collaboration on a regular cadence.  Do you share similar sentiment, or do you find yourself freed by remote work?&lt;/p&gt;

&lt;p&gt;Let me know your thoughts in the comments below ⬇️&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>productivity</category>
      <category>workplace</category>
      <category>career</category>
    </item>
    <item>
      <title>The Reddit blackout is a lesson in risk management</title>
      <dc:creator>Joe Mainwaring</dc:creator>
      <pubDate>Fri, 16 Jun 2023 18:58:16 +0000</pubDate>
      <link>https://dev.to/theaccordance/the-reddit-blackout-is-a-lesson-in-risk-k5e</link>
      <guid>https://dev.to/theaccordance/the-reddit-blackout-is-a-lesson-in-risk-k5e</guid>
      <description>&lt;p&gt;This morning I ran headfirst into the picket line for the &lt;a href="https://www.vox.com/technology/2023/6/14/23760738/reddit-blackout-explained-subreddit-apollo-third-party-apps" rel="noopener noreferrer"&gt;Reddit Blackout&lt;/a&gt; which hindered some research I was doing into a technical solution.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffhlcs04p6fqveevh0tdj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffhlcs04p6fqveevh0tdj.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;While I empathize with the impact to indie devs and SMBs dependent on the Reddit API, I can't support the protest.  &lt;strong&gt;Reddit's API is not a &lt;a href="https://en.wikipedia.org/wiki/Public_good_(economics)" rel="noopener noreferrer"&gt;public good&lt;/a&gt;; we are not entitled to freely access it.&lt;/strong&gt; While I could cite capitalist talking points to support my position, I'd rather focus instead on a different narrative, one which I suspect is underestimated by many indie devs and SMBs - risk.&lt;/p&gt;

&lt;h3&gt;
  
  
  Risk Management
&lt;/h3&gt;

&lt;p&gt;Risk Management was originally defined as part of the &lt;a href="https://en.wikipedia.org/wiki/ISO_31000" rel="noopener noreferrer"&gt;ISO 31000 Standard&lt;/a&gt; and can be summarized as:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;the identification, evaluation, and prioritization of risks, followed by coordinated and economical application of resources to minimize, monitor, and control the probability or impact of unfortunate events, or to maximize the realization of opportunities.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For mature technology companies like &lt;a href="https://www.worktango.com/" rel="noopener noreferrer"&gt;WorkTango&lt;/a&gt;, we are required to invest in Risk Management, and one way we meet this obligation is by maintaining an artifact known as a &lt;a href="https://en.wikipedia.org/wiki/Risk_register" rel="noopener noreferrer"&gt;Risk Register&lt;/a&gt;.  A Risk Register is a ledger which captures all of the criteria outlined in the definition of Risk Management.  We add to this register as risks are identified, and engage in a quarterly exercises to brainstorm new risks.  This provides the business as a whole with an understanding of potential risks for resource planning (feature development) and strategic decision making.  &lt;/p&gt;

&lt;p&gt;So why bring up risk management and the risk register in the context of the Reddit Blackout?  &lt;strong&gt;If WorkTango was in the business of creating a client app for Reddit's platform, we would have identified Reddit's free API as a dependency risk&lt;/strong&gt;.  &lt;/p&gt;

&lt;h3&gt;
  
  
  Dependency Risk
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://riskfirst.org/risks/Dependency-Risk#:~:text=Dependency%20Risk%20is%20the%20risk,the%20service%20goes%20down%20too." rel="noopener noreferrer"&gt;Dependency Risk&lt;/a&gt; is a category of risk you take on whenever you have a dependency on something (or someone) else.  &lt;strong&gt;When we build client apps wholly dependent on a third party platform, a dependency risk is created.&lt;/strong&gt; That third party could cease operating, or as both Reddit and Twitter have demonstrated, stop giving away their resources for free.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Open APIs are free, as in beer
&lt;/h2&gt;

&lt;p&gt;As a developer, it's best to think of Open APIs as &lt;a href="https://www.quora.com/What-is-the-difference-between-free-as-in-beer-and-free-as-in-speech" rel="noopener noreferrer"&gt;free, as in beer&lt;/a&gt;:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The API resource (beer) cost you nothing&lt;/li&gt;
&lt;li&gt;But APIs aren't free, somebody paid for the API (reddit)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The 2010s was a golden age in capital investment and the technology industry benefited significantly, enabling a lot of free resources as a draw to build audiences and engagement.  However, the 2020s so far have proven to be more challenging.  Money is no longer free and as a result, many companies are having to mature their business models to be more self-sustaining.  This means reducing expenses and finding additional sources of revenue.  Monetizing previously open APIs is an unfortunate intersection that addresses both needs. &lt;strong&gt;Expect less free beer on the internet as we progress through these tougher economic times.&lt;/strong&gt;  &lt;/p&gt;

&lt;h2&gt;
  
  
  Mitigating the Risk
&lt;/h2&gt;

&lt;p&gt;The only way to mitigate a dependency risk is to add a layer of redundancy, but when you build apps on top of platforms like Reddit or Twitter; you can't fail over to a different platform to access the same content.  So how would I mitigate this risk?  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Accept that if this risk is realized, it's game over for the app.  Since I do not own the backend which my app depends on, losing access to it means my app can no longer function.  Draw up a plan to wind down the product gracefully in the event this risk is ever realized.
&lt;/li&gt;
&lt;li&gt; Diversify. If I can't prevent a game-over situation, the next best mitigation strategy is to diversify my revenue streams.  That means building a second app on a different platform (ex: slack app), or building an app without the platform dependency risk.  That way, if I lose one app, I take a financial hit, but hopefully the other app can support myself while a new app is conceived to replace the lost revenue.
&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;Did you find this post insightful, or perhaps you disagree with my risk points in regards to Open APIs?  Share your thoughts in the comments below.  &lt;/p&gt;

</description>
      <category>discuss</category>
      <category>security</category>
      <category>learning</category>
      <category>startup</category>
    </item>
    <item>
      <title>Should AI development beyond GPT-4 be paused?</title>
      <dc:creator>Joe Mainwaring</dc:creator>
      <pubDate>Wed, 29 Mar 2023 14:35:39 +0000</pubDate>
      <link>https://dev.to/theaccordance/should-ai-development-beyond-gpt-4-should-be-paused-5fmb</link>
      <guid>https://dev.to/theaccordance/should-ai-development-beyond-gpt-4-should-be-paused-5fmb</guid>
      <description>&lt;p&gt;Leading AI academics and industry experts - including Steve Wozniak and Elon Musk, published an &lt;a href="https://futureoflife.org/open-letter/pause-giant-ai-experiments/"&gt;open letter&lt;/a&gt; today calling for a pause on developing more sophisticated AI beyond OpenAI's GPT-4.  The letter cites &lt;em&gt;risks to society and humanity&lt;/em&gt; as a major concern and asks for the pause to enable the industry to develop shared safety protocols. &lt;/p&gt;

&lt;p&gt;Do you agree with the consensus of the experts?  Is a pause even a realistic option when you factor in global politics and capitalism?  Share your thoughts below!  &lt;/p&gt;

</description>
      <category>discuss</category>
      <category>ai</category>
      <category>healthydebate</category>
      <category>openai</category>
    </item>
    <item>
      <title>I'm doing this one thing differently next time I build a SaaS product</title>
      <dc:creator>Joe Mainwaring</dc:creator>
      <pubDate>Thu, 24 Nov 2022 20:56:59 +0000</pubDate>
      <link>https://dev.to/theaccordance/im-doing-this-one-thing-differently-next-time-i-build-a-saas-product-2efp</link>
      <guid>https://dev.to/theaccordance/im-doing-this-one-thing-differently-next-time-i-build-a-saas-product-2efp</guid>
      <description>&lt;p&gt;As one does the further they progress in their career, they develop wisdom based on their experiences and apply it with future opportunities.  When it comes time for me to build my next SaaS product, one piece of wisdom I intend to apply is to &lt;strong&gt;host my SaaS Product and Marketing Website on separate domains&lt;/strong&gt;.  Seems simple enough, but why is this a wise piece of advice?  As products scale and businesses mature, the necessity to demonstrate the integrity of your product becomes more paramount.  &lt;/p&gt;

&lt;p&gt;Since &lt;em&gt;Information Security&lt;/em&gt; falls under my domain as Director of Infrastructure for four B2B enterprise SaaS products, I regularly have to interact with external stakeholders:  &lt;em&gt;Customers, closing deals (sales), auditors, and even insurance providers.&lt;/em&gt;  At least once a month, someone will conduct a due-diligence task on their end by publicly scanning my domains and confront us with the findings. &lt;/p&gt;

&lt;p&gt;While I think it's important to address vulnerabilities, not all vulnerabilities are the same:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Some vulnerabilities are benign because your use case is not applicable&lt;/li&gt;
&lt;li&gt;Some vulnerabilities cannot be reconciled as they were past decisions that are unable to be changed &lt;/li&gt;
&lt;li&gt;But most importantly, &lt;strong&gt;some vulnerabilities create a liability for customer data, and others do not.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In my context, 99% of public probing does not identify vulnerabilities that meet the third point, &lt;strong&gt;but it's the only reason why the feedback is being given.&lt;/strong&gt;  And because people think they've identified a risk to their data, they're often times unwilling to accept the simple answer, instead sucking up my time through multiple interactions to effectively communicate our integrity.  If I separate the marketing website from the actual SaaS product, I'm better positioned to deflect these reports, as I can instead encourage them to rescan the domain where the customer data is accessible.  &lt;/p&gt;

&lt;p&gt;So, for my next SaaS product, expect the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Marketing Website will be hosted with a &lt;code&gt;.com&lt;/code&gt; address&lt;/li&gt;
&lt;li&gt;SaaS product will live on another tld like &lt;code&gt;.app&lt;/code&gt;, &lt;code&gt;.io&lt;/code&gt;, etc&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;While I don't expect many of you to have encountered this type of situation, I'd welcome your thoughts or experiences if you do have similar.  &lt;/p&gt;

</description>
      <category>webscraping</category>
      <category>cybersecurity</category>
      <category>discuss</category>
    </item>
    <item>
      <title>A Bitter Interview Experience</title>
      <dc:creator>Joe Mainwaring</dc:creator>
      <pubDate>Sun, 06 Nov 2022 19:54:31 +0000</pubDate>
      <link>https://dev.to/theaccordance/a-bitter-interview-experience-56lf</link>
      <guid>https://dev.to/theaccordance/a-bitter-interview-experience-56lf</guid>
      <description>&lt;p&gt;Recently, I interviewed for a leadership role that left me bitter at the decision not to proceed.  While I wasn't sold that I was the correct fit for the role, I felt that the decision was made prematurely given how the role was advertised.  I won't name the company, but I'll generalize it as being of the &lt;em&gt;moonshot&lt;/em&gt; pedigree with an &lt;em&gt;extremely unique&lt;/em&gt; and &lt;em&gt;forward-thinking&lt;/em&gt; business problem being solved.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Went Wrong
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Job Description didn't cover the key technologies
&lt;/h3&gt;

&lt;p&gt;As an interviewee, I rely on job descriptions to self-evaluate &amp;amp; prepare for interviews with different stakeholders. In my most recent experience, I found myself performing top-level discovery in both the hiring manager and technical interviews, leaving me unprepared to speak in regards to those technologies.  If you know that you need to build out a data lake with a robust abstraction layer, or that you need to scale a tech stack component that's more unique to that industry, it's helpful to describe that with the advertisement.   &lt;strong&gt;It's also helpful to stack-rank your priorities in the job description, as it intuitively emphasizes what you need most.&lt;/strong&gt;  &lt;/p&gt;

&lt;h3&gt;
  
  
  No Agendas
&lt;/h3&gt;

&lt;p&gt;To put it simply, &lt;strong&gt;it is disrespectful in business to schedule a meeting without an agenda.&lt;/strong&gt;  That opinion applies equally to the interview process, as it doesn't enable one side of the meeting to adequately prepare.  As an interviewee, going forward I will be &lt;strong&gt;asking for an agenda for every meeting&lt;/strong&gt;.  This will enable me to ask follow-up questions if I'm unsure of what a certain topic will be and come prepared.  &lt;/p&gt;

&lt;h3&gt;
  
  
  The test didn't reflect the role
&lt;/h3&gt;

&lt;p&gt;Competency tests are a common (and debatably necessary) part of the interview process, as it serves to be a filter around the necessary skills to succeed.  But a lot of companies get it wrong and measure a candidate incorrectly, which is how I felt after this interview.&lt;/p&gt;

&lt;p&gt;The test itself (Application Architecture Design) is a completely legitimate type of test when you're evaluating an &lt;em&gt;individual contributor&lt;/em&gt; like a Senior or Principal engineer.  But as a leader?  I'm not being hired for ditch digging, I'm being hired to build successful teams that solve the company's problems.  Yes, it's important I have a &lt;em&gt;base level&lt;/em&gt; of competency, but when the role isn't that of an individual contributor, this kind of test is not a golden signal for evaluating a candidate.  &lt;/p&gt;

&lt;h2&gt;
  
  
  How I would have done it differently as the interviewer
&lt;/h2&gt;

&lt;p&gt;To start, I would update the job description to reflect what topics are going to be discussed during the hiring manager and technical stage interviews, and stack rank the priorities of each bullet point.  &lt;/p&gt;

&lt;p&gt;Second, Agendas.  They don't even have to be complex agendas either, something as simple as the following works:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1.  Introductions 
2.  Pair session - Application Architecture Diagram
3.  Q&amp;amp;A 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Third, I would design a competency test where the candidate pitches a solution &amp;amp; plan to implement.  This would be a more appropriate way to measure a leadership role involving a vague problem &amp;amp; a budget to build a team.  It wouldn't be a synchronous test, rather an assignment that would be issued after passing the hiring manager stage and submitted following the completion of stakeholder interviews.&lt;/p&gt;

&lt;p&gt;Last but not least, I would re-organize the technical interview step into a round robin where a candidate meets with 2-3 stakeholders individually to evaluate competency.  Preferably, the stakeholders would be from different teams/departments, enabling different perspectives &amp;amp; providing a more comprehensive evaluation of a candidate, reflecting the the fact the job isn't a single function.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Your Thoughts?
&lt;/h2&gt;

&lt;p&gt;Do you empathize with my experience, have your own to pour on, or have differing opinions?  Share your thoughts below in the comments section, but please keep it civil and agree to disagree ;) &lt;/p&gt;

</description>
      <category>devjournal</category>
      <category>discuss</category>
      <category>career</category>
      <category>leadership</category>
    </item>
    <item>
      <title>Opening up my Open Source Projects for Hacktoberfest</title>
      <dc:creator>Joe Mainwaring</dc:creator>
      <pubDate>Sun, 09 Oct 2022 15:34:16 +0000</pubDate>
      <link>https://dev.to/theaccordance/opening-up-my-open-source-projects-for-hacktoberfest-52j5</link>
      <guid>https://dev.to/theaccordance/opening-up-my-open-source-projects-for-hacktoberfest-52j5</guid>
      <description>&lt;p&gt;Calling all beginners!  &lt;/p&gt;

&lt;p&gt;Are you interested in participating with &lt;a href="https://hacktoberfest.com/"&gt;Hacktoberfest&lt;/a&gt;, but find many of the projects a little complex to participate in?  I have a couple opportunities for you!  &lt;/p&gt;

&lt;h2&gt;
  
  
  NPM:  Card-dealer
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://github.com/theaccordance/card-dealer"&gt;card-dealer&lt;/a&gt; package was a simple package I created several years ago based on a coding test I had to take for a mid-level software engineering role.  The runtime boasts no dependencies (only devDependencies!), but does with a curveball of a &lt;strong&gt;strict 100% test coverage requirement&lt;/strong&gt;, but it could also be an opportunity to learn unit testing in a simple scenario!&lt;br&gt;&lt;br&gt;
Card Dealer is written in &lt;strong&gt;TypeScript&lt;/strong&gt; and &lt;strong&gt;Markdown&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Participation Ideas
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Add new decks to the package:&lt;/strong&gt;  My OSS package includes a standard 52-card deck and an Uno deck, but there are many other types of card decks out there!  MGT, Pokemon, CAH, the list goes on.  Lots of opportunity to be creative if you desire!
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add new dealer methods:&lt;/strong&gt;  So far I have implemented a core set of methods related to Dealer actions involving a deck of cards, but there may be more use cases with other decks.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Game Management&lt;/strong&gt;:  Currently, the scope of this package is exclusive to the actions around dealing cards, but I've contemplated adding more game management aspects to the package.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add a feature that exits in a &lt;a href="https://github.com/theaccordance/card-dealer/network/members"&gt;fork&lt;/a&gt;:&lt;/strong&gt;  Many forks exist because they required a slight variation to my implementation, which presents an easy opportunity to port those changes back!
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Update documentation&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/yUtYMPgFwXjhwzJ0aY/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/yUtYMPgFwXjhwzJ0aY/giphy.gif" alt="giphy" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Github Actions: Balena Push
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/theaccordance/balena-push"&gt;Balena push&lt;/a&gt; is an open-source package that was born out of both need and opportunity with the introduction of Github Actions. At the time, I was using the IoT platform &lt;a href="https://www.balena.io/"&gt;Balena.io&lt;/a&gt; to manage a fleet of Digital Signage (TVs with Raspberry Pis) within my company's office.  The Github action enables you to continuously deliver your project to Balena by pushing changes to the platform.  &lt;/p&gt;

&lt;p&gt;Balena Push is written in Docker and Shell.  &lt;/p&gt;

&lt;h3&gt;
  
  
  Participation Ideas
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/theaccordance/balena-push/issues/6"&gt;Pass Flags&lt;/a&gt;:&lt;/strong&gt;  Looking over the forks of my OSS package, I found that someone had forked purely to pass flags I didn't need when I authored the package.  The linked ticket should help you get started.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integrate further with the CLI:&lt;/strong&gt; The Github Action itself just uses the Balena CLI to execute a push command.  Take a look at &lt;a href="https://www.balena.io/docs/reference/balena-cli/#push-fleetordevice"&gt;Balena's CLI docs&lt;/a&gt; and if you see a way to extend, feel free to take a stab at it!
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add a feature that exits in a &lt;a href="https://github.com/theaccordance/balena-push/network/members"&gt;fork&lt;/a&gt;:&lt;/strong&gt;  Many forks exist because they required a slight variation to my implementation, which presents an easy opportunity to port those changes back!
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Update Documentation&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/DpNOlWx7F77IG9stWa/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/DpNOlWx7F77IG9stWa/giphy.gif" alt="giphy" width="384" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  IoT:  Digital Signage
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/theaccordance/digital-signage"&gt;Digital Signage&lt;/a&gt; is an open-source service that I put together to turn the Televisions around my company's office into useful displays for things like Activity Feeds (our own product) and Operational Dashboards (Datadog).  &lt;/p&gt;

&lt;h3&gt;
  
  
  Participation Ideas
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Update documentation:&lt;/strong&gt;  So I have a confession to make - I didn't write any docs for this project.  I usually overlook this one when I talk OSS, but it is public and the project can be forked and reused by others.  While the lack of a README is typically a barrier for participation, the project was born based on tutorials.  Google &lt;code&gt;balena-wpe&lt;/code&gt; to find numerous guides around the actual service driving the project.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Update the subpackage dependency:&lt;/strong&gt;  As mentioned above, my digital signage uses &lt;code&gt;balena-wpe&lt;/code&gt; as a sub module, but hasn't been updated in ages.  This is a good opportunity if you want to sharpen git skills.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enhance the github project:&lt;/strong&gt;  Since I have overlooked this as OSS in the past, it doesn't have a lot of the enhancements I've made to other projects.  I discuss many of these in my post &lt;a href="https://dev.to/theaccordance/how-i-maintain-oss-projects-2oeo"&gt;How I maintain OSS&lt;/a&gt;, and several of these can be direct copies from the files I've added to my other OSS packages listed above.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/Q8DQRJ7X3ps5y4TRnh/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/Q8DQRJ7X3ps5y4TRnh/giphy.gif" alt="giphy" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Need Help?
&lt;/h2&gt;

&lt;p&gt;Do you want to participate but not sure how to get something across the finish line?  Open a Pull Request and we'll begin a discussion to help get your PR in an acceptable state to be merged.  You may also DM me on Hacktober's &lt;a href="https://discord.gg/hacktoberfest"&gt;Discord Server&lt;/a&gt; under the name &lt;code&gt;mainwaring&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Got an idea I didn't mention above?  Start a conversation as an Issue.  &lt;/p&gt;

</description>
      <category>hacktoberfest</category>
      <category>beginners</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Describing My Sandbox</title>
      <dc:creator>Joe Mainwaring</dc:creator>
      <pubDate>Mon, 03 Oct 2022 15:25:05 +0000</pubDate>
      <link>https://dev.to/theaccordance/describing-my-sandbox-594e</link>
      <guid>https://dev.to/theaccordance/describing-my-sandbox-594e</guid>
      <description>&lt;p&gt;I've been busy this year executing my take on the #100DaysOfCode challenge by rebuilding a set of development skills that I can use to implement products using micro-services.  That work has resulted in a rather robust mixed-use sandbox. As part of my effort to build out a comprehensive public documentation portal, over the weekend I set about starting a document to describe my Sandbox's Architecture.  Below is the first architecture diagram I've produced, describing from a top level the services which make up my sandbox &amp;amp; how they're zoned or organized:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fphja8pjtws6e9bgyhpi0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fphja8pjtws6e9bgyhpi0.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Using &lt;a href="https://www.cloudflare.com/dns/" rel="noopener noreferrer"&gt;Cloudflare's&lt;/a&gt; amazing DNS service, my Sandbox is spread across two domains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Knowhere.space:&lt;/strong&gt; Knowhere is my edge-computing zone, with the DNS routing to a NAS server or Raspberry PIs within my home.  I use this zone to serve content primarily within my home, as well as services which are either experimental, or cost-prohibitive in the cloud.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mainwaring.dev:&lt;/strong&gt; Mainwaring.dev encompasses all of my cloud computing services from a variety of different providers, including &lt;a href="https://www.digitalocean.com" rel="noopener noreferrer"&gt;DigitalOcean&lt;/a&gt;, &lt;a href="https://vercel.com/" rel="noopener noreferrer"&gt;Vercel&lt;/a&gt;, &lt;a href="https://www.carrd.co" rel="noopener noreferrer"&gt;Carrd.co&lt;/a&gt; and others.
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Knowhere.space
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Traefik:&lt;/strong&gt; &lt;a href="https://traefik.io/" rel="noopener noreferrer"&gt;Traefik&lt;/a&gt; acts as an ingress for my homelab, enabling me to route traffic to the other services I have running on the edge without overly exposing my Firewall with open ports.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PiHole:&lt;/strong&gt;  &lt;a href="https://pi-hole.net/" rel="noopener noreferrer"&gt;PiHole&lt;/a&gt; is a DNS Sinkhole I added to reduce the number of ads and trackers served to devices on my local network.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plex:&lt;/strong&gt;  &lt;a href="https://www.plex.tv/" rel="noopener noreferrer"&gt;Plex&lt;/a&gt; is my personal Netflix, serving content I have stored on my local network.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;YAC Reader:&lt;/strong&gt; Comics are a guilty pleasure of mine, and &lt;a href="https://www.yacreader.com/" rel="noopener noreferrer"&gt;YAC Reader&lt;/a&gt; enables me to serve digital comics to my iPad with ease.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transmission:&lt;/strong&gt; &lt;a href="https://transmissionbt.com/" rel="noopener noreferrer"&gt;Transmission&lt;/a&gt; is a BitTorrent client.  &lt;a href="https://haugene.github.io/docker-transmission-openvpn/" rel="noopener noreferrer"&gt;The specific implementation of Transmission I use includes OpenVPN&lt;/a&gt;, allowing me to securely route that traffic.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lighthouse:&lt;/strong&gt; &lt;a href="https://github.com/spotify/lighthouse-audit-service" rel="noopener noreferrer"&gt;Spotify's open-source Lighthouse Audit Service&lt;/a&gt;  integrates my Backstage.io implementation with &lt;a href="https://developer.chrome.com/docs/lighthouse/overview/" rel="noopener noreferrer"&gt;Google Lighthouse&lt;/a&gt;.  In a for-profit situation, I would run this service in the cloud, but I'm taking advantage of existing resources I have to run such a minor service.
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Mainwaring.dev
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;API:&lt;/strong&gt;  A very robust REST server built using the &lt;a class="mentioned-user" href="https://dev.to/strapijs"&gt;@strapijs&lt;/a&gt;.  I currently have over 1 million records of personal data stored from more than dozen sources, including third-party services (&lt;a href="https://www.twitter.com" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;, &lt;a href="https://www.facebook.com" rel="noopener noreferrer"&gt;Facebook&lt;/a&gt;, &lt;a href="https://www.discogs.com" rel="noopener noreferrer"&gt;Discogs&lt;/a&gt;), manual data entry (press releases &amp;amp; news articles, postcards) and &lt;a href="https://www.apple.com/ios/health/" rel="noopener noreferrer"&gt;Apple's Healthkit&lt;/a&gt; (Workouts, Calories Burned, Heart Rate).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backstage (server):&lt;/strong&gt;  &lt;a href="https://www.backstage.io" rel="noopener noreferrer"&gt;Backstage&lt;/a&gt; is an open-source project from Spotify which enables teams to build developer portals and customize them in a way to aggregate data from all the various tools a team uses. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chartbrew (server):&lt;/strong&gt; &lt;a href="https://chartbrew.com/" rel="noopener noreferrer"&gt;Chartbrew&lt;/a&gt; is open-source reporting service which really makes it easy to visualize data.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backstage (website):&lt;/strong&gt; The Backstage Frontend is a separate process from the backend, so I opted to host it on Vercel.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chartbrew (website):&lt;/strong&gt;  Similar to Backstage, the Chartbrew frontend is a separate process which I host on Vercel.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://contact.mainwaring.dev" rel="noopener noreferrer"&gt;Contact&lt;/a&gt;:  While it's awesome to build cool things, sometimes you just need a simple website tool for static content.  Contact is one of these examples.  This branded-alternative to LinkTree is used as a digital business card, providing my audience with a list of options to learn about myself and make contact.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://bruce.mainwaring.dev" rel="noopener noreferrer"&gt;The Legend of Bruce&lt;/a&gt;:&lt;/strong&gt;  A marketing website for a social experiment.  When I attend music festivals, I typically bring a large inflatable dinosaur (Bruce) to crowd-surf a headlining act, and at the end of the night he always goes home with a random person he found in the crowd.  Bruce now includes a QR code linking back to this page, which serves as a Call to Action to share pictures or videos people take with Bruce on &lt;a href="https://www.instagram.com" rel="noopener noreferrer"&gt;Instagram&lt;/a&gt;.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://status.mainwaring.dev" rel="noopener noreferrer"&gt;Status Page&lt;/a&gt;:&lt;/strong&gt; Status Pages are a common feature for SaaS products, and &lt;a href="https://www.betteruptime.com" rel="noopener noreferrer"&gt;BetterUptime&lt;/a&gt; made it really easy to implement monitoring over my resources.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://docs.mainwaring.dev" rel="noopener noreferrer"&gt;Public Documentation Portal&lt;/a&gt;:&lt;/strong&gt; &lt;a href="https://www.gitbook.com" rel="noopener noreferrer"&gt;Gitbook&lt;/a&gt; enables me to author public documentation within my Github Project and easily serve it in a presentable way.  I use this portal to share documentation for open-source projects I publish, as well as Architecture documents and how-to guides.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Do you have questions or comments about my sandbox so far?  Drop them below ⬇️&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>career</category>
      <category>100daysofcode</category>
      <category>devjournal</category>
    </item>
    <item>
      <title>Having fun with old work domains</title>
      <dc:creator>Joe Mainwaring</dc:creator>
      <pubDate>Thu, 29 Sep 2022 22:01:33 +0000</pubDate>
      <link>https://dev.to/theaccordance/having-fun-with-old-work-domains-3aoe</link>
      <guid>https://dev.to/theaccordance/having-fun-with-old-work-domains-3aoe</guid>
      <description>&lt;p&gt;Today I executed on a silly idea involving a domain I'm retiring at work, &lt;code&gt;highground.com&lt;/code&gt;.  Highground was the brand I joined back in 2014, and in 2018 we were acquired by a Private Equity firm and merged with a competitor, creating the company that is now known as &lt;a href="https://www.worktango.com"&gt;WorkTango&lt;/a&gt;.  For those of us who are Star Wars fans, there is an infamous clip from Episode III: Revenge of the Sith &lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/UbzFZacBqWjPG/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/UbzFZacBqWjPG/giphy.gif" alt="giphy" width="480" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Since &lt;em&gt;I have the Highground&lt;/em&gt;, it was only natural to share it with everyone (except Anakin, of course), enjoy! &lt;/p&gt;

&lt;p&gt;&lt;a href="https://ihavethe.highground.com"&gt;https://ihavethe.highground.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>watercooler</category>
    </item>
    <item>
      <title>Who still uses Grunt.js?</title>
      <dc:creator>Joe Mainwaring</dc:creator>
      <pubDate>Fri, 09 Sep 2022 13:09:34 +0000</pubDate>
      <link>https://dev.to/theaccordance/who-still-uses-gruntjs-5f4a</link>
      <guid>https://dev.to/theaccordance/who-still-uses-gruntjs-5f4a</guid>
      <description>&lt;p&gt;&lt;a href="https://gruntjs.com/"&gt;Grunt.js&lt;/a&gt; is a favorite tool of mine, while it's most commonly viewed as a (legacy) build system, I've found it to be a fairly robust CLI framework for designing local and automated tasks and still actively develop tasks to this day.  &lt;/p&gt;

&lt;p&gt;I've thought about writing content around these other use cases, but I've been hesitant knowing that it's not widely popular given other build-focused tools available.  &lt;/p&gt;

&lt;p&gt;If you use Grunt.js, or would be interested in how one could use it beyond build steps, share your thoughts below in the comments.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/xT5LMK9KZ6iLYlYsAE/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/xT5LMK9KZ6iLYlYsAE/giphy.gif" alt="grunting" width="480" height="366"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>devops</category>
      <category>javascript</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How to use 1Password to share local secrets</title>
      <dc:creator>Joe Mainwaring</dc:creator>
      <pubDate>Fri, 02 Sep 2022 17:13:01 +0000</pubDate>
      <link>https://dev.to/theaccordance/how-to-use-1password-to-share-local-secrets-434d</link>
      <guid>https://dev.to/theaccordance/how-to-use-1password-to-share-local-secrets-434d</guid>
      <description>&lt;p&gt;&lt;strong&gt;Author's Note:&lt;/strong&gt; &lt;em&gt;All the plain-text secret values shown in this tutorial are fictional.  Don't try to use them to hack my things, because these resources do not exist.&lt;/em&gt;  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://1password.com/" rel="noopener noreferrer"&gt;1Password&lt;/a&gt; is an excellent password manager, and recently I began exploring the value it can provide for secrets management, and boy is it easy!  If your team is using 1Password, you can use your vaults to share secrets and pass them to your projects!  Below is a tutorial I've documented as I tested this process myself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;In order to follow this tutorial, you'll need: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;a href="https://support.1password.com/explore/membership/" rel="noopener noreferrer"&gt;1Password cloud subscription&lt;/a&gt;.  If you're using the legacy version of 1Password where you self-host your vaults, this guide likely won't work.
&lt;/li&gt;
&lt;li&gt;The 1Password CLI.  You can find the &lt;a href="https://developer.1password.com/docs/cli" rel="noopener noreferrer"&gt;installation docs here&lt;/a&gt;.
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Optional: Create a vault
&lt;/h2&gt;

&lt;p&gt;While this step is &lt;em&gt;optional&lt;/em&gt; to complete the tutorial, it's a good practice to have your secrets and credentials organized in a way that segregates access.  For this example, let's pretend our project is the following: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JavaScript based SaaS Application&lt;/li&gt;
&lt;li&gt;Engineering Team: 

&lt;ul&gt;
&lt;li&gt;1 Principal Engineer&lt;/li&gt;
&lt;li&gt;1 Senior-level Engineer&lt;/li&gt;
&lt;li&gt;1 Junior-level Engineer (Contractor)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Two Environments

&lt;ul&gt;
&lt;li&gt;Non-Prod: Everyone has access&lt;/li&gt;
&lt;li&gt;Production: No contractors &lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Given this context, we'd want our Junior Engineer to be able to view/add/edit non-production secrets, but not production ones.  Let's start by first creating a vault which is accessible by all engineers and call it &lt;em&gt;NewApp Non-Prod&lt;/em&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcwjlf4te7hhdsu7ujdi8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcwjlf4te7hhdsu7ujdi8.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Add secrets to vault
&lt;/h2&gt;

&lt;p&gt;Next, let's populate a few different credentials in this vault.  For this tutorial, I'm going to keep things simple and create two different items.  For our first item, let's create &lt;em&gt;NewApp (Local)&lt;/em&gt;.  This is where I would put shared secrets that are owned by the application itself.  In this example, I've defined a few items like &lt;code&gt;URL&lt;/code&gt;, &lt;code&gt;admin password&lt;/code&gt;, &lt;code&gt;postgres connection string&lt;/code&gt;, &lt;code&gt;token salt&lt;/code&gt;, and &lt;code&gt;JWT Secret&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn4mtqmf8ni5k3buoq2ve.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn4mtqmf8ni5k3buoq2ve.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next let's add a second item to our vault for a third-party integration.  For this example, we'll use the service &lt;a href="https://www.twilio.com/" rel="noopener noreferrer"&gt;Twilio&lt;/a&gt; and define our test &lt;code&gt;Account SID&lt;/code&gt; and &lt;code&gt;Auth Token&lt;/code&gt; which is used by the application at startup: &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fib195bdu0f1uws5d8pp5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fib195bdu0f1uws5d8pp5.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Create a .env-template file
&lt;/h2&gt;

&lt;p&gt;Within your project, create a new file called &lt;code&gt;.env-template&lt;/code&gt;, which we'll use as a template for creating a &lt;code&gt;.env&lt;/code&gt; file used by the application at runtime.  Let's scaffold our template by mapping out the environment variables our application requires:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpk5ez6fa4mdsmdg94yl0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpk5ez6fa4mdsmdg94yl0.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  1Password CLI
&lt;/h2&gt;

&lt;p&gt;Now that we have our &lt;code&gt;.env-template&lt;/code&gt; scaffolded, let's shift our focus towards the 1Password CLI.  First, start by &lt;a href="https://developer.1password.com/docs/cli/get-started#sign-in" rel="noopener noreferrer"&gt;authenticating our CLI&lt;/a&gt; with the command &lt;code&gt;eval $(op signin)&lt;/code&gt;.  The CLI will ask you to confirm which account you're authenticating with, and you'll be prompted to provide your password.  &lt;/p&gt;

&lt;p&gt;Once you've authenticated, you'll want to first start by &lt;a href="https://developer.1password.com/docs/cli/get-started#basic-commands" rel="noopener noreferrer"&gt;listing your Vaults&lt;/a&gt;.  To list your vaults, execute the command &lt;code&gt;op vault list&lt;/code&gt;:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4wh67lq4z8gbu1qxd4yu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4wh67lq4z8gbu1qxd4yu.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now that we have our vault details, let's list the items of our &lt;em&gt;NewApp Non-Prod&lt;/em&gt; vault.  To list items in a vault, you'll execute the command &lt;code&gt;op item list --vault &amp;lt;vault name or guid&amp;gt;&lt;/code&gt;:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvyh6jju83ddn6z4xxtt4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvyh6jju83ddn6z4xxtt4.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finally, we'll tell the CLI to fetch us the details of an item in JSON format, so we can copy the &lt;code&gt;reference&lt;/code&gt; pointer to our template.  You can achieve this wit the command &lt;code&gt;op item get &amp;lt;item name or guid&amp;gt; --format json&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The reference pointers will be formatted as either &lt;br&gt;
&lt;code&gt;op://&amp;lt;vault&amp;gt;/&amp;lt;item&amp;gt;/&amp;lt;property&amp;gt;&lt;/code&gt; or &lt;code&gt;op://&amp;lt;vault&amp;gt;/&amp;lt;item&amp;gt;/&amp;lt;section&amp;gt;/&amp;lt;property&amp;gt;&lt;/code&gt; depending how you stored the secret in your item.  The different paramaters can either be that property's &lt;em&gt;label/title/name&lt;/em&gt; or &lt;em&gt;guid&lt;/em&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;example-project % op item get 'NewApp (Local)' --format json
{
  "id": "bzbaer6g2smaqqpntup3zugy3y",
  "title": "NewApp (Local)",
  "version": 1,
  "vault": {
    "id": "54wvogqhltjzolqik3f4cajpru",
    "name": "NewApp Non-Prod"
  },
  "category": "SERVER",
  "last_edited_by": "LFQSVNLW5VCBFDW6QKJRODDWFY",
  "created_at": "2022-09-02T14:50:19Z",
  "updated_at": "2022-09-02T14:50:19Z",
  "sections": [
    {
      "id": "admin_console",
      "label": "Admin Console"
    },
    {
      "id": "n3n3xpw3j5e4e22a6c26kqbuaq",
      "label": "Secrets"
    }
  ],
  "fields": [
    {
      "id": "notesPlain",
      "type": "STRING",
      "purpose": "NOTES",
      "label": "notesPlain",
      "reference": "op://NewApp Non-Prod/bzbaer6g2smaqqpntup3zugy3y/notesPlain"
    },
    {
      "id": "url",
      "type": "STRING",
      "label": "URL",
      "value": "https://localhost:42069",
      "reference": "op://NewApp Non-Prod/bzbaer6g2smaqqpntup3zugy3y/URL"
    },
    {
      "id": "admin_console_url",
      "section": {
        "id": "admin_console",
        "label": "Admin Console"
      },
      "type": "STRING",
      "label": "admin console URL",
      "value": "https://localhost:42069/admin",
      "reference": "op://NewApp Non-Prod/bzbaer6g2smaqqpntup3zugy3y/Admin Console/admin console URL"
    },
    {
      "id": "admin_console_username",
      "section": {
        "id": "admin_console",
        "label": "Admin Console"
      },
      "type": "STRING",
      "label": "admin console username",
      "value": "admin@newapp.dev",
      "reference": "op://NewApp Non-Prod/bzbaer6g2smaqqpntup3zugy3y/Admin Console/admin console username"
    },
    {
      "id": "admin_console_password",
      "section": {
        "id": "admin_console",
        "label": "Admin Console"
      },
      "type": "CONCEALED",
      "label": "console password",
      "value": "eZMvXEcKTL9KWRjhyTrN",
      "reference": "op://NewApp Non-Prod/bzbaer6g2smaqqpntup3zugy3y/Admin Console/console password"
    },
    {
      "id": "izfxzz7i5qbtj7unkkh6nfg3hu",
      "section": {
        "id": "n3n3xpw3j5e4e22a6c26kqbuaq",
        "label": "Secrets"
      },
      "type": "STRING",
      "label": "Postgres Connection String",
      "value": "postgres://postgres:123456@127.0.0.1:5432/dummy",
      "reference": "op://NewApp Non-Prod/bzbaer6g2smaqqpntup3zugy3y/Secrets/Postgres Connection String"
    },
    {
      "id": "6ljbsngcsimhqg7x4iukfbaovm",
      "section": {
        "id": "n3n3xpw3j5e4e22a6c26kqbuaq",
        "label": "Secrets"
      },
      "type": "STRING",
      "label": "Token Salt",
      "value": "07af136084ca0ea0cc192b0769e97122",
      "reference": "op://NewApp Non-Prod/bzbaer6g2smaqqpntup3zugy3y/Secrets/Token Salt"
    },
    {
      "id": "bvbjgzmdo4wwra7noxfnsvvyca",
      "section": {
        "id": "n3n3xpw3j5e4e22a6c26kqbuaq",
        "label": "Secrets"
      },
      "type": "STRING",
      "label": "JWT_Secret",
      "value": "061971eaaaa99212e737c1e789799cd8",
      "reference": "op://NewApp Non-Prod/bzbaer6g2smaqqpntup3zugy3y/Secrets/JWT_Secret"
    }
  ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Add reference pointers
&lt;/h2&gt;

&lt;p&gt;With the reference value copied, return to your &lt;code&gt;.env-template&lt;/code&gt; file and paste the pointer as the environment variable value.  Repeat the process of fetching the reference values until your &lt;code&gt;.env-template&lt;/code&gt; file is complete.  What mine looked like after I finished:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ADMIN_PASSWORD=op://NewApp Non-Prod/bzbaer6g2smaqqpntup3zugy3y/Admin Console/console password
POSTGRES_CONNECTION_STRING=op://NewApp Non-Prod/bzbaer6g2smaqqpntup3zugy3y/Secrets/Postgres Connection String
TOKEN_SALT=op://NewApp Non-Prod/bzbaer6g2smaqqpntup3zugy3y/Secrets/Token Salt
JWT_SECRET=op://NewApp Non-Prod/bzbaer6g2smaqqpntup3zugy3y/Secrets/JWT_Secret
TWILIO_SID=op://NewApp Non-Prod/Twilio/Test Secrets/Account SID
TWILIO_AUTH_TOKEN=op://NewApp Non-Prod/Twilio/Test Secrets/Auth Token
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Inject your secret values
&lt;/h2&gt;

&lt;p&gt;Now that we have our &lt;code&gt;.env-template&lt;/code&gt; fully configured, we can run the command &lt;code&gt;op inject -i .env-template -o .env&lt;/code&gt; which will create a &lt;code&gt;.env&lt;/code&gt; file with the secret values.  In the screenshot I have below, you can compare the template against the output of the command: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq4n1dptxjh97qezxprii.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq4n1dptxjh97qezxprii.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Add Project Shortcut
&lt;/h2&gt;

&lt;p&gt;Now that you have a process to easily generate your &lt;code&gt;.env&lt;/code&gt;, let's make it easy for other team members to use by scripting the process.  Since we're working with a JavaScript project for this tutorial, let's add a script to our &lt;code&gt;package.json&lt;/code&gt; file so developers only have to run &lt;code&gt;npm run env:generate&lt;/code&gt; to create their own &lt;code&gt;.env&lt;/code&gt; files locally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "name": "@mainwaring/example-project",
  "version": "2022.1.0",
  "description": "This is my example project!",
  "main": "index.js",
  "scripts": {
    "env:generate": "eval $(op signin) &amp;amp;&amp;amp; op inject -i .env-template -o .env",
    "test": "jest"
  },
  "author": "Joe Mainwaring &amp;lt;joe@mainwaring.dev&amp;gt;",
  "license": "MIT"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You'll notice in this example, my script is &lt;code&gt;eval $(op signin) &amp;amp;&amp;amp; op inject -i .env-template -o .env&lt;/code&gt; and not just &lt;code&gt;op inject -i .env-template -o .env&lt;/code&gt;.  By chaining the signin and iject commands, the developer will be be immediately presented with the &lt;code&gt;signin&lt;/code&gt; workflow if they aren't already authenticated.  This would otherwise require the developer to run 2-3 additional steps on their own if their terminal session was unauthenticated.  &lt;/p&gt;

&lt;p&gt;And that's it!  You now have a team using shared secrets managed through 1Password!  Share your experience with the tutorial below in the comments.  &lt;/p&gt;

</description>
      <category>devops</category>
      <category>tutorial</category>
      <category>javascript</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How I Maintain OSS Projects</title>
      <dc:creator>Joe Mainwaring</dc:creator>
      <pubDate>Thu, 01 Sep 2022 18:55:40 +0000</pubDate>
      <link>https://dev.to/theaccordance/how-i-maintain-oss-projects-2oeo</link>
      <guid>https://dev.to/theaccordance/how-i-maintain-oss-projects-2oeo</guid>
      <description>&lt;p&gt;Earlier this week I posted a &lt;a href="https://dev.to/theaccordance/failures-in-oss-ownership-2c97"&gt;rant about how a Pull request I authored for an Open Source package went un-reviewed for over 2 years.&lt;/a&gt; It wasn't a post I was particularly fond of given it was born out of frustration, but the moment had me self-reflect on my own OSS Projects and revisit them.  Those check-ins resulted in several enhancements to the projects and their workflows, designed in a way which should foster constructive interactions with community members using my software.  And now, I'm sharing those changes here with you to consider for your own OSS projects: &lt;/p&gt;

&lt;h2&gt;
  
  
  Project Configuration
&lt;/h2&gt;

&lt;p&gt;There are a plethora of ways to configure and automate workflows around your project that are freely accessible to open source projects.  Several ways I set up my projects:&lt;/p&gt;

&lt;h3&gt;
  
  
  Dependabot
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/dependabot"&gt;Dependabot&lt;/a&gt; helps me spend less time maintaining my projects by automating dependency updates as pull requests, making the process of keeping dependencies up to date significantly less time-consuming.  In addition, Dependabot can surface vulnerabilities, something that can easily get overlooked by package maintainers.  &lt;/p&gt;

&lt;h3&gt;
  
  
  Templates
&lt;/h3&gt;

&lt;p&gt;When it comes to fostering constructive dialog and efficient workflows, &lt;a href="https://docs.github.com/en/communities/using-templates-to-encourage-useful-issues-and-pull-requests/about-issue-and-pull-request-templates"&gt;Templates&lt;/a&gt; bridge the gap between you and your audience.  &lt;/p&gt;

&lt;h4&gt;
  
  
  Issues
&lt;/h4&gt;

&lt;p&gt;Not only can you provide a template for issues, but you can provide a contextual template based on the type of issue filed.  So far for my projects, I've kept this configuration relatively simple with Two types of issues: &lt;code&gt;Bug&lt;/code&gt; and &lt;code&gt;Feature Request&lt;/code&gt;.  The &lt;a href="https://github.com/theaccordance/balena-push/blob/master/.github/ISSUE_TEMPLATE/bug-report.md"&gt;Bug template&lt;/a&gt; asks evidence-gathering questions to help troubleshoot issues, while the &lt;a href="https://github.com/theaccordance/balena-push/blob/master/.github/ISSUE_TEMPLATE/feature-request.md"&gt;Feature Request template&lt;/a&gt; will have questions related to scoping a User Story.  &lt;/p&gt;

&lt;h4&gt;
  
  
  Pull Requests
&lt;/h4&gt;

&lt;p&gt;Using Pull Request templates, I'm able to provide would-be contributors with a &lt;a href="https://github.com/theaccordance/balena-push/blob/master/.github/pull_request_template.md"&gt;guide for submitting their pull-request in a state that can be easily accepted&lt;/a&gt;.  Using the template, I'm able to provide the contributor with questions to answer and a checklist to signal the PR would meet general Acceptance Criteria - like test coverage or style.  &lt;/p&gt;

&lt;h3&gt;
  
  
  Documentation
&lt;/h3&gt;

&lt;p&gt;Since OSS is by it's nature, self-service, it's important to have the right kind of documentation for the project.  Not only should a participant know how to use your project, they should also have resources on how to contribute to the project, should they choose to.  Documents I have in my projects: &lt;/p&gt;

&lt;h4&gt;
  
  
  README.md
&lt;/h4&gt;

&lt;p&gt;While you could derive how to use open-source without documentation, adoption does depend on a singular How-To guide to implement.  &lt;a href="https://www.makeareadme.com/"&gt;README.md&lt;/a&gt; is a common document found in the majority of open source projects today, and should deliver some key content:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A getting started section which describes installation steps and a basic implementation &lt;/li&gt;
&lt;li&gt;A dictionary which describes methods, inputs, or outputs &lt;/li&gt;
&lt;li&gt;Citations &amp;amp; Reference Links &lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Contributing Guideline
&lt;/h4&gt;

&lt;p&gt;If your README.md file is small, you may opt to include this section there, but it's probably more practical to just approach this as a separate document.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Contributing_guidelines#:~:text=Contributing%20guidelines%2C%20also%20called%20Contribution,may%20contribute%20user%2Dgenerated%20content"&gt;Contributing Guidelines&lt;/a&gt; are used to describe how someone can participate with the project.  It should describe both discussions and code contributions.  Things you would include as Contributing Guidelines:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If the contributor has to sign a Contributor License Agreement (CLA). (Only add one of these if it's been recommended by your legal counsel).
&lt;/li&gt;
&lt;li&gt;Community standards, like the type of language that is permissible in discussions (ex: no targeted harassment) &lt;/li&gt;
&lt;li&gt;Style Guide for making code changes&lt;/li&gt;
&lt;li&gt;Workflow process (Example: An Issue must be approved before a PR will be accepted) &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Github Actions
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/features/actions"&gt;Github Actions&lt;/a&gt; provides my projects with an easily configurable CI/CD solution to automate different steps of my project workflows.  Below are several actions I frequently use:&lt;/p&gt;

&lt;h4&gt;
  
  
  Build &amp;amp; Test
&lt;/h4&gt;

&lt;p&gt;I consider these two basic steps that nearly every OSS project has.  Having these as Github Actions is a requirement for enabling larger workflow automations for a project.  For example, if my OSS Project has sufficient test coverage, I could automate the acceptance of Dependabot Pull Requests that pass the Github Action.  &lt;/p&gt;

&lt;h4&gt;
  
  
  Publish/Deploy
&lt;/h4&gt;

&lt;p&gt;Another common automation is for an OSS package to be published or deployed.  By scripting out the process, a maintainer can reduce the human interaction to push updates for their software.  &lt;/p&gt;

&lt;h4&gt;
  
  
  Stale Janitor
&lt;/h4&gt;

&lt;p&gt;What I love about the &lt;a href="https://github.com/actions/stale"&gt;actions/stale&lt;/a&gt; GHA is that it performs cleanup tasks for my Issues and Pull Requests.  If either has no new activity for 30 days, a &lt;code&gt;Stale&lt;/code&gt; label is applied and a comment added warning that the item will be closed in 30 days if no new activity happens.  After 60 days with no activity, the action will automatically close out the item and append an additional message.  &lt;/p&gt;

&lt;h4&gt;
  
  
  Fork Sync
&lt;/h4&gt;

&lt;p&gt;On the &lt;em&gt;off-chance&lt;/em&gt; my OSS Project is a fork of another project, I have a &lt;a href="https://github.com/marketplace/actions/fork-sync"&gt;Github action which will automatically create pull requests when the parent project is updated&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Depending on how much I've altered my fork, being able automatically sync downstream changes has significant maintenance benefits, as it basically transfers the responsibility back to the parent package.  &lt;/p&gt;

&lt;h4&gt;
  
  
  Code Coverage
&lt;/h4&gt;

&lt;p&gt;Depending on the quality level of my OSS project, I may have a &lt;u&gt;strict&lt;/u&gt; &lt;code&gt;100% test&lt;/code&gt; coverage policy for any contributions.  While I don't need a third-party service to enforce such a rule, having a GUI-friendly interface is helpful when reviewing coverage reports.  There are several third-party dependencies that offer code coverage reporting, and many of them are free for public open source projects.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Alerts
&lt;/h2&gt;

&lt;p&gt;I'm a big fan of &lt;a href="https://slack.com/"&gt;Slack&lt;/a&gt; for work, so I set up my own "sandbox" instance &lt;code&gt;mainwaring.slack.com&lt;/code&gt;.  I'm the only member of my org, instead of using it for social communication, I use it to aggregate events from third-party services like Github.  This allows me to have a &lt;code&gt;#open-source-projects&lt;/code&gt; channel where notifications will surface when new activities occur, like an Issue being reported or a Pull Request being submitted.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Routine Check-ins
&lt;/h2&gt;

&lt;p&gt;One more &lt;em&gt;informal&lt;/em&gt; process I do is to check in on my projects in a routine manner, typically at least once a year, but possibly more frequently if any of my OSS projects had higher traffic.  Tasks I do at check-in include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Decide if this project should be archived or not.&lt;/li&gt;
&lt;li&gt;Review any outstanding issues or PRs and make decisions so the items can be closed out.
&lt;/li&gt;
&lt;li&gt;Dependencies and Vulnerabilities

&lt;ul&gt;
&lt;li&gt;Enable Dependabot if not already configured&lt;/li&gt;
&lt;li&gt;Apply any outstanding dependency upgrades &lt;/li&gt;
&lt;li&gt;Review vulnerabilities and make InfoSec decisions&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Review Forks of project:  Forks often times are slight modifications to a project, this can give you inspiration as to what features you are missing with your project. &lt;/li&gt;
&lt;li&gt;Review Documentation

&lt;ul&gt;
&lt;li&gt;Update language as needed to improve communication&lt;/li&gt;
&lt;li&gt;Add enrichments like badges or multimedia to communicate project details &lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Review CI/CD

&lt;ul&gt;
&lt;li&gt;Add workflow automation steps as identified &lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Publish a new version &lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>opensource</category>
      <category>github</category>
      <category>tutorial</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
