<?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: Nikema</title>
    <description>The latest articles on DEV Community by Nikema (@nikema).</description>
    <link>https://dev.to/nikema</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F303769%2F144ca7d6-234f-4c4e-9894-5ca316975f23.jpg</url>
      <title>DEV Community: Nikema</title>
      <link>https://dev.to/nikema</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nikema"/>
    <language>en</language>
    <item>
      <title>Touch Grass Coach: a chaotic garden that wants you to close the app</title>
      <dc:creator>Nikema</dc:creator>
      <pubDate>Sun, 11 Oct 2026 18:53:31 +0000</pubDate>
      <link>https://dev.to/nikema/touch-grass-coach-a-chaotic-garden-that-wants-you-to-close-the-app-49fl</link>
      <guid>https://dev.to/nikema/touch-grass-coach-a-chaotic-garden-that-wants-you-to-close-the-app-49fl</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week1-2026-10-05"&gt;Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;Touch Grass Coach turns a screen-time confession into one small outdoor mission. It is for the person who wants to take a break but keeps negotiating with the next tab.&lt;/p&gt;

&lt;p&gt;Choose your screen time, five to fifteen minutes, a walk or one nearby outdoor spot, and gentle or spicy coaching. Gemma writes a short response and a concrete mission. Four garden mascots give the different screen-time tiers a face: Pip, Sprig, Scruff, and Goblin.&lt;/p&gt;

&lt;p&gt;The important button is “Let's go outside.” It saves the mission and changes the app into a quiet reminder to pocket your phone. You can close the app and return to complete or abandon that same mission. Each completion grows a plant in your chaotic garden. The garden stays even when your streak resets.&lt;/p&gt;

&lt;p&gt;There is no account, leaderboard, or endless feed. The reward is something small to come back to, after doing something away from the screen.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://touch-grass-coach.vercel.app" rel="noopener noreferrer"&gt;Try Touch Grass Coach&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://youtu.be/aPkAPw76DIw" rel="noopener noreferrer"&gt;Watch the 60-second demo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Mission completion in the video uses a demo time jump; it demonstrates the UI rather than an outdoor trial.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/prophen" rel="noopener noreferrer"&gt;
        prophen
      &lt;/a&gt; / &lt;a href="https://github.com/prophen/touch-grass-coach" rel="noopener noreferrer"&gt;
        touch-grass-coach
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Log your screen time. Get roasted by an open-weight model. Go outside. Hacktoberfest Week 1 build.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Touch Grass Coach&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Log your screen time. Get roasted by an open-weight model. Go outside.&lt;/p&gt;
&lt;p&gt;Public demo: &lt;a href="https://touch-grass-coach.vercel.app" rel="nofollow noopener noreferrer"&gt;touch-grass-coach.vercel.app&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://youtu.be/aPkAPw76DIw" rel="nofollow noopener noreferrer"&gt;Watch the 60-second demo&lt;/a&gt; · &lt;a href="https://github.com/prophen/touch-grass-coach/docs/demo/README.md" rel="noopener noreferrer"&gt;Demo walkthrough&lt;/a&gt; · &lt;a href="https://github.com/prophen/touch-grass-coach/docs/submission/README.md" rel="noopener noreferrer"&gt;Submission draft and checklist&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Built for Hacktoberfest Week 1 (2026): theme "Touch Grass", open-weight models at the core. The coach is &lt;strong&gt;Gemma&lt;/strong&gt; (&lt;code&gt;gemma-4-26b-a4b-it&lt;/code&gt;) running on Google's free AI Studio tier, with &lt;code&gt;gemma-4-31b-it&lt;/code&gt; as a fallback. No downloads, no GPU, no disk space needed.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;How it works&lt;/h2&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;You drag a slider to log today's screen time (0-12h)
Choose a 5, 10, or 15-minute mission, take a walk or stay in one nearby outdoor spot, and pick gentle or spicy coaching.&lt;/li&gt;
&lt;li&gt;Your hours pick one of four roast tiers: Seedling, Sprout, Weed, Feral.&lt;/li&gt;
&lt;li&gt;The coaching instructions go to Gemma via the AI Studio &lt;code&gt;generateContent&lt;/code&gt; endpoint, which returns a short response plus one concrete outdoor mission using your selected preferences.&lt;/li&gt;
&lt;li&gt;Tap "Let's go outside"…&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/prophen/touch-grass-coach" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;The app uses Next.js, React, TypeScript, illustrated mascot assets, CSS animations, and browser storage. The server calls Google's hosted AI Studio API with Gemma: &lt;code&gt;gemma-4-26b-a4b-it&lt;/code&gt;, with &lt;code&gt;gemma-4-31b-it&lt;/code&gt; as a fallback.&lt;/p&gt;

&lt;p&gt;Gemma is at the center of the coaching interaction. The server combines the selected tier's persona with validated time, movement, and tone preferences. It asks for two short JSON fields: a response and an outdoor mission. Gentle mode uses supportive instructions instead of the roast persona. The mission duration includes leaving and returning.&lt;/p&gt;

&lt;p&gt;The browser sends screen hours, preferences, and up to three recent completed mission texts to the server, which forwards them to Google. The API key stays on the server. Mission dates, IDs, progress, and sound preferences stay on the device. This version does not send precise location or photographs to the model.&lt;/p&gt;

&lt;p&gt;The coach keeps the last ten completed missions locally. It supplies the latest three texts as untrusted historical data, asking Gemma to suggest a different activity while respecting today's time, movement, and tone choices. Variety is a prompt preference, not a guarantee. The app explains this sharing before coaching and lets you inspect or clear the remembered tasks. Clearing history keeps your plants, streak, and current mission; it cannot erase text already sent to Google. A new completion begins building fresh memory.&lt;/p&gt;

&lt;p&gt;The model suggests the activity; ordinary code owns the progress. Starting a mission persists it before showing the outside view. Completing it saves the terminal state and progress together, so another click or a reload cannot award the same plant again. Consecutive-day streaks use the local calendar; multiple missions on one day increase the total without increasing the streak twice.&lt;/p&gt;

&lt;p&gt;Failures get explicit retry states. Requests have time limits and bounded bodies, generated responses are checked, and the public deployment has a shared API rate-limit rule. Sound is optional and starts off. Reduced-motion settings disable the celebratory movement.&lt;/p&gt;

&lt;p&gt;Codex helped implement and check the app, including the mission persistence, visual iterations, and submission materials. The repository records the changes as small pull requests.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;For me, the answer is cost and control.&lt;/p&gt;

&lt;p&gt;Gemma is an open-weight model. This version uses Google’s hosted API, so I don’t need a GPU or space on my laptop for model weights. Free-tier access can lower the cost of experimenting, but it comes with limits. Anyone deploying their own copy should check the current API and hosting quotas, eligibility, and billing requirements.&lt;/p&gt;

&lt;p&gt;The coaching prompts and game logic live in the repository. The UI talks to my server route, which currently uses Google’s request and response format. Switching providers would require adapting that integration and testing the new model’s output. The UI, tiers, and response structure could stay the same.&lt;/p&gt;

&lt;p&gt;Open weights give builders more options for running and adapting the model. This particular deployment still depends on Google’s hosted service, including sending screen hours, preferences, and up to three recent completed mission texts to generate the next response.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;p&gt;The challenging part was keeping the game honest. A streak, a mission count, and a plant reward sound similar until you finish two missions in one day or reopen the app after midnight. Separating those concepts made the reward predictable.&lt;/p&gt;

&lt;p&gt;The other design constraint was leaving. The app should make the screen the shortest part of the experience. I put the personality around choosing and returning; the active mission view keeps the task readable and encourages closing the phone.&lt;/p&gt;

&lt;p&gt;There are deliberate limits. Missions are model suggestions, not mechanically guaranteed routes or timings. Older plants do not have individual completion dates because the original progress record did not store them. Browser data can be cleared, taking the garden with it. Saved missions restore locally, but this is not an offline-installed app.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;p&gt;Best Use of Gemma: Gemma generates the personalized coaching response and outdoor mission at the core of the app.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>California Black Stories: an AI fact-card workflow with a human approval gate</title>
      <dc:creator>Nikema</dc:creator>
      <pubDate>Sun, 04 Oct 2026 22:10:26 +0000</pubDate>
      <link>https://dev.to/nikema/california-black-stories-an-ai-fact-card-workflow-with-a-human-approval-gate-1e8p</link>
      <guid>https://dev.to/nikema/california-black-stories-an-ai-fact-card-workflow-with-a-human-approval-gate-1e8p</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/sanity-2026-09-16"&gt;Sanity Challenge, Path Two: Vibe-Code Something Strange&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;California Black Stories is an editorial app for preparing fact-card posts for a California Black history Facebook page. It takes a topic, drafts one fact, checks it against source excerpts, writes a short caption, and renders a downloadable card. The post then waits for a person to review it.&lt;/p&gt;

&lt;p&gt;I run the California Black Stories Facebook page because I’m interested in the history of my home state. Much of the content currently on the page is AI-generated. My goal is to grow the page and qualify for Facebook monetization, and I wanted a repeatable way to prepare posts while keeping the source and my review decision attached to each one.&lt;/p&gt;

&lt;p&gt;The core feature is a four-stage Sanity workflow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;generating → inReview → approved → published
               ↓
           generating
        (reject with feedback)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;I can approve a card or reject it with a note. A rejection updates the existing post using that feedback and sends it back to review. I can then approve it or request another revision. The generator cannot approve its own work.&lt;/p&gt;

&lt;p&gt;The Next.js post library shows the card image, caption, citation, source link, and workflow status. Source notes render as formatted Markdown, with longer notes available in an expandable section beside the image. It includes drafts, supports search and status filters, and lets me copy a caption or download the original PNG.&lt;/p&gt;
&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Post library:&lt;/strong&gt; &lt;a href="https://fact-card-workflow.nikema.dev/" rel="noopener noreferrer"&gt;fact-card-workflow.nikema.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Workflow walkthrough:&lt;/strong&gt; &lt;a href="https://youtu.be/Sa18wrSdgQQ" rel="noopener noreferrer"&gt;https://youtu.be/Sa18wrSdgQQ&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk5kp09w0z9icqgdxyf7h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk5kp09w0z9icqgdxyf7h.png" alt="Claim audit screenshot" width="799" height="575"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The claim audit shows supported, unsupported, and contradicted findings, with linked sources and options to recheck or record a reviewer override.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F49g5x3ezfp2ez0l2rh24.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F49g5x3ezfp2ez0l2rh24.png" alt="Studio workflow screenshot" width="799" height="575"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The post waits for human approval, with an option to reject it and request a revision.&lt;/em&gt;&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;How to test:&lt;/strong&gt; In the post library, search for a topic, filter by workflow status, open a post, copy its caption, and download its image. The library includes works in progress, so these are editorial drafts rather than a feed of approved historical claims.&lt;/p&gt;

&lt;p&gt;Generation, approval, rejection, and publication take place in Studio and require an authorized Sanity account. The linked walkthrough demonstrates that authenticated workflow, including generation, rejection with feedback, replacement generation, approval, and publication. Judges can use the live post library directly; no Studio test account is supplied.&lt;/p&gt;

