<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Storage on Producthunt daily</title>
        <link>https://producthunt.programnotes.cn/en/tags/storage/</link>
        <description>Recent content in Storage on Producthunt daily</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en</language>
        <lastBuildDate>Fri, 23 May 2025 15:28:13 +0800</lastBuildDate><atom:link href="https://producthunt.programnotes.cn/en/tags/storage/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>appwrite</title>
        <link>https://producthunt.programnotes.cn/en/p/appwrite/</link>
        <pubDate>Fri, 23 May 2025 15:28:13 +0800</pubDate>
        
        <guid>https://producthunt.programnotes.cn/en/p/appwrite/</guid>
        <description>&lt;img src="https://images.unsplash.com/photo-1731635793345-81555953ba2a?ixid=M3w0NjAwMjJ8MHwxfHJhbmRvbXx8fHx8fHx8fDE3NDc5ODUyNzh8&amp;ixlib=rb-4.1.0" alt="Featured image of post appwrite" /&gt;&lt;h1 id=&#34;appwriteappwrite&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/appwrite/appwrite&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;appwrite/appwrite&lt;/a&gt;
&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://apwr.dev/appcloud&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Get started with Appwrite&lt;/a&gt;
&lt;a class=&#34;link&#34; href=&#34;https://www.youtube.com/watch?v=1g8tuogsp7A&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Join the Init kick off event 19th of May: The future of Appwrite with Founder &amp;amp; CEO Eldad Fux&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;br /&gt;
&lt;p align=&#34;center&#34;&gt;
    &lt;a href=&#34;https://appwrite.io&#34; target=&#34;_blank&#34;&gt;&lt;img src=&#34;./public/images/banner.png&#34; alt=&#34;Appwrite banner, with logo and text saying &#34;Build Like a Team of Hundreds&#34;&gt;&lt;/a&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    &lt;b&gt;Appwrite is a backend platform for developing Web, Mobile, and Flutter applications. Built with the open source community and optimized for developer experience in the coding languages you love.&lt;/b&gt;
    &lt;br /&gt;
    &lt;br /&gt;
