<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Ankur Tyagi on Medium]]></title>
        <description><![CDATA[Stories by Ankur Tyagi on Medium]]></description>
        <link>https://medium.com/@theankurtyagi?source=rss-f80f00321ac------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*9Egj5T77crMrMCtcLHFVvA.jpeg</url>
            <title>Stories by Ankur Tyagi on Medium</title>
            <link>https://medium.com/@theankurtyagi?source=rss-f80f00321ac------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 14 Nov 2026 08:25:54 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@theankurtyagi/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[Trying Claude for E2E Testing on an Airbnb Clone]]></title>
            <link>https://javascript.plainenglish.io/trying-claude-for-e2e-testing-on-an-airbnb-clone-1480a7aff8eb?source=rss-f80f00321ac------2</link>
            <guid isPermaLink="false">https://medium.com/p/1480a7aff8eb</guid>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[software-engineering]]></category>
            <dc:creator><![CDATA[Ankur Tyagi]]></dc:creator>
            <pubDate>Thu, 25 Jun 2026 10:25:16 GMT</pubDate>
            <atom:updated>2026-06-25T10:27:01.416Z</atom:updated>
            <content:encoded><![CDATA[<blockquote><strong>TLDR:</strong> I built Bunkly, a test-friendly Airbnb clone, and ran Claude Code through every stage of E2E testing: test planning, spec generation, parallel runs, GitHub Actions, and updating tests after a UI redesign. Claude worked best as a contributor to my process, not a replacement for the decisions I still had to make. You can use its knowledge of Playwright APIs and common testing patterns, and it will scaffold setup and auth projects and fill out happy-path flows faster than writing them by hand. But it needs you to guide it: app routes, seed data, environment variables, and workflow boundaries are things Claude cannot infer on its own. It will produce specs that look complete but silently pass for the wrong reasons, especially when product changes shift behavior under the hood. Treat Claude as a way to accelerate a first draft, then review its output for correctness before you trust it in production.</blockquote><p>You hear all the time about teams struggling to create and maintain E2E tests that keep pace with the speed at which they’re shipping. They might initially invest time in creating an initial suite only to watch the suite turn flaky, slow, or get ignored when failures pile up [1].</p><p>I’ve heard people talk about using Claude Code for QA and wanted to see if Claude could help with the planning side of QA work: test planning, generating specs, running tests locally, setting up GitHub Actions, and updating tests when the UI changed.</p><p>As part of my test, I built a production-ready Airbnb-style hotel app called Bunkly, complete with search, checkout, loyalty, and messaging. I decided to start with a clean slate, an app with no Playwright tests yet.</p><p>I have attached the full Claude Code transcript [2] for you to read alongside the blog.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ZfkVzVMdw2C1Ywuo30vaVA.png" /></figure><p>The Bunkly codebase was designed to be deliberately test-friendly. Interactive elements carry `data-testid` attributes, seed data is deterministic (fixed slugs and known passwords in `CLAUDE.md`), and `ARCHITECTURE.md` explains how Server Components and server actions split responsibilities.</p><p>You’d think that would make things straightforward. Instead, I hit selectors that weren’t in the code, odd feature priorities (wishlists ranked above booking), and CI jobs that skipped hidden directories.</p><p>This post covers what happened at each step of trying Claude Code for QA testing, what worked, what broke, and what I still had to verify in the code, seed data, and CI logs.</p><h3>Set up Bunkly locally</h3><p>The first step was to get Bunkly running locally. I cloned the repository and seeded the database with the following commands:</p><pre>git clone https://github.com/rishi-raj-jain/bunkly<br>cd bunkly<br>npm install<br><br>cp .env.example .env   # set DATABASE_URL<br><br>npm run db:migrate     # or db:push in dev<br>npm run db:seed<br><br>npm run dev            # http://localhost:3000</pre><p>The seed step creates about ten to fifteen properties across five cities, rolls inventory forward for a year, and adds users with plaintext passwords for test automation. Without that seed data, flows like logging in as a user named Sarah, viewing upcoming bookings, or testing loyalty enrollment would have nothing to assert against.</p><p>To enable browser-aware changes in Claude Code, I also set up the <a href="https://playwright.dev/docs/getting-started-mcp#claude-code">Playwright MCP</a> so threads could refer to real navigation and DOM behavior along with file changes.</p><h3>Claude for QA Test Planning</h3><p>Before automating the tests via code, I asked Claude for a test plan keyed to Bunkly’s main workflows, e.g., discover properties, complete a booking end-to-end, manage profile and payment methods, notifications, message threads, loyalty (where seed allows), and secondary flows like wishlists and price alerts. Here is the prompt I used:</p><pre>Produce a prioritized E2E test matrix in docs/cc-test-plan.md with P0/P1/P2 cases.</pre><p>Claude’s first attempt at a test plan was thorough on the surface. It covered the major features and some lesser-used ones, such as price alerts, wishlists, reviews after check-out, and flows for editing bookings. The plan was laid out as a large table with P0, P1, and P2 priorities and tried to balance common paths with edge cases.</p><p>Taking stock of the app’s features was genuinely helpful. It forced me to consider corners of the product I might have skipped otherwise.</p><p>Here are a few prompts I sent after the initial test plan was generated (<a href="https://github.com/rishi-raj-jain/bunklyv2-progress/blob/51f28986adf7f25930c15e599b64886d329acd79/2026-05-25-185708-produce-a-prioritized-e2e-test-matrix-in-docscc.txt#L5-L533C3">source</a>):</p><pre>can you move the tests from P2 to PQ that makes sense, we are a booking company so we need the ability to make sure that search is the top priority</pre><pre>but how is wishlist a P1?</pre><pre>why adding payment method is P1?</pre><pre>why did you move payment method to P2? It was in P1 and it should be a P0 instead since we need to be able to process money!</pre><pre>why in the world is forgot password a P2?</pre><p>Several important gaps around using Claude for QA became clear when I reviewed the test plan:</p><ul><li>The priorities in the plan (e.g., high/medium) didn’t always match practical risk-cosmetic toggles, which were marked higher than critical for end-to-end booking flows.</li><li>Some scenarios described in the plan didn’t align with what’s possible in the current codebase. For example:<br>- The plan included saving wishlists, but the UI and seed data didn’t allow wishlist actions for any seeded user, so these tests were not feasible.<br>- Review tests referenced features without establishing the necessary preconditions. Review flows require users with prior completed bookings. Without seeded bookings for the user, these tests could never run as intended.<br>- Messaging tests assumed the existence of seeded conversations linked to a user. Without a specific database setup for these conversations, messaging tests could not execute successfully.</li></ul><p>There was a disconnect between feature coverage on paper and what could be executed, as the plan didn’t specify the test prerequisites or acknowledge app limitations. Overall, these mismatches highlighted the need to bridge the gap between the features listed in the plan and the test scenarios that can actually be run manually.</p><p>For this kind of app, making every test scenario actually useful means spelling out things like the specific user account (with credentials pulled from CLAUDE.md), how to navigate to the right page, which selectors to use (and making sure they match real data-testids from the codebase), what should change in the database if the test performs a mutation, and how to reset everything between runs to keep things clean and reproducible.</p><p>Claude was great at firing off a wide-ranging list so I didn’t forget anything major, but it couldn’t translate that list into something directly actionable, something I could truly trust day-to-day, or something I could hand to someone to use for proper QA.</p><h3>Claude for E2E Test Generation</h3><p>Once the test plan was refined (and I had it create the final one in `cc-test-plan-after.md`), I asked Claude to generate Playwright tests accordingly, with the following prompt:</p><pre>now read the cc-test-plan-after.md file and then write the tests using playwright (feel free to use the playwright mcp if required)</pre><p>Once the initial tests were scaffolded, I followed up with operational instructions (wonder why Claude hadn’t done that):</p><pre>add the instructions to run the tests in README.md</pre><p>And to ensure the automated runner would actually hit the production build, I needed to specify (since Claude didn’t pick that up automatically):</p><pre>to run the web server, use npm run start and not npm run dev</pre><p>The output included a standard Playwright structure: a playwright.config.ts file (with the webServer command), global setup scripts, a set of initial spec files in the tests/e2e/ directory, and some helpers for navigation and repeated interactions. While I hadn’t used Playwright’s multiple project configuration model before, the generated split between a general setup project and an authenticated-user project matched what I would have done.</p><p>Next, I ran npx playwright test and encountered a set of initial failures, including:</p><ul><li>Incorrect selectors and URLs in the tests</li><li>Assertions that did not match the actual DOM structure</li><li>Incorrect step order and issues related to async UI updates</li><li>Test navigation/routes and business logic that were not aligned with the codebase</li><li>Use of test.skip() in place of a proper seed-backed test setup</li><li>Tests missing authentication contexts</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*D2xj_rYcXGrapgKRfpKgqg.png" /></figure><p>To better understand the causes of these failures, I examined each issue in detail. Below, I break down what went wrong in each area.</p><h3>Issue 1: Tests didn’t use the right selectors and URLs</h3><p>Although CLAUDE.md carefully documents the expected data-testid attributes for interactive UI elements, the generated Playwright specs referenced the test IDs and selector names that simply do not exist in the codebase.</p><ul><li>For example, the specifications for profile updates assumed the presence of a profile-form wrapper, however, upon inspecting the relevant React components, it became clear that no such element is defined with that identifier. To fix this, I referenced the source code directly.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*jrhCIeVFBiKO7yNV_4D8ew.png" /></figure><p>Another source of test failure was the mismatch in the query parameters used:</p><ul><li>For example, the application expected a destination query parameter on the results page. However, both the generated specs and a reusable helper function used the parameter name location instead. This single issue affected multiple specs because it was present in shared navigation code, resulting in every search-related test failing.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*X-YACVmx6IQy4_RBTpjX7g.png" /></figure><p>These adjustments definitely made me aware that anyone using Claude Code for QA testing needed to be someone who understood how the application source and test code behaved, so they could correct them rather than rely on Claude’s assumptions, especially as both code and tests change over time.</p><h3>Issue 2: Tests didn’t make assertions based on the actual UI</h3><p>For example, the payment method specs asserted that the first four digits of a card should be displayed after adding it. However, the wallet UI is designed to display only the last 4 digits to comply with PCI best practices. As a result, the test assertion failed every time.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*hgPxEPt0CgBbL6pSJs8lXQ.png" /></figure><p>I noticed similar issues when tests made assertions about UI text or record counts that didn’t match the seeded data (for example, expecting a certain number of notifications even though no notification rows were populated during setup).</p><p>These mismatches suggested the tests were partly based on assumptions about the intended UI rather than on the actual state and structure of the codebase Claude was working on. The need to check output for this adds extra time and risk if using Claude Code for E2E testing.</p><h3>Issue 3: Tests didn’t handle async UI timing or state</h3><p>One flow expected a service-section to be visible before the user opened the service request entry point. The app renders that section after the click.</p><p>Another spec toggled a notification category and immediately called page.reload(), overlapping React useTransition on that settings page. The runner reported timeouts and stale state that looked like flakes until I reordered steps and waited on the right locators.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*gnTGJZsiajZ5Uyv6lpxMVA.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*yiy2rnLyX8CDcbzbzO7I-A.png" /></figure><p>I told Claude to always use expect(locator).toBeVisible() (not assumptions), reference real data-testids from components, check server actions for business rules, and use networkidle only when truly needed. After tightening waits and removing a reload, failures dropped from 8 to 3, showing which were timing vs. logic issues.</p><p>However, investigating and fixing these issues took time and reduced the time savings I was hoping to realize from using Claude Code for QA.</p><h3>Issue 4: Tests didn’t check real routes or logic</h3><p>For example, some test specs made assumptions about app routes or business logic without checking the implementation:</p><ul><li>Price alert tests tried to visit /alerts, assuming a standalone alerts page existed, but in reality, price alert functionality lives within each property (properties/[slug]/) and in the account’s price alert settings (not a top-level route).</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*zjnlXvW3-5bNgPR5_kKO1A.png" /></figure><ul><li>One of the messages spec navigated to /messages/ (with a trailing slash) and tried to confirm the presence of that URL even though the app is navigated at /messages (no trailing slash).</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*M8Rck1exDZ-bglQDrE2HTQ.png" /></figure><ul><li>Review-related specs attempted to review upcoming bookings, when in fact (as enforced by both reviews.ts and seeded data) only completed stays are eligible for reviews.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*HJGOxzFkzz1lZAkc7ckWGw.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*QFasJ1d9cfq0ib4XYEf0RA.png" /></figure><h3>Issue 5: Tests didn’t set up required state</h3><p>When flows needed two payment methods on file, or a non-default card to delete or to switch default, the agent sometimes emitted test.skip() with a comment that setup was hard. Skipped tests do not exercise the feature and still count toward green in CI.</p><p>I asked for explicit navigation to payment settings, seed-backed users, or a beforeEach that creates the second method through the same UI path a user would take.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*szG_gJYchEUopuTEVHfaMg.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*7Snx-e8n1SmbOHj7sY_eqQ.png" /></figure><h3>Issue 6: Tests didn’t handle authentication properly</h3><p>Initially, several tests attempted to access protected routes without logging in, resulting in redirect and timeout errors. Playwright’s dependencies config (like dependencies: [‘setup’]) wasn’t used by default, so not all tests reused the established session until I pointed it out.</p><h3>Claude for QA: Parallel test runs and the impact of shared database state locally</h3><p>After debugging specs in isolation, I enabled fuller parallel execution (fullyParallel and multiple workers). Loyalty point assertions and review submission collided when workers logged in as the same seeded user and mutated the same rows.</p><p>I pasted worker logs and stack traces into Claude. It suggested grouping the unstable suites with test.describe.configure({ mode: ‘serial’ }) so those no longer run concurrently. I had not used that API on this project before and it was the right tool for the symptoms.</p><p>Cases that failed only under parallel load included loyalty balance checks after redemption-style flows and review submission that changes booking or review rows. Serial mode stabilized them locally and I kept a mental list of which domains are read-only versus write-heavy for future sharding when I deploy the tests to CI.</p><h3>Claude for QA: Managing environment variables, jobs, artifacts, and dotfiles in GitHub Actions</h3><p>The next step after confirming that everything worked fine locally was for me to move the suite to GitHub Actions (CI).</p><p>My Claude Code QA agent’s produced workflow was recognizable i.e. checkout, install dependencies, run seed, shard tests, upload reports. I added DATABASE_URL to the repository secret so that it was accessible. It didn’t go smoothly:</p><ul><li>The first failure was environmental i.e. the seed script read DATABASE_URL from .env locally and required me to prompt the agent to wire it down via the repository secrets in the workflow code.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*vR1bFSB4dYhLNSWPh_Z-IQ.png" /></figure><ul><li>Authenticated specs depended on files under tests/.auth/ produced during a setup job. The setup job logged in and wrote storageState to disk. Consumer jobs restored node_modules from cache but <strong>not the auth directory</strong>. Auth specs then failed or passed depending on whether they accidentally performed login again in the spec body.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*7eNSLsi9J2Xdip6sH1Xy6w.png" /></figure><ul><li>I still had a gap after auth-related tests improved. The setup job had run in the logs, but tests/.auth/ did not appear in the uploaded artifact bundle. The agent’s first explanation was <strong>that seed had not run but I knew that seed had run</strong>. So, I pointed at an artifact upload configuration and dot directories. GitHub’s default upload patterns often omit paths like .auth unless you include them explicitly in actions/upload-artifact.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*qKcY9wphypv2x8SguLQc8Q.png" /></figure><ul><li>After adding the dotfile paths (or an explicit path to tests/.auth/**), later jobs downloaded the auth bundle and the workflow passed end to end.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*RTSEfblQ2WDK8a4Rxh2Ekw.png" /></figure><h3>Claude for QA: Updating tests when the product changes</h3><p>After a stable CI run, I asked Claude to update with two UX changes in the application:</p><ul><li>To merge the stay and guest details into one step in the checkouts, and leave payment as the clearer second step.</li><li>Drop the tabbed “upcoming / past” navigation in the bookings view for a single list with filters.</li></ul><p>And as a result:</p><ul><li>Checkout edits by Claude mostly matched the new step order. The agent rewrote navigation through the combined step and adjusted payment-step assertions. It also tightened waits on a spec that had been green under loose timing (a race that showed up when step boundaries changed!).</li><li>Bookings tests became harder to pass after the Claude edits as <strong>one spec silently passed</strong>. I knew it shouldn’t have happened since I removed the tab clicks, but I found that the tests were written so they searched for a specific property name that appeared regardless of the filter state. The assertion did not prove that the “past” filter changed the list (<strong>a false negative</strong>, CI green without guarding the behavior we changed).</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*JmZXuV1F50wNAspokTMLtg.png" /></figure><p>I asked Claude to see what’s going on:</p><pre>can you read the code and then tell me if clicking past-tab changes the booking-card- list? or does it just takes me to the same page but to the past bookings below the upcoming views instead of it being tabbed</pre><p>and it finally came to senses with the following proposal:</p><pre>The fix is to scope the locator to the past section:<br><br>const cards = page.locator(&#39;[data-testid=&quot;bookings-section-past&quot;]<br>[data-testid”=&quot;booking-card-&quot;]&quot;&#39;);<br><br>That way the loop only iterates over cards inside #bookings-section-past,<br>regardless of scroll position. Want me to apply that fix?</pre><p>After that, I simply asked it to read through the failed test results that were automatically reported in a standalone directory by Playwright:</p><pre>can you read the test-results folder and then fix the tests?</pre><p>From <a href="https://github.com/rishi-raj-jain/bunklyv2-progress/blob/main/2026-05-26-185638-this-session-is-being-continued-from-a-previous-c.txt#L1170-L1440">the logs</a>, I saw that it fixed the add-on scenarios (like breakfast on pending versus confirmed bookings) with the new list-and-filter UI model and also clarified which seed user owned which booking states. For handling booking checks, it added serial grouping to ensure parallel workers were not writing to the same booking (or add-on records).</p><h3>Advice for developers thinking about using Claude for QA testing</h3><p>Overall, after having Claude update the code and write tests for the new feature, I saw that simple selector renames get handled quickly if I point the agent directly at the changes, but bigger workflow changes need new assertions that will actually fail if the old UX is still present. For example, things like asserting on filter state in the DOM, row counts, or booking ids that only appear under the right filter, rather than just checking if some property name appears anywhere on the page need new assertions.</p><p>After a redesign, I had to clearly define for the agent what “correct” means, rather than assuming it could infer it from the component diffs alone.</p><p>While Claude can be helpful for setting up E2E testing, it works best as a contributor to your process rather than an all knowing test author.</p><p>You can leverage its knowledge of Playwright APIs and common testing patterns, and it can help with initial scaffolding and fill out happy-path test flows, however, that’s all it does. If you have more complicated use flows, it will likely be very time consuming for you to use Claude for QA testing and it could miss testing critical things.</p><p>There’s also considerable manual work required in using Claude for QA. You need to guide it on your specific app’s routes, seed data nuances, environment setup, and workflow boundaries to be fully effective. While it can sort out issues like parallelization and CI artifact handling, you still need to review its output for context-specific correctness, as it may produce false positives or fragile test logic if left unchecked.</p><p>Blindly trusting Claude E2E test results or assuming your Claude Code QA agent fully understands new workflows might cause issues to slip through, especially when product changes affect how things work under the hood. Ultimately, Claude might be able to help you get started creating an end-to-end coverage plan but it’s not purpose-built for generating QA tests and so often misses things or creates flaky tests.</p><p>[1]: <a href="https://medium.com/codetodeploy/our-e2e-tests-were-flaky-we-deleted-half-of-them-8393bb419322">https://medium.com/codetodeploy/our-e2e-tests-were-flaky-we-deleted-half-of-them-8393bb419322</a></p><p>[2]: <a href="https://github.com/rishi-raj-jain/bunkly/blob/main/2026-05-26-185638-this-session-is-being-continued-from-a-previous-c.txt">https://github.com/rishi-raj-jain/bunkly/blob/main/2026-05-26-185638-this-session-is-being-continued-from-a-previous-c.txt</a></p><p>(Co-authored with <a href="https://medium.com/u/cf48f7f14d64">Rishi Raj Jain</a>)</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=1480a7aff8eb" width="1" height="1" alt=""><hr><p><a href="https://javascript.plainenglish.io/trying-claude-for-e2e-testing-on-an-airbnb-clone-1480a7aff8eb">Trying Claude for E2E Testing on an Airbnb Clone</a> was originally published in <a href="https://javascript.plainenglish.io/">JavaScript in Plain English</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Getting Started with React Hooks- A Step-by-Step Guide for Beginners]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://blog.stackademic.com/getting-started-with-react-hooks-a-step-by-step-guide-for-beginners-5eb0fd1d782c?source=rss-f80f00321ac------2"><img src="https://cdn-images-1.medium.com/max/1590/1*dC314cc_07wZxIkgZsdXLQ.png" width="1590"></a></p><p class="medium-feed-snippet">React Hooks opens a new world in the React ecosystem. However, it can be quite confusing for beginners working with React for the first&#x2026;</p><p class="medium-feed-link"><a href="https://blog.stackademic.com/getting-started-with-react-hooks-a-step-by-step-guide-for-beginners-5eb0fd1d782c?source=rss-f80f00321ac------2">Continue reading on Stackademic »</a></p></div>]]></description>
            <link>https://blog.stackademic.com/getting-started-with-react-hooks-a-step-by-step-guide-for-beginners-5eb0fd1d782c?source=rss-f80f00321ac------2</link>
            <guid isPermaLink="false">https://medium.com/p/5eb0fd1d782c</guid>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[react]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[react-hook]]></category>
            <dc:creator><![CDATA[Ankur Tyagi]]></dc:creator>
            <pubDate>Wed, 20 Dec 2023 08:41:57 GMT</pubDate>
            <atom:updated>2023-12-28T01:35:46.604Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[OneEntry: The Next-Gen Headless CMS]]></title>
            <link>https://blog.venturemagazine.net/oneentry-the-next-gen-headless-cms-fbdf6123db1c?source=rss-f80f00321ac------2</link>
            <guid isPermaLink="false">https://medium.com/p/fbdf6123db1c</guid>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[cms]]></category>
            <category><![CDATA[startup]]></category>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[web-development]]></category>
            <dc:creator><![CDATA[Ankur Tyagi]]></dc:creator>
            <pubDate>Mon, 18 Dec 2023 20:33:02 GMT</pubDate>
            <atom:updated>2023-12-27T05:10:44.723Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="OneEntry a Headless CMS" src="https://cdn-images-1.medium.com/max/1024/0*9lHyOcWzqzZMyj9S.png" /></figure><p>Headless Content Management Systems ( <a href="https://en.wikipedia.org/wiki/Headless_content_management_system">Headless CMS</a>) are pre-built backend that allows for the creation, storage, and management of digital content and assets. Unlike traditional CMSs, a headless CMS is decoupled by default, that is the content repository (otherwise called backend) is separated from the presentation layer (frontend) making it easier to deliver content across multiple presentation layers via APIs and SDKs.</p><p>Using a Headless CMS means that you can efficiently manage content from a centralized repository, move from idea to production faster, and adapt to changing technologies.</p><p>Many headless CMS providers exist. However, with some of these headless CMS providers, developers often encounter challenges such as integration complexity, limited customization, vendor lock-ins, restricted data control, rigidity, and feature gaps. These challenges have led developers, product owners, marketing specialists, and content creators in search of a flexible, extensible, and scalable headless CMS solution.</p><blockquote><a href="https://oneentry.cloud/"><strong>OneEntry</strong></a><strong> Headless CMS is a ready-made, flexible, user-friendly, and scalable backend that allows you to manage all your websites and applications from a centralized dashboard. With OneEntry, you can deliver content at scale to multiple platforms like websites, mobile applications, electronic devices, IoTs, etc.</strong></blockquote><p>This article will review the potential of OneEntry and how it can help you unlock unlimited scaling for your applications.</p><h3>What is OneEntry?</h3><p><a href="https://oneentry.cloud/">OneEntry</a> is a flexible headless CMS for content development, creation, and management from a singular platform.</p><p>It helps content-heavy applications like e-commerce and less content-heavy applications like business websites to scale, manage, and serve content seamlessly. It also reduces the financial costs and time consumption of building backend solutions for your applications from the ground up.</p><figure><img alt="oneentry headless cms" src="https://cdn-images-1.medium.com/max/1024/0*NcuabPv4pUFmsKWw.png" /></figure><p>OneEntry’s simplicity, flexibility, and extensibility are some of the reasons it is a game changer for headless CMS.</p><p>It uses a modular architecture — that is, its system is divided into small independent parts called modules making it easily maintainable, reusable, and scalable.</p><p><strong>The following are some of the currently available modules:</strong></p><ul><li><strong>Content management</strong>: The content management module is the system core of OneEntry. You can create catalogs, text, and pages, and add forms, blocks, and other elements to pages with this module.</li><li><strong>Attributes</strong>: Add attribute sets for pages, goods, news, blocks, etc. The input and value variations can be configured by default.</li><li><strong>Forms</strong>: Set up forms and forms interactions such as save to the base, send via email, and send to script with this module. Configure validation and placeholders.</li><li><strong>Blocks</strong>: The Blocks module holds the page elements showing the content.</li><li><strong>Administrators</strong>: Assign administrative privileges with various access permissions.</li><li><strong>Catalog</strong>: The Catalog module allows you to import goods, create new goods, and merge and configure them.</li><li><strong>Menu</strong>: The Menu module lets you create and configure the menu.</li></ul><p>The OneEntry system allows you to manage and structure content in multiple languages, allowing for language-specific adaptations. It also offers a seamless experience for all users, from developers to content creators and marketing specialists. The system was built to scale by default and seamlessly handle projects of any difficulty level.</p><h3>Why OneEntry Trumps Other Headless CMS</h3><p>The following are some of the benefits of using OneEntry and why it trumps other Headless Content Management Systems.</p><ul><li><strong>Flexibility and Scalability</strong>: The OneEntry system is geared to be flexible and scalable by default, serving content across multiple channels efficiently. Its scalability makes it suitable for distributing content for content-heavy applications. The system can scale horizontally to handle rapidly growing businesses and varying traffic enabling practically unlimited scaling. It is also presentation-layer agnostic — meaning that you can use whatever tool you want to build the front end.</li><li><strong>Omnichannel content delivery</strong>: OneEntry allows you to deliver content across multiple channels from a central repository, supporting personalization options across channels. You can easily reuse content across different channels.</li><li><strong>User-friendliness</strong>: OneEntry is arguably the most user-friendly headless CMS when compared to others. It has an intuitive interface that allows users to understand how to navigate and use its features.</li><li><strong>Multi-language support</strong>: Effortlessly internationalize and increase accessibility for your product with OneEntry’s multi-language support. Serving content in various languages gives your product a global reach. Displaying content in your user’s native language helps convey messages accurately, gives you a competitive advantage in the market, and enhances the user experience for your product.</li><li><strong>Ease of integration</strong>: OneEntry’s API and SDK expose a standard interface for interacting with the modules. You can interact with every available OneEntry module from your frontend via the REST API. OneEntry can also integrate seamlessly with third-party tools and services such as card providers, payment infrastructure, delivery services, etc.</li><li><strong>Extensibility:</strong> OneEntry is extensible so it allows you to bring in your module or use third-party modules without conflict. Integrate your modules using technologies like Node.js, Python, Ruby, Java, or whatever technology you decide.</li><li><strong>Improved developer experience</strong>: The OneEntry system is specifically designed for developers, content managers, and marketing experts, making it faster and easier to build complex applications, create &amp; manage content, and spin up marketing campaigns.</li><li><strong>Customization</strong>: OneEntry is a customizable system for any needs. You can customize it to meet your project needs.</li><li><strong>Data portability</strong>: Easily export your product data as YML or CSV files. Your product data belongs to you and you can move them whenever you want — no vendor lock-in.</li><li><strong>Content structuring:</strong> OneEntry’s content modeling capabilities allow you to define complex content structures and relationships.</li><li><strong>Cost-effectiveness</strong>: OneEntry reduces development costs by eliminating the need for building a custom backend from the ground up. Plus, OneEntry has affordable plans to get you started.</li></ul><h3>OneEntry’s Features and Architecture</h3><p>The following are breakdown of OneEntry’s features and architecture that makes it stand out among other headless CMS.</p><ul><li><strong>Modularization</strong>: OneEntry uses a modular architecture. Services are decoupled and operate as small independent units making the system maintainable and reliable. The architecture is extensible, allowing you to integrate third-party modules.</li><li><strong>Cloud storage:</strong> The OneEntry storage system rests on powerful and modern cloud servers making it highly performant, with daily backups to ensure the preservation of content.</li><li><strong>Security</strong>: Security is at the core of OneEntry. It goes through routine maintenance and updates to keep it optimized. OneEntry issues a let’s encrypt certificate (mTLS) to help keep your application secure.</li><li><strong>Media asset management</strong>: OneEntry effectively manages multimedia content. The system is designed to efficiently organize, store, and retrieve large media files.</li><li><strong>Automatic image optimization</strong>: You can diversify your content with OneEntry’s automatically optimized images.</li><li><strong>Powerful servers</strong>: OneEntry servers are powerful and capable of handling large traffic. The load-balancing algorithm helps to route load across servers, preventing excessive load on a single server. The servers are increased regularly to further allow for load-balancing.</li><li><strong>Fast SSDs</strong>: OneEntry’s SSDs are fast. This makes fetching content from the content repository fast. The SSDs make file upload &amp; download, and content delivery fast.</li><li><strong>PostgreSQL, MySQL, and MongoDB databases</strong>: Under the hood, OneEntry uses both relational and non-relational databases to store and manage content.</li><li><strong>API driven</strong>: REST API access to all modules. The API is fast and well-documented to ensure easy integration.</li></ul><p><a href="https://oneentry.cloud/areas.html">OneEntry</a> allows you to manage, store, retrieve, and digital content across multiple channels without the hurdles found in other headless CMS.</p><p>The system incorporates all necessary tools used by developers, content managers, and marketing specialists for the successful operation of any business project.</p><p>It is flexible, user-friendly, and extensible allowing you to deliver content at scale.</p><figure><img alt="OneEntry- Headless CMS" src="https://cdn-images-1.medium.com/max/1024/0*W9VbTcolhF3TEx3I.png" /></figure><blockquote><em>You can build projects of any scale on it without worrying about performance or scale — its servers are optimized to handle high-volume traffic seamlessly.</em></blockquote><blockquote><em>The built-in multi-language support gives your product a global reach and an enhanced user experience.</em></blockquote><p>Create a <a href="https://account.oneentry.cloud/authentication/register"><strong>free account</strong></a> on OneEntry and experience for yourself the possibility of a truly flexible and scalable headless CMS.</p><p>That was the end of this blog. Today, I hope you learned something new.</p><p>If you did, please like/share it so that others can see it as well.</p><blockquote><strong><em>Thank you for being a regular reader; you’re a big part of why I’ve been able to share my life/career experiences with you.</em></strong></blockquote><p>Follow me on <a href="https://twitter.com/theankurtyagi">Twitter</a> to get more software engineering articles.</p><h3>Want to read more interesting articles</h3><p>✅ my most popular articles that you might be interested in</p><ul><li><a href="https://theankurtyagi.com/why-you-should-learn-reactjs/"><strong>Why Learn React</strong></a></li><li><a href="https://theankurtyagi.com/the-complete-react-handbook-the-good-parts-of-react/"><strong>Good Parts of React</strong></a></li><li><a href="https://theankurtyagi.com/a-simple-and-effective-way-to-learn-practice-javascript/"><strong>Practice JavaScript.</strong></a></li><li><a href="https://theankurtyagi.com/why-react-and-how-to-learn-reactjs-in-2024/"><strong>How to Learn ReactJS</strong></a></li><li><a href="https://theankurtyagi.com/modern-javascript/"><strong>Modern JavaScript</strong></a></li><li><a href="https://theankurtyagi.com/how-to-start-a-react-project-in-2024/"><strong>How to Create a Project with Vite</strong></a></li><li><a href="https://theankurtyagi.com/react-state-management-a-complete-in-depth-look-at-hooks-context-api-and-redux/"><strong>React State Management</strong></a></li></ul><p><em>Originally published at </em><a href="https://theankurtyagi.com/oneentry-headless-cms/"><em>https://theankurtyagi.com</em></a><em> on December 18, 2023.</em></p><h3>Bonus: How to Create high-value content that converts</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/700/0*8YBLwz6KbUpuAdyv.png" /></figure><p>Founded by the team behind <a href="https://plainenglish.io/?utm=venture"><strong>In Plain English</strong></a>,<strong> </strong><a href="https://circuit.ooo/?utm=venture"><strong>Circuit</strong></a><strong> </strong>is a strategic growth company for developer-focused software startups. We help companies produce a higher ROI on their content marketing efforts.</p><p>If you want to <strong>build a better content strategy, scale content operations, increase product awareness and adoption, </strong>and <strong>grow a community, </strong>we help brands make this happen.</p><p><strong>→ </strong><a href="https://circuit.ooo/blog/2023-content-marketing-checklist?utm=venture_blog_post_link"><strong>Content Marketing Checklist</strong></a></p><p><strong>→ </strong><a href="https://circuit.ooo/blog/how-to-create-better-content-for-developers?utm=venture_blog_post_link"><strong>How to Create Better Content for Developers</strong></a></p><p><strong>→ </strong><a href="https://circuit.ooo/blog/the-key-ingredient-behind-high-newsletter-open-rates?utm=venture_blog_post_link"><strong>The Key Ingredient Behind High Newsletter Open Rates</strong></a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=fbdf6123db1c" width="1" height="1" alt=""><hr><p><a href="https://blog.venturemagazine.net/oneentry-the-next-gen-headless-cms-fbdf6123db1c">OneEntry: The Next-Gen Headless CMS</a> was originally published in <a href="https://blog.venturemagazine.net/">Venture</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Mastering Forms in React: A Guide to Usage and Validation]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://blog.stackademic.com/mastering-forms-in-react-a-guide-to-usage-and-validation-d070c3758b10?source=rss-f80f00321ac------2"><img src="https://cdn-images-1.medium.com/max/2240/1*FzpCHRqnZMJXNUz5Siyk9Q.png" width="2240"></a></p><p class="medium-feed-snippet">A form is an integral component of every website.</p><p class="medium-feed-link"><a href="https://blog.stackademic.com/mastering-forms-in-react-a-guide-to-usage-and-validation-d070c3758b10?source=rss-f80f00321ac------2">Continue reading on Stackademic »</a></p></div>]]></description>
            <link>https://blog.stackademic.com/mastering-forms-in-react-a-guide-to-usage-and-validation-d070c3758b10?source=rss-f80f00321ac------2</link>
            <guid isPermaLink="false">https://medium.com/p/d070c3758b10</guid>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[reactjs]]></category>
            <category><![CDATA[react]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[front-end-development]]></category>
            <dc:creator><![CDATA[Ankur Tyagi]]></dc:creator>
            <pubDate>Sun, 10 Dec 2023 21:12:08 GMT</pubDate>
            <atom:updated>2024-01-02T07:22:35.372Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Mastering React State Management: Exploring Hooks, Context API, and Redux in Detail]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://blog.stackademic.com/mastering-react-state-management-exploring-hooks-context-api-and-redux-in-detail-59dd2579fdcf?source=rss-f80f00321ac------2"><img src="https://cdn-images-1.medium.com/max/2240/1*TgPIDUT2uWAbr49e12GiLg.png" width="2240"></a></p><p class="medium-feed-snippet">As a React developer, understanding how to manage states effectively is key to building fully functional applications. How you handle data&#x2026;</p><p class="medium-feed-link"><a href="https://blog.stackademic.com/mastering-react-state-management-exploring-hooks-context-api-and-redux-in-detail-59dd2579fdcf?source=rss-f80f00321ac------2">Continue reading on Stackademic »</a></p></div>]]></description>
            <link>https://blog.stackademic.com/mastering-react-state-management-exploring-hooks-context-api-and-redux-in-detail-59dd2579fdcf?source=rss-f80f00321ac------2</link>
            <guid isPermaLink="false">https://medium.com/p/59dd2579fdcf</guid>
            <category><![CDATA[react-state-management]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[react]]></category>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[front-end-development]]></category>
            <dc:creator><![CDATA[Ankur Tyagi]]></dc:creator>
            <pubDate>Fri, 10 Nov 2023 09:18:00 GMT</pubDate>
            <atom:updated>2023-12-21T01:15:55.481Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[How Technical Writing Can Supercharge Your Startup]]></title>
            <link>https://medium.com/swlh/how-technical-writing-can-supercharge-your-startup-2336835581a6?source=rss-f80f00321ac------2</link>
            <guid isPermaLink="false">https://medium.com/p/2336835581a6</guid>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[startup]]></category>
            <category><![CDATA[technical-writing]]></category>
            <category><![CDATA[developer-tools]]></category>
            <category><![CDATA[documentation]]></category>
            <dc:creator><![CDATA[Ankur Tyagi]]></dc:creator>
            <pubDate>Fri, 20 Oct 2023 20:21:04 GMT</pubDate>
            <atom:updated>2023-11-02T01:49:57.498Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*5XTTK9xyve-fr2yA.png" /></figure><blockquote><em>Welcome to the first blog post in our new series, “</em><a href="https://theankurtyagi.com/how-technical-writing-can-supercharge-your-startup/"><strong>How Technical Writing Can Supercharge Your Startup</strong><em>.</em></a><em>”</em></blockquote><blockquote><em>In this series, I’ll show you how technical writing can benefit startups, from gaining visibility to building trust with your audience. As a provider of </em><a href="https://theankurtyagi.com/blogging-service/"><em>writing services</em></a><em> to startups, I’ve seen the positive impact well-crafted content can have.</em></blockquote><p>Today, I’ll start with an overview of how technical writing can boost your startup’s growth. Stay tuned for more posts on why writing is a vital tool for startups!</p><h3>Introduction</h3><p>Technical writing plays an important role in the success of a startup. It involves creating clear, concise, and user-focused documentation that explains how a product or service works. “ <em>Strong views, weakly held.</em> “ Put yourself out there, but stay on the hunt for dissenting opinions from smart and respectful people.</p><p><strong><em>Writing software is halfway between writing a novel and building a bridge.</em></strong></p><blockquote><strong>Technical writing tolerates and even encourages stylistic idiosyncrasies that traditional publishing would not accommodate. Lean into them.</strong></blockquote><blockquote><strong>Technical content is either timely or timeless, with almost nothing in between.</strong></blockquote><figure><img alt="2023devrelreport" src="https://cdn-images-1.medium.com/max/1024/0*0p8dXYY9DnEfmniU.png" /><figcaption>2023devrelreport</figcaption></figure><blockquote><strong>Image credit- “State of Developer Relations”- you can access the full</strong><em> </em><a href="https://www.stateofdeveloperrelations.com/2023devrelreport"><strong>report</strong></a><em> </em><strong>here.</strong></blockquote><p>The person who writes down the plan in an organization/startup has tremendous power. If you want to find the up-and-comers at a tech company, look into who’s writing the plan. Though they may not be coming up with all the ideas, you’ll know they have the energy, motivation, and skills to organize and communicate ideas in a written form.</p><p>Surround yourself and your startup with “<strong><em>lateral thinkers</em></strong>” who can’t help but come up with variant perspectives on everything they see in your product or service. They won’t always be right, but they always challenge your thinking and writing.</p><p>Investing in technical writing can have a substantial impact on your startup’s success. It not only benefits your users but also contributes to the efficiency and effectiveness of your internal operations. Remember that the goal is to produce documentation that is clear, concise, and understandable to your intended audience. As a result, user satisfaction, loyalty, and business growth will increase.</p><p>Remember- Media formats are cyclical. Nietzsche wrote in aphorisms and Twitter is aphorisms-as-a-service. Hip-hop brought back poetry. Montaigne pioneered the essay format and blogs brought them back into vogue.</p><blockquote><strong>Startups should write more manifestos, blogs, clean docs, and integration guides.</strong></blockquote><h3>What is Technical Writing?</h3><p>Over the last 3 years, I’ve worked off and on documentation, integration guides, and technical blog posts for 20+ startups. I started contributing during my role as a <a href="https://theankurtyagi.com/working-at-supertokens-as-a-developer-advocate/"><strong><em>developer advocate</em></strong></a> at <a href="https://theankurtyagi.com/everything-about-super-tokens-an-open-source-alternative-to-auth0-firebase-auth-and-aws-cognito/"><strong><em>SuperTokens — an alternative to Auth0, Firebase</em></strong></a><strong><em> Auth</em></strong> back in 2021 and helped developers transition to the new open-source user authentication.</p><blockquote><strong>I found I enjoy writing </strong><a href="https://theankurtyagi.com/a-comprehensive-guide-to-migrate-your-database-from-supabase-to-harperdb/"><strong>technical blogs</strong></a><strong> and documentation, It is satisfying to produce high-quality </strong><a href="https://theankurtyagi.com/how-to-add-authentication-using-supertokens-in-your-react-app/"><strong>technical writing</strong></a><strong> that benefits others.</strong></blockquote><h3>Ankur💻🎧💪 on Twitter: &quot;I&#39;m on the front page of Hacker Noon right now if not on Hacker News 😄My story got featured. 🙏 pic.twitter.com/nYPZvO6CHH / Twitter&quot;</h3><p>I&#39;m on the front page of Hacker Noon right now if not on Hacker News 😄My story got featured. 🙏 pic.twitter.com/nYPZvO6CHH</p><p>I’ve read a lot of technical writing and documentation resources over the years. I’ve written about <a href="https://theankurtyagi.com/what-is-technical-writing-and-how-to-become-a-technical-writer/"><strong>why every engineer should write</strong></a> and I’ve collected together my notes both to help me remember key points later in my career, but also as a tool to help me think about writing now.</p><blockquote><strong>GPT has revealed how much writing is pure pablum. Bland, lifeless, uninsightful, unoffensive, and not worth the price of the ink it was printed with. so good writers will become more important for your startups who can build and write excellent technical blogs and ChatGPT plagiarism is a complete non-issue. If you can’t out-write a machine, what are you doing writing?</strong></blockquote><p>If you’re a developer interested in writing technical blogs, I’ve written a complete dedicated blog on <a href="https://theankurtyagi.com/what-is-technical-writing-and-how-to-become-a-technical-writer/"><strong>what technical writing is and how to write good technical blogs</strong></a>.</p><h3>My Writing Principles</h3><p>When doing technical writing, I always try to keep the following principles in mind.</p><ul><li>The goal of writing is to make tasks as simple and efficient for users as possible.</li><li>Developers prefer to be shown rather than told and prefer to learn by doing.</li><li>Help your users achieve their first success as soon as possible.</li><li>Keep it simple and write in simple language.</li></ul><h3>Why is Technical Writing Important for Startups?</h3><p>I’ve been writing technical content for the last 3 years. Here’s what I learned:</p><ul><li>Clear technical blogs and documentation help end users understand your product quickly and efficiently, reducing frustration and increasing satisfaction.</li><li>Thorough technical writing shows that you take your product and your users seriously. It boosts your brand’s trust and confidence.</li><li>New end users can quickly become proficient with your product if they have access to well-organized, easy-to-follow guides, integration, and docs.</li><li>Well-structured technical blogs and documentation improve your website’s SEO, helping potential customers find you more easily.</li><li>As your startup grows, you’ll need to onboard more employees. Good technical writing and documentation are essential for training new hires efficiently.</li></ul><p>Here are a few examples of excellent engineering blogs:</p><ul><li><a href="https://blog.cloudflare.com/tag/engineering/"><strong>The Cloudflare Blog</strong></a></li><li><a href="https://doordash.engineering/blog/"><strong>DoorDash Engineering Blog</strong></a></li><li><a href="https://netflixtechblog.com/"><strong>The Netflix Tech Blog</strong></a></li></ul><figure><img alt="The Netflix Tech Blog" src="https://cdn-images-1.medium.com/max/1024/0*RpORvo33P5MjjwWO.png" /><figcaption>The Netflix Tech Blog</figcaption></figure><ul><li>Detailed technical blogs and documentation demonstrate that you have a well-thought-out product and business strategy, which can be appealing to potential investors and partners.</li><li>End-user feedback from technical blogs and documentation is often invaluable for improving your product and identifying areas of confusion.</li><li>Well-written blogs and documentation can be easily translated into other local languages, enabling you to reach a broader, global audience.</li><li>Having superior technical blogs and documentation can be a significant differentiator, giving you an edge over competitors.</li></ul><h3>Gergely Orosz on Twitter: &quot;An underrated way to attract great engineers to your company(drumroll)Have a great engineering blog.This means ENGINEERS write the blog, not content writers. And they give the &quot;real deal&quot; about challenges, learnings, failures.So few companies do this. A few that do: / Twitter&quot;</h3><p>An underrated way to attract great engineers to your company(drumroll)Have a great engineering blog.This means ENGINEERS write the blog, not content writers. And they give the &quot;real deal&quot; about challenges, learnings, failures.So few companies do this. A few that do:</p><h3>Good Technical Writing = Organic Developer Marketing</h3><p>Developers have a reputation for being averse to marketing, but that’s not necessarily true.</p><p>In reality, developers are gaining purchasing power and respect within businesses of all sizes. Employers recognise the importance of investing in tools to help developers stay productive and happy because good developers are difficult to find and retain.</p><p>The variety of developer tools has increased dramatically, ranging from IDEs to higher-level abstractions and paid services like GPT, including low-code tools.</p><blockquote><strong>Technical writing is a successful developer marketing strategy rooted in authenticity and understanding the audience. Startups should spend time with developers, both online and in-person, to grasp their needs and preferences.</strong></blockquote><figure><img alt="How Technical Writing Can Supercharge Your Startup" src="https://cdn-images-1.medium.com/max/1024/0*KeIzz-Cd6tJQlMCM.png" /><figcaption>Why Technical Writing is Important for Startups</figcaption></figure><p>Technical content should be genuinely helpful and educational, and it is often more effective when created by a fellow developer. Options include in-house engineers, developer advocates, community writing programs, freelance writers, independent software engineers come writers like <a href="https://theankurtyagi.com/">myself</a>.</p><p>Developers are present on platforms like X formerly Twitter, Hacker News, Reddit, and LinkedIn and love to read well-written technical blog posts.</p><h3>Why Technical Writing Strategy Stand Out?</h3><p>While I’ll admit that big tech companies and startups are getting better at reaching developers. I spent 13 years as a hands-on software engineer and technical leader before starting my <a href="https://theankurtyagi.com/blog">blog</a> as a marketing developer, so here are my thoughts on why technical writing is a great asset for startups.</p><p>Business-to-developer marketing (“B2D marketing”) describes <strong>marketing initiatives designed to reach developers</strong> and technical writing is one of the best ways to do it while being genuine, authentic and interesting.</p><p><strong>Many startups struggle with B2D technical marketing because developers are more difficult to reach than the average consumer. </strong>Gimmicks like swags, free food coupons, free t-shirts or exclusionary events centred around alcohol are not the way to go.</p><blockquote><strong>Be interesting- Writing is by far the fastest way to get feedback from developers in software engineering.</strong></blockquote><blockquote><strong>Build a cool project with your product, write about it and share it in public to get feedback and iterate.</strong></blockquote><p>We all developers appreciate honesty. In recent times, I personally liked the blog page of <a href="https://supabase.com/blog">Supabase</a>. They’ve written some very cool blogs and achieved very good growth from their written content.</p><figure><img alt="Supabase blog" src="https://cdn-images-1.medium.com/max/1024/0*WhlzxcTnLcQJgwT3.png" /><figcaption>Supabase tech blog</figcaption></figure><p>As a startup, this means you should be honest about your product in the community.</p><figure><img alt="Mental Models of Technical Writing for a Startup" src="https://cdn-images-1.medium.com/max/1024/0*zXWjMFcBtFkvyeO4.png" /><figcaption>Mental Models of Technical Writing</figcaption></figure><p>Many big tech hire <a href="https://theankurtyagi.com/working-at-supertokens-as-a-developer-advocate/">developer advocates</a> — someone with a technical background who will champion their product at live events.</p><p>Big tech companies like <strong><em>Google/Amazon/Meta/Netflix</em></strong> have teams of these people to give talks at conferences, do training sessions, and write technical content about their company’s products but the developer advocate role is not a good fit for most of the startups- because they’ve to moved fast and unfortunately many developer advocates are lazy and below average people.</p><blockquote><strong>Startups need highly skilled engineers in tech who can write and build their engineering blog a platform where people want to come every single week if not every single day.</strong></blockquote><figure><img alt="stateofdeveloperrelations- 2023 devrelreport" src="https://cdn-images-1.medium.com/max/1024/0*UTQtWHzMBrt_Igvq.png" /><figcaption>stateofdeveloperrelations- 2023 devrelreport</figcaption></figure><p>Startups must leverage technical writing and documentation as <a href="https://clickhelp.com/clickhelp-technical-writing-blog/technical-documentation-as-a-marketing-tool/">marketing</a> tools.</p><blockquote><strong>Image credit- “State of Developer Relations”- you can access the full</strong><em> </em><a href="https://www.stateofdeveloperrelations.com/2023devrelreport"><strong>report</strong></a><em> </em><strong>here.</strong></blockquote><h3>Role of Technical Writing in Effective Communication</h3><p>We can write many different types of technical content for software developers.</p><ul><li><strong>Documentation</strong> is important, but very few startups leverage documentation as a marketing channel.</li><li><a href="https://theankurtyagi.com/how-i-use-medusa-to-create-a-powerful-next-js-e-commerce-store/"><strong>Tutorials and how-to guides</strong></a> can help end-users see how to use your product in the real world.</li><li><a href="https://theankurtyagi.com/github-copilot-vs-tabnine-choose-the-best-ai-assistant-for-you/"><strong>Awareness-driving content</strong></a><strong> </strong>is created with the goal of increasing the top of your funnel and may be published on external partner sites for increased reach. Hashnode, DevTo, HackerNoon, and DZone are all free places to publish developer content.</li><li><a href="https://theankurtyagi.com/blog/"><strong>Blog posts</strong></a> on your website allow you to engage readers and increase sign-ups.</li><li>Sponsor independent writers or senior engineer who writes a technical blog on their website or newsletters.</li></ul><h3>How Technical Writing Ensures Clarity and Understanding</h3><p>Always write good examples by starting with real code this builds trust with clients and investors while writing in public.</p><p><strong><em>My tactics for writing in public:</em></strong></p><blockquote><strong>Someone recently in my Twitter DM asked me — “Hi Ankur, I’m a big fan of your blog but I have got a question- how do you deal with writing in public? People on the internet are such assholes, sometimes.”</strong></blockquote><p>I’ve often heard the advice “<strong><em>Either turn off or Don’t read the comments</em></strong>”, but I’ve gained a huge amount of knowledge from reading internet comments on my posts and other people’s posts from strangers over the years, even if sometimes people are jerks.</p><h3>Always talk about real facts and be honest</h3><p>I mostly talk about facts — either facts about startups or developer advocates about my experiences as a writer. In general, I’d say that people’s comments about facts tend to stay pretty normal. The main kinds of negative comments I get about facts about my mistakes. I mostly try to head this off by trying to be self-aware about my knowledge level on a topic and saying “I’m not sure…” when I’m not sure about something.</p><h3>Edit and refactor mistakes</h3><p>I make many mistakes in my blog posts because I write about a lot of things that are on the edge of my knowledge. When people point out mistakes, I edit the blog post and fix it. Generally, I’ll stay near a computer for a few hours after I post a blog post on my Twitter or LinkedIn timeline so that I can fix mistakes quickly as they come up.</p><h3>Bridging the Tech Knowledge Gap: The Core Challenge in Startup Developer Relations Program</h3><p>The <a href="https://www.stateofdeveloperrelations.com/2023devrelreport">survey</a> report mentions that Content Development was a top job activity for Developer Relations practitioners in 2023, with a distinction between Content Development related to Education (55%) and Technical Content Development, such as documentation (50%)​. This highlights the importance of technical writing and content creation in engaging with and educating developer communities.</p><figure><img alt="State of DevRel Report 2023" src="https://cdn-images-1.medium.com/max/1024/0*k03e3S7f51pyoZ28.png" /><figcaption>State of DevRel Report 2023</figcaption></figure><h3>Top 3 Questions Every Startup Must Ask Before Starting a Technical Blog</h3><p>Starting a technical blog can be a significant step for a startup, as it requires a thoughtful approach to ensure it serves its intended purpose effectively.</p><ul><li>the purpose of writing</li><li>the target audience</li><li>the kind of content to be created</li></ul><p>Ask these questions if you’re starting a new blog for your startup.</p><p>Identifying the blog’s aim is crucial, whether it’s raising brand awareness, supplementing documentation, building an audience, or establishing thought leadership. Secondly, understanding and narrowing down the audience helps in tailoring the content accordingly. Lastly, deciding on the content format, whether it’s tutorials, roundups, case studies, features, Q&amp;As, comparisons, or opinion pieces, aids in maintaining a consistent and engaging blog.</p><p><strong><em>That’s it for this blog. I’ll keep writing on this topic and share more insight about more specific features in the next </em></strong><a href="https://theankurtyagi.com/"><strong><em>blog</em></strong></a><strong><em>.</em></strong></p><p>Stay tuned Until then, here are some of my most popular blogs you might like to read.</p><ul><li><a href="https://theankurtyagi.com/what-is-technical-writing-and-how-to-become-a-technical-writer/">Software Developers, Why Haven’t You Started Technical Writing Yet?</a></li><li><a href="https://theankurtyagi.com/building-scalable-microservices-with-amplication-graphql-mongodb-and-kafka/">How to Build Scalable Microservices with Amplication</a></li><li><a href="https://theankurtyagi.com/how-to-use-harperdb-custom-functions-with-your-react-app/">How to Use HarperDB Custom Functions</a></li></ul><p><em>Originally published at </em><a href="https://theankurtyagi.com/how-technical-writing-can-supercharge-your-startup/"><em>https://theankurtyagi.com</em></a><em> on October 20, 2023.</em></p><h3>Bonus: How to Create high-value content that converts</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/700/0*WbelIyhkpJt12XkA.png" /></figure><p>Founded by the team behind <a href="https://plainenglish.io/?utm=venture"><strong>In Plain English</strong></a>,<strong> </strong><a href="https://circuit.ooo/?utm=venture"><strong>Circuit</strong></a><strong> </strong>is a strategic growth company for developer-focused software startups. We help companies produce a higher ROI on their content marketing efforts.</p><p>If you want to <strong>build a better content strategy, scale content operations, increase product awareness and adoption, </strong>and <strong>grow a community, </strong>we help brands make this happen.</p><p><strong>→ </strong><a href="https://circuit.ooo/blog/2023-content-marketing-checklist?utm=venture_blog_post_link"><strong>Content Marketing Checklist</strong></a></p><p><strong>→ </strong><a href="https://circuit.ooo/blog/how-to-create-better-content-for-developers?utm=venture_blog_post_link"><strong>How to Create Better Content for Developers</strong></a></p><p><strong>→ </strong><a href="https://circuit.ooo/blog/the-key-ingredient-behind-high-newsletter-open-rates?utm=venture_blog_post_link"><strong>The Key Ingredient Behind High Newsletter Open Rates</strong></a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=2336835581a6" width="1" height="1" alt=""><hr><p><a href="https://medium.com/swlh/how-technical-writing-can-supercharge-your-startup-2336835581a6">How Technical Writing Can Supercharge Your Startup</a> was originally published in <a href="https://medium.com/swlh">The Startup</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[What is Technical Writing and How to Become a Technical Writer]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://javascript.plainenglish.io/what-is-technical-writing-and-how-to-become-a-technical-writer-9dda24d4dd66?source=rss-f80f00321ac------2"><img src="https://cdn-images-1.medium.com/max/1024/0*ZEnuBcCqJyF8Mqyt.png" width="1024"></a></p><p class="medium-feed-snippet">A blog is a useful piece for many reasons not only to you but to other software developers in tech.</p><p class="medium-feed-link"><a href="https://javascript.plainenglish.io/what-is-technical-writing-and-how-to-become-a-technical-writer-9dda24d4dd66?source=rss-f80f00321ac------2">Continue reading on JavaScript in Plain English »</a></p></div>]]></description>
            <link>https://javascript.plainenglish.io/what-is-technical-writing-and-how-to-become-a-technical-writer-9dda24d4dd66?source=rss-f80f00321ac------2</link>
            <guid isPermaLink="false">https://medium.com/p/9dda24d4dd66</guid>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[startup]]></category>
            <category><![CDATA[developer]]></category>
            <category><![CDATA[documentation]]></category>
            <category><![CDATA[technical-writing]]></category>
            <dc:creator><![CDATA[Ankur Tyagi]]></dc:creator>
            <pubDate>Tue, 10 Oct 2023 08:48:15 GMT</pubDate>
            <atom:updated>2023-10-21T09:29:22.067Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Top 5 Best Blogging Platforms for Software Engineers in 2023]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://javascript.plainenglish.io/top-5-best-blogging-platforms-for-software-engineers-in-2023-70e51eb3aabe?source=rss-f80f00321ac------2"><img src="https://cdn-images-1.medium.com/max/1024/0*UFC4L5oY9iwiMoha.png" width="1024"></a></p><p class="medium-feed-snippet">A blog is an incredible tool for software engineers to expand their knowledge in a specific tech domain.</p><p class="medium-feed-link"><a href="https://javascript.plainenglish.io/top-5-best-blogging-platforms-for-software-engineers-in-2023-70e51eb3aabe?source=rss-f80f00321ac------2">Continue reading on JavaScript in Plain English »</a></p></div>]]></description>
            <link>https://javascript.plainenglish.io/top-5-best-blogging-platforms-for-software-engineers-in-2023-70e51eb3aabe?source=rss-f80f00321ac------2</link>
            <guid isPermaLink="false">https://medium.com/p/70e51eb3aabe</guid>
            <category><![CDATA[blogging]]></category>
            <category><![CDATA[money]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[writing-tips]]></category>
            <category><![CDATA[writing]]></category>
            <dc:creator><![CDATA[Ankur Tyagi]]></dc:creator>
            <pubDate>Wed, 19 Jul 2023 12:18:53 GMT</pubDate>
            <atom:updated>2023-07-30T07:30:31.560Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[10 Powerful Lessons of Blogging From a Software Engineer]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/tech-lead-hub/10-powerful-lessons-of-blogging-from-a-software-engineer-4a2133d98cd1?source=rss-f80f00321ac------2"><img src="https://cdn-images-1.medium.com/max/2240/1*Pao76xORcmlUB24_Ghmm4Q.png" width="2240"></a></p><p class="medium-feed-snippet">If you&#x2019;d asked me if I&#x2019;d ever make money from my blog, I&#x2019;d have said no. I don&#x2019;t have a special talent or gift, nor do I have a writer to&#x2026;</p><p class="medium-feed-link"><a href="https://medium.com/tech-lead-hub/10-powerful-lessons-of-blogging-from-a-software-engineer-4a2133d98cd1?source=rss-f80f00321ac------2">Continue reading on Tech Lead Hub »</a></p></div>]]></description>
            <link>https://medium.com/tech-lead-hub/10-powerful-lessons-of-blogging-from-a-software-engineer-4a2133d98cd1?source=rss-f80f00321ac------2</link>
            <guid isPermaLink="false">https://medium.com/p/4a2133d98cd1</guid>
            <category><![CDATA[blog]]></category>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[writing]]></category>
            <category><![CDATA[developer]]></category>
            <category><![CDATA[blogging]]></category>
            <dc:creator><![CDATA[Ankur Tyagi]]></dc:creator>
            <pubDate>Thu, 22 Jun 2023 09:35:53 GMT</pubDate>
            <atom:updated>2023-07-03T03:57:46.437Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[How I Become a Better Writer as a Software Engineer]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://javascript.plainenglish.io/how-i-become-a-better-writer-as-a-software-engineer-35c5507737f9?source=rss-f80f00321ac------2"><img src="https://cdn-images-1.medium.com/max/2240/0*GjR5W5duVSMzK2SN.png" width="2240"></a></p><p class="medium-feed-snippet">Writing is an important skill for software developers. Indeed, poor writing can hamper your career advancement after a certain level.</p><p class="medium-feed-link"><a href="https://javascript.plainenglish.io/how-i-become-a-better-writer-as-a-software-engineer-35c5507737f9?source=rss-f80f00321ac------2">Continue reading on JavaScript in Plain English »</a></p></div>]]></description>
            <link>https://javascript.plainenglish.io/how-i-become-a-better-writer-as-a-software-engineer-35c5507737f9?source=rss-f80f00321ac------2</link>
            <guid isPermaLink="false">https://medium.com/p/35c5507737f9</guid>
            <category><![CDATA[writing]]></category>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[development]]></category>
            <category><![CDATA[startup]]></category>
            <category><![CDATA[blogging]]></category>
            <dc:creator><![CDATA[Ankur Tyagi]]></dc:creator>
            <pubDate>Tue, 23 May 2023 11:29:00 GMT</pubDate>
            <atom:updated>2023-05-24T13:44:12.141Z</atom:updated>
        </item>
    </channel>
</rss>