&lt;p&gt;After approving a draft in Studio, I click &lt;strong&gt;Publish&lt;/strong&gt;. Sanity publishes the document, and a background Function completes the same workflow and updates its status. No separate “mark published” click is needed. This demo publishes to Sanity; it does not post to Facebook.&lt;/p&gt;
&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/prophen" rel="noopener noreferrer"&gt;
        prophen
      &lt;/a&gt; / &lt;a href="https://github.com/prophen/fact-card-workflow" rel="noopener noreferrer"&gt;
        fact-card-workflow
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Fact Card Workflow&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;One Git repository contains both apps and the automatic workflow runtime:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;studio/&lt;/code&gt;: Sanity Studio, post schema, and editorial workflow.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;web/&lt;/code&gt;: Next.js app.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;functions/&lt;/code&gt;: automatic workflow status synchronization and rejected-card regeneration.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;shared/&lt;/code&gt;: generation and template rendering used by the web app and Functions.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sanity.blueprint.ts&lt;/code&gt;: Sanity Function and service-token deployment.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Commit and push from this repository root. The app folders are ordinary folders
not separate repositories or submodules. Their earlier Git histories are preserved
in the ignored &lt;code&gt;.git-backups/&lt;/code&gt; directory.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Install and run&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Run &lt;code&gt;npm install&lt;/code&gt; at the root, &lt;code&gt;npm install --prefix studio&lt;/code&gt;, and
&lt;code&gt;npm install --prefix web&lt;/code&gt;. Run &lt;code&gt;npm run studio:dev&lt;/code&gt; and &lt;code&gt;npm run web:dev&lt;/code&gt; in
separate terminals.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Automatic status synchronization&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;The deployed &lt;code&gt;fact-card-status-sync&lt;/code&gt; Sanity Function processes status effects
when a workflow queues new work. It updates the draft post's status to match its
current workflow stage. It does not approve cards…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/prophen/fact-card-workflow" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;The repository contains the Studio, Next.js frontend, shared generation and rendering code, and the Sanity Function runtime. The &lt;a href="https://github.com/prophen/fact-card-workflow#readme" rel="noopener noreferrer"&gt;README&lt;/a&gt; explains how to run them and configure the integrations.&lt;/p&gt;

&lt;p&gt;The verification and rendering approach builds on my earlier &lt;a href="https://github.com/prophen/cbs-post-generator" rel="noopener noreferrer"&gt;CBS Post Generator&lt;/a&gt;. I adapted it into an editorial process with structured content, stored assets, and review history.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Build Process
&lt;/h2&gt;

&lt;p&gt;I built this with the Codex desktop app. I started with a specific schema and workflow request, then changed the app through small prompts as I tested the result.&lt;/p&gt;

&lt;h3&gt;
  
  
  Start with the process and the schema
&lt;/h3&gt;

&lt;p&gt;My initial request specified one &lt;code&gt;post&lt;/code&gt; document with a topic, fact text, a nested citation and source URL, a Facebook caption, a template ID, an uploaded image, and a status. It also specified the four workflow stages and a rejection path back to generation.&lt;/p&gt;

&lt;p&gt;Keeping these as separate fields matters. The source remains available to the reviewer even though it is not printed on the card. The image is a stored Sanity asset, and the template ID records how it was rendered. The workflow is stored alongside the content rather than being an informal agreement about what a status label means.&lt;/p&gt;

&lt;p&gt;The definition lives in &lt;code&gt;studio/workflows/postWorkflow.ts&lt;/code&gt;, and the schema uses Sanity's &lt;code&gt;defineType&lt;/code&gt; and &lt;code&gt;defineField&lt;/code&gt; APIs. I removed an earlier generic &lt;code&gt;factCard&lt;/code&gt; schema once the new &lt;code&gt;post&lt;/code&gt; model powered the app.&lt;/p&gt;

&lt;h3&gt;
  
  
  A deployed definition is not a running pipeline
&lt;/h3&gt;

&lt;p&gt;The first workflow deployment warned that no generated runtime was present. That was a useful distinction: deploying the workflow described the process, but something still had to execute the queued effects.&lt;/p&gt;

&lt;p&gt;I initially had a manual drain command. I asked, “can we handle it automatically instead,” and the app gained a Sanity Function that responds to newly queued effects. It synchronizes the post's status and performs replacement generation after rejection. Normal transitions no longer depend on a terminal command or an open browser.&lt;/p&gt;

&lt;h3&gt;
  
  
  Move generation into the app
&lt;/h3&gt;

&lt;p&gt;Next I asked, “I want to generate the posts within the app.” We added a custom &lt;strong&gt;Generate post&lt;/strong&gt; tool in Studio, backed by a server endpoint in the web app.&lt;/p&gt;

&lt;p&gt;When choosing topics became difficult, I asked to bring in the topic-generation feature from CBS Post Generator. Studio now suggests five specific claim ideas from broad categories. I can choose one and send that exact idea to source checking. The suggestions are explicitly unverified. I restored the original generator’s idea prompt so suggestions retain its range of historical stories. A source-checking retry now keeps the same claim while requesting more sources and longer source text; it does not turn an unsupported claim into a post.&lt;/p&gt;

&lt;p&gt;OpenAI produces a candidate claim when I enter my own topic. &lt;strong&gt;Verify with Exa&lt;/strong&gt; retrieves source excerpts and runs the original generator’s audit prompt. The tool shows each finding as &lt;strong&gt;supported&lt;/strong&gt;, &lt;strong&gt;unsupported&lt;/strong&gt;, or &lt;strong&gt;contradicted&lt;/strong&gt;, alongside the linked Exa sources and excerpt previews. I can expand the excerpts to read their formatted text.&lt;/p&gt;

&lt;p&gt;If part of a claim isn’t supported or conflicts with the sources, the app suggests a correction while keeping the supported details. &lt;strong&gt;Apply suggested correction&lt;/strong&gt; uses the findings already available, without another search or audit. If I edit that suggestion, the edited wording needs verification. Possible contradictions with earlier approved or published posts appear as review warnings.&lt;/p&gt;

&lt;p&gt;Once I’m satisfied with the selected fact, &lt;strong&gt;Create card &amp;amp; submit for review&lt;/strong&gt; renders the image and saves a draft with its citation, source URL, and caption ending in a question. Verification and card creation are separate steps, giving me time to inspect the evidence first.&lt;/p&gt;

&lt;p&gt;That screening step can still miss historical nuance. The human review gate is part of the design, not an optional cleanup step.&lt;/p&gt;

&lt;h3&gt;
  
  
  When the audit gets it wrong
&lt;/h3&gt;

&lt;p&gt;The claim audit can make mistakes too. In one example, it marked a claim about the first Los Angeles CORE chapter as contradicted because a source mentioned a later chapter. A later chapter doesn’t contradict the existence of the first one.&lt;/p&gt;

&lt;p&gt;I added two ways to handle this. I can recheck an individual finding against the same saved source excerpts, with an explanation of why I disagree. Or I can keep the original claim by recording a reviewer override with a written explanation and a supporting source.&lt;/p&gt;

&lt;p&gt;The app preserves the original findings and records the recheck or override in the audit history. An override allows the card to be created and submitted for review; the post still needs approval before publication.&lt;/p&gt;

&lt;p&gt;This helped me see that an AI-assisted editorial workflow needs room to question the AI’s conclusions as well as the content it generates.&lt;/p&gt;

&lt;h3&gt;
  
  
  Refine the actual card, not just the prompt
&lt;/h3&gt;

&lt;p&gt;I noticed that the card template printed the source text at the bottom and asked to remove it. We kept the citation in Sanity and on the detail page, while simplifying the image to the fact and the California Black Stories branding. New citations contain source titles and URLs rather than entire Exa excerpts; the fuller excerpts remain available during fact-checking. Studio also provides a formatted citation preview.&lt;/p&gt;

&lt;p&gt;The images are template-rendered, not AI-generated artwork. Satori lays out the text, and WebAssembly Resvg produces a 1080 × 1080 PNG. A native renderer caused deployment trouble, so we moved to the WebAssembly version and shared that renderer between initial generation and replacements.&lt;/p&gt;

&lt;h3&gt;
  
  
  Make rejection useful
&lt;/h3&gt;

&lt;p&gt;A reject button alone leaves me with another task. I asked how to generate a replacement automatically, and we connected rejection feedback to the generation process.&lt;/p&gt;

&lt;p&gt;The background job uses the revision note to decide what needs changing. Caption-only feedback preserves the fact, source, and image. Image-only feedback rerenders the existing fact. Factual or source changes go through verification. I also fixed feedback such as “keep the fact and source unchanged” so it does not accidentally trigger a factual rewrite.&lt;/p&gt;

&lt;p&gt;Replacement saves tolerate background status updates while still protecting edits a reviewer makes during generation. An actual generation failure leaves an error and a retry action. Existing workflow instances retain their definition snapshots and review history.&lt;/p&gt;

&lt;p&gt;The current Workflows UI can briefly show “An automated step didn’t finish” while the background job is still running. In the demonstrated flow, that warning clears when the revised post returns to review. I acknowledge the temporary warning in the walkthrough rather than presenting it as a failed regeneration.&lt;/p&gt;

&lt;h3&gt;
  
  
  Finish the handoff
&lt;/h3&gt;

&lt;p&gt;The frontend came from another practical request: “can we build a frontend that shows the post data and allows downloading the post image.” I chose to include drafts so it works as a working library. The implementation uses server-side GROQ reads with a Viewer token; the token stays out of browser code.&lt;/p&gt;

&lt;p&gt;Finally, I wanted Studio's &lt;strong&gt;Publish&lt;/strong&gt; button to complete the workflow automatically. The button checks the current workflow's approval, and a background Function advances the approved workflow after a published document exists.&lt;/p&gt;

&lt;p&gt;The latest local checks passed 56 tests, Studio and web builds, and TypeScript checks. Tests exercise approval restrictions, rejection and retries, caption-only revisions, concurrent status updates, formatted source rendering, card rendering, and publication synchronization. A production-build endpoint check also confirms that accepting a suggested correction reuses its saved evidence without another provider call. I also checked search, filtering, caption copying, mobile layouts, and an actual 1080 × 1080 image download in the browser. The deployed library also loaded successfully, and search, status filtering, caption copying, and image download worked there. &lt;/p&gt;

&lt;h3&gt;
  
  
  What I would improve next
&lt;/h3&gt;

&lt;p&gt;The web library is a server-rendered interface with refresh-based updates; it is not a custom real-time App SDK app. Workflows are the Sanity feature I explored deeply for this submission.&lt;/p&gt;

&lt;p&gt;Interrupted effect jobs currently have a manual recovery path rather than a scheduled sweep. Content Lake write permissions also remain the boundary for direct API edits; the workflow and Studio button coordinate the intended editorial process.&lt;/p&gt;

&lt;p&gt;The demo is deliberately limited to fact cards. Production uses Buffer to publish to Facebook and Instagram, but there is no Buffer integration or reels workflow in this entry.&lt;/p&gt;

&lt;p&gt;My biggest learning was that a content workflow needs more than a status dropdown. Sanity Workflows let me model who can move a post forward, what happens after rejection, and where human approval belongs. I also learned that deploying a workflow definition does not automatically run its effects; that needs a runtime.&lt;/p&gt;

