<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Tramline</title>
    <description>The latest articles on DEV Community by Tramline (@tramline).</description>
    <link>https://dev.to/tramline</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F6895%2F7cb6e321-5511-4bbc-9394-f15faef0988d.png</url>
      <title>DEV Community: Tramline</title>
      <link>https://dev.to/tramline</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tramline"/>
    <language>en</language>
    <item>
      <title>Does sponsoring a developer conference help with sales or marketing?</title>
      <dc:creator>Pratul Kalia</dc:creator>
      <pubDate>Wed, 31 Jul 2024 11:37:56 +0000</pubDate>
      <link>https://dev.to/tramline/does-sponsoring-a-developer-conference-help-with-sales-or-marketing-4ib8</link>
      <guid>https://dev.to/tramline/does-sponsoring-a-developer-conference-help-with-sales-or-marketing-4ib8</guid>
      <description>&lt;p&gt;&lt;a href="http://sf.droidcon.com/" rel="noopener noreferrer"&gt;Droidcon San Francisco&lt;/a&gt; is one of two big Android community conferences (the other one being &lt;a href="https://nyc.droidcon.com/" rel="noopener noreferrer"&gt;New York&lt;/a&gt;) that happen in the United States. We attended the 2023 edition to talk to people about Tramline, get feedback, and gauge interest, but we were not sponsors. We spoke to many people but in every case, we had to go up to them, pique their interest, and then show them our platform. In the end, it did not feel worth the time to travel so far with the intention to demo (and sell) but do it as an attendee. &lt;/p&gt;

&lt;p&gt;In our past lives, we have sponsored events as a way to support the developer community. We had no experience of sponsoring with the intention to sell, and with Tramline, we were curious about what that would be like. So for the 2024 edition, we decided it was time.&lt;/p&gt;

&lt;p&gt;Droidcon was not only supportive of an early stage startup like ours, but also patient and super nice. They answered our (many) questions when we were in two minds, and their team went above and beyond during the event to help us with what we needed. Shout out to &lt;a href="https://www.linkedin.com/in/emiliano-frau/" rel="noopener noreferrer"&gt;Emiliano&lt;/a&gt; and &lt;a href="https://www.linkedin.com/in/elissa-z-531a92a0/" rel="noopener noreferrer"&gt;Elissa&lt;/a&gt; for everything! &lt;/p&gt;

&lt;h2&gt;
  
  
  Intention
&lt;/h2&gt;

&lt;p&gt;The biggest difference we felt this year was &lt;strong&gt;people’s intention&lt;/strong&gt;. As a sponsor, people knew we were there to sell something. When people came to our desk and spoke to us, they came with the intention to listen to us. Some people dropped off mid conversation, but most people were interested in seeing the platform work. Some people had built similar systems at their workplace, and talking to them about their choices and tradeoffs was enlightening for us. &lt;/p&gt;

&lt;p&gt;Discussing the problem space and giving demos repeatedly forced us to refine our flow on the fly. People are busy at conferences! Their attention is split between listening to talks, hallway conversations, the after-party, and other sponsor booths. On the show floor, you only have one shot with someone so it can get stressful. It took us a few runs to come up with a script that would convince people to want to see a demo. &lt;/p&gt;

&lt;p&gt;Not everyone has the same strategy though: we spoke to Arnold from &lt;a href="https://screenshotbot.io/" rel="noopener noreferrer"&gt;Screenshotbot&lt;/a&gt;, and he prefers giving people an overview of the product, answering questions, and scheduling a demo after the conference when people have more time on their hands.&lt;/p&gt;

&lt;h2&gt;
  
  
  Making friends
&lt;/h2&gt;

&lt;p&gt;During the speaker talks, the hallways became empty and we used that time to talk to the other sponsors about their experiences. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We spoke to the &lt;a href="http://gitar.co/" rel="noopener noreferrer"&gt;Gitar&lt;/a&gt; team about the mobile DevOps tooling space, especially the role of AI. They also shared their experience of attending other developer events across the US and Europe. &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.linkedin.com/in/arnoldnoronha/" rel="noopener noreferrer"&gt;Arnold&lt;/a&gt; of &lt;a href="https://screenshotbot.io/" rel="noopener noreferrer"&gt;Screenshotbot&lt;/a&gt; was helpful to us throughout, sharing from his experience of selling and growing the product. It is refreshing to see solo developers trying to build a business in a market obsessed with raising venture capital. &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.linkedin.com/in/josh-cohenzadeh/" rel="noopener noreferrer"&gt;Josh&lt;/a&gt; from &lt;a href="http://emerge.tools/" rel="noopener noreferrer"&gt;Emerge Tools&lt;/a&gt; gave us good feedback on our positioning and pricing. Separately, Emerge has a neat inbound sales motion which is driven by their &lt;a href="https://x.com/emergetools/status/1786147199812059272" rel="noopener noreferrer"&gt;unique&lt;/a&gt; &lt;a href="https://x.com/rbro112/status/1806455543164547202" rel="noopener noreferrer"&gt;content&lt;/a&gt; &lt;a href="https://x.com/emergetools/status/1805363336185626977" rel="noopener noreferrer"&gt;strategy&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;We love &lt;a href="http://sentry.io/" rel="noopener noreferrer"&gt;Sentry&lt;/a&gt; and we’re happy customers of the product. As always, they had really nice swag, and their sales engineers were eager to share their opinions on GTM and early-stage sales. &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Swag swagger
&lt;/h2&gt;

