<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Emma Tang]]></title><description><![CDATA[engineering, meditation, and other thoughts]]></description><link>https://www.emmatang.xyz</link><image><url>https://substackcdn.com/image/fetch/$s_!W5-K!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54da7027-78bf-4034-9bbd-c5ba2c82bb48_608x608.png</url><title>Emma Tang</title><link>https://www.emmatang.xyz</link></image><generator>Substack</generator><lastBuildDate>Fri, 24 Apr 2026 12:59:18 GMT</lastBuildDate><atom:link href="https://www.emmatang.xyz/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Emma Tang]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[orionblue@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[orionblue@substack.com]]></itunes:email><itunes:name><![CDATA[Emma Tang]]></itunes:name></itunes:owner><itunes:author><![CDATA[Emma Tang]]></itunes:author><googleplay:owner><![CDATA[orionblue@substack.com]]></googleplay:owner><googleplay:email><![CDATA[orionblue@substack.com]]></googleplay:email><googleplay:author><![CDATA[Emma Tang]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[45 days of silence - meditating 16 hours a day for 45 days]]></title><description><![CDATA[I recently came back from a 6 week meditation retreat.]]></description><link>https://www.emmatang.xyz/p/45-days-of-silence-meditating-16-hours-a-day-for-45-days</link><guid isPermaLink="false">https://www.emmatang.xyz/p/45-days-of-silence-meditating-16-hours-a-day-for-45-days</guid><dc:creator><![CDATA[Emma Tang]]></dc:creator><pubDate>Thu, 01 Dec 2022 02:44:11 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/752b5ab3-3b42-4940-85d0-7bad5d1d6113_2989x1688.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NWCs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13e9aee9-6896-494d-8954-b5d9b621b7df_2989x1688.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NWCs!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13e9aee9-6896-494d-8954-b5d9b621b7df_2989x1688.jpeg 424w, https://substackcdn.com/image/fetch/$s_!NWCs!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13e9aee9-6896-494d-8954-b5d9b621b7df_2989x1688.jpeg 848w, https://substackcdn.com/image/fetch/$s_!NWCs!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13e9aee9-6896-494d-8954-b5d9b621b7df_2989x1688.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!NWCs!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13e9aee9-6896-494d-8954-b5d9b621b7df_2989x1688.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NWCs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13e9aee9-6896-494d-8954-b5d9b621b7df_2989x1688.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/13e9aee9-6896-494d-8954-b5d9b621b7df_2989x1688.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;45 days of silence - meditating 16 hours a day for 45 days&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="45 days of silence - meditating 16 hours a day for 45 days" title="45 days of silence - meditating 16 hours a day for 45 days" srcset="https://substackcdn.com/image/fetch/$s_!NWCs!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13e9aee9-6896-494d-8954-b5d9b621b7df_2989x1688.jpeg 424w, https://substackcdn.com/image/fetch/$s_!NWCs!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13e9aee9-6896-494d-8954-b5d9b621b7df_2989x1688.jpeg 848w, https://substackcdn.com/image/fetch/$s_!NWCs!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13e9aee9-6896-494d-8954-b5d9b621b7df_2989x1688.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!NWCs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13e9aee9-6896-494d-8954-b5d9b621b7df_2989x1688.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><p>I recently came back from a 6 week meditation retreat. I've done long silent retreats before, but 6 weeks was still a challenge for me. Many friends have asked how my experience was, so I thought I'd share some of my notes here.</p><p><strong>What is a meditation retreat like?</strong></p><p>The retreat center I went to follows a Burmese Buddhist tradition which emphasizes doing a lot of continuous meditation. Food and lodging were taken care of, with around 80 of us in the cohort. During the retreat, there was no talking, no phones, no reading, no internet, and little to no eye contact (in a meditative state, it can be distracting).</p><p>Every 45 minutes or 1 hour, we alternate between sitting meditation in the meditation hall, or walking meditation indoors or on the beautiful grounds - a sprawling few hundred acres - see header photo.</p><p>We had a dharma talk every day, and every few days we'd have 1-1 time with our meditation teachers, who have extensive meditation experience and are sometimes ordained monks or nuns.</p><p>Every day the schedule was identical, there were no weekends or off days, and after a while things like dates along the rest of the outside world fade away.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Uzjr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8048ef23-b39c-4810-b4eb-e1a0a795c935_3024x4032.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Uzjr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8048ef23-b39c-4810-b4eb-e1a0a795c935_3024x4032.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Uzjr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8048ef23-b39c-4810-b4eb-e1a0a795c935_3024x4032.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Uzjr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8048ef23-b39c-4810-b4eb-e1a0a795c935_3024x4032.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Uzjr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8048ef23-b39c-4810-b4eb-e1a0a795c935_3024x4032.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Uzjr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8048ef23-b39c-4810-b4eb-e1a0a795c935_3024x4032.jpeg" width="2000" height="2667" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8048ef23-b39c-4810-b4eb-e1a0a795c935_3024x4032.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:2667,&quot;width&quot;:2000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;45 days of silence - meditating 16 hours a day for 45 days&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="45 days of silence - meditating 16 hours a day for 45 days" title="45 days of silence - meditating 16 hours a day for 45 days" srcset="https://substackcdn.com/image/fetch/$s_!Uzjr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8048ef23-b39c-4810-b4eb-e1a0a795c935_3024x4032.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Uzjr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8048ef23-b39c-4810-b4eb-e1a0a795c935_3024x4032.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Uzjr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8048ef23-b39c-4810-b4eb-e1a0a795c935_3024x4032.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Uzjr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8048ef23-b39c-4810-b4eb-e1a0a795c935_3024x4032.jpeg 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">the daily schedule</figcaption></figure></div><p><strong>How does your mind change after 45 days of meditation?</strong></p><p>Meditation is like spring cleaning for your brain. All the stuff you've been stowing in the corners get to see the light of day. This includes beautiful memories of childhood joy, deep gratitude, but also negative patterns like aversion, "I dislike this other person, I wish my meditation was easier", or worry and anxiety, "Maybe this a a huge waste of time, if I don't get to a peaceful state then I've failed".</p><p>In the beginning, these thoughts and feelings are recognized and let go, and as you gain momentum, things just fall away on their own. What's left is peace and happiness. Happiness in meditation feels like a sweet contentment, an urge to smile.</p><p>From these moments of peace and happiness, perspective naturally develops. What felt like threatening and urgent issues, just don't feel that urgent or important anymore, and often a solution that wasn't previously obvious arises.</p><p>Most people experience deepening states of peace, calm, a deeper appreciation of beauty, a sense that they are more "alive", a feeling of warmth and brightness emanating from within, more love and compassion for everyone, and insights on their own life and what life is about in general.</p><p>These insights are whole body experiences, where you "know" the truth of something. It's a lived experience that has the potency to change one's values.</p><p>The feeling that every sight, sound, and experience is fresh and new and sparkly does go away eventually when you're back in the real world. But these insights stay and work their way into your life, albeit gradually. Often one will see changes in their decision making around 2-3 months after a retreat, without needing any conscious action. Some insights from my retreat are jotted down at the end of this note.</p><p><strong>What about changes in the body? What was it like to be attuned with a natural circadian rhythm?</strong></p><p>I'm a natural late riser, so the 5:00am wake time coupled with the jetlag was brutal for me. It took a good 2 weeks for me to acclimate, and even then not fully.</p><p>But waking up before the sun rises and seeing the sun rise and fall each day does improve one's mood and outlook. There's more hopefulness and optimism, and a connectedness to nature. The smell of fresh morning air with light dew, how the sunlight breaks the darkness each morning. You'll see how light hits the forest differently each day, and notice how the seasons change along with the path of the sun.</p><p>Sleep usually improves. I don't usually have sleep issues, but I tend to sleep even more deeply here, falling asleep more easily and waking up naturally with no need for alarms. Digestion improves. Complexion improves. I don't know if it's the vegetarian diet, the sleep, or the meditation, but skin texture usually improves and there's a brightness to the complexion.</p><p>The downside here is that unless you bring extra nutrition and add in your own exercise routine, you'll likely lose weight and muscle mass. Sitting and walking slowly daily doesn't help, especially if you had a rigorous program going in. I try to bulk up a bit before going, and also do daily body weight exercises, but some say rigorous exercising can break the meditative state. I lost weight and muscle mass even with daily exercising, but I also followed the 8 precepts and did not eat after lunch.</p><p><strong>What was the most difficult part? What did I miss the most?</strong></p><p>The most difficult part was deciding to go in the first place. The common ill of our time is the curse of opportunity cost aka fomo. "I could be spending time with family and friends, or traveling in Europe, or making progress in my business, etc". The psychological stress of weighing options was the hardest part. Once the decision was made, everything was pretty easy. If you've been to 10 day silent retreats, a 45 day is not that different. Once you're in a meditate state, time flows differently anyways. When you're in it, it's like time doesn't exist. When you're out and reflect back, it seems like only a few days have passed.</p><p>I did find myself missing some surprising things. Outside of missing my people, the top thing I missed was reading. The fact that we can pick up a book to learn about any topic any time seems like magic when you can't do so. Everyone has individual rooms on the retreat, which was great, but I sorely missed having more physical space and my creature comforts. I also missed the nature in the Bay Area. We really have some of the most majestic nature here, and I felt that I hadn't taken advantage of it enough while I was home.</p><p><strong>What was the most difficult part in coming back to the "real world"?</strong></p><p>Meditation sensitizes you to your thoughts and feelings, including suffering / stress. So after feeling so much peace and love, going back to the news and social media where there's so much cynicism and hate felt a bit overwhelming. Seeing the evident striving of social media influencers can trigger a feeling of suffering and compassion. Other people's emotions register with you more deeply, sometimes at a level where the other person might not know what they're feeling yet.</p><p>Beautiful things will also hit you harder. Something nice that someone does for you, or a magnificent sunset can send one to tears more easily than before.</p><p>These changes also don't necessarily go away over time.</p><p><strong>Tell me more technical stuff about the retreat?</strong></p><p>For those who already have a practice and want to know more details, the retreat loosely follows the Mahasi Sayadaw lineage of insight meditation with noting, in the Theravada Buddhist tradition. For the first few weeks, every day we work on a different meditation object, loosely following the Satipatthana (Four Establishment of Mindfulness), starting with the sounds, breath, moving to the body posture etc etc. We end at open awareness, where awareness follows where attention lands.</p><p>There are also instructions for Samadhi (concentration) practice, and yogis are free to choose their meditation focus and object. &nbsp;</p><p>The teachings hew close to the Pali Canon, and Suttas are often quoted.</p><p>There's also a weekly optional Metta / Four Brahma Viharas meditation led by one of the teachers. Some opt out because in a deepened meditative state, it might not be helpful, but I found metta sessions to be beautiful and help deepen samadhi.</p><p><strong>What are some of the insights you arrived at during these 45 days?</strong></p><p>Insights are made from the stuff in each individual's psyche, so it's highly personal. If the following doesn't make sense, just skip this section.</p><p><strong>Love &amp; wholeness</strong></p><ul><li><p>If you believe in your innate goodness, it gives you the capacity to unconditionally love others.</p></li><li><p>Radically love every part of yourself, your body, your mind, your emotions, your sensations, send unconditional love to everything. Because your thoughts, feelings, and sensations are you too.</p></li><li><p>We are beings of pure love. Our capacity to love is infinite and love transforms everything else into love.</p></li><li><p>Intention matters. If your intention for practice is to improve yourself, at some point it will stop leading you forward, because inside there is a message that there is a self that needs to change / improve. The truth is everything is complete.</p></li><li><p>Dualistic view, as long as we think this this way we highlight our separateness. When we meditate, embrace unicity - the universality of consciousness. There's no start, no end, and no boundaries. When you let go of the discriminating identities, we merge into universal consciousness.</p></li><li><p>Any aversion poisons oneself. In some parts of our ancient brain, we can't differentiate us and others, every time we hate something or someone, we hate ourselves, we ruin our mood, put into motion unwholesome habit patterns to surface later. To guard the heart as a pure space, for your own good, keep love and compassion alive.</p></li><li><p>Feelings of separateness lead to fear. Feelings of unicity lead to happiness and peace. Anger, hate, judgement are are emotions of separateness, of pushing away. Love, gratitude, compassion are emotions of wholeness, of pulling closer towards.</p></li><li><p>We think we have a glimpse into our whole potential, but we don't even have the imagination required to understand our true capacity. We underestimate it by far too much.</p></li><li><p>In meditation, one is absorbing wounds and scars, merging them into the infinite and into the source. One is reparenting themselves, reliving their lives, changing the past, changing the future. Becoming one with the infinite.</p></li></ul><p><strong>Letting go</strong></p><ul><li><p>Are you busy &#8220;doing&#8221; or trying to control what just needs to be deeply accepted? How can one &#8220;do&#8221; less?</p></li><li><p>Every single person is already whole and complete, nothing is missing. But we&#8217;re used to obfuscating the truth with conditioned patterns of thought, feelings, and behavior. In the quietest of moments, when we can let go of more, the truth becomes apparent.</p></li><li><p>We get stuck on what we refuse to accept. If you feel stuck, see what you cannot fully accept. Accept fully and deeply into your bones. Once you do you world will open further, and you can move forward.</p></li><li><p>Meditation is not &#8220;doing&#8221;. You're doing nothing at all, any effort is just suffering, craving. You let go and let experience happen to you and deeply accept everything. Every single thing, accept into your core with unconditional love. This is truly being alive.</p></li><li><p>Can you, totally and wholeheartedly accept that you don&#8217;t have any control over things, even for just a moment? You will experience freedom and peace in that moment.</p></li><li><p>If you knew with 100% certainty you were going to die in the next moment, would you still cling on to what you&#8217;re clinging to right now? Being able to let go freely is the path to freedom.</p></li><li><p>In meditation, it becomes clear how little control there is over what comes up in the mind, thoughts and memories spontaneously arise, whether we want them to or not. Without control of thoughts and feelings, how much control do we have over our behavior? How much control do we have over our life? How much of life is a reaction to whatever that happens to come through the mind at the time?</p></li><li><p>letting go = completely merging into</p></li></ul><p><strong>Suffering / Stress</strong></p><ul><li><p>One can have discernment without carrying the emotional load along for the ride. One can choose to not like something without feeling the burning of aversion.</p></li><li><p>Notice both the positive and negative thoughts. Often the positive thoughts are suffering repackaged. Be wary of the need to self compliment, "I&#8217;m such a good yogi, or hard worker". Implied is a wanting for approval, and fear. Just let go.</p></li><li><p>The feeling of striving is the ultimate invisible suffering. Every moment we spend striving is a moment we&#8217;re reinforcing the message that we are not enough. Achievement is separate from the feeling of striving.</p></li><li><p>Having feelings, hard feelings, sad feelings, angry feelings, is normal, it&#8217;s a part of being alive. Notice if there&#8217;s a slight dislike of feeling these feelings, what does it feel like if you welcomed the feeling, including the disliking of it?</p></li></ul><p><strong>Happiness</strong></p><ul><li><p>To feel happy, let go of more. Let go of the worries, let go of the doubt, let go of the thoughts. The act of letting go is to surrender, instead of pushing things away, you accept things completely and let the full experience wash over you.</p></li><li><p>Happiness comes before success. Happiness enables one to see all possibilities, see reality clearly, choose the best routes, be your own friend and supporter, so success become easier.</p></li><li><p>Invite delight into your life every day. A new experience, an interesting conversation, new sights and learnings. Delight ultimately leads to clearing seeing.</p></li></ul><p><strong>Karma</strong></p><ul><li><p>All thoughts about what you want, your opinions, your fears, they are old patterns echoing through time. Upon close inspection of these thoughts and feelings, they are often jumbled images and sensations, and yet we take them to be sacred and defended at all costs. To live an entire life in this delusion is a waste of this precious life.</p></li><li><p>We are a bundle of habit patterns. Our thoughts and emotions are habits. Your relationship with yourself and with others are habits. Like a tape being played on repeat, without inspection, we live in habits cycles without awareness of them. What&#8217;s important to know is that you are not the tape. Try watching closely without assuming it&#8217;s true or false or that it is you. This is the start of freedom.</p></li><li><p>Every feeling is here to tell us something, about our worldview about our assumptions. The only question is whether we're ready to listen or not. The message will continue to repeat until taken.</p></li><li><p>This story of who you are is a constructed entity to simulate a solid sense of self. For every story that comes up, inspect it closely, how solid is this? When did this particular movie start its run? Do these thoughts and feelings come and go? What does it feel like to buy into the story and take the protagonist as yourself? What does it feel like if you didn&#8217;t identify completely with the the story and instead see it as a movie that's being played?</p></li><li><p>Actions (karma) include thoughts and feelings, all actions lead to their consequences in this lifetime and future lifetimes. The totality of one&#8217;s habits, thought patterns, tendencies give rise to the remainder of this current life and future lives. Ask yourself if your thought patterns and tendencies are the ones you want to carry into the future.</p></li><li><p>As much as possible, do things because you feel it&#8217;s truly the right thing to do. Don&#8217;t do things because you feel you need to. If you want to donate, but the suggested donation amount is higher than what you feel comfortable with, you serve yourself and your karmic path better if you choose what feels right to you.</p></li></ul>]]></content:encoded></item><item><title><![CDATA[Career paths beyond senior software engineer]]></title><description><![CDATA[You've worked hard and earned your stripes, you've gotten promoted / upleveled multiple times over the years for your hard work and contributions and now you're at the career level - senior software engineer - something that you've been eager to achieve for years.]]></description><link>https://www.emmatang.xyz/p/career-paths-beyond-senior-software-engineer</link><guid isPermaLink="false">https://www.emmatang.xyz/p/career-paths-beyond-senior-software-engineer</guid><dc:creator><![CDATA[Emma Tang]]></dc:creator><pubDate>Mon, 30 May 2022 00:18:11 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/57d59b2e-e326-4c0f-b3fc-1d3cbcc2b699_2000x1997.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!SkZi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2a1a14e-c498-446d-a876-589cd03faea3_2000x1997.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SkZi!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2a1a14e-c498-446d-a876-589cd03faea3_2000x1997.jpeg 424w, https://substackcdn.com/image/fetch/$s_!SkZi!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2a1a14e-c498-446d-a876-589cd03faea3_2000x1997.jpeg 848w, https://substackcdn.com/image/fetch/$s_!SkZi!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2a1a14e-c498-446d-a876-589cd03faea3_2000x1997.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!SkZi!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2a1a14e-c498-446d-a876-589cd03faea3_2000x1997.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SkZi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2a1a14e-c498-446d-a876-589cd03faea3_2000x1997.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c2a1a14e-c498-446d-a876-589cd03faea3_2000x1997.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Career paths beyond senior software engineer&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Career paths beyond senior software engineer" title="Career paths beyond senior software engineer" srcset="https://substackcdn.com/image/fetch/$s_!SkZi!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2a1a14e-c498-446d-a876-589cd03faea3_2000x1997.jpeg 424w, https://substackcdn.com/image/fetch/$s_!SkZi!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2a1a14e-c498-446d-a876-589cd03faea3_2000x1997.jpeg 848w, https://substackcdn.com/image/fetch/$s_!SkZi!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2a1a14e-c498-446d-a876-589cd03faea3_2000x1997.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!SkZi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2a1a14e-c498-446d-a876-589cd03faea3_2000x1997.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><p>You've worked hard and earned your stripes, you've gotten promoted / upleveled multiple times over the years for your hard work and contributions and now you're at the career level - senior software engineer - something that you've been eager to achieve for years.</p><p>Now that you're here, you're leading projects and the tech lead of your team, but the next career step seems less clear. Should you dig deeper technically in a specialized area, or contribute more to open source? Should you start taking on more team management and organizational work? Should you reach into the product and learn how the business works?</p><p>The road leading up to the senior engineer role is relatively linear, with marked goalposts, but it's less clear what lies beyond - the road underfoot forks.</p><p>In broad strokes, here are some categories -</p><p><strong>Staff engineer </strong>- be the expert in a technical area or some part of the architecture.</p><p>Top skills: deep technical experience (e.g. set up distributed computation infrastructure multiple times with various frameworks, set up tax calculation frameworks for a few fintechs, one of the top contributors to open-source Kafka etc), ability to bring people along to agree on big projects and technical directions.</p><p><strong>Engineering manager </strong>- bring people together, translate and help teams accomplish company goals.</p><p>Top skills: Ability to understand and motivate people and teams, technical experience to understand what team is working on and needs to accomplish</p><p><strong>Product Management / Business</strong> etc - work directly with customers, turn customer needs into deliverables, bring different company functions to alignment etc.</p><p>Top skills: various, but all involve bringing people together and working well with other people and teams</p><p>No matter where you go, continuing to uplevel means having a greater impact, and that is accomplished by being able to rally other people to work together on something bigger than what a single person can do.</p><p><strong>Q &amp; A</strong></p><p><strong>Myths about staff-level engineers</strong></p><p>The staff-level engineer [0] that only writes code is a myth and almost never exists - maybe if you're the only person that can contribute to a highly complex system that the company depends on (hence high impact), and the company has never tried to train or hire anyone else to create redundancy. If you're in that position, ask for a raise!</p><p><strong>I want to stay an IC but it seems like engineering management has a better promotion path.</strong></p><p>It&#8217;s about supply and demand. Notice the ratio of staff-level eng / non staff-level IC, as well as staff-level eng / eng management in your company. Some companies need more staff-level eng because of the company's product or culture, but many companies don't need many staff-level eng.</p><p>An analogy: a car factory might need one or two deep experts to come in when the machines break down, but to hire a deep expert per assembly line is excessive and not a good use of resources. Each line still needs a manager, so naturally, there are more managers than deep experts in this factory.</p><p>In a company where there are many more engineering manager roles than there are staff engineer roles, it's statistically easier to be promoted as an engineering manager.</p><p>However, your personal inclinations and interests matter more. If you know being a technical expert is what you want, find an environment inside the company or at another company that has more opportunities of this type. Being a staff-level engineer is in many ways a more defensible position. You are an area expert, and that is usually much harder to find and replace than managers.</p><p><strong>I'm interested in Product but I'm worried about losing my engineering chops.</strong></p><p>The truth is there&#8217;s a good chance you will start losing your engineering ability as well as your brand as an engineer. There's a large supply and demand gap for engineers, so moving to almost any other function means competition with a bigger pool of qualified people.</p><p>However, only you know what's right for you. If there's a chance to try another role with a low switching cost, try it out. As an engineer, you'll bring invaluable insight to product roles that will help you differentiate yourself in your career.</p><p><strong>What's the career path that gets me to the exec level the fastest?</strong></p><p>It depends. In an engineering-driven company, engineers make more decisions and lead product direction, in a sales-driven org, it might be easier to create impact from sales or operations. You can also start your own company, or join a smaller company so your impact can be proportionally larger.</p><p>At the end of the day, which role will allow you to make the biggest impact with your skills and passions? Promotions at the highest levels still work the same way - you have to show you're capable of delivering at the next level.</p><p><strong>How do I know if I'm making the right choice?</strong></p><p>Having integrity in your decisions to align with what you want is what makes a good life.</p><p>If you feel inspired and creative in your work more often than not, you're on a great path. If you feel stuck, then it's time for a reevaluation. No job will be 100% what you want, and what you enjoy may not be the same every year. Most decisions are reversible, so give things a try.</p><p>Check in at least every half a year and ask if you're learning, if you&#8217;re looking forward to coming to work, feeling connected, and making an impact. Sometimes the answer is clear if we stop and ask.<br></p><p>This post is getting long, so I'll leave out the tactical suggestions on how to change paths to another post if people are interested.</p><p>[0] <a href="https://staffeng.com/?ref=emmatang.xyz">https://staffeng.com/</a> &nbsp; &nbsp;<br></p>]]></content:encoded></item><item><title><![CDATA[Building an NFT project from scratch]]></title><description><![CDATA[I've been itching to try my hand at coding in web3, and what started as a brief exploration quickly became a project to launch end to end with all the bells and whistles that come with a production-grade software project.]]></description><link>https://www.emmatang.xyz/p/building-an-nft-project-from-scratch</link><guid isPermaLink="false">https://www.emmatang.xyz/p/building-an-nft-project-from-scratch</guid><dc:creator><![CDATA[Emma Tang]]></dc:creator><pubDate>Fri, 11 Feb 2022 18:54:49 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/aa58e939-f795-4a0f-a1a7-761f004f6714_1998x1408.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3zAN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6eefbc4-57dd-495a-8e6e-e1f586fc8e3e_1998x1408.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3zAN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6eefbc4-57dd-495a-8e6e-e1f586fc8e3e_1998x1408.png 424w, https://substackcdn.com/image/fetch/$s_!3zAN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6eefbc4-57dd-495a-8e6e-e1f586fc8e3e_1998x1408.png 848w, https://substackcdn.com/image/fetch/$s_!3zAN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6eefbc4-57dd-495a-8e6e-e1f586fc8e3e_1998x1408.png 1272w, https://substackcdn.com/image/fetch/$s_!3zAN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6eefbc4-57dd-495a-8e6e-e1f586fc8e3e_1998x1408.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3zAN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6eefbc4-57dd-495a-8e6e-e1f586fc8e3e_1998x1408.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a6eefbc4-57dd-495a-8e6e-e1f586fc8e3e_1998x1408.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Building an NFT project from scratch&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Building an NFT project from scratch" title="Building an NFT project from scratch" srcset="https://substackcdn.com/image/fetch/$s_!3zAN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6eefbc4-57dd-495a-8e6e-e1f586fc8e3e_1998x1408.png 424w, https://substackcdn.com/image/fetch/$s_!3zAN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6eefbc4-57dd-495a-8e6e-e1f586fc8e3e_1998x1408.png 848w, https://substackcdn.com/image/fetch/$s_!3zAN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6eefbc4-57dd-495a-8e6e-e1f586fc8e3e_1998x1408.png 1272w, https://substackcdn.com/image/fetch/$s_!3zAN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6eefbc4-57dd-495a-8e6e-e1f586fc8e3e_1998x1408.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><p>I've been itching to try my hand at coding in web3, and what started as a brief exploration quickly became a project to launch end to end with all the bells and whistles that come with a production-grade software project.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2eXC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8b44ada-a986-47ae-b7ee-c37c89a37de2_1080x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2eXC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8b44ada-a986-47ae-b7ee-c37c89a37de2_1080x1080.png 424w, https://substackcdn.com/image/fetch/$s_!2eXC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8b44ada-a986-47ae-b7ee-c37c89a37de2_1080x1080.png 848w, https://substackcdn.com/image/fetch/$s_!2eXC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8b44ada-a986-47ae-b7ee-c37c89a37de2_1080x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!2eXC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8b44ada-a986-47ae-b7ee-c37c89a37de2_1080x1080.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2eXC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8b44ada-a986-47ae-b7ee-c37c89a37de2_1080x1080.png" width="1080" height="1080" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a8b44ada-a986-47ae-b7ee-c37c89a37de2_1080x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1080,&quot;width&quot;:1080,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Building an NFT project from scratch&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Building an NFT project from scratch" title="Building an NFT project from scratch" srcset="https://substackcdn.com/image/fetch/$s_!2eXC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8b44ada-a986-47ae-b7ee-c37c89a37de2_1080x1080.png 424w, https://substackcdn.com/image/fetch/$s_!2eXC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8b44ada-a986-47ae-b7ee-c37c89a37de2_1080x1080.png 848w, https://substackcdn.com/image/fetch/$s_!2eXC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8b44ada-a986-47ae-b7ee-c37c89a37de2_1080x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!2eXC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8b44ada-a986-47ae-b7ee-c37c89a37de2_1080x1080.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">"vices" - pixel art</figcaption></figure></div><p>My talented friend Brent[0] doodled a collection of pixel art based on vices, and I decided to make an NFT collection out of it.</p><p>The main building blocks of the project are:</p><ol><li><p>Image combination and metadata generation algorithm. Along with managing pins via Pinata.</p></li><li><p>Solidity &amp; the smart contract</p></li><li><p>Landing page &amp; minting functionality</p></li><li><p>Server for serving landing page data, metadata, the images, and managing Opensea listings</p></li></ol><h3>Image Combination</h3><p>Brent provided 7 background images and 14 foregrounds, and I combined and upscaled them in Python with <code>PIL</code> to get 98 <code>png</code>s.</p><p>The program also generates NFT metadata in the format Opensea expects it.</p><pre><code>{
    "dna": "eebbff9f829740f4ef233d22474b8725fc9406f25025a608b7ff00ca",
    "name": "Metadreams # 0",
    "description": "What dreams are made of",
    "image": "https://ipfs.io/ipfs/QmSwxmWYdHhRP3aMErg4CWthhHgwSWMUcm78iKekGWtBhn",
    "edition": 1,
    "date": "1635482449831",
    "artist": "burn",
    "dev": "pokonono",
    "attributes": [
        {
            "trait_type": "Background",
            "value": "metadreams-molly1"
        },
        {
            "trait_type": "Dream",
            "value": "metadreams_0000_dawn"
        }
    ]
}</code></pre><p>I compute the provenance hash[1] from the image files, which we'll use later in the smart contract.</p><p>Pinata was pretty straightforward to use, even though their UI has a lot to be desired (bulk deletes please?). Their minimal API was functional enough where I could do everything I need, <code>pin</code>, <code>unpin</code>, <code>pinList</code>, so it ended up being my choice.</p><p>By generating images in parallel to take advantage of my 16 core machine, I was able to cut the generation time down by around 10x. Python made this really easy with <code>pool = mp.Pool(mp.cpu_count())</code> <code>pool.apply_async</code> .</p><h3>Solidity &amp; the Smart Contract</h3><p>Solidity isn't as hard as it seems; it's a tiny library one can pick up in a few hours. What's difficult is anticipating and identifying all the bugs therein. Luckily, NFT contracts are very straightforward. There are plenty of popular NFT projects where you can look at their contracts on etherscan[2].</p><p>Note that Opensea testnet is on Rinkeby, so that's your best choice for testnet.</p><div class="captioned-image-container"><figure><pre><code>// SPDX-License-Identifier: MIT
pragma solidity ^0.8.11;