&lt;p&gt;Customizing Studio showed me that I could put the generation tool inside the same place where I review the content. I didn’t need to keep switching between a generator and a CMS. Prompting helped me build the pieces, but testing the actual generation, rejection, approval, and publication loop is what made the app useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sanity Project Details
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Project ID:&lt;/strong&gt; &lt;code&gt;ta2gi825&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dataset:&lt;/strong&gt; &lt;code&gt;production&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Document type:&lt;/strong&gt; &lt;code&gt;post&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Workflow:&lt;/strong&gt; &lt;code&gt;post-workflow&lt;/code&gt;, deployment tag &lt;code&gt;production&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Runtime:&lt;/strong&gt; Sanity Function &lt;code&gt;fact-card-status-sync&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Agent Session
&lt;/h2&gt;

&lt;p&gt;I used Codex throughout the build. The repository includes &lt;a href="https://github.com/prophen/fact-card-workflow/blob/main/submission/prompt-notes.md" rel="noopener noreferrer"&gt;selected prompt notes&lt;/a&gt; explaining the requests and course corrections behind the app.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>sanitychallenge</category>
      <category>sanity</category>
      <category>ai</category>
    </item>
    <item>
      <title>Ask the Archive: a Q&amp;A agent grounded in 150 stories of Black California history</title>
      <dc:creator>Nikema</dc:creator>
      <pubDate>Tue, 29 Sep 2026 07:20:02 +0000</pubDate>
      <link>https://dev.to/nikema/ask-the-archive-a-qa-agent-grounded-in-150-stories-of-black-california-history-533c</link>
      <guid>https://dev.to/nikema/ask-the-archive-a-qa-agent-grounded-in-150-stories-of-black-california-history-533c</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/sanity-2026-09-16"&gt;Sanity Challenge, Path One: Ship an Agent That Queries Real Content&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;Ask California Black Stories is a chat agent that answers questions about Black history in California, and it only answers from a real archive: 150 researched stories, 436 claims, 45 thematic pillars, with every claim carrying at least one source URL.&lt;/p&gt;

&lt;p&gt;I run California Black Stories, a content project on Black history in California. The research archive behind it is large and structured, but asking it a question meant digging through notes by hand. And asking a general-purpose chatbot gets you a confident answer stitched from who knows where. I wanted an interface where every answer traces back to a specific story and a real source, and where the agent says "that is not in the archive" instead of guessing.&lt;/p&gt;

&lt;p&gt;So the agent has one hard rule: if the archive does not cover the question, it says so and stops. No general knowledge, no gap filling.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;The landing page has sample questions you can click to see it in action. Ask about Biddy Mason or the Palace Hotel sit-in and you get a cited answer. Ask about the Montgomery bus boycott and it tells you that is outside the archive, because it is.&lt;/p&gt;