&lt;p&gt;We’ve attended so many conferences over the years that we had a ton of ideas on what we want to share with attendees. After much deliberation, we settled on canvas coasters with the Tramline logo on one side, and a QR code of our &lt;a href="http://github.com/tramlinehq/tramline" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt; on the other (yay open source!). &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjm2cdptp39ialghii4mv.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjm2cdptp39ialghii4mv.jpeg" alt="Image description" width="800" height="599"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We also wanted to do a book giveaway, so we requested the inimitable &lt;a href="https://www.chethaase.com/" rel="noopener noreferrer"&gt;Chet Haase&lt;/a&gt; to sign some copies of his &lt;a href="https://www.chethaase.com/androids" rel="noopener noreferrer"&gt;Androids&lt;/a&gt; book… which he did! He was super sweet and patient with us as we dealt with the logistics of moving the books around. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh4w9b9eq00paq0rs6b8j.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh4w9b9eq00paq0rs6b8j.jpeg" alt="Image description" width="800" height="1066"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Our table would have looked incomplete without a big standee, but we wanted something that wasn’t boring or sales-oriented. So we channeled our obsession with apps, trains, and maps to come up with… &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzrpwmm1c63sky2nvgt9n.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzrpwmm1c63sky2nvgt9n.jpeg" alt="Image description" width="800" height="1423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Massimo Vignelli homage was a hit during the conference, and many people took photos with the standee. The design was illustrated to perfection by &lt;a href="https://www.instagram.com/avyadraws/" rel="noopener noreferrer"&gt;Bhavya Arora&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Outro
&lt;/h2&gt;

&lt;p&gt;Sponsoring events is a great way to give back to the community, but if you’re building a product for developers which has some traction, sponsoring gets you a lot of eyeballs in a short amount of time. It costs time and money, but we think it is an effective use of both. Good luck!&lt;/p&gt;

</description>
      <category>marketing</category>
      <category>devrel</category>
    </item>
    <item>
      <title>Applelink: Practical API Recipes for App Store Connect Workflows</title>
      <dc:creator>Pratul Kalia</dc:creator>
      <pubDate>Sat, 22 Apr 2023 17:50:14 +0000</pubDate>
      <link>https://dev.to/tramline/applelink-practical-api-recipes-for-app-store-connect-workflows-n4b</link>
      <guid>https://dev.to/tramline/applelink-practical-api-recipes-for-app-store-connect-workflows-n4b</guid>
      <description>&lt;p&gt;&lt;a href="https://tramline.app"&gt;Tramline&lt;/a&gt; is a modest Rails monolith (as opposed to a &lt;a href="https://m.signalvnoise.com/the-majestic-monolith/"&gt;majestic one&lt;/a&gt;) that wants to stay a monolith for as long as possible. We tend to only mildly impose advice such as “you should always start out with a monolith” or “micro-services are actually a terrible idea for a startup” for our engineering decisions. As with most practical things, all our decisions have devils inside of the details rather than adages.&lt;/p&gt;

&lt;p&gt;Since a release coordination platform talks to a variety of fragmented yet necessary tooling, the real value comes along when many integration touch-points are combined to ship new releases on a predictable and reliable cadence.&lt;/p&gt;

&lt;p&gt;We presently &lt;a href="https://www.tramline.app/integrations"&gt;integrate with&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub for source control&lt;/li&gt;
&lt;li&gt;GitHub Actions and Bitrise for post-commit workflows&lt;/li&gt;
&lt;li&gt;Slack for notifications and sending builds&lt;/li&gt;
&lt;li&gt;App Store and Play Store for shipping releases&lt;/li&gt;
&lt;li&gt;GitLab, Sentry, and Firebase App Distribution &lt;em&gt;coming soon&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of our integrations sit inside the aforementioned monolith. This is for simplicity of maintenance and deployments. That being said, we maintain a strict domain-agnostic layer for handling API calls so that if integration endpoints do need to move out — say, for accommodating higher concurrency — the contract from the layer “above” does not need to dramatically change (if at all).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gFEyJu0q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5w8jexz7b5u3becfvmhx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gFEyJu0q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5w8jexz7b5u3becfvmhx.png" alt="Diagram of how integrations inside Tramline talk to external services" width="800" height="846"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;However, by integrating App Store Connect, we intentionally break our own mild constraint against opening the gates to a service-based architecture.&lt;/p&gt;

&lt;h2&gt;
  
  
  App Store Connect &amp;amp; Fastlane
&lt;/h2&gt;

