<?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>Forem: Christopher Codes</title>
    <description>The latest articles on Forem by Christopher Codes (@christoph_codes).</description>
    <link>https://forem.com/christoph_codes</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F276633%2Fc8038739-36cd-46b2-ba5a-fb1bd1e9d885.png</url>
      <title>Forem: Christopher Codes</title>
      <link>https://forem.com/christoph_codes</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/christoph_codes"/>
    <language>en</language>
    <item>
      <title>Do we still use StackOverflow?</title>
      <dc:creator>Christopher Codes</dc:creator>
      <pubDate>Sun, 08 Mar 2026 22:48:06 +0000</pubDate>
      <link>https://forem.com/christoph_codes/do-we-still-use-stackoverflow-2f53</link>
      <guid>https://forem.com/christoph_codes/do-we-still-use-stackoverflow-2f53</guid>
      <description></description>
      <category>community</category>
      <category>developers</category>
      <category>discuss</category>
      <category>programming</category>
    </item>
    <item>
      <title>AI Is Not Your Product. It’s Just a Feature.</title>
      <dc:creator>Christopher Codes</dc:creator>
      <pubDate>Thu, 15 Jan 2026 18:48:40 +0000</pubDate>
      <link>https://forem.com/christoph_codes/ai-is-not-your-product-its-just-a-feature-23p9</link>
      <guid>https://forem.com/christoph_codes/ai-is-not-your-product-its-just-a-feature-23p9</guid>
      <description>&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%2Fn00ndbbmdxnwlj54ednf.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%2Fn00ndbbmdxnwlj54ednf.png" alt="AI Is Not Your Product The Kirk Concept" width="800" height="400"&gt;&lt;/a&gt;Every frontend project lately seems to start with the same sentence:&lt;/p&gt;

&lt;p&gt;“We’re thinking about adding AI.”&lt;/p&gt;

&lt;p&gt;Cool. But why?&lt;/p&gt;

&lt;p&gt;After building real products that integrate AI, here’s the hot take I’ve landed on:&lt;br&gt;
AI doesn’t make a product valuable. It only amplifies what’s already there.&lt;/p&gt;

&lt;p&gt;If the product is weak, AI just makes that more obvious.&lt;/p&gt;

&lt;p&gt;We’re in this phase where people are trying to build AI-first tools, and most of them feel backwards. The UI is vague. The workflows are unclear. The value prop is “trust the model.” And once the novelty wears off, users are left wondering what problem the tool actually solved.&lt;/p&gt;

&lt;p&gt;That’s not a model issue. That’s a product issue.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The Best Products Don’t Need AI to Make Sense&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here’s something I’ve noticed working on frontend-heavy apps:&lt;br&gt;
If your product needs AI to be useful, it probably isn’t ready.&lt;/p&gt;

&lt;p&gt;The strongest products I’ve worked on already had clear value before AI ever touched them. Users understood what the app did. They knew where to click. They knew what success looked like.&lt;/p&gt;

&lt;p&gt;When AI showed up, it didn’t replace the experience. It just smoothed it out.&lt;/p&gt;

&lt;p&gt;Less friction. Less typing. Faster feedback. Better suggestions.&lt;/p&gt;

&lt;p&gt;That’s it.&lt;/p&gt;

&lt;p&gt;No magic. No “ask anything.” No black box UI where the user hopes the model guesses right.&lt;/p&gt;

&lt;p&gt;Frontend Engineers Feel Bad AI Immediately&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Bad AI integrations show up in the UI first.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You see it when the interface turns into a single text box with a vague prompt. You see it when the app can’t explain what just happened. You see it when the user doesn’t know whether to trust the output or double-check everything.&lt;/p&gt;

&lt;p&gt;That’s not empowering. That’s stressful.&lt;/p&gt;

&lt;p&gt;Good frontend design is about clarity. Predictable states. Intentional flows. AI works best when it stays inside those boundaries.&lt;/p&gt;

&lt;p&gt;When AI becomes the assistant, not the decision-maker, the UI stays grounded. The user stays in control. And the product feels reliable instead of experimental.&lt;/p&gt;