&lt;p&gt;Try it live: &lt;a href="https://californiablackstories.com" rel="noopener noreferrer"&gt;https://californiablackstories.com&lt;/a&gt;&lt;br&gt;
Demo video: &lt;a href="https://www.youtube.com/watch?v=hYWFyAtU46I" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=hYWFyAtU46I&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/prophen" rel="noopener noreferrer"&gt;
        prophen
      &lt;/a&gt; / &lt;a href="https://github.com/prophen/california-black-stories" rel="noopener noreferrer"&gt;
        california-black-stories
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A Q&amp;amp;A agent that answers questions about Black history in California, grounded in a 150-story Sanity archive with cited sources. Built with Sanity Context MCP for the Sanity Challenge, Path One.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Ask California Black Stories&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A chat agent that answers questions about Black history in California, grounded in a real research archive. Every answer cites its sources. If the archive does not cover your question, the agent says so and stops.&lt;/p&gt;
&lt;p&gt;Live: &lt;a href="https://californiablackstories.com" rel="nofollow noopener noreferrer"&gt;https://californiablackstories.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Video walkthrough: &lt;a href="https://www.youtube.com/watch?v=hYWFyAtU46I" rel="nofollow noopener noreferrer"&gt;https://www.youtube.com/watch?v=hYWFyAtU46I&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/prophen/california-black-stories/docs/screenshot-landing.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fprophen%2Fcalifornia-black-stories%2FHEAD%2Fdocs%2Fscreenshot-landing.png" alt="Ask California Black Stories landing page"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Built for the &lt;a href="https://dev.to/challenges/sanity-2026-09-16" rel="nofollow"&gt;Sanity Challenge&lt;/a&gt;, Path One: Ship an Agent That Queries Real Content.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;The archive&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;California Black Stories is my content project on Black history in California. The Sanity dataset holds 150 story documents: 436 fact-check claims across 45 thematic pillars, with every claim carrying at least one source URL.&lt;/p&gt;
&lt;p&gt;Content model: &lt;code&gt;story&lt;/code&gt;, &lt;code&gt;person&lt;/code&gt;, &lt;code&gt;place&lt;/code&gt;, &lt;code&gt;source&lt;/code&gt;. Stories carry structured claim objects; people and places are their own documents so questions about who and where resolve against structure, not keyword matching.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;How it works&lt;/h2&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Research notes (an Obsidian vault with three note formats) are parsed into normalized records (&lt;code&gt;ingest/parse_notes.py&lt;/code&gt;…&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/prophen/california-black-stories" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  How I Used Sanity
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The content model.&lt;/strong&gt; Four schema types: &lt;code&gt;story&lt;/code&gt;, &lt;code&gt;person&lt;/code&gt;, &lt;code&gt;place&lt;/code&gt;, &lt;code&gt;source&lt;/code&gt;. Stories carry structured claim objects, and every claim has at least one source URL. People and places are their own documents so questions about who and where resolve against structure, not keyword matching.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The ingest.&lt;/strong&gt; My research lives in an Obsidian vault with three different note formats. I wrote a parser that normalizes all three into story records, converted them to NDJSON, and imported 150 documents into a production dataset with &lt;code&gt;sanity dataset import&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sanity Context.&lt;/strong&gt; I built a Knowledge Base ("California Black Stories") on the query &lt;code&gt;*[_type == "story"]&lt;/code&gt;, exposed through a Context MCP endpoint. The KB distilled 33 entries from the 150 stories, each entry linked to the story it came from.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The agent.&lt;/strong&gt; A Next.js app. The &lt;code&gt;/ask&lt;/code&gt; chat UI streams from &lt;code&gt;/api/ask&lt;/code&gt;, which uses AI SDK v7 with an MCP client pointed at the Sanity Context endpoint. The model reads KB entries as its only context.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Two grounding bugs I caught in testing:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;After refusing a question, the agent answered it anyway from general knowledge (my test: the Montgomery bus boycott). The system prompt rule was not strict enough. I tightened it and retested until the refusal held.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Dead citation links. KB entries cite story titles but carry no URLs, so the model invented plausible-looking source links, including fake URLs on the site's own domain. A story lookup tool fixed it at first, but the model sometimes skipped the tool and faked a link anyway. So the route now injects every story's real source URLs from Sanity directly into the prompt, and the model copies from that list instead of calling a tool. I retested with the Palace Hotel sit-in and the citations now link to the real sources.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The prompt also instructs the agent to surface disagreements side by side when sources tell a story differently, instead of picking one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;An honest note on verification.&lt;/strong&gt; I ran mechanical checks over the KB output: all 479 citation markers resolve to real story titles, no two stories cover the same person or event, and the corpus report confirms every claim has at least one source URL. That is the level I am claiming: structural and citation-level verification, not a line-by-line re-fact-check of all 436 claims.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sanity Project Details
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Project ID: &lt;code&gt;bq2hoxdt&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Dataset: &lt;code&gt;production&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;150 &lt;code&gt;story&lt;/code&gt; documents; schema types &lt;code&gt;story&lt;/code&gt;, &lt;code&gt;person&lt;/code&gt;, &lt;code&gt;place&lt;/code&gt;, &lt;code&gt;source&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>sanitychallenge</category>
      <category>sanity</category>
      <category>ai</category>
    </item>
    <item>
      <title>PayPal Streamlines Checkout Integration Workflows with GitHub Codespaces</title>
      <dc:creator>Nikema</dc:creator>
      <pubDate>Mon, 02 Oct 2023 22:57:47 +0000</pubDate>
      <link>https://dev.to/paypaldeveloper/paypal-streamlines-checkout-integration-workflows-with-github-codespaces-2j59</link>
      <guid>https://dev.to/paypaldeveloper/paypal-streamlines-checkout-integration-workflows-with-github-codespaces-2j59</guid>
      <description>&lt;p&gt;In the fast-paced digital payment world, seamless integration is essential for developers aiming to embed PayPal into their applications. This is particularly important when integrating with payment gateways, like PayPal, which are pivotal in ensuring successful and secure transactions.&lt;/p&gt;

&lt;p&gt;Traditional challenges in local integration environments involve time-intensive configuration, potential issues due to environment disparities, security complexities with sensitive data, and the burden of continuous maintenance to adapt to changing needs. To streamline the integration process for developers and address these challenges, PayPal has introduced an innovative feature to our integration guides — the “Open in Codespaces” button. This addition offers developers the ability to edit and run our sample applications in GitHub Codespaces.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fe07y16gtq3nhlfnm266b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fe07y16gtq3nhlfnm266b.png" alt="Open in Codespaces" width="200" height="48"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How GitHub Codespaces will improve the PayPal developer experience:
&lt;/h2&gt;

&lt;p&gt;By leveraging &lt;a href="https://github.com/features/codespaces" rel="noopener noreferrer"&gt;GitHub Codespaces&lt;/a&gt;, we aim to make integrations smoother, faster, and more accessible for PayPal developers. Here are some benefits of using GitHub Codespaces as your development environment to explore our sample applications:&lt;/p&gt;

&lt;h3&gt;
  
  
  Simplified Onboarding and Setup
&lt;/h3&gt;

&lt;p&gt;With GitHub Codespaces, developers can now instantly access and run a sample application with just their PayPal Sandbox application credentials and a few clicks. The entire development environment is pre-configured, reducing setup time and allowing developers to dive right into the integration process.&lt;/p&gt;

&lt;h3&gt;
  
  
  Enhanced Collaboration
&lt;/h3&gt;

&lt;p&gt;When you click the “Open in Codespaces” button, you’ll gain immediate access to a PayPal sample application repository in a cloud-based coding environment. GitHub Codespaces allows developers from around the world to collaborate, share ideas, and edit code with others using the Visual Studio Live Share extension.&lt;/p&gt;

&lt;h3&gt;
  
  
  Risk-Free Experimentation
&lt;/h3&gt;

&lt;p&gt;GitHub Codespaces offers a safe environment to experiment with PayPal’s sample integrations. By creating separate branches, you can test new ideas, explore different features, and experiment without the fear of breaking existing code. This risk-free space encourages creativity and enables developers to confidently develop innovative solutions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Standardized Development Environment
&lt;/h3&gt;

&lt;p&gt;GitHub Codespaces ensures a consistent and standardized development environment for all PayPal developers. The “Open in Codespaces” button provides access to the GitHub Codespaces environment in just a few clicks, ensuring that every developer works in the same environment, reducing potential compatibility issues, and creating a smoother integration process.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try out the “Open in Codespaces” Button
&lt;/h2&gt;

&lt;p&gt;To see this new feature in action, navigate to the &lt;a href="https://developer.paypal.com/docs/checkout/standard/integrate/" rel="noopener noreferrer"&gt;Standard Checkout&lt;/a&gt;, &lt;a href="https://developer.paypal.com/docs/checkout/advanced/integrate/" rel="noopener noreferrer"&gt;Advanced Checkout&lt;/a&gt;, &lt;a href="https://developer.paypal.com/docs/checkout/apm/google-pay/" rel="noopener noreferrer"&gt;Google Pay&lt;/a&gt;, or &lt;a href="https://developer.paypal.com/docs/checkout/apm/apple-pay/" rel="noopener noreferrer"&gt;Apple Pay&lt;/a&gt; integration guide, then click the “Open in Codespaces” button in the “Know before you code” section. You can then create a new Codespace using a PayPal REST API application client ID and client secret. You can find these credentials by logging into the PayPal developer dashboard and clicking &lt;a href="https://developer.paypal.com/dashboard/applications/sandbox" rel="noopener noreferrer"&gt;Apps &amp;amp; Credentials&lt;/a&gt; from the navigation menu.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fkyvkyn78khd8uj8sllj5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fkyvkyn78khd8uj8sllj5.png" alt="Get up and running in GitHub Codespaces | GitHub Codespaces are cloud-based development environments where you can code and test your PayPal integrations. Learn more" width="720" height="145"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Learn about how to use GitHub Codespaces in the PayPal &lt;a href="https://developer.paypal.com/api/rest/sandbox/codespaces/" rel="noopener noreferrer"&gt;developer documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=2jgoDFn29DM" rel="noopener noreferrer"&gt;Watch this video&lt;/a&gt; on how to set up a Codespaces environment.&lt;br&gt;
  &lt;iframe src="https://www.youtube.com/embed/2jgoDFn29DM" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The “Open in Codespaces” button is an exciting addition to the PayPal developer documentation, transforming the way developers integrate our payment services into their applications. This new feature is a testament to PayPal’s dedication to creating a vibrant developer community, where developers can easily explore and integrate PayPal’s services to meet the evolving needs of the digital economy.&lt;/p&gt;

&lt;h2&gt;
  
  
  PayPal Developer Community
&lt;/h2&gt;

&lt;p&gt;The PayPal Developer Community aims to be a valuable resource hub, support system, and knowledge-sharing source that empowers developers to build and enhance their applications with PayPal’s payment capabilities.&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="https://developer.paypal.com/" rel="noopener noreferrer"&gt;developer.paypal.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Twitter: &lt;a href="https://twitter.com/paypaldev" rel="noopener noreferrer"&gt;@paypaldev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/paypaldev" rel="noopener noreferrer"&gt;@paypaldev&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to add donations to your website with PayPal's Donate SDK</title>
      <dc:creator>Nikema</dc:creator>
      <pubDate>Mon, 14 Nov 2022 20:15:47 +0000</pubDate>
      <link>https://dev.to/paypaldeveloper/how-to-add-donations-to-your-website-with-paypals-donate-sdk-fl4</link>
      <guid>https://dev.to/paypaldeveloper/how-to-add-donations-to-your-website-with-paypals-donate-sdk-fl4</guid>
      <description>&lt;h2&gt;
  
  
  Low-code donation integration using PayPal's Donate SDK
&lt;/h2&gt;

&lt;p&gt;Follow step-by-step instructions to create a Donate button and donation page that’s functional and well-designed out of the box. Follow the prompts to customize images, donation amounts, and instructions to your donors.&lt;/p&gt;

&lt;p&gt;The Donate SDK provides a great solution for enabling donations on a static site. Once your donation page is set up, you don't need to be an advanced web developer to add donations to your website. PayPal provides all of the code needed to add the Donate button and the direct link to your donation page.&lt;/p&gt;

&lt;h3&gt;
  
  
  Check your eligibility
&lt;/h3&gt;

&lt;p&gt;To check if your account is eligible to integrate the Donate SDK, log in to &lt;a href="https://paypal.com/donate/buttons" rel="noopener noreferrer"&gt;paypal.com/donate/buttons&lt;/a&gt;. If you can see the options to create a new donation page, you’re good to go for live donations. &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%2F0cq05gmq2vyc5mov327v.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%2F0cq05gmq2vyc5mov327v.png" alt="Create a new donation page on paypal.com/donate/buttons/manage"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you can get to this page you can create a Donate button and accept donations on your live website &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Create a donate button in the sandbox
&lt;/h3&gt;

&lt;p&gt;If you have a PayPal Developer account and you would like to follow along, you can still create a donation page in the sandbox. Log in to &lt;a href="https://www.sandbox.paypal.com/donate/buttons" rel="noopener noreferrer"&gt;sandbox.paypal.com/donate/buttons&lt;/a&gt; with your sandbox credentials to start the flow to create a Donate button. For this example, I’m using my sandbox business account but a personal account will work as well.&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%2Fgh5y3fhfohp00mjn02rj.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%2Fgh5y3fhfohp00mjn02rj.png" alt="Sandbox create a new donation page"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;PayPal Developer account holders can create a Donate button in the sandbox environment&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For help with setting up a PayPal Developer account and accessing your sandbox accounts, see the &lt;a href="https://developer.paypal.com/api/rest/sandbox/accounts/" rel="noopener noreferrer"&gt;Sandbox accounts documentation&lt;/a&gt; on the PayPal Developer site.&lt;/p&gt;

&lt;h3&gt;
  
  
  Take the four steps to setup a Donate button
&lt;/h3&gt;

&lt;p&gt;There are four steps to setting up your hosted donation button and payment page. In each step there are a number of options to turn on or off.&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 1: Customize your button
&lt;/h4&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%2Fuvt143b9cdt0dmvhk41e.gif" 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%2Fuvt143b9cdt0dmvhk41e.gif" alt="Step 1: Customize your button"&gt;&lt;/a&gt;&lt;br&gt;
In this step, you can choose between the large or small PayPal donate buttons or upload your own image for a custom hosted button.&lt;/p&gt;


&lt;h4&gt;
  
  
  Step 2: Set up your donation page
&lt;/h4&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%2Fu8r88qxi8han0e252dh9.gif" 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%2Fu8r88qxi8han0e252dh9.gif" alt="Step 2: Setup your donation page"&gt;&lt;/a&gt;&lt;br&gt;
Here you have the options to display your logo, upload a banner image, and add an inspiring message to your donation page. In this step, you choose to display your donation page as a fullscreen experience or a pop-up.&lt;/p&gt;


&lt;h4&gt;
  
  
  Step 3: Customize your donation details
&lt;/h4&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%2Frqg6x2saj3luxcgn8soz.gif" 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%2Frqg6x2saj3luxcgn8soz.gif" alt="Step 3: Customize your details"&gt;&lt;/a&gt;&lt;br&gt;
In this step, you choose the currency and amount for donations. It can be an exact amount, any amount, or 3 options, plus any amount. You can let the donor make it a monthly donation, donate more to offset fees, or donate to specific programs.&lt;/p&gt;


&lt;h4&gt;
  
  
  Step 4: Set up your payment page
&lt;/h4&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%2Fzdlwj29vnil5j7nwu93y.gif" 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%2Fzdlwj29vnil5j7nwu93y.gif" alt="Step 4: Set up your payment page"&gt;&lt;/a&gt;&lt;br&gt;
The payment page is the last page a donor will see before completing the transaction. In this last step, you can choose to collect donor mailing addresses, accept notes from donors, and whether to send visitors back to your site if they cancel or complete a donation.&lt;/p&gt;
&lt;h3&gt;
  
  
  Demos!
&lt;/h3&gt;

&lt;p&gt;For the demo site, I created three similar home pages with different ways to add a Donate button. For two of the home pages I used the code that PayPal provided. For the third page, I created my own button with CSS and linked it to my donation page.&lt;/p&gt;


&lt;div class="ltag__replit"&gt;
  &lt;iframe height="550px" src="https://repl.it/@prophen/cat-rescue-donation-button?lite=true"&gt;&lt;/iframe&gt;
&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;For the complete donation flow, open the website using the button on the embedded replit or use the links from the list below.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Donate SDK demo site pages
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://cat-rescue-donation-button.prophen.repl.co/css.html" rel="noopener noreferrer"&gt;Home page with CSS button, full page payment&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cat-rescue-donation-button.prophen.repl.co" rel="noopener noreferrer"&gt;Home page with PayPal button, pop-up payment&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cat-rescue-donation-button.prophen.repl.co/custom-button.html" rel="noopener noreferrer"&gt;Home page with custom hosted button image, pop-up payment&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cat-rescue-donation-button.prophen.repl.co/cancel.html" rel="noopener noreferrer"&gt;Cancel page&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cat-rescue-donation-button.prophen.repl.co/completed.html" rel="noopener noreferrer"&gt;Completed donation page&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Why three pages to show the Donate button?
&lt;/h4&gt;

&lt;p&gt;I created three pages to show adding a Donate button with three levels of visual customization.&lt;/p&gt;

&lt;p&gt;The simplest option is to take the code and Donate button image that PayPal provides and paste it into your website HTML. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://cat-rescue-donation-button.prophen.repl.co/" rel="noopener noreferrer"&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%2F9t3doko1tngus80cfl4m.gif" alt="PayPal button click"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;PayPal will also host a button image that you upload in the first step of customizing your button. It's not mentioned but it's best to make sure that the image is less than or equal to &lt;code&gt;300px&lt;/code&gt; wide before you upload because the rendered button has a max-width of &lt;code&gt;300px&lt;/code&gt;. This is more work than using the PayPal designed button because you have to create a button image that will look good when it's rendered.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://cat-rescue-donation-button.prophen.repl.co/custom-button.html" rel="noopener noreferrer"&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%2F23yeuhansjzxbfr4slkq.png" alt="Uploaded button"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The example with a CSS donate button links to the donation page URL that PayPal provides. This requires some custom CSS and HTML because PayPal doesn't give you code for CSS buttons. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://cat-rescue-donation-button.prophen.repl.co/css.html" rel="noopener noreferrer"&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%2Fa9lefngcix6ibw29a7d2.png" alt="CSS button"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  My preferences
&lt;/h4&gt;

&lt;p&gt;I like using a CSS donate button most because it's the easiest to customize. I might want a snazzier button with animations and hover states. We don't get that level of customization with the Donate SDK hosted button.&lt;/p&gt;

&lt;p&gt;With PayPal's hosted buttons, I didn't like the way my uploaded image rendered as a button and I wasn't sure how to make it look better. I don't love the look of the default buttons, specifically because the "large" button is still very small. I'd like to see buttons provided in the style we see on the actual donation page.&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%2Fssqregigxur9jqdurrte.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%2Fssqregigxur9jqdurrte.png" alt="Donation page buttons - Gold "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  My recommendations
&lt;/h3&gt;

&lt;p&gt;If you want the simplest way to add donations to your website without writing any code, go with the standard, gold, PayPal Donate button and use the pop-up experience. &lt;/p&gt;

&lt;p&gt;If you want to customize your button, create it with CSS or SVG, then use the donation page link that PayPal provides. You will lose the option for a pop-up, but the full-page experience is functionally the same. &lt;/p&gt;

&lt;p&gt;For a low-code implementation, the Donate SDK does everything it needs to do without a lot of fuss. If that's what you need for your website, I recommend that you give it a try.&lt;/p&gt;

&lt;h3&gt;
  
  
  Thanks for reading!
&lt;/h3&gt;

&lt;p&gt;If you decide to add donations to your website using PayPal's Donate SDK, let me know in a comment or tweet. I'd love to see it.&lt;/p&gt;




&lt;p&gt;Cover Photo by &lt;a href="https://unsplash.com/@markuswinkler?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Markus Winkler&lt;/a&gt;&lt;/p&gt;

</description>
      <category>paypal</category>
      <category>donatesdk</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Interview with Guillermo Huerta for National IT Professionals Day</title>
      <dc:creator>Nikema</dc:creator>
      <pubDate>Tue, 21 Sep 2021 15:18:25 +0000</pubDate>
      <link>https://dev.to/armory/interview-with-guillermo-huerta-for-national-it-professionals-day-5aeh</link>
      <guid>https://dev.to/armory/interview-with-guillermo-huerta-for-national-it-professionals-day-5aeh</guid>
      <description>&lt;p&gt;To celebrate National IT Professionals Day, we're sharing an interview I had with Armory's Head of IT and Workplace, Guillermo Huerta. The interview is broken into seven parts. There's a video and transcript for each section.&lt;/p&gt;

&lt;h3&gt;Introductions&lt;/h3&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/ZWrZJTUT3wY" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nikema Prophet:&lt;/strong&gt; &lt;span&gt;[00:00:00]&lt;/span&gt; I'm Nikema I am the Associate Community Marketing Manager at Armory and I'm talking to Guillermo today. We are celebrating National IT Professionals Day this month, and we wanted to talk to you and get to know more about you and like what you do at Armory, what it's like to be an IT professional.&lt;/p&gt;

&lt;p&gt;So Guillermo, can you share a little bit about yourself and your role at Armory? &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Guillermo Huerta:&lt;/strong&gt; Sure. So I'm, Guillermo Huerta. I am the Head of IT and Workplace here at Armory. And I joined Armory in April with the plan to build out an IT department and facilitate the growth and structure that IT brings to a company.&lt;/p&gt;

&lt;p&gt;A lot of the role when you think of IT is who's fixing your laptop when you have a problem. But that's when you have a problem and when IT is going well, you're not having a problem. So &lt;span&gt;[00:01:00]&lt;/span&gt; a lot of the work is preventative. How do we prevent issues from arising? How do we make sure that the services that we need as a company to do our jobs are running and are available before we need them to be &lt;/p&gt;

&lt;h3&gt;IT at Armory&lt;/h3&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/TaNmA5Vw1yc" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nikema Prophet:&lt;/strong&gt; &lt;span&gt;[00:00:00]&lt;/span&gt; Can you describe a typical day or week at Armory? &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Guillermo Huerta:&lt;/strong&gt; Sure. So I think one of the things that makes being in IT at a startup a little bit different from a larger org is so much of what IT is doing is preparing for that growth and getting us ready to scale.&lt;/p&gt;

&lt;p&gt;So it's, it's looking at what applications are we using? What hardware are we using? How is that going to work? When we add another 50, a hundred people into this environment and start tracking that. So, a lot of it is planning. So having meetings with the various departments, understanding what their goals are, what their team is working on and what are the tools and processes that they need to get that job done.&lt;/p&gt;

&lt;p&gt;And then taking that information and looking at what systems we currently have, what systems we need to have, and planning out what is the path that's going to get us from, where we are today to where we &lt;span&gt;[00:01:00]&lt;/span&gt; need to be to continue that growth and planning. And then there's a lot of administrative work that goes alongside with that.&lt;/p&gt;

&lt;p&gt;Because to do that scale, we need to bring new employees on, onto the company accounts, we need to be able to give them the appropriate access, make sure that their machines are secure. So some of it is planning how those things operate and then the actual action of doing those tasks.&lt;/p&gt;

&lt;p&gt;And again, looking at how do we scale? A lot of this is automation. How do we do all of those things in an automated fashion? Because we could do them manually that doesn't scale, but also by doing them manually, we're creating the opportunity to make mistakes. So when you set up your, email account, for example, if I, type in your name manually, rather than it coming from the HR system where, you know, the new hire &lt;span&gt;[00:02:00]&lt;/span&gt; inputted their information directly, there is an opportunity that it gets mistyped and then that information is wrong. And the employee can't use that account because they can't log in, or it's going to start sending out emails as this misspelled name and all of those things that need to be created, creating more work.&lt;/p&gt;

&lt;p&gt;Whereas, if you could just automate it – that's one of the things that IT focuses on is how do we automate things in a way that improves our accuracy and ease of life for the employees&lt;/p&gt;

&lt;h3&gt;Guillermo's Career Path&lt;/h3&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/GY7B2qdU_vo" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nikema Prophet:&lt;/strong&gt; &lt;span&gt;[00:00:00]&lt;/span&gt; So that makes me wonder, how did you get on this career trajectory? How did you get started? &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Guillermo Huerta:&lt;/strong&gt; Yeah, that's a great question. IT, definitely, wasn't my original plan to go into IT. I went to school with the idea that I would be pre-med and look at medical school. But I always had an interest in technology. In high school, I got interested in computers in actually the hardware side. So I had access to a computer lab. I thought it was really cool that if you opened up a computer and took out parts and swapped them out and put them back in, it would change how that computer, behaved the next time you powered it on. And so, I got exposed to it then, and it became, a hobby. And then in college, well, I was focused on my studies. I got a job in the libraries as a tech, so servicing computer labs and the library and then also in the dorm. So supporting my, &lt;span&gt;[00:01:00]&lt;/span&gt; fellow students to do that.&lt;/p&gt;

&lt;p&gt;And so it was always one of these hobbies where I was getting more and more skilled and interested in it as I was growing up. And then when I did have to make a career decision I was in California looking for jobs and found a, company that was looking for an, IT support role. So my, first full-time IT job was as, a lot of people started in IT as a desktop support person. So I, literally was the person who went around and fixed your laptop if you had an issue. And through that learned that IT is really a very wide field. There's a lot to do in IT. You can focus on the end-user support.&lt;/p&gt;

&lt;p&gt;You can get into system administration and system administration is a giant field. There are all sorts of different kinds of system administrators, and a lot of them have completely distinct skill sets. I actually was interested in &lt;span&gt;[00:02:00]&lt;/span&gt; network engineering because that to me was, well, that's the backbone of all of these systems and how they talk to each other.&lt;/p&gt;

&lt;p&gt;So I got into that and while I was doing that, I just so happened to, start supporting as a system admin, the video conferencing infrastructure that my company was using. And as I learned more about networking, I realized that well, video conferencing is using 60% of our internal bandwidth on a day-to-day basis.&lt;/p&gt;

&lt;p&gt;Cause this was before everything was SAAS based there wasn't a SAAS service that would handle over all of our video conferencing. Like there is today, it was more, if we needed to make a video call somebody in the IT department had to maintain a server in each office, the infrastructure and the conference rooms and the servers and data centers.&lt;/p&gt;

&lt;p&gt;So that, that conversation between our dev team in Mountain View and Toronto and Paris could have that, &lt;span&gt;[00:03:00]&lt;/span&gt; call and a smooth and seamless process. And so through that, I kind of realized, oh, This keeps on getting wider and more more interesting of a field. And that's, how I started to get more and more technical.&lt;/p&gt;

&lt;p&gt;Just, realizing that every time I learned something new, I found a whole new a whole new avenue of IT. And I think that's really one of the things that I share with, anyone who tells me they're interested in IT, is that, well, IT is a really large and wide field, and it's great to come in with a, generalist point of view, and want to learn everything, but what you should do is see what are the things that actually interest you in IT. And how, can you learn more about those things? Because there's, just so much to learn and all sorts of directions. &lt;/p&gt;

&lt;h3&gt;More on the Video Conferencing Story...&lt;/h3&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/m5-B6qWELKE" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nikema Prophet:&lt;/strong&gt; &lt;span&gt;[00:00:00]&lt;/span&gt; That's a really cool story. About what year was that when you had to do all of that setup for one video call? &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Guillermo Huerta:&lt;/strong&gt; Well, so I have a funny story about that. The first time I had to support video conferencing I found out the day before because again, IT is a very, very, wide field.&lt;/p&gt;

&lt;p&gt;And so the department I was in, nobody had any experience setting up a video conferencing system. So the day before three servers arrived to our director of IT. And there was going to be an old director's meeting the next day. That usually it was a phone-in meeting. And so they wanted to use video conferencing for that meeting.&lt;/p&gt;

&lt;p&gt;So the director came to me and said, Hey, nobody else has any experience with setting up these video conferencing servers before. Do you want to get these set up with the idea that this call is going to be tomorrow? And so that was what I had to do.&lt;/p&gt;

&lt;p&gt;I got those three servers. I got badged and fingerprinted to go to the data center that we had that I &lt;span&gt;[00:01:00]&lt;/span&gt; had locally at the time in San Jose. Drove down there, racked and stacked the servers, got them configured, and got the office infrastructure communicating with those servers in the data center.&lt;/p&gt;

&lt;p&gt;Got on a call with people in those various offices. So the day of, and then the morning before that call was supposed to happen. So that was the first really rushed hustle, hustled IT experience I had where, hey, this is something with, no previous knowledge of, you're going to have to get up to speed quickly.&lt;/p&gt;

&lt;p&gt;And we did with within that that that day turnaround, we got this entirely new video conferencing system spun up and working. And then of course that director's meeting was canceled. So we do all that work and it was great because that then gave us some more time to keep doing testing, actually write documentation.&lt;/p&gt;

&lt;p&gt;Because one thing I've definitely learned over my career is. IT really is about planning. It's, the action is exciting. That's when you going to do the technical work &lt;span&gt;[00:02:00]&lt;/span&gt; that you've learned so much about, but if you don't plan you're really going to have to put in a lot more work during that action phase.&lt;/p&gt;

&lt;p&gt;Then if you have a plan, you have a communication plan and documentation, because at the end of the day, everything you were doing as an IT professional. Is going to affect a end-user's life. And how will the users interact with that system? What information do they need to know to be able to interact with that system?&lt;/p&gt;

&lt;h3&gt;Thoughts on Representation in Tech&lt;/h3&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/RM_sp7xHeHU" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nikema Prophet:&lt;/strong&gt; &lt;span&gt;[00:00:00]&lt;/span&gt; I know you mentioned that you were in California, at the time, are you originally from California ? &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Guillermo Huerta:&lt;/strong&gt; I'm not from California, so I grew up in Omaha, Nebraska. I'm actually, not from there either though. I was, born, outside of Detroit, Michigan. And my parents are from Detroit and Miami though.&lt;/p&gt;

&lt;p&gt;My, my father is a Cuban refugee, so he grew up in Miami. But was born in Cuba.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nikema Prophet:&lt;/strong&gt; What are your thoughts about representation in tech? &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Guillermo Huerta:&lt;/strong&gt; Yeah I think representation is one of the keys to having good diversity and inclusive company culture. Because one of the kind of reasons why we talk so much about representation is a person can't really see themselves in a role if they don't have representation in that role. If it's a role where &lt;span&gt;[00:01:00]&lt;/span&gt; you've never seen somebody who looks like you has a similar background to you in that role, then you have to.&lt;/p&gt;

&lt;p&gt;Really go out on a limb to to imagine yourself in that role. And so, I mentioned, my father is Cuban. I grew up in Omaha, Nebraska, where there were not a lot of Cubans there wasn't a large Latin population. And our kind of careers that we were encouraged to, were, doctor, lawyer and that was kind of the end of the list. And there was a small Latin community that we would celebrate holidays with get together. And it was kind of the same for all the other kids in those families. We were encouraged to, go to school, stay focused. And then, try to get into one of, one of those professions.&lt;/p&gt;

&lt;p&gt;And when I had this interest in tech, it was always seen as well, this is an interest or a hobby, it's not a career. &lt;span&gt;[00:02:00]&lt;/span&gt; So representation matters not only in the industry that you want to get into, but also within your community, because if your community doesn't understand that industry or that field, there's there, isn't a resource within your community that you can go talk to and understand what are the things that I should be doing, or learning, or researching&lt;/p&gt;

&lt;p&gt;about, so that I can get into that field. And that was, there was definitely one of the things that I struggled with as I made this movement into tech. It was always seen as, oh, this is a opportunity to learn more about this. This isn't a career. And as I got more involved in it, as I learned more about the industry, the opportunity there, just like learning more about how wide and varied IT is, I learned that, oh, there is opportunity in tech. I do have a path and a career here in tech and I can focus on this and not just see &lt;span&gt;[00:03:00]&lt;/span&gt; it as, a hobby or an interest of mine. &lt;/p&gt;

&lt;p&gt;And that really, really would be supported more with representation. And so my kind of personal outcome of that is I have been more conscientious of how do I, support representation be representative of my community in my community as well as at the company. And so I definitely think it's not only important, but it's one of those things that you can't just talk about, you have to act on.&lt;/p&gt;

&lt;p&gt; So at my previous company, I was active in our ERG and focused on, those kinds of things.&lt;/p&gt;

&lt;p&gt;How do we show representation within the company? And we would do a lot of events throughout the year. One event we would do was around the Latinx/Hispanic Heritage Month. And when we did those events, we made sure, okay. Not only do we have a, a Latin panel or presenters who are speaking, but they are all varied &lt;span&gt;[00:04:00]&lt;/span&gt; levels at the company, because if we can't show anybody at a leadership level, then what we're really showing is the representation that, yeah, you can be in tech, but you can be in tech at an entry level. And that then represents that the career path really isn't there. And so I think taking those opportunities to really show that there are individuals that you have similar backgrounds to you, that, that look like you in these roles at all different levels of the company that have gone through a career in this industry it, it encourages people to focus and see this as a career rather than this is a job and I'm going to have to, you know, find a real career in the future.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nikema Prophet:&lt;/strong&gt; That's so true. I don't have anything to add to that. That was great.&lt;/p&gt;

&lt;h3&gt;It's Latinx/Hispanic Heritage Month (September 15 - October 15)&lt;/h3&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/3M6Q3bT4_lE" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Guillermo Huerta:&lt;/strong&gt; &lt;span&gt;[00:00:00]&lt;/span&gt; It is Latin/Hispanic Heritage Month. And I think this is a great opportunity for individuals and companies to better understand, well, what is the exposure of the Latin community to tech within their company, outside of their company. &lt;/p&gt;

&lt;p&gt;And it's not only, who are you hiring? It's how do you interact with those communities? Because those communities are your customers. They are your vendors And they shouldn't just be limited to a hiring plan because going back to why representation matters and why diversity matters, is if you don't have a diverse workforce, but also, work with a diverse set of vendors and contractors, when you do engage with your users you're inevitably not going to be able to reflect your user base because your user base for most &lt;span&gt;[00:01:00]&lt;/span&gt; companies is everybody. And if you don't represent a good portion of everybody, then how can you possibly have a product that understands the needs of all those various communities? So I think the heritage months throughout the year, they're a great opportunity to learn what resources are out there, but those resources are available year-round. &lt;/p&gt;

&lt;p&gt;Techqueria is a great one for the Latin community in the tech industry. They put on lots of events throughout the entire year, but particularly during this month. They have great programming. I highly recommend if anybody is curious about the Latin experience and the tech industry to check out their events. And then there's also a Latin Fest that's happening at the end of the month. And that's a three-day event that has all sorts of speakers, career development paths, and sessions for networking.&lt;/p&gt;

&lt;p&gt;So it's not and I think this is one of the things that I always &lt;span&gt;[00:02:00]&lt;/span&gt; talk about when planning those events is yes, we are celebrating a particular community's heritage or culture during one of these months, that does not mean that is the only audience for these events, which goes back to, true diversity and inclusion is having diversity and including everyone. And so if you only create an event and you're only having the community, that is you're supposed to be raising awareness about show up to that event. You're not really raising awareness your just creating an environment for that community.&lt;/p&gt;


&lt;h3&gt;What Do You like About Working at Armory?&lt;/h3&gt;
  &lt;iframe src="https://www.youtube.com/embed/5Nj1dPyf3tA" width="710" height="399"&gt;
  &lt;/iframe&gt;

&lt;p&gt;&lt;strong&gt;Nikema Prophet:&lt;/strong&gt; &lt;span&gt;[00:00:00]&lt;/span&gt; What do you like about working at Armory or is there a favorite part about working here? &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Guillermo Huerta:&lt;/strong&gt; I really enjoy working at Armory.&lt;/p&gt;
&lt;p&gt;I think it's an exciting time to, to join Armory. And I think one of the things that, really makes it different for me is I started this job entirely remotely in the middle of the pandemic. But I think one thing that really stood out to me as while there was this special circumstance on why I was starting remotely&lt;/p&gt;
&lt;p&gt;Armory is the first company I've worked at, which is, a remote first culture. And really, reinforcing that in the way that we are thinking about how the office is being used, how employees get their setups. And so I think I've really appreciated that, that not only am I starting as a remote employee and in this special circumstance, but the fact that it's something that the company &lt;span&gt;[00:01:00]&lt;/span&gt; is committed to.&lt;/p&gt;
&lt;p&gt;And despite that I have had the opportunity to get to know people and the company culture is very friendly. Like I've enjoyed my conversations. You know, the, all the coffee meetings that we randomly get paired with and just get to know who are the people behind this company? And they're all very interesting, and that they all have plenty of fun facts to find out about.  
&lt;/p&gt;

&lt;h3&gt;Thanks Guillermo!&lt;/h3&gt;

&lt;p&gt;Thanks for the awesome work you're doing at Armory. I'm glad I had the opportunity to interview you so that we all can celebrate you on this year's National IT Professionals Day 🎉.&lt;/p&gt;

</description>
      <category>it</category>
    </item>
    <item>
      <title>ICYMI: Our Celebration of #NationalDogDay</title>
      <dc:creator>Nikema</dc:creator>
      <pubDate>Thu, 09 Sep 2021 19:34:06 +0000</pubDate>
      <link>https://dev.to/armory/icymi-our-celebration-of-nationaldogday-1oa</link>
      <guid>https://dev.to/armory/icymi-our-celebration-of-nationaldogday-1oa</guid>
      <description>&lt;p&gt;In case you missed it: The Armory crew celebrated #NationalDogDay and shared super-cute photos and video of some of the special dogs in our lives. Get your daily dose of cute in the photos below.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1430960074973929476-733" src="https://platform.twitter.com/embed/Tweet.html?id=1430960074973929476"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1430960074973929476-733');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1430960074973929476&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1430995699324227584-143" src="https://platform.twitter.com/embed/Tweet.html?id=1430995699324227584"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1430995699324227584-143');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1430995699324227584&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1431008670544896004-489" src="https://platform.twitter.com/embed/Tweet.html?id=1431008670544896004"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1431008670544896004-489');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1431008670544896004&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fp-qKFvWn.b3.n0.cdn.getcloudapp.com%2Fitems%2FkpunOqAZ%2F697f9d6e-6ab1-4dee-a15a-0630868aa10f.gif%3Fv%3D10815d5b81c229d195fa7e2efb511ac0" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fp-qKFvWn.b3.n0.cdn.getcloudapp.com%2Fitems%2FkpunOqAZ%2F697f9d6e-6ab1-4dee-a15a-0630868aa10f.gif%3Fv%3D10815d5b81c229d195fa7e2efb511ac0" alt="Armory crew with dog friends" width="600" height="314"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>culture</category>
      <category>people</category>
    </item>
    <item>
      <title>Interview with Daniel Ko — Google Summer of Code 2021</title>
      <dc:creator>Nikema</dc:creator>
      <pubDate>Thu, 09 Sep 2021 15:50:44 +0000</pubDate>
      <link>https://dev.to/armory/interview-with-daniel-ko-google-summer-of-code-2021-3k37</link>
      <guid>https://dev.to/armory/interview-with-daniel-ko-google-summer-of-code-2021-3k37</guid>
      <description>&lt;p&gt;I’m personally excited about this year’s Google Summer of Code (GSoC) project &lt;a href="https://spinnaker.io/docs/community/gsoc/projects/2021/try-spinnaker-io/" rel="noopener noreferrer"&gt;&lt;strong&gt;try.spinnaker.io&lt;/strong&gt;&lt;/a&gt;. Daniel Ko is the student who worked with Armory mentors and the &lt;a href="https://cd.foundation" rel="noopener ugc nofollow noreferrer"&gt;Continuous Delivery Foundation&lt;/a&gt; to complete the project. After his midterm demo, I asked Daniel some questions about the project and why he chose it.&lt;/p&gt;





&lt;p id="3337"&gt;Nikema Prophet: What inspired you to work with the Spinnaker Project for GSoC?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p id="863d"&gt;&lt;em&gt;Daniel Ko: I was inspired to submit a proposal for Spinnaker because I was broadly interested in contributing to open source CI/CD tools. I think I would like to work in the DevOps field in the future rather than traditional software development and through my research before applying to GSoC I found out that Spinnaker was one of the most popular and powerful tools for deployment.&lt;/em&gt;&lt;/p&gt;
&lt;p id="37df"&gt;&lt;em&gt;My project, try.spinnaker.io, in a nutshell is a sandbox environment where users can test out the core functionality of Spinnaker such as deploying pipelines without having to worry about installing on their machines.&lt;/em&gt;&lt;/p&gt;
&lt;p id="848a"&gt;&lt;em&gt;I was motivated to work on try.spinnaker.io because I had a lot of trouble setting up my first test environment for Spinnaker. Spinnaker is notorious for being hard to get up and running. There were so many dependencies that one had to set up correctly such as network configuration and an external storage provider just to see the main ui. I saw that other popular open source projects such as Docker and golang have their own sandbox environments and thought this project would be a great opportunity to encourage people to see for themselves what all the fuss about Spinnaker is about.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p id="f25f"&gt;NP: We’re midway through GSoC, have you had any challenges that were particularly satisfying to overcome?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p id="e074"&gt;&lt;em&gt;DK: One of the tricky technical challenges was mitigating the risk of bad actors deploying malicious containers such as cryptocurrency miners. I first thought of the idea of blocking all inbound and outbound requests besides our private container registry on an AWS security group level but quickly found out that this would cause problems because the Spinnaker images are pulled from a public container registry. I found a workaround where we install a Kubernetes admission controller called “Portieris” which allows us to define image security policies on a namespace level.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p id="fc9d"&gt;NP: Do you have any examples of getting unblocked?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p id="5c42"&gt;&lt;em&gt;DK: My mentors were able to unblock me on exposing Spinnaker using an ‘Application Load Balancer’ (ALB). This wasn’t a trivial process as there were a lot of moving parts; you need a Route53 hosted zone, changes to the Spinnaker config file such as defining the correct URLs for the Deck and Gate, and setting up certificates for our ALB.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p id="ab38"&gt;NP: What is something you’re excited about or looking forward to?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p id="7213"&gt;&lt;em&gt;DK: I’m excited for new people to try out our sandbox environment and experience Spinnaker for the first time. I know that there will be a lot of bugs and feedback from the community and I hope that this project can gain more traction so we can get more hands working on it!&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p id="7446"&gt;NP: Has your ​​experience so far matched up with the expectations you had coming into the program?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p id="140c"&gt;&lt;em&gt;DK: My ​​experience has definitely exceeded the expectations I had coming in! I didn’t know that I would be paired with three amazing mentors who are willing to unblock me and give constructive feedback. The weekly meetings that we have really helped me to set attainable goals for myself and made me accountable for the work I wanted to accomplish.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p id="f541"&gt;NP: Is there anything you need from the Spinnaker community right now?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p id="bc79"&gt;&lt;em&gt;DK: Nothing as of this moment but keep your eyes peeled for a future beta test release of my project!&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p id="5aaa"&gt;NP: Any news to share or amplify?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p id="f1f2"&gt;&lt;em&gt;DK: A video presentation where I go over the project in more detail can be found here! &lt;/em&gt;&lt;a href="https://www.youtube.com/watch?v=-_MRDYxtOrs" rel="noopener ugc nofollow noreferrer"&gt;&lt;em&gt;GSoC Phase 1 Try Spinnaker io&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p id="b077"&gt;Thank you, Daniel, for taking time out of your busy schedule to answer my questions. The demo looks awesome and I can’t wait to try out the beta!&lt;/p&gt;





&lt;h2&gt;Additional Insights from the Mentors&lt;/h2&gt;

&lt;p&gt;This year was the second year that Armory provided mentors to GSoC for the open source Spinnaker project. For this Armory blog post I asked the mentors Cameron Motevasselani, Dan Johnston, and Fernando Freire how it went from the mentor's perspective. They had great things to say about Daniel.&lt;/p&gt;

&lt;h3&gt;On working with Daniel (and what he did well)&lt;/h3&gt;

&lt;ul&gt;
    &lt;li&gt;It "was a great experience."&lt;/li&gt;
    &lt;li&gt;"He came up with a plan of attack, broke the project up into doable parts with milestones."&lt;/li&gt;
    &lt;li&gt;It was an "ambitious project and he delivered."&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;On overcoming technical challenges&lt;/h3&gt;

&lt;ul&gt;
    &lt;li&gt;"Daniel’s work touched many different areas, requiring help from different mentors. Having multiple mentors with a variety of experience helped. "&lt;/li&gt;
    &lt;li&gt;As a team, they implemented &lt;span&gt;&lt;span&gt;role-based access control&lt;/span&gt;&lt;/span&gt; (RBAC) to prevent abuse of service.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Advice for future GSoC mentees&lt;/h3&gt;

&lt;ul&gt;
    &lt;li&gt;"Be prepared to do research prior to diving into coding"&lt;/li&gt;
    &lt;li&gt;"Break the project down into achievable milestones"&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;A callout of Daniel's technical skills&lt;/h3&gt;

&lt;ul&gt;
    &lt;li&gt;Locking down the instance and creating a plugin to modify RBAC was impressive.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;A final thought&lt;/h3&gt;

&lt;p&gt;A great amount was accomplished even with a shorter project time this year.&lt;/p&gt;

</description>
      <category>googlesummerofcode</category>
      <category>spinnaker</category>
      <category>opensource</category>
      <category>community</category>
    </item>
    <item>
      <title>Getting Started as a Content Contributor</title>
      <dc:creator>Nikema</dc:creator>
      <pubDate>Sat, 10 Jul 2021 01:09:01 +0000</pubDate>
      <link>https://dev.to/armory/getting-started-as-a-content-contributor-158n</link>
      <guid>https://dev.to/armory/getting-started-as-a-content-contributor-158n</guid>
      <description>&lt;p&gt;Hi! Nikema here. I co-lead the Spinnaker Contributor Experience Special Interest Group (SIG) with Adetokunbo Ige. Since stepping into this role, I’ve wanted to write a post to explicitly welcome non-code contributions to the project. This is meant to be a living document, and I am open to feedback and suggestions. Let’s work together to make open source contributing a little less intimidating.&lt;/p&gt;

&lt;p&gt;I will be loosely referring to contributing to Spinnaker, but I intend to make this a starting point for anyone new to content contributing.&lt;/p&gt;

&lt;h2&gt;
  
  
  What You Need to Get Started
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Familiarity with Git and GitHub&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Spinnaker project lives on GitHub. It’s helpful to know how to navigate the platform and complete common tasks. Later in the post, I’ll list some ideas for non-code contributions. Not everything you do as a community member needs to go through GitHub, but it’s a good skill to have and to practice.&lt;/p&gt;

&lt;p&gt;If you aren’t familiar with GitHub, Kent C. Dodds has a free community course on egghead.io. He’s a great teacher so this is an awesome place to start.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://egghead.io/courses/how-to-contribute-to-an-open-source-project-on-github" rel="noopener noreferrer"&gt;https://egghead.io/courses/how-to-contribute-to-an-open-source-project-on-github&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An interest in an open source project&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My suggestion is to find a project that is exciting to you or solving a problem you have experienced. You may also want to work backwards from finding a great community. Good people can make the most challenging work enjoyable.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Willingness to participate in a community&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You’ll have to interact with people as you are making your contributions. There might be times when you have to discuss an issue or Pull Request (PR). Don’t be afraid but keep in mind that you don’t have to put up with toxicity or dismissive attitudes. If people are jerks to you, find a better, more inclusive project to contribute to.&lt;br&gt;
Helpful Resources&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://opensource.guide/how-to-contribute/#how-to-submit-a-contribution" rel="noopener noreferrer"&gt;Open Source Guides — How to Contribute to Open Source&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://builtin.com/software-engineering-perspectives/open-source-contribution" rel="noopener noreferrer"&gt;The Ultimate Guide to Open-Source Contribution&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Ways to Contribute Content Without Coding
&lt;/h2&gt;

&lt;p&gt;If there’s one point I’d like to get across, it’s that you don’t have to be an expert in the technology to make awesome contributions. In this post, I’ll provide a short list of ideas for creating content for project contributions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Participate in community discussions
&lt;/h3&gt;

&lt;p&gt;Join the community forum (in our case, it’s &lt;a href="http://join.spinnaker.io" rel="noopener noreferrer"&gt;Slack&lt;/a&gt; and introduce yourself. Ask questions. Find out what the project needs and how you may be able to help. Make comments and bring yourself to the community.&lt;/p&gt;

&lt;h3&gt;
  
  
  Learn in public
&lt;/h3&gt;

&lt;p&gt;It’s okay to be a beginner and content from a newbie perspective is incredibly valuable. Once you are familiar enough, it’s hard to remember the things that were challenging or blocking for you when you were just starting out. The more perspectives we have documented, the more accessible our projects are to people within a range of experience levels.&lt;/p&gt;

&lt;h3&gt;
  
  
  Add your perspective to existing content
&lt;/h3&gt;

&lt;p&gt;View talks, tutorials, and workshops and add your perspective. You could talk about it on video or write a blog post.&lt;/p&gt;

&lt;p&gt;What did you learn? What was hard to understand? Did you get stuck?&lt;/p&gt;

&lt;p&gt;Again, it’s super-helpful to do this. If you got stuck and were able to resolve an issue, sharing that with the community will help others avoid the problem and could eliminate the problem for future users.&lt;/p&gt;

&lt;h3&gt;
  
  
  Share on social media
&lt;/h3&gt;

&lt;p&gt;Like (or clap), comment, subscribe, share.&lt;/p&gt;

&lt;h3&gt;
  
  
  Organize or join local or virtual meetups around a project
&lt;/h3&gt;

&lt;p&gt;Meet up with others. There is so much potential for magic ✨ to happen when we get together.&lt;/p&gt;

&lt;h3&gt;
  
  
  Give a talk on your experience
&lt;/h3&gt;

&lt;p&gt;Your experience matters. Your unique voice is a value add to the community and no one can provide it but you.&lt;/p&gt;

&lt;h3&gt;
  
  
  Publish interviews of community members and maintainers
&lt;/h3&gt;

&lt;p&gt;Learn from others through interviews; share them with the community.&lt;/p&gt;

&lt;h3&gt;
  
  
  Start a study group and document your progress
&lt;/h3&gt;

&lt;p&gt;The journey from newbie to knowledgeable is much more fun with friends. Get a group together and level-up as a team. Learn stuff and tell people about it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Use your writing skills to make existing documentation more readable or easier to understand
&lt;/h3&gt;

&lt;p&gt;Break out those GitHub skills and make a pull request to improve documentation. Find something missing or lacking? Fill in that blank with your awesome technical writing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Teach something you’ve learned about the project
&lt;/h3&gt;

&lt;p&gt;Document your learning as if you are teaching it to someone else.&lt;/p&gt;

&lt;h3&gt;
  
  
  Submit issues when you come across bugs or errors
&lt;/h3&gt;

&lt;p&gt;Find out how your project handles bug reports and submit them as needed. Don’t underestimate how helpful this is!&lt;/p&gt;

&lt;h3&gt;
  
  
  Become an ambassador
&lt;/h3&gt;

&lt;p&gt;Find out how to become a champion for your project and community. Some projects have formal ambassador roles. If you’re excited about the work your community is doing, help spread the word.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Ask
&lt;/h2&gt;

&lt;p&gt;I’m still new to open source contributing, and I’d like to collect more resources to share. What are your favorite guides and tips for new content contributors? Please let me know in the comments.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>contributorswanted</category>
      <category>writing</category>
      <category>spinnaker</category>
    </item>
    <item>
      <title>Nikema’s Spinnaker Summit 2021 Recap</title>
      <dc:creator>Nikema</dc:creator>
      <pubDate>Tue, 29 Jun 2021 21:13:51 +0000</pubDate>
      <link>https://dev.to/armory/nikema-s-spinnaker-summit-2021-recap-2i94</link>
      <guid>https://dev.to/armory/nikema-s-spinnaker-summit-2021-recap-2i94</guid>
      <description>&lt;h2&gt;My Second Spinnaker Summit is in the Books!&lt;/h2&gt;

&lt;p&gt;Last week I attended and spoke at my second Spinnaker Summit. Like last year’s summit, it was fully virtual. This time Spinnaker Summit was co-located with cdCon and took place on the Hopin platform.&lt;/p&gt;

&lt;p&gt;Last year, I spoke on a panel about Black professionals a few months after starting as a new employee at Armory. I showed up and just spoke my mind. I was just getting introduced to the Spinnaker community. Between then and now, I co-founded a Special Interest Group (SIG), the Contributor Experience SIG, with my co-lead Ige. We presented the story of our SIG on Day 0 of the summit.&lt;/p&gt;

&lt;p&gt;In less than a year’s time, I can see how much I’ve grown in my comfort level and my level of community involvement. I no longer feel unsure that I have anything of value to offer this project. I am solidly an active member of the community.&lt;/p&gt;

&lt;p&gt;As further confirmation of my place in the community, &lt;a href="https://www.youtube.com/watch?v=ZYEfJrKc8ig&amp;amp;t=339s" rel="noopener noreferrer"&gt;I won an award for contributing to Spinnaker&lt;/a&gt;. I was super surprised but honored.&lt;/p&gt;

&lt;h3&gt;Must-See Sessions and Keynotes&lt;/h3&gt;

&lt;p&gt;As the Associate Community Marketing Manager at Armory, Spinnaker Summit was an important event for me to participate in. For a number of reasons, I didn’t get a chance to attend all of the sessions I wanted to check out in real-time. Fortunately, this was a virtual conference that was recorded. I can’t wait for the replays to be posted in July.&lt;/p&gt;

&lt;p&gt;Until then, we have the conference keynotes available on the Continuous Delivery Foundation YouTube channel.&lt;br&gt;
&lt;iframe class="tweet-embed" id="tweet-1408440134538776576-309" src="https://platform.twitter.com/embed/Tweet.html?id=1408440134538776576"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1408440134538776576-309');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1408440134538776576&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h3&gt;Tweets!&lt;/h3&gt;

&lt;p&gt;Tweets posted during the event that caught my attention.&lt;br&gt;
&lt;iframe class="tweet-embed" id="tweet-1407348305798041617-243" src="https://platform.twitter.com/embed/Tweet.html?id=1407348305798041617"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1407348305798041617-243');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1407348305798041617&amp;amp;theme=dark"
  }



&lt;br&gt;
&lt;iframe class="tweet-embed" id="tweet-1408460281420865542-221" src="https://platform.twitter.com/embed/Tweet.html?id=1408460281420865542"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1408460281420865542-221');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1408460281420865542&amp;amp;theme=dark"
  }