&lt;p&gt;App Store Connect has an extensive &lt;a href="https://developer.apple.com/documentation/appstoreconnectapi"&gt;developer API&lt;/a&gt; to manage releases on both TestFlight and App Store. You can do most things through the API (a notable exception being able to upload builds). The canonical library in Ruby that implements a large part of the API is the excellently named &lt;a href="https://spaceship.airforce/"&gt;Spaceship&lt;/a&gt;. Spaceship is, in fact, an abstraction higher than what the API allows you to do. This is because it’s designed to be &lt;a href="https://fastlane.tools/"&gt;Fastlane-first&lt;/a&gt;. All the actions and recipes that Fastlane supports are sometimes direct interfaces implemented in Spaceship.&lt;/p&gt;

&lt;p&gt;Using Spaceship gives us two benefits:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Use many of the battle-tested recipes directly&lt;/li&gt;
&lt;li&gt;Integrate the Fastlane gem with Rails&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Since Spaceship is a part of Fastlane, it makes integrating Fastlane directly with a Rails app quite tricky. Fastlane is a big gem and a lot of the code just isn’t useful to the primary Tramline service. More importantly though, Fastlane’s dependencies simply do not play very well with Rails 7.&lt;/p&gt;

&lt;h2&gt;
  
  
  And so, Applelink
&lt;/h2&gt;

&lt;p&gt;We built &lt;a href="https://github.com/tramlinehq/applelink"&gt;Applelink&lt;/a&gt;, a small, self-contained, rack-based service using &lt;a href="https://github.com/hanami/api"&gt;Hanami::API&lt;/a&gt;, that wraps over Spaceship and exposes some nice common recipes as RESTful endpoints in an entirely stateless fashion. These are based on the needs of the framework that Tramline implements over App Store. The API pulls its weight so Tramline has to do as little as possible. Currently, it exposes &lt;a href="https://github.com/tramlinehq/applelink#api"&gt;13 API endpoints&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Tramline hops all App Store requests through this service:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8cP7HF-_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vqb4d1wf3hqihxwje47b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8cP7HF-_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vqb4d1wf3hqihxwje47b.png" alt="Architecture diagram of how Applelink works in tandem with Tramline" width="800" height="513"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In Applelink, a complex recipe, such as &lt;a href="https://github.com/tramlinehq/applelink#prepare-a-release-for-the-app"&gt;release/prepare&lt;/a&gt;, will perform the following tasks all bunched up:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ensure that there is an &lt;a href="https://developer.apple.com/documentation/appstoreconnectapi/app_store/app_metadata/app_store_versions"&gt;App Store version&lt;/a&gt; that we can use for the release, or create a new one&lt;/li&gt;
&lt;li&gt;Update the release metadata for that release version&lt;/li&gt;
&lt;li&gt;Enable phased releases, if necessary&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Similarly a simple fetch endpoint like &lt;a href="https://github.com/tramlinehq/applelink#fetch-the-status-of-current-live-release"&gt;release/live&lt;/a&gt; will give you the current status of the latest release.&lt;/p&gt;

&lt;p&gt;Even though Spaceship has helped us come a long way, it isn't necessarily efficient at choosing the right combination of API calls underneath. For example, while preparing a release, Spaceship could end up making 3 separate API calls to look for the app, update its attributes (setting release type, version name etc.) and then select the correct build.&lt;/p&gt;

&lt;p&gt;In some instances it’s just better to drop the interface from Spaceship altogether and make direct API requests. Applelink tries to choose the most efficient path by making use of the &lt;a href="https://developer.apple.com/documentation/appstoreconnectapi/app/relationships/appstoreversions"&gt;correct relationships&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Since Fastlane is mainly intended as a command-line tool for build pipelines, its primary focus may not be an efficient request-response cycle.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where are we now?
&lt;/h2&gt;

&lt;p&gt;Applelink has been operating smoothly for the past few months and this model has proven to be an effective starting point. It is possible that after a few more iterations we decide to retire the use of Spaceship. Nevertheless, we would have a solidified API in place, and it would only be a matter of swapping out the implementation.&lt;/p&gt;

&lt;p&gt;Since Applelink is a separate service that is not reliant on Tramline’s internal state, all the API endpoints are valid outside of Tramline. It can be used in a standalone way from a CI action or a Slack bot that spits out release information periodically.&lt;/p&gt;

&lt;p&gt;As with Tramline, &lt;a href="https://github.com/tramlinehq/applelink/"&gt;Applelink is open source&lt;/a&gt; under the Apache 2.0 License.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prior art
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/cidertool/asc-go"&gt;Cider&lt;/a&gt; by Aaron Sky, aims to implement a significant portion of the API in Go which has been helpful in confirming some of our assumptions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/tramlinehq/store-quirks"&gt;Store Quirks&lt;/a&gt; is partly maintained by findings made during the implementation of Applelink.&lt;/p&gt;

</description>
      <category>android</category>
      <category>ios</category>
      <category>mobiledevops</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