&lt;p&gt;AI Should Reduce Work, Not Responsibility&lt;/p&gt;

&lt;p&gt;This is the line I don’t like seeing crossed.&lt;/p&gt;

&lt;p&gt;AI is great at speeding things up. It’s great at drafting, summarizing, suggesting, and filling in gaps. What it’s not great at is owning outcomes.&lt;/p&gt;

&lt;p&gt;The best use cases I’ve seen don’t ask AI to do the job. They ask it to help the user do the job faster.&lt;/p&gt;

&lt;p&gt;That distinction matters.&lt;/p&gt;

&lt;p&gt;Users don’t want a product that thinks for them. They want one that respects their time.&lt;/p&gt;

&lt;p&gt;The Real Winners Are the “Boring” Products&lt;/p&gt;

&lt;p&gt;Here’s the uncomfortable truth:&lt;br&gt;
The tools people rely on every day are rarely exciting.&lt;/p&gt;

&lt;p&gt;They’re consistent. Predictable. Clear. They do one thing well.&lt;/p&gt;

&lt;p&gt;AI doesn’t replace that foundation. It sweetens it.&lt;/p&gt;

&lt;p&gt;The products that will last aren’t the ones screaming about intelligence. They’re the ones quietly using AI to remove friction from workflows that already work.&lt;/p&gt;

&lt;p&gt;As builders, especially on the frontend, our job isn’t to chase hype. It’s to ship products people trust.&lt;/p&gt;

&lt;p&gt;AI is just another tool in that toolbox. A powerful one, sure. But still just a tool.&lt;/p&gt;

&lt;p&gt;If AI makes the experience clearer, faster, or smoother, it belongs.&lt;br&gt;
If it makes the product harder to understand, it doesn’t.&lt;/p&gt;

&lt;p&gt;Simple as that.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>frontend</category>
      <category>product</category>
    </item>
    <item>
      <title>Just Launch Already! 🚀🚀</title>
      <dc:creator>Christopher Codes</dc:creator>
      <pubDate>Sun, 30 Mar 2025 22:07:37 +0000</pubDate>
      <link>https://forem.com/christoph_codes/just-launch-already-3i52</link>
      <guid>https://forem.com/christoph_codes/just-launch-already-3i52</guid>
      <description>&lt;p&gt;Sip some coffee and ponder on this for a sec…&lt;/p&gt;

&lt;p&gt;I know you probably hear this all the time as devs but we should constantly be reminded of this as we start new projects and work on existing ones. There are a lot of studies that show that projects launched before they are perfect are better off in the long term because feedback is acquired while building, instead of after. So here are a few things you can apply to your projects starting today to help you launch quicker without feeling like your work isn’t “good” enough.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Launch your MVP without fear
&lt;/h2&gt;

&lt;p&gt;Fear comes in all shapes and sizes and can creep up quickly and have compound growth as time goes on. It could be the fear of someone hating your product. The fear of pushing bad code to production. The fear of bad comments or reviews. Just know there is no need to fear because most of these things never happen, so don’t hide from a not promised future.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Save the features for later
&lt;/h2&gt;

&lt;p&gt;It is really easy to work towards your MVP and notice opportunities for improvement and include them in as a requirement for your MVP. As your feature / opportunities list grows your MVP turns into a feature heavy project that no one asked for. So much time is wasted on this list. The MVP should only be items required to solve the problem and once the problem is solved leave the “cool ideas” for later or until multiple customers request it.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. The Sooner the Better
&lt;/h2&gt;

&lt;p&gt;You could wait until the “perfect time”, but better, you could launch now and build to the perfect time. There are a lot of benefits to launching now. Gain feedback, generate your first dollar, acquire customers, validate ideas, validate the market/audience. Did I mention you can generate revenue in the process??&lt;/p&gt;

&lt;p&gt;In my years of running an agency and working on side projects, I have found that launching NOW is better than launching never. To my surprise, your potential customers have very low expectations. Just look at Craigslist. Anybody remember the first version of Facebook? They launched solving a couple problems and everybody loved it. Most of us would never launch something that looks as simple and bad as Craigslist, but the difference is they launched and iterated versus, iterate and never launch. Now please understand I am not vouching for the current versions of Facebook or Craigslist but the difference is we have an opinion about them, and no one has an opinion on the idea you never launched, so go be a billionaire, and just launch already!&lt;/p&gt;