&lt;/p&gt;
&lt;!-- [![Build Status](https://img.shields.io/travis/com/appwrite/appwrite?style=flat-square)](https://travis-ci.com/appwrite/appwrite) --&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://appwrite.io/company/careers&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://img.shields.io/static/v1?label=We%27re&amp;amp;message=Hiring&amp;amp;color=blue&amp;amp;style=flat-square&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;We’re Hiring label&#34;
	
	
&gt;&lt;/a&gt;
&lt;a class=&#34;link&#34; href=&#34;https://hacktoberfest.appwrite.io&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://img.shields.io/static/v1?label=hacktoberfest&amp;amp;message=ready&amp;amp;color=191120&amp;amp;style=flat-square&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Hacktoberfest label&#34;
	
	
&gt;&lt;/a&gt;
&lt;a class=&#34;link&#34; href=&#34;https://appwrite.io/discord?r=Github&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://img.shields.io/discord/564160730845151244?label=discord&amp;amp;style=flat-square&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Discord label&#34;
	
	
&gt;&lt;/a&gt;
&lt;a class=&#34;link&#34; href=&#34;https://github.com/appwrite/appwrite/actions&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://img.shields.io/github/actions/workflow/status/appwrite/appwrite/tests.yml?branch=master&amp;amp;label=tests&amp;amp;style=flat-square&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Build Status label&#34;
	
	
&gt;&lt;/a&gt;
&lt;a class=&#34;link&#34; href=&#34;https://twitter.com/appwrite&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://img.shields.io/twitter/follow/appwrite?color=00acee&amp;amp;label=twitter&amp;amp;style=flat-square&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;X Account label&#34;
	
	
&gt;&lt;/a&gt;&lt;/p&gt;
&lt;!-- [![Docker Pulls](https://img.shields.io/docker/pulls/appwrite/appwrite?color=f02e65&amp;style=flat-square)](https://hub.docker.com/r/appwrite/appwrite) --&gt;
&lt;!-- [![Translate](https://img.shields.io/badge/translate-f02e65?style=flat-square)](docs/tutorials/add-translations.md) --&gt;
&lt;!-- [![Swag Store](https://img.shields.io/badge/swag%20store-f02e65?style=flat-square)](https://store.appwrite.io) --&gt;
&lt;p&gt;English | &lt;a class=&#34;link&#34; href=&#34;README-CN.md&#34; &gt;简体中文&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Appwrite is an end-to-end backend server for Web, Mobile, Native, or Backend apps packaged as a set of Docker&lt;nobr&gt; microservices. Appwrite abstracts the complexity and repetitiveness required to build a modern backend API from scratch and allows you to build secure apps faster.&lt;/p&gt;
&lt;p&gt;Using Appwrite, you can easily integrate your app with user authentication and multiple sign-in methods, a database for storing and querying users and team data, storage and file management, image manipulation, Cloud Functions, messaging, and &lt;a class=&#34;link&#34; href=&#34;https://appwrite.io/docs&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;more services&lt;/a&gt;.&lt;/p&gt;
&lt;p align=&#34;center&#34;&gt;
    &lt;br /&gt;
    &lt;a href=&#34;https://www.producthunt.com/posts/appwrite-2?utm_source=badge-top-post-badge&amp;utm_medium=badge&amp;utm_souce=badge-appwrite-2&#34; target=&#34;_blank&#34;&gt;&lt;img src=&#34;https://api.producthunt.com/widgets/embed-image/v1/top-post-badge.svg?post_id=360315&amp;theme=light&amp;period=daily&#34; alt=&#34;Appwrite - 100&amp;#0037;&amp;#0032;open&amp;#0032;source&amp;#0032;alternative&amp;#0032;for&amp;#0032;Firebase | Product Hunt&#34; style=&#34;width: 250px; height: 54px;&#34; width=&#34;250&#34; height=&#34;54&#34; /&gt;&lt;/a&gt;
    &lt;br /&gt;
    &lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://producthunt.programnotes.cn/public/images/github.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Appwrite project dashboard showing various Appwrite features&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;Find out more at: &lt;a class=&#34;link&#34; href=&#34;https://appwrite.io&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://appwrite.io&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Table of Contents:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#getting-started&#34; &gt;Getting Started&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#self-hosting&#34; &gt;Self-Hosting&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#unix&#34; &gt;Unix&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#windows&#34; &gt;Windows&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#cmd&#34; &gt;CMD&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#powershell&#34; &gt;PowerShell&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#upgrade-from-an-older-version&#34; &gt;Upgrade from an Older Version&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#one-click-setups&#34; &gt;One-Click Setups&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#getting-started&#34; &gt;Getting Started&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#products&#34; &gt;Products&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#sdks&#34; &gt;SDKs&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#client&#34; &gt;Client&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#server&#34; &gt;Server&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#community&#34; &gt;Community&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#architecture&#34; &gt;Architecture&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#contributing&#34; &gt;Contributing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#security&#34; &gt;Security&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#follow-us&#34; &gt;Follow Us&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#license&#34; &gt;License&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;getting-started&#34;&gt;Getting Started
&lt;/h2&gt;&lt;p&gt;The easiest way to get started with Appwrite is by &lt;a class=&#34;link&#34; href=&#34;https://cloud.appwrite.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;signing up for Appwrite Cloud&lt;/a&gt;. While Appwrite Cloud is in public beta, you can build with Appwrite completely free, and we won&amp;rsquo;t collect you credit card information.&lt;/p&gt;
&lt;h2 id=&#34;self-hosting&#34;&gt;Self-Hosting
&lt;/h2&gt;&lt;p&gt;Appwrite is designed to run in a containerized environment. Running your server is as easy as running one command from your terminal. You can either run Appwrite on your localhost using docker-compose or on any other container orchestration tool, such as &lt;a class=&#34;link&#34; href=&#34;https://kubernetes.io/docs/home/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Kubernetes&lt;/a&gt;, &lt;a class=&#34;link&#34; href=&#34;https://docs.docker.com/engine/swarm/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Docker Swarm&lt;/a&gt;, or &lt;a class=&#34;link&#34; href=&#34;https://rancher.com/docs/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Rancher&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Before running the installation command, make sure you have &lt;a class=&#34;link&#34; href=&#34;https://www.docker.com/products/docker-desktop&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Docker&lt;/a&gt; installed on your machine:&lt;/p&gt;
&lt;h3 id=&#34;unix&#34;&gt;Unix
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker run -it --rm &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    --volume /var/run/docker.sock:/var/run/docker.sock &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    --volume &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;pwd&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;/appwrite:/usr/src/code/appwrite:rw &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    --entrypoint&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;install&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    appwrite/appwrite:1.7.2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;windows&#34;&gt;Windows
&lt;/h3&gt;&lt;h4 id=&#34;cmd&#34;&gt;CMD
&lt;/h4&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-cmd&#34; data-lang=&#34;cmd&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker run -it --rm &lt;span class=&#34;se&#34;&gt;^
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt; &lt;/span&gt;   --volume //var/run/docker.sock:/var/run/docker.sock &lt;span class=&#34;se&#34;&gt;^
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt; &lt;/span&gt;   --volume &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;%cd%&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;/appwrite:/usr/src/code/appwrite:rw &lt;span class=&#34;se&#34;&gt;^
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt; &lt;/span&gt;   --entrypoint=&lt;span class=&#34;s2&#34;&gt;&amp;#34;install&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;^
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt; &lt;/span&gt;   appwrite/appwrite:1.7.2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id=&#34;powershell&#34;&gt;PowerShell
&lt;/h4&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;docker&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;run&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-it&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;-rm&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;-volume&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;var&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;run&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;docker&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sock&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;var&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;run&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;docker&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;py&#34;&gt;sock&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;-volume&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pwd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;appwrite&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;usr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;src&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;code&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;appwrite&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rw&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;-entrypoint&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;install&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;appwrite&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;appwrite&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;1.7&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;py&#34;&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Once the Docker installation is complete, go to http://localhost to access the Appwrite console from your browser. Please note that on non-Linux native hosts, the server might take a few minutes to start after completing the installation.&lt;/p&gt;
&lt;p&gt;For advanced production and custom installation, check out our Docker &lt;a class=&#34;link&#34; href=&#34;https://appwrite.io/docs/environment-variables&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;environment variables&lt;/a&gt; docs. You can also use our public &lt;a class=&#34;link&#34; href=&#34;https://appwrite.io/install/compose&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;docker-compose.yml&lt;/a&gt; and &lt;a class=&#34;link&#34; href=&#34;https://appwrite.io/install/env&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;.env&lt;/a&gt; files to manually set up an environment.&lt;/p&gt;
&lt;h3 id=&#34;upgrade-from-an-older-version&#34;&gt;Upgrade from an Older Version
&lt;/h3&gt;&lt;p&gt;If you are upgrading your Appwrite server from an older version, you should use the Appwrite migration tool once your setup is completed. For more information regarding this, check out the &lt;a class=&#34;link&#34; href=&#34;https://appwrite.io/docs/self-hosting&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Installation Docs&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;one-click-setups&#34;&gt;One-Click Setups
&lt;/h2&gt;&lt;p&gt;In addition to running Appwrite locally, you can also launch Appwrite using a pre-configured setup. This allows you to get up and running quickly with Appwrite without installing Docker on your local machine.&lt;/p&gt;
&lt;p&gt;Choose from one of the providers below:&lt;/p&gt;
&lt;table border=&#34;0&#34;&gt;
  &lt;tr&gt;
    &lt;td align=&#34;center&#34; width=&#34;100&#34; height=&#34;100&#34;&gt;
      &lt;a href=&#34;https://marketplace.digitalocean.com/apps/appwrite&#34;&gt;
        &lt;img width=&#34;50&#34; height=&#34;39&#34; src=&#34;public/images/integrations/digitalocean-logo.svg&#34; alt=&#34;DigitalOcean Logo&#34; /&gt;
          &lt;br /&gt;&lt;sub&gt;&lt;b&gt;DigitalOcean&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;
        &lt;/a&gt;
    &lt;/td&gt;
    &lt;td align=&#34;center&#34; width=&#34;100&#34; height=&#34;100&#34;&gt;
      &lt;a href=&#34;https://gitpod.io/#https://github.com/appwrite/integration-for-gitpod&#34;&gt;
        &lt;img width=&#34;50&#34; height=&#34;39&#34; src=&#34;public/images/integrations/gitpod-logo.svg&#34; alt=&#34;Gitpod Logo&#34; /&gt;
          &lt;br /&gt;&lt;sub&gt;&lt;b&gt;Gitpod&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;    
      &lt;/a&gt;
    &lt;/td&gt;
    &lt;td align=&#34;center&#34; width=&#34;100&#34; height=&#34;100&#34;&gt;
      &lt;a href=&#34;https://www.linode.com/marketplace/apps/appwrite/appwrite/&#34;&gt;
        &lt;img width=&#34;50&#34; height=&#34;39&#34; src=&#34;public/images/integrations/akamai-logo.svg&#34; alt=&#34;Akamai Logo&#34; /&gt;
          &lt;br /&gt;&lt;sub&gt;&lt;b&gt;Akamai Compute&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;    
      &lt;/a&gt;
    &lt;/td&gt;
    &lt;td align=&#34;center&#34; width=&#34;100&#34; height=&#34;100&#34;&gt;
      &lt;a href=&#34;https://aws.amazon.com/marketplace/pp/prodview-2hiaeo2px4md6&#34;&gt;
        &lt;img width=&#34;50&#34; height=&#34;39&#34; src=&#34;public/images/integrations/aws-logo.svg&#34; alt=&#34;AWS Logo&#34; /&gt;
          &lt;br /&gt;&lt;sub&gt;&lt;b&gt;AWS Marketplace&lt;/b&gt;&lt;/sub&gt;&lt;/a&gt;    
      &lt;/a&gt;
    &lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;
&lt;h2 id=&#34;getting-started-1&#34;&gt;Getting Started
&lt;/h2&gt;&lt;p&gt;Getting started with Appwrite is as easy as creating a new project, choosing your platform, and integrating its SDK into your code. You can easily get started with your platform of choice by reading one of our Getting Started tutorials.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Platform&lt;/th&gt;
          &lt;th&gt;Technology&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Web app&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://appwrite.io/docs/quick-starts/web&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Quick start for Web&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://appwrite.io/docs/quick-starts/nextjs&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Quick start for Next.js&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://appwrite.io/docs/quick-starts/react&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Quick start for React&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://appwrite.io/docs/quick-starts/vue&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Quick start for Vue.js&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://appwrite.io/docs/quick-starts/nuxt&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Quick start for Nuxt&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://appwrite.io/docs/quick-starts/sveltekit&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Quick start for SvelteKit&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://appwrite.io/docs/quick-starts/refine&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Quick start for Refine&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://appwrite.io/docs/quick-starts/angular&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Quick start for Angular&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Mobile and Native&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://appwrite.io/docs/quick-starts/react-native&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Quick start for React Native&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://appwrite.io/docs/quick-starts/flutter&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Quick start for Flutter&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://appwrite.io/docs/quick-starts/apple&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Quick start for Apple&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://appwrite.io/docs/quick-starts/android&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Quick start for Android&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Server&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://appwrite.io/docs/quick-starts/node&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Quick start for Node.js&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://appwrite.io/docs/quick-starts/python&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Quick start for Python&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://appwrite.io/docs/quick-starts/dotnet&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Quick start for .NET&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://appwrite.io/docs/quick-starts/dart&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Quick start for Dart&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://appwrite.io/docs/quick-starts/ruby&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Quick start for Ruby&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://appwrite.io/docs/quick-starts/deno&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Quick start for Deno&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://appwrite.io/docs/quick-starts/php&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Quick start for PHP&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://appwrite.io/docs/quick-starts/kotlin&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Quick start for Kotlin&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://appwrite.io/docs/quick-starts/swift&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Quick start for Swift&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;products&#34;&gt;Products
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://appwrite.io/docs/references/cloud/client-web/account&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;strong&gt;Account&lt;/strong&gt;&lt;/a&gt; - Manage current user authentication and account. Track and manage the user sessions, devices, sign-in methods, and security logs.&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://appwrite.io/docs/server/users&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;strong&gt;Users&lt;/strong&gt;&lt;/a&gt; - Manage and list all project users when building backend integrations with Server SDKs.&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://appwrite.io/docs/references/cloud/client-web/teams&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;strong&gt;Teams&lt;/strong&gt;&lt;/a&gt; - Manage and group users in teams. Manage memberships, invites, and user roles within a team.&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://appwrite.io/docs/references/cloud/client-web/databases&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;strong&gt;Databases&lt;/strong&gt;&lt;/a&gt; - Manage databases, collections, and documents. Read, create, update, and delete documents and filter lists of document collections using advanced filters.&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://appwrite.io/docs/references/cloud/client-web/storage&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;strong&gt;Storage&lt;/strong&gt;&lt;/a&gt; - Manage storage files. Read, create, delete, and preview files. Manipulate the preview of your files to perfectly fit your app. All files are scanned by ClamAV and stored in a secure and encrypted way.&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://appwrite.io/docs/references/cloud/server-nodejs/functions&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;strong&gt;Functions&lt;/strong&gt;&lt;/a&gt; - Customize your Appwrite project by executing your custom code in a secure, isolated environment. You can trigger your code on any Appwrite system event either manually or using a CRON schedule.&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://appwrite.io/docs/references/cloud/client-web/messaging&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;strong&gt;Messaging&lt;/strong&gt;&lt;/a&gt; - Communicate with your users through push notifications, emails, and SMS text messages using Appwrite Messaging.&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://appwrite.io/docs/realtime&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;strong&gt;Realtime&lt;/strong&gt;&lt;/a&gt; - Listen to real-time events for any of your Appwrite services including users, storage, functions, databases, and more.&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://appwrite.io/docs/references/cloud/client-web/locale&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;strong&gt;Locale&lt;/strong&gt;&lt;/a&gt; - Track your user&amp;rsquo;s location and manage your app locale-based data.&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://appwrite.io/docs/references/cloud/client-web/avatars&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;strong&gt;Avatars&lt;/strong&gt;&lt;/a&gt; - Manage your users&amp;rsquo; avatars, countries&amp;rsquo; flags, browser icons, and credit card symbols. Generate QR codes from links or plaintext strings.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For the complete API documentation, visit &lt;a class=&#34;link&#34; href=&#34;https://appwrite.io/docs&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://appwrite.io/docs&lt;/a&gt;. For more tutorials, news and announcements check out our &lt;a class=&#34;link&#34; href=&#34;https://medium.com/appwrite-io&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;blog&lt;/a&gt; and &lt;a class=&#34;link&#34; href=&#34;https://discord.gg/GSeTUeA&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Discord Server&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;sdks&#34;&gt;SDKs
&lt;/h3&gt;&lt;p&gt;Below is a list of currently supported platforms and languages. If you would like to help us add support to your platform of choice, you can go over to our &lt;a class=&#34;link&#34; href=&#34;https://github.com/appwrite/sdk-generator&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;SDK Generator&lt;/a&gt; project and view our &lt;a class=&#34;link&#34; href=&#34;https://github.com/appwrite/sdk-generator/blob/master/CONTRIBUTING.md&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;contribution guide&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&#34;client&#34;&gt;Client
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;:white_check_mark:   &lt;a class=&#34;link&#34; href=&#34;https://github.com/appwrite/sdk-for-web&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Web&lt;/a&gt; (Maintained by the Appwrite Team)&lt;/li&gt;
&lt;li&gt;:white_check_mark:   &lt;a class=&#34;link&#34; href=&#34;https://github.com/appwrite/sdk-for-flutter&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Flutter&lt;/a&gt; (Maintained by the Appwrite Team)&lt;/li&gt;
&lt;li&gt;:white_check_mark:   &lt;a class=&#34;link&#34; href=&#34;https://github.com/appwrite/sdk-for-apple&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Apple&lt;/a&gt; (Maintained by the Appwrite Team)&lt;/li&gt;
&lt;li&gt;:white_check_mark:   &lt;a class=&#34;link&#34; href=&#34;https://github.com/appwrite/sdk-for-android&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Android&lt;/a&gt; (Maintained by the Appwrite Team)&lt;/li&gt;
&lt;li&gt;:white_check_mark:   &lt;a class=&#34;link&#34; href=&#34;https://github.com/appwrite/sdk-for-react-native&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;React Native&lt;/a&gt; - &lt;strong&gt;Beta&lt;/strong&gt; (Maintained by the Appwrite Team)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;server&#34;&gt;Server
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;:white_check_mark:   &lt;a class=&#34;link&#34; href=&#34;https://github.com/appwrite/sdk-for-node&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;NodeJS&lt;/a&gt; (Maintained by the Appwrite Team)&lt;/li&gt;
&lt;li&gt;:white_check_mark:   &lt;a class=&#34;link&#34; href=&#34;https://github.com/appwrite/sdk-for-php&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;PHP&lt;/a&gt; (Maintained by the Appwrite Team)&lt;/li&gt;
&lt;li&gt;:white_check_mark:   &lt;a class=&#34;link&#34; href=&#34;https://github.com/appwrite/sdk-for-dart&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Dart&lt;/a&gt; (Maintained by the Appwrite Team)&lt;/li&gt;
&lt;li&gt;:white_check_mark:   &lt;a class=&#34;link&#34; href=&#34;https://github.com/appwrite/sdk-for-deno&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Deno&lt;/a&gt; (Maintained by the Appwrite Team)&lt;/li&gt;
&lt;li&gt;:white_check_mark:   &lt;a class=&#34;link&#34; href=&#34;https://github.com/appwrite/sdk-for-ruby&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Ruby&lt;/a&gt; (Maintained by the Appwrite Team)&lt;/li&gt;
&lt;li&gt;:white_check_mark:   &lt;a class=&#34;link&#34; href=&#34;https://github.com/appwrite/sdk-for-python&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Python&lt;/a&gt; (Maintained by the Appwrite Team)&lt;/li&gt;
&lt;li&gt;:white_check_mark:   &lt;a class=&#34;link&#34; href=&#34;https://github.com/appwrite/sdk-for-kotlin&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Kotlin&lt;/a&gt; (Maintained by the Appwrite Team)&lt;/li&gt;
&lt;li&gt;:white_check_mark:   &lt;a class=&#34;link&#34; href=&#34;https://github.com/appwrite/sdk-for-swift&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Swift&lt;/a&gt; (Maintained by the Appwrite Team)&lt;/li&gt;
&lt;li&gt;:white_check_mark:   &lt;a class=&#34;link&#34; href=&#34;https://github.com/appwrite/sdk-for-dotnet&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;.NET&lt;/a&gt; - &lt;strong&gt;Beta&lt;/strong&gt; (Maintained by the Appwrite Team)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;community&#34;&gt;Community
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;:white_check_mark:   &lt;a class=&#34;link&#34; href=&#34;https://github.com/m1ga/ti.appwrite&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Appcelerator Titanium&lt;/a&gt; (Maintained by &lt;a class=&#34;link&#34; href=&#34;https://github.com/m1ga/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Michael Gangolf&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;:white_check_mark:   &lt;a class=&#34;link&#34; href=&#34;https://github.com/GodotNuts/appwrite-sdk&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Godot Engine&lt;/a&gt; (Maintained by &lt;a class=&#34;link&#34; href=&#34;https://github.com/fenix-hub&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;fenix-hub @GodotNuts&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Looking for more SDKs? - Help us by contributing a pull request to our &lt;a class=&#34;link&#34; href=&#34;https://github.com/appwrite/sdk-generator&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;SDK Generator&lt;/a&gt;!&lt;/p&gt;
&lt;h2 id=&#34;architecture&#34;&gt;Architecture
&lt;/h2&gt;&lt;p&gt;&lt;img src=&#34;https://producthunt.programnotes.cn/docs/specs/overview.drawio.svg&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Appwrite Architecture showing how Appwrite is built and the services and tools it uses&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;Appwrite uses a microservices architecture that was designed for easy scaling and delegation of responsibilities. In addition, Appwrite supports multiple APIs, such as REST, WebSocket, and GraphQL to allow you to interact with your resources by leveraging your existing knowledge and protocols of choice.&lt;/p&gt;
&lt;p&gt;The Appwrite API layer was designed to be extremely fast by leveraging in-memory caching and delegating any heavy-lifting tasks to the Appwrite background workers. The background workers also allow you to precisely control your compute capacity and costs using a message queue to handle the load. You can learn more about our architecture in the &lt;a class=&#34;link&#34; href=&#34;CONTRIBUTING.md#architecture-1&#34; &gt;contribution guide&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;contributing&#34;&gt;Contributing
&lt;/h2&gt;&lt;p&gt;All code contributions, including those of people having commit access, must go through a pull request and be approved by a core developer before being merged. This is to ensure a proper review of all the code.&lt;/p&gt;
&lt;p&gt;We truly :heart: pull requests! If you wish to help, you can learn more about how you can contribute to this project in the &lt;a class=&#34;link&#34; href=&#34;CONTRIBUTING.md&#34; &gt;contribution guide&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;security&#34;&gt;Security
&lt;/h2&gt;&lt;p&gt;For security issues, kindly email us at &lt;a class=&#34;link&#34; href=&#34;mailto:security@appwrite.io&#34; &gt;security@appwrite.io&lt;/a&gt; instead of posting a public issue on GitHub.&lt;/p&gt;
&lt;h2 id=&#34;follow-us&#34;&gt;Follow Us
&lt;/h2&gt;&lt;p&gt;Join our growing community around the world! Check out our official &lt;a class=&#34;link&#34; href=&#34;https://appwrite.io/blog&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Blog&lt;/a&gt;. Follow us on &lt;a class=&#34;link&#34; href=&#34;https://twitter.com/appwrite&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;X&lt;/a&gt;, &lt;a class=&#34;link&#34; href=&#34;https://www.linkedin.com/company/appwrite/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;LinkedIn&lt;/a&gt;, &lt;a class=&#34;link&#34; href=&#34;https://dev.to/appwrite&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Dev Community&lt;/a&gt; or join our live &lt;a class=&#34;link&#34; href=&#34;https://appwrite.io/discord&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Discord server&lt;/a&gt; for more help, ideas, and discussions.&lt;/p&gt;
&lt;h2 id=&#34;license&#34;&gt;License
&lt;/h2&gt;&lt;p&gt;This repository is available under the &lt;a class=&#34;link&#34; href=&#34;./LICENSE&#34; &gt;BSD 3-Clause License&lt;/a&gt;.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>neon</title>
        <link>https://producthunt.programnotes.cn/en/p/neon/</link>
        <pubDate>Mon, 19 May 2025 15:30:21 +0800</pubDate>
        
        <guid>https://producthunt.programnotes.cn/en/p/neon/</guid>
        <description>&lt;img src="https://images.unsplash.com/photo-1649999361030-3bb0ac366598?ixid=M3w0NjAwMjJ8MHwxfHJhbmRvbXx8fHx8fHx8fDE3NDc2Mzk3MzV8&amp;ixlib=rb-4.1.0" alt="Featured image of post neon" /&gt;&lt;h1 id=&#34;neondatabaseneon&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/neondatabase/neon&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;neondatabase/neon&lt;/a&gt;
&lt;/h1&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://neon.tech&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://github.com/neondatabase/neon/assets/11527560/f15a17f0-836e-40c5-b35d-030606a6b660&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Neon&#34;
	
	
&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;neon&#34;&gt;Neon
&lt;/h1&gt;&lt;p&gt;Neon is a serverless open-source alternative to AWS Aurora Postgres. It separates storage and compute and substitutes the PostgreSQL storage layer by redistributing data across a cluster of nodes.&lt;/p&gt;
&lt;h2 id=&#34;quick-start&#34;&gt;Quick start
&lt;/h2&gt;&lt;p&gt;Try the &lt;a class=&#34;link&#34; href=&#34;https://neon.tech/github&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Neon Free Tier&lt;/a&gt; to create a serverless Postgres instance. Then connect to it with your preferred Postgres client (psql, dbeaver, etc) or use the online &lt;a class=&#34;link&#34; href=&#34;https://neon.tech/docs/get-started-with-neon/query-with-neon-sql-editor/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;SQL Editor&lt;/a&gt;. See &lt;a class=&#34;link&#34; href=&#34;https://neon.tech/docs/connect/connect-from-any-app/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Connect from any application&lt;/a&gt; for connection instructions.&lt;/p&gt;
&lt;p&gt;Alternatively, compile and run the project &lt;a class=&#34;link&#34; href=&#34;#running-local-installation&#34; &gt;locally&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;architecture-overview&#34;&gt;Architecture overview
&lt;/h2&gt;&lt;p&gt;A Neon installation consists of compute nodes and the Neon storage engine. Compute nodes are stateless PostgreSQL nodes backed by the Neon storage engine.&lt;/p&gt;
&lt;p&gt;The Neon storage engine consists of two major components:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pageserver: Scalable storage backend for the compute nodes.&lt;/li&gt;
&lt;li&gt;Safekeepers: The safekeepers form a redundant WAL service that received WAL from the compute node, and stores it durably until it has been processed by the pageserver and uploaded to cloud storage.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;See developer documentation in &lt;a class=&#34;link&#34; href=&#34;https://producthunt.programnotes.cn/docs/SUMMARY.md&#34; &gt;SUMMARY.md&lt;/a&gt; for more information.&lt;/p&gt;
&lt;h2 id=&#34;running-a-local-development-environment&#34;&gt;Running a local development environment
&lt;/h2&gt;&lt;p&gt;Neon can be run on a workstation for small experiments and to test code changes, by
following these instructions.&lt;/p&gt;
&lt;h4 id=&#34;installing-dependencies-on-linux&#34;&gt;Installing dependencies on Linux
&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;Install build dependencies and other applicable packages&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;On Ubuntu or Debian, this set of packages should be sufficient to build the code:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;apt install build-essential libtool libreadline-dev zlib1g-dev flex bison libseccomp-dev &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;libssl-dev clang pkg-config libpq-dev cmake postgresql-client protobuf-compiler &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;libprotobuf-dev libcurl4-openssl-dev openssl python3-poetry lsof libicu-dev
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;On Fedora, these packages are needed:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;dnf install flex bison readline-devel zlib-devel openssl-devel &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  libseccomp-devel perl clang cmake postgresql postgresql-contrib protobuf-compiler &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  protobuf-devel libcurl-devel openssl poetry lsof libicu-devel libpq-devel python3-devel &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  libffi-devel
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;On Arch based systems, these packages are needed:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pacman -S base-devel readline zlib libseccomp openssl clang &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;postgresql-libs cmake postgresql protobuf curl lsof
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Building Neon requires 3.15+ version of &lt;code&gt;protoc&lt;/code&gt; (protobuf-compiler). If your distribution provides an older version, you can install a newer version from &lt;a class=&#34;link&#34; href=&#34;https://github.com/protocolbuffers/protobuf/releases&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.rust-lang.org/tools/install&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Install Rust&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-gdscript3&#34; data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# recommended approach from https://www.rust-lang.org/tools/install&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;curl&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;proto&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;=https&amp;#39;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tlsv1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sSf&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;https&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sh&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rustup&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rs&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sh&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id=&#34;installing-dependencies-on-macos-1231&#34;&gt;Installing dependencies on macOS (12.3.1)
&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;Install XCode and dependencies&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-gdscript3&#34; data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;xcode&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;select&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;install&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;brew&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;install&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;protobuf&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;openssl&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;flex&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;bison&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;icu4c&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pkg&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;config&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;m4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# add openssl to PATH, required for ed25519 keys generation in neon_local&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;export PATH=&amp;#34;$(brew --prefix openssl)/bin:$PATH&amp;#34;&amp;#39;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;~/.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;zshrc&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;If you get errors about missing &lt;code&gt;m4&lt;/code&gt; you may have to install it manually:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;brew install m4
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;brew link --force m4
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.rust-lang.org/tools/install&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Install Rust&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-gdscript3&#34; data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# recommended approach from https://www.rust-lang.org/tools/install&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;curl&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;proto&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;=https&amp;#39;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tlsv1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sSf&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;https&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sh&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rustup&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rs&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sh&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;Install PostgreSQL Client&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# from https://stackoverflow.com/questions/44654216/correct-way-to-install-psql-without-full-postgres-on-macos
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;brew install libpq
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;brew link --force libpq
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id=&#34;rustc-version&#34;&gt;Rustc version
&lt;/h4&gt;&lt;p&gt;The project uses &lt;a class=&#34;link&#34; href=&#34;./rust-toolchain.toml&#34; &gt;rust toolchain file&lt;/a&gt; to define the version it&amp;rsquo;s built with in CI for testing and local builds.&lt;/p&gt;
&lt;p&gt;This file is automatically picked up by &lt;a class=&#34;link&#34; href=&#34;https://rust-lang.github.io/rustup/overrides.html#the-toolchain-file&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;code&gt;rustup&lt;/code&gt;&lt;/a&gt; that installs (if absent) and uses the toolchain version pinned in the file.&lt;/p&gt;
&lt;p&gt;rustup users who want to build with another toolchain can use the &lt;a class=&#34;link&#34; href=&#34;https://rust-lang.github.io/rustup/overrides.html#directory-overrides&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;code&gt;rustup override&lt;/code&gt;&lt;/a&gt; command to set a specific toolchain for the project&amp;rsquo;s directory.&lt;/p&gt;
&lt;p&gt;non-rustup users most probably are not getting the same toolchain automatically from the file, so are responsible to manually verify that their toolchain matches the version in the file.
Newer rustc versions most probably will work fine, yet older ones might not be supported due to some new features used by the project or the crates.&lt;/p&gt;
&lt;h4 id=&#34;building-on-linux&#34;&gt;Building on Linux
&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;Build neon and patched postgres&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-mysql&#34; data-lang=&#34;mysql&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Note: The path to the neon sources can not contain a space.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;git&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;clone&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;--&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;recursive&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;https&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;github&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;com&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;neondatabase&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;neon&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;git&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;cd&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;neon&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# The preferred and default is to make a debug build. This will create a
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# demonstrably slower build than a release build. For a release build,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# use &amp;#34;BUILD_TYPE=release make -j`nproc` -s&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Remove -s for the verbose build log
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;make&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;j&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nproc&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id=&#34;building-on-osx&#34;&gt;Building on OSX
&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;Build neon and patched postgres&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# Note: The path to the neon sources can not contain a space.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git clone --recursive https://github.com/neondatabase/neon.git
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cd neon
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# The preferred and default is to make a debug build. This will create a
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# demonstrably slower build than a release build. For a release build,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# use &amp;#34;BUILD_TYPE=release make -j`sysctl -n hw.logicalcpu` -s&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# Remove -s for the verbose build log
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;make -j`sysctl -n hw.logicalcpu` -s
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id=&#34;dependency-installation-notes&#34;&gt;Dependency installation notes
&lt;/h4&gt;&lt;p&gt;To run the &lt;code&gt;psql&lt;/code&gt; client, install the &lt;code&gt;postgresql-client&lt;/code&gt; package or modify &lt;code&gt;PATH&lt;/code&gt; and &lt;code&gt;LD_LIBRARY_PATH&lt;/code&gt; to include &lt;code&gt;pg_install/bin&lt;/code&gt; and &lt;code&gt;pg_install/lib&lt;/code&gt;, respectively.&lt;/p&gt;
&lt;p&gt;To run the integration tests or Python scripts (not required to use the code), install
Python (3.11 or higher), and install the python3 packages using &lt;code&gt;./scripts/pysync&lt;/code&gt; (requires &lt;a class=&#34;link&#34; href=&#34;https://python-poetry.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;poetry&amp;gt;=1.8&lt;/a&gt;) in the project directory.&lt;/p&gt;
&lt;h4 id=&#34;running-neon-database&#34;&gt;Running neon database
&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;Start pageserver and postgres on top of it (should be called from repo root):&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;24
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;25
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;26
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;27
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;28
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;29
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;30
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;31
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;32
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Create repository in .neon with proper paths to binaries and data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Later that would be responsibility of a package install script&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;gt; cargo neon init
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Initializing pageserver node &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; at &lt;span class=&#34;s1&#34;&gt;&amp;#39;127.0.0.1:64000&amp;#39;&lt;/span&gt; in &lt;span class=&#34;s2&#34;&gt;&amp;#34;.neon&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# start pageserver, safekeeper, and broker for their intercommunication&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;gt; cargo neon start
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Starting neon broker at 127.0.0.1:50051.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;storage_broker started, pid: &lt;span class=&#34;m&#34;&gt;2918372&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Starting pageserver node &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; at &lt;span class=&#34;s1&#34;&gt;&amp;#39;127.0.0.1:64000&amp;#39;&lt;/span&gt; in &lt;span class=&#34;s2&#34;&gt;&amp;#34;.neon&amp;#34;&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pageserver started, pid: &lt;span class=&#34;m&#34;&gt;2918386&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Starting safekeeper at &lt;span class=&#34;s1&#34;&gt;&amp;#39;127.0.0.1:5454&amp;#39;&lt;/span&gt; in &lt;span class=&#34;s1&#34;&gt;&amp;#39;.neon/safekeepers/sk1&amp;#39;&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;safekeeper &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; started, pid: &lt;span class=&#34;m&#34;&gt;2918437&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# create initial tenant and use it as a default for every future neon_local invocation&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;gt; cargo neon tenant create --set-default
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;tenant 9ef87a5bf0d92544f6fafeeb3239695c successfully created on the pageserver
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Created an initial timeline &lt;span class=&#34;s1&#34;&gt;&amp;#39;de200bd42b49cc1814412c7e592dd6e9&amp;#39;&lt;/span&gt; at Lsn 0/16B5A50 &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; tenant: 9ef87a5bf0d92544f6fafeeb3239695c
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Setting tenant 9ef87a5bf0d92544f6fafeeb3239695c as a default one
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# create postgres compute node&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;gt; cargo neon endpoint create main
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# start postgres compute node&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;gt; cargo neon endpoint start main
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Starting new endpoint main &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;PostgreSQL v14&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; on timeline de200bd42b49cc1814412c7e592dd6e9 ...
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Starting postgres at &lt;span class=&#34;s1&#34;&gt;&amp;#39;postgresql://cloud_admin@127.0.0.1:55432/postgres&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# check list of running postgres instances&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;gt; cargo neon endpoint list
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; ENDPOINT  ADDRESS          TIMELINE                          BRANCH NAME  LSN        STATUS
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; main      127.0.0.1:55432  de200bd42b49cc1814412c7e592dd6e9  main         0/16B5BA8  running
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;Now, it is possible to connect to postgres and run some queries:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;gt; psql -p 55432 -h 127.0.0.1 -U cloud_admin postgres
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;postgres=# CREATE TABLE t(key int primary key, value text);
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;CREATE TABLE
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;postgres=# insert into t values(1,1);
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;INSERT 0 1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;postgres=# select * from t;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; key | value
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-----+-------
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   1 | 1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;(1 row)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;And create branches and run postgres on them:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;24
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;25
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;26
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;27
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;28
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;29
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;30
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;31
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;32
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;33
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;34
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;35
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;36
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;37
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;38
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;39
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;40
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;41
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;42
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# create branch named migration_check&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;gt; cargo neon timeline branch --branch-name migration_check
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Created timeline &lt;span class=&#34;s1&#34;&gt;&amp;#39;b3b863fa45fa9e57e615f9f2d944e601&amp;#39;&lt;/span&gt; at Lsn 0/16F9A00 &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; tenant: 9ef87a5bf0d92544f6fafeeb3239695c. Ancestor timeline: &lt;span class=&#34;s1&#34;&gt;&amp;#39;main&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# check branches tree&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;gt; cargo neon timeline list
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;L&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; main &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;de200bd42b49cc1814412c7e592dd6e9&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;L&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; ┗━ @0/16F9A00: migration_check &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;b3b863fa45fa9e57e615f9f2d944e601&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# create postgres on that branch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;gt; cargo neon endpoint create migration_check --branch-name migration_check
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# start postgres on that branch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;gt; cargo neon endpoint start migration_check
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Starting new endpoint migration_check &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;PostgreSQL v14&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; on timeline b3b863fa45fa9e57e615f9f2d944e601 ...
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Starting postgres at &lt;span class=&#34;s1&#34;&gt;&amp;#39;postgresql://cloud_admin@127.0.0.1:55434/postgres&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# check the new list of running postgres instances&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;gt; cargo neon endpoint list
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; ENDPOINT         ADDRESS          TIMELINE                          BRANCH NAME      LSN        STATUS
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; main             127.0.0.1:55432  de200bd42b49cc1814412c7e592dd6e9  main             0/16F9A38  running
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; migration_check  127.0.0.1:55434  b3b863fa45fa9e57e615f9f2d944e601  migration_check  0/16F9A70  running
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# this new postgres instance will have all the data from &amp;#39;main&amp;#39; postgres,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# but all modifications would not affect data in original postgres&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;gt; psql -p &lt;span class=&#34;m&#34;&gt;55434&lt;/span&gt; -h 127.0.0.1 -U cloud_admin postgres
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;postgres&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# select * from t;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; key &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; value
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-----+-------
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; row&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;postgres&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# insert into t values(2,2);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;INSERT &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# check that the new change doesn&amp;#39;t affect the &amp;#39;main&amp;#39; postgres&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;gt; psql -p &lt;span class=&#34;m&#34;&gt;55432&lt;/span&gt; -h 127.0.0.1 -U cloud_admin postgres
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;postgres&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# select * from t;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; key &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; value
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-----+-------
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; row&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;If you want to run tests afterwards (see below), you must stop all the running pageserver, safekeeper, and postgres instances
you have just started. You can terminate them all with one command:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;gt; cargo neon stop
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;More advanced usages can be found at &lt;a class=&#34;link&#34; href=&#34;./control_plane/README.md&#34; &gt;Local Development Control Plane (&lt;code&gt;neon_local&lt;/code&gt;))&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&#34;handling-build-failures&#34;&gt;Handling build failures
&lt;/h4&gt;&lt;p&gt;If you encounter errors during setting up the initial tenant, it&amp;rsquo;s best to stop everything (&lt;code&gt;cargo neon stop&lt;/code&gt;) and remove the &lt;code&gt;.neon&lt;/code&gt; directory. Then fix the problems, and start the setup again.&lt;/p&gt;
&lt;h2 id=&#34;running-tests&#34;&gt;Running tests
&lt;/h2&gt;&lt;h3 id=&#34;rust-unit-tests&#34;&gt;Rust unit tests
&lt;/h3&gt;&lt;p&gt;We are using &lt;a class=&#34;link&#34; href=&#34;https://nexte.st/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;code&gt;cargo-nextest&lt;/code&gt;&lt;/a&gt; to run the tests in Github Workflows.
Some crates do not support running plain &lt;code&gt;cargo test&lt;/code&gt; anymore, prefer &lt;code&gt;cargo nextest run&lt;/code&gt; instead.
You can install &lt;code&gt;cargo-nextest&lt;/code&gt; with &lt;code&gt;cargo install cargo-nextest&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;integration-tests&#34;&gt;Integration tests
&lt;/h3&gt;&lt;p&gt;Ensure your dependencies are installed as described &lt;a class=&#34;link&#34; href=&#34;https://github.com/neondatabase/neon#dependency-installation-notes&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git clone --recursive https://github.com/neondatabase/neon.git
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;CARGO_BUILD_FLAGS&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;--features=testing&amp;#34;&lt;/span&gt; make
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;./scripts/pytest
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;By default, this runs both debug and release modes, and all supported postgres versions. When
testing locally, it is convenient to run just one set of permutations, like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;DEFAULT_PG_VERSION&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;17&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;BUILD_TYPE&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;release ./scripts/pytest
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;flamegraphs&#34;&gt;Flamegraphs
&lt;/h2&gt;&lt;p&gt;You may find yourself in need of flamegraphs for software in this repository.
You can use &lt;a class=&#34;link&#34; href=&#34;https://github.com/flamegraph-rs/flamegraph&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;code&gt;flamegraph-rs&lt;/code&gt;&lt;/a&gt; or the original &lt;a class=&#34;link&#34; href=&#34;https://github.com/brendangregg/FlameGraph&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;code&gt;flamegraph.pl&lt;/code&gt;&lt;/a&gt;. Your choice!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]
If you&amp;rsquo;re using &lt;code&gt;lld&lt;/code&gt; or &lt;code&gt;mold&lt;/code&gt;, you need the &lt;code&gt;--no-rosegment&lt;/code&gt; linker argument.
It&amp;rsquo;s a &lt;a class=&#34;link&#34; href=&#34;https://crbug.com/919499#c16&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;general thing with Rust / lld / mold&lt;/a&gt;, not specific to this repository.
See &lt;a class=&#34;link&#34; href=&#34;https://github.com/neondatabase/neon/pull/6764&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;this PR for further instructions&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;cleanup&#34;&gt;Cleanup
&lt;/h2&gt;&lt;p&gt;For cleaning up the source tree from build artifacts, run &lt;code&gt;make clean&lt;/code&gt; in the source directory.&lt;/p&gt;
&lt;p&gt;For removing every artifact from build and configure steps, run &lt;code&gt;make distclean&lt;/code&gt;, and also consider removing the cargo binaries in the &lt;code&gt;target&lt;/code&gt; directory, as well as the database in the &lt;code&gt;.neon&lt;/code&gt; directory. Note that removing the &lt;code&gt;.neon&lt;/code&gt; directory will remove your database, with all data in it. You have been warned!&lt;/p&gt;
&lt;h2 id=&#34;documentation&#34;&gt;Documentation
&lt;/h2&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://producthunt.programnotes.cn/docs&#34; &gt;docs&lt;/a&gt; Contains a top-level overview of all available markdown documentation.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://producthunt.programnotes.cn/docs/sourcetree.md&#34; &gt;sourcetree.md&lt;/a&gt; contains overview of source tree layout.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To view your &lt;code&gt;rustdoc&lt;/code&gt; documentation in a browser, try running &lt;code&gt;cargo doc --no-deps --open&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;See also README files in some source directories, and &lt;code&gt;rustdoc&lt;/code&gt; style documentation comments.&lt;/p&gt;
&lt;p&gt;Other resources:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://neon.tech/blog/hello-world/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;SELECT &amp;lsquo;Hello, World&amp;rsquo;&lt;/a&gt;: Blog post by Nikita Shamgunov on the high level architecture&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://neon.tech/blog/architecture-decisions-in-neon/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Architecture decisions in Neon&lt;/a&gt;: Blog post by Heikki Linnakangas&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.youtube.com/watch?v=rES0yzeERns&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Neon: Serverless PostgreSQL!&lt;/a&gt;: Presentation on storage system by Heikki Linnakangas in the CMU Database Group seminar series&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;postgres-specific-terms&#34;&gt;Postgres-specific terms
&lt;/h3&gt;&lt;p&gt;Due to Neon&amp;rsquo;s very close relation with PostgreSQL internals, numerous specific terms are used.
The same applies to certain spelling: i.e. we use MB to denote 1024 * 1024 bytes, while MiB would be technically more correct, it&amp;rsquo;s inconsistent with what PostgreSQL code and its documentation use.&lt;/p&gt;
&lt;p&gt;To get more familiar with this aspect, refer to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://producthunt.programnotes.cn/docs/glossary.md&#34; &gt;Neon glossary&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.postgresql.org/docs/14/glossary.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;PostgreSQL glossary&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Other PostgreSQL documentation and sources (Neon fork sources can be found &lt;a class=&#34;link&#34; href=&#34;https://github.com/neondatabase/postgres&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;here&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;join-the-development&#34;&gt;Join the development
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Read &lt;a class=&#34;link&#34; href=&#34;https://producthunt.programnotes.cn/CONTRIBUTING.md&#34; &gt;CONTRIBUTING.md&lt;/a&gt; to learn about project code style and practices.&lt;/li&gt;
&lt;li&gt;To get familiar with a source tree layout, use &lt;a class=&#34;link&#34; href=&#34;https://producthunt.programnotes.cn/docs/sourcetree.md&#34; &gt;sourcetree.md&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;To learn more about PostgreSQL internals, check &lt;a class=&#34;link&#34; href=&#34;http://www.interdb.jp/pg/index.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://www.interdb.jp/pg/index.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        
    </channel>
</rss>
