<?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[The Pythoneers - Medium]]></title>
        <description><![CDATA[Your home for innovative tech stories about Python and its limitless possibilities. Discover, learn, and get inspired. - Medium]]></description>
        <link>https://medium.com/pythoneers?source=rss----7a8fb64b42eb---4</link>
        <image>
            <url>https://cdn-images-1.medium.com/proxy/1*TGH72Nnw24QL3iV9IOm4VA.png</url>
            <title>The Pythoneers - Medium</title>
            <link>https://medium.com/pythoneers?source=rss----7a8fb64b42eb---4</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Fri, 06 Nov 2026 05:22:53 GMT</lastBuildDate>
        <atom:link href="https://medium.com/feed/pythoneers" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Neo4j: Data Model & Data Source]]></title>
            <link>https://medium.com/pythoneers/neo4j-data-model-data-source-046268a0cebe?source=rss----7a8fb64b42eb---4</link>
            <guid isPermaLink="false">https://medium.com/p/046268a0cebe</guid>
            <category><![CDATA[neo4j-graph-database]]></category>
            <category><![CDATA[data-modeling]]></category>
            <category><![CDATA[neo4j]]></category>
            <category><![CDATA[graph-database]]></category>
            <category><![CDATA[cypher]]></category>
            <dc:creator><![CDATA[Mohit Singh Kushwaha]]></dc:creator>
            <pubDate>Tue, 03 Nov 2026 21:12:32 GMT</pubDate>
            <atom:updated>2026-11-05T14:05:06.410Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/804/1*6EDRpNxK5AgMXrEzKsVXjw.png" /><figcaption>Neo4j Logo</figcaption></figure><blockquote>Neo4j documentation states, “<strong>Neo4j is a <em>native graph database.</em></strong><em>”</em></blockquote><p>So, Neo4j is definitely two things-</p><ol><li><strong>Graph model-based</strong></li><li><strong>Database</strong></li></ol><p>Neo4j is a native graph database. It stores and represents data in graph format through nodes and relationships (<em>aka links</em>). The relationships have directions and mark source &amp; destination nodes. These nodes and relationships have one or more properties associated with them. Neo4j also has most of the capabilities of a traditional database. You can define constraints &amp; indexes, execute transactions, run subqueries, etc.</p><p>Neo4j is available in several forms. Its cloud-based solution is available under the name <strong>Neo4j Aura</strong>. It is also available as a graph database on all major cloud service providers. It is also available on Docker and Kubernetes, and has plugins for most of the major programming languages, including <em>Python</em>, <em>JS</em>, <em>Java</em>, <em>Go</em>, etc.</p><p><a href="https://neo4j.com/docs/getting-started/whats-neo4j/"><em>Read more about Neo4j Solutions</em></a></p><p>In this story, you will read about <strong>Data Model- Creating a Data Model</strong> and <strong>Data Source- Importing a Data Source</strong>.</p><h3>Data Model</h3><p>A data model defines the schema for the database to support the queries and structure of stored data. A good model will help gather all required fields and return query responses with the least data traversal. One must understand the domain and specific use case requirements to create a well-designed data model.</p><p><a href="https://neo4j.com/docs/getting-started/data-modeling/"><em>Read more about Neo4j Data Modeling</em></a></p><h4>Creating a Data Model</h4><p>There are several ways to create a data model. When using the <strong>Neo4j Aura</strong> cloud solution, the <strong>Import</strong> option offers the easiest, hassle-free way to create a model.</p><p>Although there are several other efficient ways to create a model and import data, when creating the model manually, one can better understand the features, constraints, and nuances of the Neo4j platform.</p><figure><img alt="Import Models" src="https://cdn-images-1.medium.com/max/1024/1*nrkRxVsyHeiQlVl0BOiA5w.png" /><figcaption>Import Models</figcaption></figure><p>Follow the steps below to create a <strong>Customer — Product</strong> data model from scratch. A rough sketch of the model is shown below-</p><pre>(:Customer)-[:PLACED]-&gt;(:Order)-[:CONTAINS]-&gt;(:Product)-[:BELONGS_TO]-&gt;(:Category)<br>       │                                     ▲<br>       └──────────────[:REVIEWED]────────────┘</pre><p><strong>Node Labels and their Properties</strong></p><ul><li><strong>Customer</strong>: customerId <em>(ID)</em>, name, email, joinedDate</li><li><strong>Order</strong>: orderId <em>(ID)</em>, orderDate, status, paymentMethod</li><li><strong>Product</strong>: productId <em>(ID)</em>, name, price, sku</li><li><strong>Category</strong>: categoryId <em>(ID)</em>, name</li></ul><p><strong>Relationships and their Properties</strong></p><ul><li>(:Customer)-[:<strong>PLACED</strong>]-&gt;(:Order)</li><li>(:Order)-[:<strong>CONTAINS </strong>{quantity: Integer, unitPrice: Float}]-&gt;(:Product)</li><li>(:Product)-[:<strong>BELONGS_TO</strong>]-&gt;(:Category)</li><li>(:Customer)-[:<strong>REVIEWED </strong>{rating: Integer, comment: String, reviewDate: Datetime}]-&gt;(:Product)</li></ul><h4>1. Create a new Import Model</h4><p>Go to the <strong>Import Models</strong> tab and click on the <strong>Create Import Model</strong> button at the center of the screen. A pop-up box will open.</p><p>Provide a <strong>name </strong><em>(ex: Customer)</em> and <strong>description </strong>for your model. Then click on the <strong>Create </strong>button.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*4VpaReIzHXb7OygtFGDigg.png" /><figcaption>Model Creation Wizard</figcaption></figure><h4>2. Define Model Manually</h4><p>In the next step, you’ll get the option to define the source of data for your model. The data source could either be a database (like <em>MySQL</em>, <em>AWS Redshift</em>) or <em>CSV/TSV</em> files. Based on the data, you can ask Neo4j to infer the model structure.</p><p>However, you can create the model manually as well by defining each graph element yourself (<em>nodes, relationships, properties, constraints,</em> etc.). Click on the <strong>Define Manually</strong> card at the center of the screen.</p><figure><img alt="Defined Data Model" src="https://cdn-images-1.medium.com/max/1024/1*SZxyHYwG40kUqzbjjWre8g.png" /><figcaption>Define Data Model</figcaption></figure><h4>3. Create Node Labels</h4><p>In the next screen, you’ll get an interactive playground where you can create nodes, relationships, etc.</p><p>Start by adding labels to the blank node visible on screen and defining label properties in the right sidebar. (Labels can be considered as node types or tags. Each node can belong to multiple labels.)</p><p>Also, there is a toolbar at the bottom of the screen that can be used to add more node labels/relationships in the model.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*btZ3HZXKvh2wbsW8RUxfZg.png" /><figcaption>New Node Label, Label Name, Label Properties</figcaption></figure><p>Create the following node labels-</p><ul><li><strong>Customer</strong></li><li><strong>Order</strong></li><li><strong>Product</strong></li><li><strong>Category</strong></li></ul><figure><img alt="Node Labels" src="https://cdn-images-1.medium.com/max/1024/1*JzpIQljFcpgqtnvObQHDfA.png" /><figcaption>Node Labels</figcaption></figure><h4>4. Add Node Label Properties</h4><p>To add Properties to a label, select the label. Then, on the right sidebar, click on the add icon ‘<strong>+</strong>’ next to the <strong>Properties </strong>and give a suitable name &amp; datatype to the property. You can add any number of properties in the same manner. From the <strong>Constraints </strong>tab, you can configure constraints for these properties.</p><p>Now, add all required properties for all the node labels. Also set a suitable property as the <strong>ID</strong> (or <em>Primary Key</em>) for each label (ex: <em>customerId</em> can be the ID for the <em>Customer</em> Label). You can set a single or combination of properties as the <strong>ID</strong>.</p><figure><img alt="Add Label Properties" src="https://cdn-images-1.medium.com/max/1024/1*if09UdPS6UtvRL61-a4zLA.png" /><figcaption>Add Label Properties</figcaption></figure><h4>5. Create Relationships</h4><p>To create a relationship, select the starting node. A thick border appears around it. Press on this border, then drag and drop over the destination node. A relationship will be created between these two nodes.</p><p>If required, relationship direction can be changed by clicking the <strong>Reverse Direction</strong> button in the bottom toolbar. <strong>Relationship Type</strong> can be added from the right sidebar.</p><p>Create the following relationships-</p><ul><li><strong>PLACED</strong></li><li><strong>CONTAINS</strong></li><li><strong>BELONGS_TO</strong></li><li><strong>REVIEWED</strong></li></ul><figure><img alt="Relationships" src="https://cdn-images-1.medium.com/max/1024/1*jrdurY1Fm9c54dgZnl_nhw.png" /><figcaption>Relationships</figcaption></figure><h4>6. Add Relationship Properties</h4><p>Add properties for the relationships <em>(required for </em><strong><em>CONTAINS </em></strong><em>and </em><strong><em>REVIEWED </em></strong><em>relationships).</em> You can follow the same steps as for adding properties to node labels.</p><p><strong>Node ID mapping</strong> will be completed later once the data source is added.</p><figure><img alt="Relationship Properties" src="https://cdn-images-1.medium.com/max/1024/1*HpRpmtF_EEJqvVn6kci_Xg.png" /><figcaption>Relationship Properties</figcaption></figure><p>With that, you successfully created a <strong>Customer-Product</strong> data model.</p><h3>Data Source</h3><p>The data model lays out the schema for your database. But a database without data is still nothing. To populate data in a Neo4j DB instance, you have several options. You can upload CSV/TSV files or connect with MySQL, PostgreSQL, AWS Redshift, AWS S3, etc., to load your data.</p><p><a href="https://neo4j.com/docs/getting-started/data-import/"><em>Read more about Neo4j Data Sources</em></a></p><h4>Import Data Source</h4><p>After creating the data model, in the next step you need to add a data source to this model. Neo4j supports several data source types, but here you will load sample data from CSV files.</p><figure><img alt="Data Sources" src="https://cdn-images-1.medium.com/max/905/1*MpVui02ScgUXElmocSvuFw.png" /><figcaption>Neo4j Data Sources</figcaption></figure><p>Download all the files from this <a href="https://gist.github.com/MohitKushwaha/113a7a82844439b1374bdeb3378ea559">GitHub link</a> and store them on your local system. The .json file contains the data model schema, and the .csv files contain sample data for node labels and relationships.</p><h4>1. Upload Data Source Files</h4><p>Click <strong>Browse </strong>on the left sidebar in the <strong>CSV/TSV</strong> box. Select all required <strong>.csv</strong> files.</p><figure><img alt="Import Data Source CSV" src="https://cdn-images-1.medium.com/max/1024/1*qfnClS_UpfxYNoST6rIjTg.png" /><figcaption>Import Data Source CSV</figcaption></figure><p>Once uploaded, the CSV files and their details will be displayed on the left side.</p><figure><img alt="Uploaded csv file details" src="https://cdn-images-1.medium.com/max/1024/1*aTpT28z1BCvxlou-KWg65w.png" /><figcaption>Uploaded csv file details</figcaption></figure><h4>2. Map Node Label Properties with Data Source Columns</h4><p>Select a node label. In the <strong>Properties </strong>tab on the right sidebar, you need to select the data source (table) and map the properties to the appropriate table columns.</p><p>Perform this step for all the properties of all the node labels.</p><figure><img alt="Label Property mapping with Data Source Table Column" src="https://cdn-images-1.medium.com/max/1024/1*ZYyqBfvflX6EpriTY-Zyiw.png" /><figcaption>Label Property mapping with Data Source Table Column</figcaption></figure><h4>3. Map Relationship Properties with Data Source Columns</h4><p>You need to perform a similar step for relationship properties as well. Map all relationship properties with their respective columns from data source tables.</p><p>Also, you need to complete <strong>Node ID mapping.</strong> This mapping helps the relationship to identify the source and destination nodes by their respective IDs. Map the columns in the relationship data source with the respective <strong>From </strong>&amp; <strong>To</strong> Node ID properties.</p><figure><img alt="Relationship Property and Node ID mapping with Data Source Table Columns" src="https://cdn-images-1.medium.com/max/1024/1*MX4d7-o96-DEuzvaPSn76g.png" /><figcaption>Relationship Property and Node ID mapping with Data Source Table Columns</figcaption></figure><h4>4. Run Import</h4><p>Once all the Labels &amp; Relationships, their properties &amp; IDs are defined, you are ready to import the model and sample data into your database instance.</p><p>Click on the <strong>Run Import</strong> button in the top right corner. A pop-up box will open; select your instance in which you want to load the model and source data. Then click on the <strong>Run Import</strong> button.</p><figure><img alt="Import model and data source in DB instance" src="https://cdn-images-1.medium.com/max/1024/1*5BN49GJDPujMMCdMIcYM1A.png" /><figcaption>Import model and data source in DB instance</figcaption></figure><p>Thus, your data model with some sample data gets successfully created and deployed in your database instance. Your database is now ready to store and query data.</p><h3>Query and Visualization</h3><p>A database system is never used only to store data. Querying this data is another crucial purpose of a database. Neo4j has plugins available in several programming languages that you can integrate with your application to manage your database.</p><p>Neo4j supports queries in the Cypher language. Cypher is a declarative query language. It is close to natural language and visually matches the patterns and relationships in its syntax. Example-</p><pre>MATCH (n: From_Node_Label)-[r:RELATIONSHIP]-&gt;(m:To_Node_Label)<br>RETURN n, r, m</pre><p><a href="https://neo4j.com/docs/getting-started/cypher/"><em>Read more about Cypher</em></a></p><h4>Run Query</h4><p>To query and visualize your data, you can use the <strong>Query </strong>option from the left sidebar. In the typing area, write a <em>Cypher query</em> and click on the <strong>Run </strong>button.</p><p>The query response will generally be returned in multiple formats. The <strong>graph </strong>format is a representation of the response in the form of nodes and relationships. You can click on graph elements to view their properties and interact with them. Besides this, the response is also returned in <strong>table </strong>and <strong>raw </strong>formats.</p><figure><img alt="Cypher Query" src="https://cdn-images-1.medium.com/max/1024/1*NY823rq2rPLv9vrWyNRmgg.png" /><figcaption>Cypher Query</figcaption></figure><p>Cypher query used above-</p><pre>MATCH (c:Customer)-[r]-&gt;(p)<br>RETURN c, r, p</pre><p>The query returns all the Customer nodes, their immediate relationships, and the linked nodes.</p><p>You can integrate the database instance with your application and perform complex queries through plugins and api calls.</p><p><a href="https://neo4j.com/docs/getting-started/"><em>Read more about Neo4j</em></a></p><p><a href="https://neo4j.com/docs/getting-started/graph-database/"><em>Read more about Graph Database</em></a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=046268a0cebe" width="1" height="1" alt=""><hr><p><a href="https://medium.com/pythoneers/neo4j-data-model-data-source-046268a0cebe">Neo4j: Data Model &amp; Data Source</a> was originally published in <a href="https://medium.com/pythoneers">The Pythoneers</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[I Built AI Automation Systems That Can Generate Income While I Focus on Bigger Projects]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/pythoneers/i-built-ai-automation-systems-that-can-generate-income-while-i-focus-on-bigger-projects-f37218a98846?source=rss----7a8fb64b42eb---4"><img src="https://cdn-images-1.medium.com/max/1408/1*cK1YCcY-2XZF7r_sz_dqHw.jpeg" width="1408"></a></p><p class="medium-feed-snippet">How I use Python, large language models, AI agents, and automation tools to turn technical skills into practical income opportunities.</p><p class="medium-feed-link"><a href="https://medium.com/pythoneers/i-built-ai-automation-systems-that-can-generate-income-while-i-focus-on-bigger-projects-f37218a98846?source=rss----7a8fb64b42eb---4">Continue reading on The Pythoneers »</a></p></div>]]></description>
            <link>https://medium.com/pythoneers/i-built-ai-automation-systems-that-can-generate-income-while-i-focus-on-bigger-projects-f37218a98846?source=rss----7a8fb64b42eb---4</link>
            <guid isPermaLink="false">https://medium.com/p/f37218a98846</guid>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[python]]></category>
            <category><![CDATA[ai-automation]]></category>
            <category><![CDATA[entrepreneurship]]></category>
            <category><![CDATA[saas]]></category>
            <dc:creator><![CDATA[Mohsin Abro]]></dc:creator>
            <pubDate>Tue, 03 Nov 2026 21:12:09 GMT</pubDate>
            <atom:updated>2026-11-03T21:12:08.263Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[16 Python Libraries That Make Your Code Actually Good]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/pythoneers/11-python-libraries-that-make-your-code-actually-good-589170d6d464?source=rss----7a8fb64b42eb---4"><img src="https://cdn-images-1.medium.com/max/2600/0*C1Pr4WymmxYZIvJm" width="3840"></a></p><p class="medium-feed-snippet">Not &#x201C;good enough.&#x201D; Actually good.</p><p class="medium-feed-link"><a href="https://medium.com/pythoneers/11-python-libraries-that-make-your-code-actually-good-589170d6d464?source=rss----7a8fb64b42eb---4">Continue reading on The Pythoneers »</a></p></div>]]></description>
            <link>https://medium.com/pythoneers/11-python-libraries-that-make-your-code-actually-good-589170d6d464?source=rss----7a8fb64b42eb---4</link>
            <guid isPermaLink="false">https://medium.com/p/589170d6d464</guid>
            <category><![CDATA[data-science]]></category>
            <category><![CDATA[python-programming]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[python]]></category>
            <dc:creator><![CDATA[Abhay Parashar]]></dc:creator>
            <pubDate>Thu, 29 Oct 2026 14:08:00 GMT</pubDate>
            <atom:updated>2026-10-29T14:10:12.272Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[How to reach API rate limits]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/pythoneers/how-to-reach-api-rate-limits-a7fb3a61b73a?source=rss----7a8fb64b42eb---4"><img src="https://cdn-images-1.medium.com/max/960/1*cRbQjoJmFjLU2uLiHsJaEw.gif" width="960"></a></p><p class="medium-feed-snippet">Parallelize batches of API calls using ayncio in Python</p><p class="medium-feed-link"><a href="https://medium.com/pythoneers/how-to-reach-api-rate-limits-a7fb3a61b73a?source=rss----7a8fb64b42eb---4">Continue reading on The Pythoneers »</a></p></div>]]></description>
            <link>https://medium.com/pythoneers/how-to-reach-api-rate-limits-a7fb3a61b73a?source=rss----7a8fb64b42eb---4</link>
            <guid isPermaLink="false">https://medium.com/p/a7fb3a61b73a</guid>
            <category><![CDATA[rate-limiting]]></category>
            <category><![CDATA[asyncio]]></category>
            <category><![CDATA[httpx]]></category>
            <dc:creator><![CDATA[Florian Trautweiler]]></dc:creator>
            <pubDate>Mon, 19 Oct 2026 06:00:00 GMT</pubDate>
            <atom:updated>2026-10-19T05:59:59.439Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Understanding Python Decorators….It’s Just This Easy!]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/pythoneers/understanding-python-decorators-its-just-this-easy-5f8094b921d5?source=rss----7a8fb64b42eb---4"><img src="https://cdn-images-1.medium.com/max/1672/1*jRL7WBpbT6-Sn8hll38Gbw.png" width="1672"></a></p><p class="medium-feed-snippet">Python decorators tended to confuse me far more than they needed to.