&lt;br&gt;
&lt;iframe class="tweet-embed" id="tweet-1407811688582221824-22" src="https://platform.twitter.com/embed/Tweet.html?id=1407811688582221824"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1407811688582221824-22');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1407811688582221824&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h3&gt;Personal Notes&lt;/h3&gt;

&lt;p&gt;Burnout is REAL. I’ve been approaching the point of burnout since the beginning of May. The #SpeedOfLife campaign was a stretch outside my comfort zone. Stretching and growing pains are fine and normal under regular circumstances. Unfortunately, during #SpeedOfLife, I started writing energetic checks I could not cash at work and in my personal life. I quickly found myself overwhelmed, over-capacity, and struggling.&lt;/p&gt;

&lt;h4&gt;What I’ve learned from two months headed towards burnout&lt;/h4&gt;

&lt;ul&gt;
    &lt;li&gt;Count the costs and know your capacity. Factor in the whole picture when it comes to agreeing to a workload. Creative expression, caregiving, family, emotional labor, and self-care all have time and energy costs.&lt;/li&gt;
    &lt;li&gt;It is my responsibility to get unstuck. Ask for help sooner rather than later.&lt;/li&gt;
    &lt;li&gt;Remember who you are and what you do best. Don’t stray too far from that center.&lt;/li&gt;
    &lt;li&gt;Plans, structure, and strategy need to be in place. Having few to no surprises will prevent last-minute efforts and leave margin for changes.&lt;/li&gt;
    &lt;li&gt;I’m doing a lot. I can’t do it all 100%. I have to learn to prioritize the most important task at the moment and allow an appropriate amount of time to complete it.&lt;/li&gt;
    &lt;li&gt;I have support and means of assistance. I can remember to access that when it’s needed.&lt;/li&gt;
    &lt;li&gt;I can’t do my job well if I’m not taking care of myself. I can take breaks before performance suffers or my body forces the issue (illness, exhaustion, immobilization).&lt;/li&gt;
    &lt;li&gt;I’m allowed calm, peace, and to be doing better than just scraping by. That will be my new normal. I’ll be happier and healthier once I address my addiction to chaos and break the habit of overcommitting.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;a href="https://twitter.com/search?q=from%3Adev_nikema%20%23SpeedOfLife&amp;amp;src=typed_query" rel="noopener noreferrer"&gt;#SpeedOfLife&lt;/a&gt; campaign taught me through my experience of leading a project for work and from the words of the people I spoke with. Kelsey Hightower talked about being present, Lee Faus talked about how the appropriate speed depends on the context, Margaret Francis spoke about how our work at Armory enables developers like me to work effectively at the speed our lives necessitate.&lt;/p&gt;