&lt;p&gt;Let me know your thoughts on launching or share a project you’ve been sitting on that you haven’t launched yet! I’ll go first -&amp;gt; &lt;a href="http://app.thenextbill.com" rel="noopener noreferrer"&gt;http://app.thenextbill.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I hope you enjoyed this, I speak way more on Twitter if you’re into that kind of thing! &lt;a href="https://twitter.com/christoph_codes" rel="noopener noreferrer"&gt;https://twitter.com/christoph_codes&lt;/a&gt;&lt;/p&gt;

</description>
      <category>launch</category>
      <category>buildinpublic</category>
      <category>programming</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Tanstack Router's file generation is 🔥!</title>
      <dc:creator>Christopher Codes</dc:creator>
      <pubDate>Thu, 27 Mar 2025 17:07:11 +0000</pubDate>
      <link>https://forem.com/christoph_codes/tanstack-routers-file-generation-is--jo0</link>
      <guid>https://forem.com/christoph_codes/tanstack-routers-file-generation-is--jo0</guid>
      <description></description>
      <category>softwaredevelopment</category>
      <category>react</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Why I recommend Optimizing File and Folder Composition for Server Components First!</title>
      <dc:creator>Christopher Codes</dc:creator>
      <pubDate>Wed, 26 Mar 2025 15:40:00 +0000</pubDate>
      <link>https://forem.com/christoph_codes/why-i-recommend-optimizing-file-and-folder-composition-for-server-components-first-2cd0</link>
      <guid>https://forem.com/christoph_codes/why-i-recommend-optimizing-file-and-folder-composition-for-server-components-first-2cd0</guid>
      <description>&lt;p&gt;With Next.js just announcing version 15, and evolving rapidly, server components have become a core focus. The new data-fetching paradigms and routing enhancements further solidify the framework’s push toward server-side rendering (SSR) as the default approach. To keep up with these changes, I’ve adopted a mindset of “server components first” while managing client-side functionality separately. Here’s why I believe this approach should be embraced by more teams, along with practical guidelines for structuring Next.js projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Mindset: Server Components First
&lt;/h2&gt;

&lt;p&gt;Server components are emphasized to allow developers to fully leverage SSR while also offering client-side flexibility. By default, the assumption is that all pages will be server-rendered, benefiting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Performance: Offloading rendering to the server reduces the amount of JavaScript that runs on the client, leading to faster load times and a smoother user experience.&lt;/li&gt;
&lt;li&gt;Data Fetching: Fetch data directly within server components using standard fetch and async/await. This approach takes full advantage of SSR without needing complex configurations, letting the server handle the heavy lifting while keeping the client-side lightweight.&lt;/li&gt;
&lt;li&gt;SEO: Server-rendered pages deliver fully populated HTML to search engine crawlers, improving indexing and boosting search engine rankings.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Handling Client-Side Functionality Separately
&lt;/h2&gt;

&lt;p&gt;Client-side interactivity remains crucial for certain features, such as form handling, animations, or dynamic state management. With Next.js, you can manage this by using the 'use client' directive, which declares that a component should be rendered on the client side. Here’s how to structure this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Isolate client functionality in separate components: Create individual files for client-specific components and include the 'use client' directive at the top.&lt;/li&gt;
&lt;li&gt;Leverage composition patterns to manage complexity: Utilize the composition patterns described in Next.js documentation to maintain clarity between server-rendered and client-rendered components. This ensures that client components are only introduced when necessary.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, consider a page that includes a server-rendered list but also requires a client-side filter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;page.tsx&lt;/code&gt;: This is the server component for rendering the list.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ProductFilter.tsx&lt;/code&gt;: A client component with the &lt;code&gt;'use client'&lt;/code&gt; directive to manage filter interactions.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What If There Are No Server-Specific Needs?
&lt;/h2&gt;