For instance:</p><p class="medium-feed-link"><a href="https://medium.com/pythoneers/understanding-python-decorators-its-just-this-easy-5f8094b921d5?source=rss----7a8fb64b42eb---4">Continue reading on The Pythoneers »</a></p></div>]]></description>
            <link>https://medium.com/pythoneers/understanding-python-decorators-its-just-this-easy-5f8094b921d5?source=rss----7a8fb64b42eb---4</link>
            <guid isPermaLink="false">https://medium.com/p/5f8094b921d5</guid>
            <category><![CDATA[python]]></category>
            <category><![CDATA[decorators]]></category>
            <category><![CDATA[python3]]></category>
            <category><![CDATA[python-programming]]></category>
            <dc:creator><![CDATA[Dr Abdullah Azhar]]></dc:creator>
            <pubDate>Mon, 19 Oct 2026 05:59:47 GMT</pubDate>
            <atom:updated>2026-10-19T05:59:46.010Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[I Let One AI Platform Build My Entire Brand — Here’s What Happened]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/pythoneers/i-let-one-ai-platform-build-my-entire-brand-heres-what-happened-0d658db8cb57?source=rss----7a8fb64b42eb---4"><img src="https://cdn-images-1.medium.com/max/1892/1*mfGMIggRu4Paq8RBOpSnpQ.png" width="1892"></a></p><p class="medium-feed-snippet">I tested Zawa&#x2019;s logo, color palette, and social media tools to see how far it could take a brand from scratch</p><p class="medium-feed-link"><a href="https://medium.com/pythoneers/i-let-one-ai-platform-build-my-entire-brand-heres-what-happened-0d658db8cb57?source=rss----7a8fb64b42eb---4">Continue reading on The Pythoneers »</a></p></div>]]></description>
            <link>https://medium.com/pythoneers/i-let-one-ai-platform-build-my-entire-brand-heres-what-happened-0d658db8cb57?source=rss----7a8fb64b42eb---4</link>
            <guid isPermaLink="false">https://medium.com/p/0d658db8cb57</guid>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[tech]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[ai-agent]]></category>
            <category><![CDATA[technology]]></category>
            <dc:creator><![CDATA[Abhay Parashar]]></dc:creator>
            <pubDate>Sat, 19 Sep 2026 05:37:41 GMT</pubDate>
            <atom:updated>2026-09-19T05:37:41.134Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Vmake Labs: The All-in-One AI Studio for Creating Viral Social Content]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/pythoneers/vmake-labs-the-all-in-one-ai-studio-for-creating-viral-social-content-7e714858a17b?source=rss----7a8fb64b42eb---4"><img src="https://cdn-images-1.medium.com/max/1623/1*6UE_YgCHvng83_7d2aqXPg.png" width="1623"></a></p><p class="medium-feed-snippet">Because creating one good social video shouldn&#x2019;t require five different AI tools.</p><p class="medium-feed-link"><a href="https://medium.com/pythoneers/vmake-labs-the-all-in-one-ai-studio-for-creating-viral-social-content-7e714858a17b?source=rss----7a8fb64b42eb---4">Continue reading on The Pythoneers »</a></p></div>]]></description>
            <link>https://medium.com/pythoneers/vmake-labs-the-all-in-one-ai-studio-for-creating-viral-social-content-7e714858a17b?source=rss----7a8fb64b42eb---4</link>
            <guid isPermaLink="false">https://medium.com/p/7e714858a17b</guid>
            <category><![CDATA[tech]]></category>
            <category><![CDATA[technology]]></category>
            <category><![CDATA[automation]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[ai]]></category>
            <dc:creator><![CDATA[Abhay Parashar]]></dc:creator>
            <pubDate>Mon, 14 Sep 2026 16:55:51 GMT</pubDate>
            <atom:updated>2026-09-14T16:55:51.363Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[These Python Libraries Fixed Problems I Didn’t Know I Had]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/pythoneers/these-python-libraries-fixed-problems-i-didnt-know-i-had-584d874dd440?source=rss----7a8fb64b42eb---4"><img src="https://cdn-images-1.medium.com/max/1672/1*n9QjEdBXZOOCPpr3RxdsJA.png" width="1672"></a></p><p class="medium-feed-snippet">For a long time, I assumed that the Python code that I was writing was great.</p><p class="medium-feed-link"><a href="https://medium.com/pythoneers/these-python-libraries-fixed-problems-i-didnt-know-i-had-584d874dd440?source=rss----7a8fb64b42eb---4">Continue reading on The Pythoneers »</a></p></div>]]></description>
            <link>https://medium.com/pythoneers/these-python-libraries-fixed-problems-i-didnt-know-i-had-584d874dd440?source=rss----7a8fb64b42eb---4</link>
            <guid isPermaLink="false">https://medium.com/p/584d874dd440</guid>
            <category><![CDATA[python-programming]]></category>
            <category><![CDATA[python-libraries]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[python]]></category>
            <dc:creator><![CDATA[Dr Abdullah Azhar]]></dc:creator>
            <pubDate>Wed, 19 Aug 2026 13:42:46 GMT</pubDate>
            <atom:updated>2026-08-19T13:42:45.064Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[I Built a Safety Net for Python Environments Because I Was Tired of Debugging “It Works on My…]]></title>
            <link>https://medium.com/pythoneers/i-built-a-safety-net-for-python-environments-because-i-was-tired-of-debugging-it-works-on-my-99a62643b51e?source=rss----7a8fb64b42eb---4</link>
            <guid isPermaLink="false">https://medium.com/p/99a62643b51e</guid>
            <category><![CDATA[cli]]></category>
            <category><![CDATA[developer-tools]]></category>
            <category><![CDATA[macos]]></category>
            <category><![CDATA[python-programming]]></category>
            <category><![CDATA[python-packages]]></category>
            <dc:creator><![CDATA[Rohan R]]></dc:creator>
            <pubDate>Mon, 10 Aug 2026 04:43:53 GMT</pubDate>
            <atom:updated>2026-08-10T04:43:52.583Z</atom:updated>
            <content:encoded><![CDATA[<h3>I Built a Safety Net for Python Environments Because I Was Tired of Debugging “It Works on My Machine”</h3><h4>Why every Python developer needs a preflight check for their code</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/455/1*ly1QShN7S0R6E_bbK27lYA@2x.jpeg" /></figure><p>I used to have a recurring nightmare. I’d be halfway through a machine learning experiment, three hours into training, when suddenly everything would explode. Not because my code was wrong, but because my environment was quietly broken in a way I couldn’t see coming. Wrong Python version. A package that got installed with pip instead of conda. A wheel that claimed to support my architecture but didn’t. <strong>Rosetta 2</strong> running my <strong>arm64</strong> Python as <strong>x86_64</strong> and tanking my GPU acceleration.</p><p>The error messages were always cryptic. The fixes were always tedious. And the worst part? I never knew if my environment was actually healthy until something went wrong.</p><p>So I built <strong>[</strong><a href="https://github.com/rotsl/envguard"><strong>EnvGuard</strong></a><strong>]</strong>—a CLI tool that validates your Python environment <strong><em>before</em></strong> you run your code, not after it breaks. Think of it as a preflight checklist for your Python projects. If something’s wrong, it blocks execution and tells you exactly what’s broken and how to fix it. If everything passes, your command runs in a validated environment.</p><p>It’s macOS-first (because that’s where I do my work), runs on Linux with partial support, and deliberately doesn’t support Windows (because life’s too short for three-platform maintenance). You can install it from <strong>[</strong><a href="https://pypi.org/project/envguard-tool/"><strong>PyPI</strong></a><strong>]</strong> as `<a href="https://pypi.org/project/envguard-tool/"><strong>envguard-tool</strong></a>` — the CLI command is just `<strong>envguard</strong>`.</p><h4>The Problem: Python Environments Are Fragile and Invisible</h4><p>Python environment management is a solved problem in the same way that herding cats is a solved problem. Technically there are tools. Practically, things go wrong constantly.</p><p>Here’s what actually happens in the wild:</p><p><strong>The architecture confusion.</strong> You install Python on an M1 Mac, but somehow you’re running the <em>x86_64</em> version under <em>Rosetta 2</em>. Everything works, but your Metal Performance Shaders (MPS) acceleration is silently disabled. PyTorch falls back to CPU. Your training takes 10x longer. You don’t notice until you check `<em>activity monitor</em>` and see no GPU usage.</p><p><strong>The mixed ownership trap.</strong> You create a conda environment, but then you <strong><em>pip install</em></strong> something because the conda version is outdated. Then you conda install something else. Now you have packages owned by two different managers, and `<em>pip check</em>` is screaming about conflicts, but your code still runs so you ignore it until it doesn’t.</p><p><strong>The CUDA delusion.</strong> You’re on macOS, but your `<em>requirements.txt</em>` includes `<strong>torch==2.0.0+cu118</strong>` because you copied it from a Linux server. It installs fine. It even imports. But CUDA doesn’t exist on Apple Silicon, and your code fails three layers deep in a stack trace that mentions nothing about GPU compatibility.</p><p><strong>The “it worked yesterday” mystery. </strong>Your environment was fine. Then you updated one package. Now something else is broken. You have no idea what changed or when.</p><p>These aren’t exotic edge cases. They’re daily experiences for Python developers working on ML, data science, or scientific computing projects. The existing tools — conda, pip, poetry, uv, pyenv — are great at <strong>creating </strong>environments. They’re terrible at <strong>validating</strong> them continuously.</p><h4>The Solution: Preflight Validation Every Single Time</h4><p>EnvGuard’s core idea is simple: instead of running `<em>python train.py</em>` and hoping, you run `<em>envguard run — python train.py</em>`. Before your code executes, EnvGuard runs a nine-step preflight pipeline:</p><p>1. <strong>Detect the host </strong>— OS version, architecture (native arm64 vs Intel vs Rosetta 2), available package managers, network connectivity<br>2. <strong>Discover the project</strong> — scan for `<em>pyproject.toml</em>`, `<em>requirements.txt</em>`, `<em>environment.yml</em>`, `<em>Pipfile</em>`, `<em>poetry.lock</em>`, etc.<br>3. <strong>Analyze intent</strong> — figure out what environment type (venv/conda/pipenv/poetry), Python version, and accelerator targets (CPU/MPS/CUDA) the project needs<br>4. <strong>Evaluate rules </strong>— run 15+ validation rules to catch problems<br>5. <strong>Fail-fast on critical issues </strong>— block execution if anything is unrecoverable<br>6. <strong>Create a resolution plan</strong> — determine exactly how to satisfy the environment requirements<br>7. <strong>Create or repair the environment</strong>— make sure the actual environment matches the requirements<br>8. <strong>Validate the environment</strong> — run `pip check` or equivalent to verify consistency<br>9. <strong>Smoke test</strong>— try importing key packages in an isolated subprocess to catch runtime failures</p><p>If any step fails with a `CRITICAL` finding, your command never runs. You get a clear error message explaining what went wrong and how to fix it. No cryptic tracebacks. No debugging environment issues at 2am.</p><h4>What EnvGuard Actually Catches</h4><p>The rules engine evaluates 15+ specific checks. Here are the ones that have saved me the most pain:</p><pre>| Rule                          | Severity  | What it catches                                                                 |<br>|-------------------------------|-----------|----------------------------------------------------------------------------------|<br>| `CUDA_ON_MACOS`               | **CRITICAL** | Any CUDA dependency on macOS (hardware impossibility)                           |<br>| `ROSETTA_TRANSLATION_DETECTED`| WARNING   | x86_64 Python running under Rosetta 2 on Apple Silicon (kills MPS performance)  |<br>| `ARCHITECTURE_MISMATCH`       | ERROR     | Python architecture doesn&#39;t match project requirements                          |<br>| `MIXED_PIP_CONDA_OWNERSHIP`   | WARNING   | Packages installed by both pip and conda (dependency hell indicator)            |<br>| `WHEEL_INCOMPATIBLE`          | WARNING   | Wheel file doesn&#39;t match current platform/architecture                          |<br>| `BROKEN_ENVIRONMENT`          | ERROR     | Active venv/conda is missing Python binary or critical files                    |<br>| `PYTHON_VERSION_BELOW_MINIMUM`| ERROR     | Python version below `requires-python` in pyproject.toml                        |<br>| `MPS_NOT_AVAILABLE`           | INFO      | Apple Silicon present but MPS not available (usually means PyTorch wasn&#39;t built with MPS support) |</pre><p>The `CUDA_ON_MACOS` rule alone has probably saved me hours of debugging. Here’s what happens: you copy a `requirements.txt` from a Linux machine that specifies `torch==2.1.0+cu118`. You install it on your M1 Mac. It seems to work — pip doesn’t complain, the import succeeds. But when you actually try to move tensors to the GPU, you get a cryptic error about CUDA devices not being available. EnvGuard catches this at the dependency resolution stage and blocks execution with a message telling you to use `mps` or `cpu` targets instead.</p><p>The `ROSETTA_TRANSLATION_DETECTED` rule is subtler but equally important. If you’re running an x86_64 Python binary on an Apple Silicon Mac (usually because you installed it before Rosetta was properly configured, or you’re using an old pyenv), everything works — but MPS acceleration is silently disabled. Your ML training runs on CPU. Your inference is 10x slower than it should be. EnvGuard detects this via `sysctl proc_translated` and warns you that you’re leaving performance on the table.</p><h4>The Technical Architecture: How It Actually Works</h4><p>EnvGuard is built as a layered Python package with clear separation of concerns. The source is in [the GitHub repo](<a href="https://github.com/rotsl/envguard">https://github.com/rotsl/envguard</a>) under `src/envguard/`.</p><p><strong>CLI Layer</strong> (`cli.py`): Typer-based interface with 25 commands across environment management, dependency resolution, lock files, publishing, and self-updating. Every command supports ` — json` output for CI/CD integration.</p><p><strong>Orchestration Layer</strong> (`preflight.py`, `doctor.py`): The preflight engine runs the nine-step pipeline. The doctor runs standalone diagnostics without execution. Both use the same underlying detection and rules systems.</p><p><strong>Domain Layer</strong>: The heavy lifting happens here:<br>- `detect.py` — `HostDetector` class gathers OS, architecture, Python, shell, network, and permission facts<br>- `rules.py` — `RulesEngine` evaluates all 15+ validation rules<br>- `repair.py` — `RepairEngine` can automatically fix broken environments (recreate venvs, fix mixed ownership, switch Python versions)<br>- `models.py` — Pydantic models for `HostFacts`, `ProjectIntent`, `RuleFinding`, `ResolutionRecord`, etc.<br>- `project/` — Discovery (scanning for project files), intent analysis (inferring requirements), resolution (dependency solving), and lifecycle management<br>- `resolver/` — Pluggable backends for PyPI (BFS resolution via JSON API), uv, pip, and conda<br>- `lock/` — Lock file generation and management (`envguard.lock` in TOML format with SHA-256 content hashes)<br>- `update/` — Self-updating mechanism with SHA-256 verification and rollback support</p><p><strong>Platform Layer</strong>: macOS-specific code for permissions, Rosetta detection, Xcode CLI tools, and LaunchAgent management. Linux gets partial support here — core pipeline works, but no LaunchAgent, no MPS detection, no Rosetta checks.</p><p>All state files (in `.envguard/`) are written atomically using write-to-temp-then-rename to prevent corruption from interrupted writes. Every subprocess call has explicit timeouts. The security model is documented in detail — checksum verification for updates, no shell=True with string interpolation, path traversal protection for archive extraction.</p><h4>Real Usage: What My Workflow Looks Like</h4><p>I work on a lot of ML projects with different requirements. Some need PyTorch with MPS. Some need TensorFlow (which has its own special hell on macOS). Some are pure Python data pipelines. Here’s how I actually use EnvGuard day-to-day.</p><p><strong>Starting a new project:</strong></p><pre>cd ~/projects/new-ml-experiment<br>envguard init</pre><p>This creates a `.envguard/` directory with `state.json`, `envguard.toml` (config), and subdirectories for snapshots, cache, logs, and backups. It scans my project files to figure out what I’m building.</p><p><strong>Checking if everything is healthy:</strong></p><pre>envguard doctor</pre><p>This runs 10 diagnostic checks: host detection, project discovery, Python environment, package manager health, dependency consistency, accelerator support, permissions, network connectivity, and environment ownership. It outputs a report showing what’s working and what’s not.</p><p><strong>Running my actual code:</strong></p><pre>envguard run - python train.py - epochs 100 - batch-size 32</pre><p>Before `train.py` executes, the preflight pipeline runs. If my environment has drifted — say, I updated PyTorch and now there’s a version conflict with torchvision — EnvGuard catches it and blocks execution. I can then run `envguard repair` to fix it automatically, or `envguard lock sync` to reinstall from my lock file.</p><p><strong>Locking dependencies for reproducibility:</strong></p><pre>envguard resolve<br>envguard lock generate</pre><p>`resolve` uses the PyPI JSON API to resolve my project dependencies to exact pinned versions. `lock generate` writes an `envguard.lock` file with SHA-256 content hashes. I commit this to git. When someone else clones the repo, they run `envguard install — from-lock` and get exactly the same environment I have.</p><p><strong>Self-updating:</strong></p><pre>envguard update - dry-run # check if there&#39;s a new version<br>envguard update # actually update with SHA-256 verification and automatic rollback snapshot</pre><p>EnvGuard can update itself. Before applying an update, it creates a rollback snapshot. If something goes wrong, `envguard rollback` restores the previous version.</p><h4>The Lock File: Reproducibility Without the Pain</h4><p>Python dependency management has a reproducibility problem. `requirements.txt` with loose version constraints means “install something that hopefully works.” `requirements.txt` with pinned versions means “this worked on my machine at one specific moment, but good luck if you’re on a different architecture or Python version.”</p><p>EnvGuard’s lock file (`envguard.lock`) tries to be smarter. It’s a TOML file that includes:</p><p>- The exact resolved dependency graph with specific versions<br>- SHA-256 content hashes for verification<br>- Platform and Python version markers (so you can have different resolutions for macOS-arm64 vs Linux-x86_64 if needed)<br>- The source files that contributed to the resolution (`pyproject.toml`, `requirements.txt`, etc.)</p><p>The lock file is human-readable but machine-generated. You don’t edit it manually. You regenerate it with `envguard lock generate` or update specific packages with `envguard lock update — package &lt;name&gt;`.</p><p>In CI, you can run `envguard lock check` to verify that the lock file is up-to-date with your source requirements. It exits with code 13 if stale, which you can use to fail builds that might have inconsistent dependencies.</p><h4>What It Doesn’t Do (And Why)</h4><p>EnvGuard has deliberate limitations that are worth understanding:</p><p><strong>It doesn’t intercept unmanaged launches.</strong> If you run `python train.py` directly, EnvGuard doesn’t see it. Only commands routed through `envguard run` get validated. This is by design — EnvGuard is opt-in, not a system-wide interceptor that could break other workflows.</p><p><strong>It doesn’t support Windows</strong>. The codebase uses POSIX-specific APIs throughout (`os.access()` for permissions, list-form subprocess arguments, `/tmp` paths). Adding Windows support would require a parallel implementation of the platform layer, and I don’t use Windows enough to maintain that. WSL2 works if you need it.</p><p><strong>It doesn’t make CUDA work on macOS</strong>. Apple Silicon physically cannot run NVIDIA CUDA. EnvGuard detects CUDA dependencies and blocks them with a clear error, but it can’t magically add CUDA support where none exists.</p><p><strong>It doesn’t auto-activate environments on directory change.</strong> If you want `<em>cd my-project</em>` to automatically activate the right <em>venv</em>, use `<em>direnv</em>`. EnvGuard’s shell hooks are minimal and opt-in — they just load the integration, not the environments themselves.</p><p>These limitations are documented in the repo’s `<strong><em>docs/limitations.md</em></strong>` and tracked as architectural decisions in `<strong><em>docs/adrs/</em></strong>`.</p><h4>Installation and Getting Started</h4><p>If you’re on macOS 12+ (Monterey) or Linux, installation is straightforward:</p><pre>pip install envguard-tool</pre><p>The PyPI package is named `envguard-tool` because `envguard` was taken. The CLI command and Python import are both just `envguard`.</p><p>For macOS, there’s also a bootstrap script that installs shell hooks and the LaunchAgent for automatic update checking:</p><pre>git clone https://github.com/rotsl/envguard.git<br>cd envguard<br>bash scripts/bootstrap.sh</pre><p>Once installed, verify it works:</p><pre>envguard - version<br>envguard doctor</pre><p>Then initialize any Python project:</p><pre>cd /path/to/your/project<br>envguard init<br>envguard run - python your_script.py</pre><h4>Why I Built This (And Who It’s For)</h4><p>I built EnvGuard for myself, primarily. I’m a researcher working on machine learning for biology — specifically computer vision for fungal pathogen analysis. I work on Apple Silicon Macs. I collaborate with people on Linux servers. I deal with PyTorch, TensorFlow, JAX, and a lot of scientific Python packages with complex native dependencies.</p><p>I was tired of debugging environment issues that had nothing to do with my actual research. I wanted a tool that would catch problems before they cost me hours of training time or corrupted experimental results.</p><p>EnvGuard is for Python developers who:<br>- Work on macOS (especially Apple Silicon) and are tired of Rosetta/architecture surprises<br>- Need MPS acceleration for PyTorch and want to know when it’s not actually available<br>- Collaborate across different machines and need reproducible environments<br>- Are tired of “works on my machine” and want validation that happens <strong>before</strong> execution<br>- Prefer CLI tools that integrate into existing workflows rather than replacing them entirely</p><p>It’s not for everyone. If you’re a web developer working with simple Python environments, you probably don’t need this. If you’re on Windows, this won’t help you (yet). If you want a full IDE-like environment manager with GUI buttons, look elsewhere.</p><p>But if you’re doing scientific Python or ML and you’ve ever lost a day to a broken environment that you didn’t know was broken until it was too late — EnvGuard might save you some pain.</p><p>Python environment management has been broken for a long time. We’ve accepted “it works on my machine” as an inevitable part of the development experience. We’ve normalized spending hours debugging issues that have nothing to do with our actual code.</p><p>I don’t think it has to be this way. EnvGuard is my attempt to bring some of the safety and validation we expect from production systems (preflight checks, reproducible builds, clear error messages) to the messy world of Python development.</p><p>It’s not perfect. It’s alpha software with known limitations. But it’s already saved me hours of debugging, and I hope it can do the same for you.</p><p>If you’re tired of environment surprises, give it a try. Run `<strong><em>pip install envguard-tool</em></strong>`, run `<strong><em>envguard doctor</em></strong>` on your project, and see what it finds. You might discover that your “working” environment has been quietly broken in ways you never noticed.</p><h4>Links:</h4><p>- GitHub: <a href="https://github.com/rotsl/envguard">github.com/rotsl/envguard</a><br>- PyPI: <a href="https://pypi.org/project/envguard-tool/">pypi.org/project/envguard-tool/</a></p><p>#Python #MachineLearning #MLOps #DeveloperTools #macOS #AppleSilicon #PyTorch #EnvironmentManagement #DevOps #OpenSource #Reproducibility #CLI #Preflight #SoftwareEngineering</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=99a62643b51e" width="1" height="1" alt=""><hr><p><a href="https://medium.com/pythoneers/i-built-a-safety-net-for-python-environments-because-i-was-tired-of-debugging-it-works-on-my-99a62643b51e">I Built a Safety Net for Python Environments Because I Was Tired of Debugging “It Works on My…</a> was originally published in <a href="https://medium.com/pythoneers">The Pythoneers</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[I Used Claude Code Every Day — These Skills Were Worth the Effort]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/pythoneers/i-used-claude-code-every-day-these-skills-were-worth-the-effort-b5bd009907c9?source=rss----7a8fb64b42eb---4"><img src="https://cdn-images-1.medium.com/max/2322/0*E-SyJo-bc3RLNQF_" width="2322"></a></p><p class="medium-feed-snippet">After months of using Claude Code daily, I realized the biggest productivity gains didn&#x2019;t come from writing more code. They came from&#x2026;</p><p class="medium-feed-link"><a href="https://medium.com/pythoneers/i-used-claude-code-every-day-these-skills-were-worth-the-effort-b5bd009907c9?source=rss----7a8fb64b42eb---4">Continue reading on The Pythoneers »</a></p></div>]]></description>
            <link>https://medium.com/pythoneers/i-used-claude-code-every-day-these-skills-were-worth-the-effort-b5bd009907c9?source=rss----7a8fb64b42eb---4</link>
            <guid isPermaLink="false">https://medium.com/p/b5bd009907c9</guid>
            <category><![CDATA[python]]></category>
            <category><![CDATA[data-science]]></category>
            <category><![CDATA[machine-learning]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[technology]]></category>
            <dc:creator><![CDATA[Muhummad Zaki]]></dc:creator>
            <pubDate>Sat, 08 Aug 2026 14:50:19 GMT</pubDate>
            <atom:updated>2026-08-08T14:50:59.110Z</atom:updated>
        </item>
    </channel>
</rss>