&lt;p&gt;I am grateful and relieved to be where I am today. I had three major projects to complete over the past few months, #SpeedOfLife, the &lt;a href="https://spinnaker.io" rel="noopener noreferrer"&gt;Spinnaker.io&lt;/a&gt; website refresh, and Spinnaker Summit. I many ways, I fell short of the expectations set for me but I have objectively accomplished a significant amount.&lt;/p&gt;

&lt;p&gt;I’m grateful but I definitely need a break ASAP. I am looking forward to returning refreshed and reset, in a mental state that sets me up for success.&lt;/p&gt;

</description>
      <category>spinnaker</category>
      <category>cdcon</category>
      <category>community</category>
      <category>opensource</category>
    </item>
    <item>
      <title>#SpeedOfLife - In Conclusion, Thanks for the Conversation</title>
      <dc:creator>Nikema</dc:creator>
      <pubDate>Thu, 27 May 2021 02:26:39 +0000</pubDate>
      <link>https://dev.to/armory/speedoflife-in-conclusion-thanks-for-the-conversation-5adb</link>
      <guid>https://dev.to/armory/speedoflife-in-conclusion-thanks-for-the-conversation-5adb</guid>
      <description>&lt;p&gt;As we close out the month of May, the #SpeedOfLife campaign will come to a close as well. Soon I will no longer be monitoring the hashtag but please feel free to &lt;a href="https://twitter.com/search?q=%23speedoflife&amp;amp;src=typed_query" rel="noopener noreferrer"&gt;continue the conversation on Twitter&lt;/a&gt;. You can even tag me (@dev_nikema) if you like.&lt;/p&gt;