import "@openzeppelin/contracts/access/Ownable.sol";
import '@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol';

contract Metadreams is ERC721Enumerable, Ownable {
    using Strings for uint256;

    string _baseTokenURI;
    uint256 private _reserved = 2;
    uint256 private _price = 0.06 ether;

    uint256 public constant maxSupply = 98;
    bool public _paused = false;
    string public DRUG_PROVENANCE = "b75d85c9aa5a4b91a1fa5be552273a025ced656d6a3bacf7ab7a92b4745f79cc";

    // withdraw addresses
    address t = 0x0000000000000000;

    constructor(string memory baseURI) ERC721("Metadreams", "DRUG")  {
        setBaseURI(baseURI);

        // team gets the first dream
        _safeMint(t, 0);
    }

    function mint(uint256 num) public payable {
        uint256 supply = totalSupply();
        require(!_paused, "Sale paused");
        require(num &lt; 2, "You can mint a maximum of 1 dream");
        require(supply + num &lt; maxSupply - _reserved + 1, "Exceeds maximum dream supply");
        require(msg.value &gt;= _price * num, "Ether sent is not correct");

        for (uint256 i; i &lt; num; i++) {
            _safeMint(msg.sender, supply + i);
        }
    }

    function pause(bool val) public onlyOwner {
        _paused = val;
    }

    function getPrice() public view returns (uint256){
        return _price;
    }

    function setPrice(uint256 _newPrice) public onlyOwner() {
        _price = _newPrice;
    }

    function setProvenanceHash(string memory provenanceHash) public onlyOwner {
        DRUG_PROVENANCE = provenanceHash;
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return _baseTokenURI;
    }

    function setBaseURI(string memory baseURI) public onlyOwner {
        _baseTokenURI = baseURI;
    }

    function walletOfOwner(address _owner) public view returns (uint256[] memory) {
        uint256 tokenCount = balanceOf(_owner);

        uint256[] memory tokensId = new uint256[](tokenCount);
        for (uint256 i; i &lt; tokenCount; i++) {
            tokensId[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokensId;
    }

    function withdrawAll() public payable onlyOwner {
        require(payable(t).send(address(this).balance));

    }

}
</code></pre><figcaption class="image-caption">the smart contract in its entirety</figcaption></figure></div><p>After completing the contract, I installed <code>hardhat</code>, compiled and deployed the contract. To be able to connect to the blockchain, I signed up for Alchemy. Infura is a similar product and also a common choice. &nbsp;As a last step, I grabbed an Etherscan API key and used <code>@nomiclabs/hardhat-etherscan</code> - this lets users validate contracts from the command line. Validating the contract is surprisingly finicky otherwise.</p><h3>Landing Page &amp; Minting</h3><p>As an infra engineer, front-end engineering is IMO the hardest type of engineering because one has to know so much, work with different tools that don't necessarily work well together, and the space moves so fast. If any front-end engineers are reading this and want to share tips on how to get better, ping me on Twitter!</p><p>I used NextJS to bootstrap but did not use their Server Side Rendering, since the site is so simple. I want to optimize for serving speed by putting the whole thing up in a CDN. &nbsp;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hN7O!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99162678-2c09-419e-b045-4db04d6bf57e_1998x1408.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hN7O!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99162678-2c09-419e-b045-4db04d6bf57e_1998x1408.png 424w, https://substackcdn.com/image/fetch/$s_!hN7O!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99162678-2c09-419e-b045-4db04d6bf57e_1998x1408.png 848w, https://substackcdn.com/image/fetch/$s_!hN7O!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99162678-2c09-419e-b045-4db04d6bf57e_1998x1408.png 1272w, https://substackcdn.com/image/fetch/$s_!hN7O!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99162678-2c09-419e-b045-4db04d6bf57e_1998x1408.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hN7O!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99162678-2c09-419e-b045-4db04d6bf57e_1998x1408.png" width="1998" height="1408" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/99162678-2c09-419e-b045-4db04d6bf57e_1998x1408.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1408,&quot;width&quot;:1998,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Building an NFT project from scratch&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Building an NFT project from scratch" title="Building an NFT project from scratch" srcset="https://substackcdn.com/image/fetch/$s_!hN7O!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99162678-2c09-419e-b045-4db04d6bf57e_1998x1408.png 424w, https://substackcdn.com/image/fetch/$s_!hN7O!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99162678-2c09-419e-b045-4db04d6bf57e_1998x1408.png 848w, https://substackcdn.com/image/fetch/$s_!hN7O!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99162678-2c09-419e-b045-4db04d6bf57e_1998x1408.png 1272w, https://substackcdn.com/image/fetch/$s_!hN7O!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99162678-2c09-419e-b045-4db04d6bf57e_1998x1408.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">landing page for metadreams</figcaption></figure></div><p>The landing page is where most of my time went. Just handling all the different states that can occur when a user attempts to connect, mint, including various errors, connection issues, gas prices, etc was super tedious, and I'm sure solutions will soon arise to make this easy.</p><p>I had to learn (read: copy) a lot of CSS to make things look ok and be responsive, and styling was where I spent ~50% of all my time in this entire project &#128561;. I really hope there's a better way to style apps in the future.</p><p>The libraries I used here were <code>WalletConnect</code>, <code>web3.js</code>, <code>Web3Modal</code>. <code>web3.js</code> was easy to use and the documentation was great. I also tried <code>ethers.js</code>, which has a lot of great things going for it - it's a much smaller library, the separation of <code>wallet</code> and <code>provider</code>, but in the end, I felt the documentation wasn't strong enough, which as a newbie is a no-go.</p><p>With the <code>abi</code> generated from <code>hardhat compile</code> from the previous step, it's pretty straightforward to use with <code>web3</code> and start writing code against the contract. I iterated a couple of times on the contract to get all the methods and variables I needed.</p><p>I rabbitholed into the unnecessary but satisfying task of trying to reduce my compiled code size, beginning with <code>3MB</code> &nbsp;and reducing it down to <code>1.14MB</code> and then down to <code>309kB</code>.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!I_Y0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa02488ec-7aff-4af5-89d3-6ab6393bb78e_502x200.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!I_Y0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa02488ec-7aff-4af5-89d3-6ab6393bb78e_502x200.png 424w, https://substackcdn.com/image/fetch/$s_!I_Y0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa02488ec-7aff-4af5-89d3-6ab6393bb78e_502x200.png 848w, https://substackcdn.com/image/fetch/$s_!I_Y0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa02488ec-7aff-4af5-89d3-6ab6393bb78e_502x200.png 1272w, https://substackcdn.com/image/fetch/$s_!I_Y0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa02488ec-7aff-4af5-89d3-6ab6393bb78e_502x200.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!I_Y0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa02488ec-7aff-4af5-89d3-6ab6393bb78e_502x200.png" width="502" height="200" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a02488ec-7aff-4af5-89d3-6ab6393bb78e_502x200.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:200,&quot;width&quot;:502,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Building an NFT project from scratch&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Building an NFT project from scratch" title="Building an NFT project from scratch" srcset="https://substackcdn.com/image/fetch/$s_!I_Y0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa02488ec-7aff-4af5-89d3-6ab6393bb78e_502x200.png 424w, https://substackcdn.com/image/fetch/$s_!I_Y0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa02488ec-7aff-4af5-89d3-6ab6393bb78e_502x200.png 848w, https://substackcdn.com/image/fetch/$s_!I_Y0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa02488ec-7aff-4af5-89d3-6ab6393bb78e_502x200.png 1272w, https://substackcdn.com/image/fetch/$s_!I_Y0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa02488ec-7aff-4af5-89d3-6ab6393bb78e_502x200.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>I did this by installing a custom webpack resolver to remove all repeated instances of <code>bn.js</code> , removing the node dependencies for <code>web3.js</code> and <code>walletconnect</code> with minified scripts to be loaded, reducing image sizes. All of this reduces the compiled size by 10x.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!GG29!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F971c07a3-89e2-4948-b025-7e5dd032da31_1246x616.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!GG29!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F971c07a3-89e2-4948-b025-7e5dd032da31_1246x616.png 424w, https://substackcdn.com/image/fetch/$s_!GG29!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F971c07a3-89e2-4948-b025-7e5dd032da31_1246x616.png 848w, https://substackcdn.com/image/fetch/$s_!GG29!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F971c07a3-89e2-4948-b025-7e5dd032da31_1246x616.png 1272w, https://substackcdn.com/image/fetch/$s_!GG29!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F971c07a3-89e2-4948-b025-7e5dd032da31_1246x616.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!GG29!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F971c07a3-89e2-4948-b025-7e5dd032da31_1246x616.png" width="1246" height="616" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/971c07a3-89e2-4948-b025-7e5dd032da31_1246x616.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:616,&quot;width&quot;:1246,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Building an NFT project from scratch&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Building an NFT project from scratch" title="Building an NFT project from scratch" srcset="https://substackcdn.com/image/fetch/$s_!GG29!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F971c07a3-89e2-4948-b025-7e5dd032da31_1246x616.png 424w, https://substackcdn.com/image/fetch/$s_!GG29!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F971c07a3-89e2-4948-b025-7e5dd032da31_1246x616.png 848w, https://substackcdn.com/image/fetch/$s_!GG29!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F971c07a3-89e2-4948-b025-7e5dd032da31_1246x616.png 1272w, https://substackcdn.com/image/fetch/$s_!GG29!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F971c07a3-89e2-4948-b025-7e5dd032da31_1246x616.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">before and after removing duplicated <code>bn.js</code></figcaption></figure></div><p>What also surprised me was that I wasn't able to find a good Modal React component. I tried MUI and Bootstrap, and ended up writing my own with functionality like clicking outside the box to close. Overall, I'm surprised that in 2022 there is still so much boilerplate code to write for a basic app. Again, I'm not an expert here, ping me to share!</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!HZh8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb52b0762-2e97-49c4-8aea-a818929fd085_1486x1142.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HZh8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb52b0762-2e97-49c4-8aea-a818929fd085_1486x1142.png 424w, https://substackcdn.com/image/fetch/$s_!HZh8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb52b0762-2e97-49c4-8aea-a818929fd085_1486x1142.png 848w, https://substackcdn.com/image/fetch/$s_!HZh8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb52b0762-2e97-49c4-8aea-a818929fd085_1486x1142.png 1272w, https://substackcdn.com/image/fetch/$s_!HZh8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb52b0762-2e97-49c4-8aea-a818929fd085_1486x1142.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!HZh8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb52b0762-2e97-49c4-8aea-a818929fd085_1486x1142.png" width="1486" height="1142" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b52b0762-2e97-49c4-8aea-a818929fd085_1486x1142.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1142,&quot;width&quot;:1486,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Building an NFT project from scratch&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Building an NFT project from scratch" title="Building an NFT project from scratch" srcset="https://substackcdn.com/image/fetch/$s_!HZh8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb52b0762-2e97-49c4-8aea-a818929fd085_1486x1142.png 424w, https://substackcdn.com/image/fetch/$s_!HZh8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb52b0762-2e97-49c4-8aea-a818929fd085_1486x1142.png 848w, https://substackcdn.com/image/fetch/$s_!HZh8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb52b0762-2e97-49c4-8aea-a818929fd085_1486x1142.png 1272w, https://substackcdn.com/image/fetch/$s_!HZh8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb52b0762-2e97-49c4-8aea-a818929fd085_1486x1142.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>Server</h3><p>A server is not necessary for most NFT projects, but I wanted a bit more finesse with the metadata reveals and a layer of indirection for functionality I might add in later.</p><p>The server starts up and queries the state on the blockchain to get data on the contract and see how many NFTs are minted. It starts up a cron process to query every hour for state. The server gates <em>reveals</em> by serving up metadata dynamically. Every hour, based on the new NFTs that were minted, &nbsp;the server makes calls to Opensea's api to refresh Opensea's metadata for new reveals. It also provides basic state for the front end to query.</p><p><code>Express.js</code> was a joy to use, with so many great 3rd party plugins. I was against writing server code in a scripting language for the longest time, but it's so easy to move quickly and I see the light now.</p><h3>Summary</h3><p>This was a fun project that helped identify a couple of interesting gaps in the ecosystem. You can check out the end product at metadreams.dev [3], and say hi on Twitter [4].</p><p>Upcoming posts include thoughts on web3, engineering management for dummies, how to hire your first engineer / engineering leader. Subscribe or check back in!</p><p>[0] Brent is awesome, follow him on Twitter: <a href="https://twitter.com/burnto?ref=emmatang.xyz">https://twitter.com/burnto</a></p><p>[1] Article on provenance hash <a href="https://medium.com/coinmonks/the-elegance-of-the-nft-provenance-hash-solution-823b39f99473?ref=emmatang.xyz">https://medium.com/coinmonks/the-elegance-of-the-nft-provenance-hash-solution-823b39f99473</a></p><p>[2]Bored Ape Yacht Club's contract <a href="https://etherscan.io/address/0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d?ref=emmatang.xyz#code">https://etherscan.io/address/0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d#code</a></p><p>[3] Metadreams NFT website <a href="https://www.metadreams.dev/?ref=emmatang.xyz">https://www.metadreams.dev/</a></p><p>[4] Come say hi! <a href="https://twitter.com/emmaytang?ref=emmatang.xyz">https://twitter.com/emmaytang</a></p>]]></content:encoded></item></channel></rss>