&lt;p&gt;When server-side rendering isn’t required, you can add the 'use client' directive directly to the page.tsx file. This approach is suitable for scenarios where a page's content doesn’t benefit from being pre-rendered on the server, such as purely interactive dashboards or forms.&lt;/p&gt;

&lt;h2&gt;
  
  
  Structuring Your Next.js Project in Version 14+
&lt;/h2&gt;

&lt;p&gt;To keep the project organized, follow a structure that clearly separates server and client components, utilizing composition patterns where appropriate. Here’s an example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app/
  ├─ products/
  │   ├─ page.tsx                 // Server component for rendering the product list &amp;amp; imports ProductList.tsx
  │   ├─ ProductList.tsx          // Client page with 'use client' directive &amp;amp; imports ProductFilter.tsx
  │   ├─ ProductFilter.tsx        // Client component with 'use client' directive
  ├─ checkout/
  │   ├─ page.tsx                 // 'use client' directive if entirely client-side
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This folder organization facilitates using different composition patterns like partial hydration (splitting pages into server and client sections) or lifting state management into a client component where necessary.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data Fetching in Next.js
&lt;/h2&gt;

&lt;p&gt;The new recommended way of data-fetching strategy involves:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Using &lt;code&gt;fetch&lt;/code&gt; directly in server components&lt;/strong&gt;: Data-fetching operations are performed inside server components, making SSR straightforward.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Async functions for data retrieval&lt;/strong&gt;: Server components can use &lt;code&gt;async/await&lt;/code&gt; for data-fetching without extra configurations.
An example implementation:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// app/products/page.tsx
import React from 'react';