&lt;p&gt;What does "speed of life" mean to you?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fmedia1.giphy.com%2Fmedia%2Fl2SpQRuCQzY1RXHqM%2Fgiphy.gif%3Fcid%3D36b14facgo7lutzpzikpj47kilvh6o22lzt8kcaoaa2x1r8t%26rid%3Dgiphy.gif%26ct%3Dg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fmedia1.giphy.com%2Fmedia%2Fl2SpQRuCQzY1RXHqM%2Fgiphy.gif%3Fcid%3D36b14facgo7lutzpzikpj47kilvh6o22lzt8kcaoaa2x1r8t%26rid%3Dgiphy.gif%26ct%3Dg" alt="Talk amongst yourselves" width="480" height="321"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Before I step away, I'd like to highlight some of my favorite parts of my interviews with Armory crewmates. It was interesting to hear all of the different interpretations of the phrase, "speed of life."&lt;/p&gt;

&lt;h3&gt;Lee Faus, Field CTO&lt;/h3&gt;

&lt;p&gt;First up is Field CTO Lee Faus on speed. In the full conversation, he gives great examples of how the appropriate speed depends on the situation and the needs at hand.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/_rPjN4uTzeY" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;Chad Tripod, Field CTO&lt;/h3&gt;

&lt;p&gt;Field CTO Chad Tripod with examples of what software delivery at the speed of life looks like today.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/e_Flh4LaL3U" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;Fernando Freire, Software Engineer&lt;/h3&gt;

&lt;p&gt;Software Engineer Fernando Freire on how great developer tooling "helps software delivery fade into the background"&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/L2MvVEcGmyU" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;This campaign was a stretch and a challenge for me. I have thoughts about it but I'm saving them for a future blog post 😀. To say the least, I learned a lot. I appreciate everyone who took the time to speak to me and extra-special thanks go to the people who joined a live stream (Kelsey Hightower, Margaret Francis, and David Morgenthaler).&lt;/p&gt;

&lt;p&gt;Some recordings I've yet to publish. If you're interested in viewing them, check out the &lt;a href="https://youtube.com/playlist?list=PLkzenGYiHxOPSxa2bW939rN3u7g3KXyDm" rel="noopener noreferrer"&gt;#SpeedOfLife YouTube playlist&lt;/a&gt;. It will be updated with clips from the interviews and live streams.&lt;/p&gt;

</description>
      <category>speedoflife</category>
      <category>devops</category>
    </item>
    <item>
      <title>#SpeedOfLife Week Two Recap</title>
      <dc:creator>Nikema</dc:creator>
      <pubDate>Thu, 27 May 2021 02:15:07 +0000</pubDate>
      <link>https://dev.to/armory/speedoflife-week-two-recap-5hjj</link>
      <guid>https://dev.to/armory/speedoflife-week-two-recap-5hjj</guid>
      <description>&lt;h2&gt;Tweets, Clips, and Double the Livestreams&lt;/h2&gt;

&lt;p&gt;In week two, we shared some awesome clips from my #SpeedOfLife interviews. Additionally, we had a bonus live stream with Kelsey Hightower. To date, there has been an element of chaos in each live stream. I've got two more planned, so two chances to get through a smooth stream 🤞🏾.&lt;br&gt;
&lt;iframe class="tweet-embed" id="tweet-1393292629010313216-688" src="https://platform.twitter.com/embed/Tweet.html?id=1393292629010313216"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1393292629010313216-688');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1393292629010313216&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h3&gt;The Armory Crew is Chiming In&lt;/h3&gt;

&lt;p&gt;I shared clips from my chats with Becky Jaimes (Chief of Staff) and Margaret Francis (COO). It was nice to hear their personalized perspectives on #SpeedOfLife.&lt;br&gt;
&lt;iframe class="tweet-embed" id="tweet-1394388947908718595-192" src="https://platform.twitter.com/embed/Tweet.html?id=1394388947908718595"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1394388947908718595-192');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1394388947908718595&amp;amp;theme=dark"
  }



&lt;br&gt;
&lt;iframe class="tweet-embed" id="tweet-1395154804993789954-272" src="https://platform.twitter.com/embed/Tweet.html?id=1395154804993789954"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1395154804993789954-272');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1395154804993789954&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/bN3g1jnRflY" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;h3&gt;Reminder, You Can Join the Conversation on Twitter&lt;/h3&gt;

&lt;p&gt;Jeff Barr and Isaac Mosquera did. Just use the hashtag #SpeedOfLife and share what coding at the speed of life means to you.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1392517572633976836-88" src="https://platform.twitter.com/embed/Tweet.html?id=1392517572633976836"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1392517572633976836-88');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1392517572633976836&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;We're chatting with the community for the month of May. I'd love to hear your point of view. See you next week!&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

</description>
      <category>speedoflife</category>
      <category>softwaredelivery</category>
    </item>
  </channel>
</rss>