export default async function ProductsPage() {
  const res = await fetch('https://api.example.com/products');
  const products = await res.json();
  return (
      &amp;lt;div&amp;gt;
        &amp;lt;h1&amp;gt;Product List&amp;lt;/h1&amp;gt;
        &amp;lt;ul&amp;gt;
          {products.map((product) =&amp;gt; (
            &amp;lt;li key={product.id}&amp;gt;{product.name}&amp;lt;/li&amp;gt;
          ))}
        &amp;lt;/ul&amp;gt;
      &amp;lt;/div&amp;gt;
    );
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Composition Patterns for Enhanced Control
&lt;/h2&gt;

&lt;p&gt;According to Next.js’s documentation on composition patterns, different approaches can be taken to balance server-side rendering and client-side interactivity:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Partial Hydration&lt;/strong&gt;: Split a page into server and client components, keeping most content server-rendered for performance while allowing dynamic sections to be interactive.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Client Component Islands&lt;/strong&gt;: Place interactive islands (client components) within server-rendered content. This approach helps reduce the amount of JavaScript needed on the client side while still providing rich interactivity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Server-Rendered Shells&lt;/strong&gt;: Build the outer structure (shell) of your application with server components and populate it with client components for specific sections that need user interactivity.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These patterns ensure that client-side JavaScript usage is minimized, leading to better performance and user experiences.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Adopt This Mentality?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Improved Performance&lt;/strong&gt;: By defaulting to server components and the new data-fetching approach, your application will benefit from optimized SSR, resulting in faster page loads.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enhanced SEO&lt;/strong&gt;: Server-rendered pages provide search engines with fully populated HTML, making it easier to index content.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reduced Client Bundle Size&lt;/strong&gt;: Isolating client logic with 'use client' minimizes JavaScript sent to the browser.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simplified Development&lt;/strong&gt;: The new data-fetching approach integrates directly into server components, eliminating the need for helper functions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalability and Maintainability&lt;/strong&gt;: Using composition patterns makes it easy to scale features and manage rendering logic.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;The shift toward “server components first” in &lt;a href="https://nextjs.org/docs/app/building-your-application/rendering/composition-patterns" rel="noopener noreferrer"&gt;Next.js&lt;/a&gt; aligns perfectly with the composition patterns described in the Next.js documentation. This approach simplifies SSR while maximizing performance and SEO benefits. By adopting this mentality and following the composition strategies, teams can quickly build scalable, fast, and optimized Awesome applications.&lt;/p&gt;

&lt;p&gt;Happy coding 👌&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>typescript</category>
      <category>ssr</category>
    </item>
    <item>
      <title>Wallet » Where your credit lives | Redis Hackathon Submission August 2022</title>
      <dc:creator>Christopher Codes</dc:creator>
      <pubDate>Tue, 30 Aug 2022 05:41:00 +0000</pubDate>
      <link>https://forem.com/christoph_codes/wallet-where-your-credit-lives-redis-hackathon-submission-august-2022-46h4</link>
      <guid>https://forem.com/christoph_codes/wallet-where-your-credit-lives-redis-hackathon-submission-august-2022-46h4</guid>
      <description>&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%2Fen48ousfe1hiwx921fgs.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%2Fen48ousfe1hiwx921fgs.png" alt="Image description" width="800" height="386"&gt;&lt;/a&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.amazonaws.com%2Fuploads%2Farticles%2Fix19vfice8ldihv4vpdb.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%2Fix19vfice8ldihv4vpdb.png" alt="Image description" width="800" height="385"&gt;&lt;/a&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.amazonaws.com%2Fuploads%2Farticles%2F3npmyctdj5d74lsirtmd.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%2F3npmyctdj5d74lsirtmd.png" alt="Image description" width="800" height="387"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Overview of My Submission
&lt;/h3&gt;

&lt;p&gt;I have built a personal credit card wallet that consolidates all of your credit card data to view in one glance.&lt;/p&gt;

&lt;p&gt;The inspiration comes from dealing with multiple credit card companies and having to login to each one of them separately and also while trying to manage credit and calculate debt to income is always difficult because all of the data is not in one place.&lt;/p&gt;

&lt;p&gt;Live Here!&lt;br&gt;
&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;a href="https://wallet-82c94.web.app/" rel="noopener noreferrer"&gt;
      wallet-82c94.web.app
    &lt;/a&gt;
&lt;/div&gt;


&lt;h3&gt;
  
  
  Submission Category:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;MEAN/MERN Mavericks&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Language Used
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Node.js &amp;amp; React.js&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Link to Code
&lt;/h3&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/christoph-codes" rel="noopener noreferrer"&gt;
        christoph-codes
      &lt;/a&gt; / &lt;a href="https://github.com/christoph-codes/wallet" rel="noopener noreferrer"&gt;
        wallet
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A personal credit card wallet for the DEV Redis Hackathon. August 2022
    &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;wallet&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A personal credit card wallet for the DEV Redis Hackathon. August 2022&lt;/p&gt;
&lt;p&gt;&lt;a href="https://wallet-82c94.web.app/" rel="nofollow noopener noreferrer"&gt;Wallet&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://user-images.githubusercontent.com/54452490/187353403-ddbe65de-313b-4481-a770-6aed57183d7c.png"&gt;&lt;img width="1435" alt="Screen Shot 2022-08-29 at 10 03 21 PM" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F54452490%2F187353403-ddbe65de-313b-4481-a770-6aed57183d7c.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://user-images.githubusercontent.com/54452490/187353634-4441c3d9-a9b6-4e71-b8ff-f474a1cbc2c8.png"&gt;&lt;img width="1438" alt="Screen Shot 2022-08-29 at 10 05 34 PM" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F54452490%2F187353634-4441c3d9-a9b6-4e71-b8ff-f474a1cbc2c8.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://user-images.githubusercontent.com/54452490/187353446-54ac1e47-e801-4cfe-b4ea-67f314e60e6c.png"&gt;&lt;img width="1435" alt="Screen Shot 2022-08-29 at 8 44 45 PM" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F54452490%2F187353446-54ac1e47-e801-4cfe-b4ea-67f314e60e6c.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://user-images.githubusercontent.com/54452490/187353326-eb1ac1d7-559a-466c-a97a-fd604def2bdf.png"&gt;&lt;img width="1434" alt="Screen Shot 2022-08-29 at 8 45 30 PM" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F54452490%2F187353326-eb1ac1d7-559a-466c-a97a-fd604def2bdf.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://user-images.githubusercontent.com/54452490/187353331-2b7a6151-e74f-4ac9-9eb5-066e23d12c54.png"&gt;&lt;img width="1438" alt="Screen Shot 2022-08-29 at 8 45 41 PM" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F54452490%2F187353331-2b7a6151-e74f-4ac9-9eb5-066e23d12c54.png"&gt;&lt;/a&gt;&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;p&gt;You create an account with a username and password which writes to Firebases authentication server.&lt;/p&gt;
&lt;p&gt;The data returned from Firebase is then saved in the Redis database with some additional fields the app will later request.&lt;/p&gt;
&lt;p&gt;Once the initial account creation process is complete, you are taken to your dashboard where you will have the ability to add your credit cards.&lt;/p&gt;
&lt;p&gt;After a card is entered you can view its data and update at any point.&lt;/p&gt;
&lt;p&gt;You can filter credit card transaction data based on certain data points.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;How the data is stored:&lt;/h3&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Users&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;first name (chris)&lt;/li&gt;
&lt;li&gt;last name (jones)&lt;/li&gt;
&lt;li&gt;authentication id (unique, generated by firebase)&lt;/li&gt;
&lt;li&gt;email (&lt;a href="https://github.com/christoph-codes/walletmailto:john@doe.com" rel="noopener noreferrer"&gt;john@doe.com&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;cards (an array of card ids) ['s9djf93j2pii','jasodi923hdo']&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Cards&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;name (Cap1 Travel Purchases)&lt;/li&gt;
&lt;li&gt;issuer (visa)&lt;/li&gt;
&lt;li&gt;limit (1000)&lt;/li&gt;
&lt;li&gt;balance (500)&lt;/li&gt;
&lt;li&gt;expirationDate (0667 formatted to 06/67)&lt;/li&gt;
&lt;li&gt;…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/christoph-codes/wallet" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


</description>
      <category>redishackathon</category>
    </item>
    <item>
      <title>Reverse Recipe</title>
      <dc:creator>Christopher Codes</dc:creator>
      <pubDate>Thu, 13 Jan 2022 06:32:32 +0000</pubDate>
      <link>https://forem.com/christoph_codes/reverse-recipe-2m7h</link>
      <guid>https://forem.com/christoph_codes/reverse-recipe-2m7h</guid>
      <description>&lt;h3&gt;
  
  
  Overview of My Submission
&lt;/h3&gt;

&lt;p&gt;The purpose of our app is to search our MongoDB database for a list of recipe's based on a list of entered ingredients. We connected our Mongo Realm account with serverless functions and made GraphQL calls to retrieve the data from our database. We plan for a lot more to come and plan to continue working on it post Hackathon. Feel free to check it out!&lt;/p&gt;

&lt;h2&gt;
  
  
  Submission Category:
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Choose Your Own Adventure&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Link to Code
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/DebitTwo/reverseRecipe" rel="noopener noreferrer"&gt;Link to code&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Additional Resources / Info
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Home Page
&lt;/h3&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%2Ffcje7r1sim788xlhnz3k.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%2Ffcje7r1sim788xlhnz3k.png" alt="Home Page" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Recipe Results Page
&lt;/h3&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%2Fth4vezeu5eso1glqehhi.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%2Fth4vezeu5eso1glqehhi.png" alt="Recipe Results Page" width="800" height="1131"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Single Recipe Page
&lt;/h3&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%2Fbd15pxdwbzmvxgmra3d2.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%2Fbd15pxdwbzmvxgmra3d2.png" alt="Single Recipe Page" width="800" height="931"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Collaborators
&lt;/h2&gt;

&lt;p&gt;@tkcwebdev - Chris&lt;br&gt;
&lt;a href="https://github.com/christoph-codes" rel="noopener noreferrer"&gt;Github for Chris&lt;/a&gt; - Chris&lt;br&gt;
@cmolisee - Cody&lt;br&gt;
&lt;a href="https://github.com/cmolisee" rel="noopener noreferrer"&gt;Github for Cody&lt;/a&gt; - Cody&lt;/p&gt;

</description>
      <category>atlashackathon</category>
    </item>
  </channel>
</rss>
