<?xml version="1.0" encoding="utf-8"?>

<feed xmlns="http://www.w3.org/2005/Atom" >
  <generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator>
  <link href="https://tunglinn.github.io/feed.xml" rel="self" type="application/atom+xml" />
  <link href="https://tunglinn.github.io/" rel="alternate" type="text/html" />
  <updated>2026-05-22T10:11:37+00:00</updated>
  <id>https://tunglinn.github.io/</id>

  
    <title type="html">Tung Lin</title>
  

  
    <subtitle>Portfolio of Tung Lin — data analyst and transportation enthusiast specializing in transit planning, data visualization, and web development.</subtitle>
  

  
    <author>
        <name>Tung Lin</name>
      
        <email>tunglin@yahoo.com</email>
      
      
    </author>
  

  
  
    <entry>
      <title type="html">GamePoint LA</title>
      <link href="https://tunglinn.github.io/post/gamepoint-la/" rel="alternate" type="text/html" title="GamePoint LA" />
      <published>2025-05-01T00:00:00+00:00</published>
      <updated>2025-05-01T00:00:00+00:00</updated>
      <id>https://tunglinn.github.io/post/gamepoint-la</id>
      <content type="html" xml:base="https://tunglinn.github.io/post/gamepoint-la/">&lt;p&gt;GamePoint LA is a fully browser-based sports match recording tool. Users mark the start and end of each point directly in the browser, and the app automatically exports the clipped video with a scoreboard overlay rendered frame-by-frame.&lt;/p&gt;

&lt;h2 id=&quot;how-it-works&quot;&gt;How It Works&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Mark points&lt;/strong&gt; — click to tag serve and end timestamps during or after a match&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Auto-export&lt;/strong&gt; — leverages the &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/WebCodecs_API&quot;&gt;WebCodecs API&lt;/a&gt; to re-encode video clips with a scoreboard burned in, entirely client-side&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;No server upload&lt;/strong&gt; — all processing happens in the browser; the raw video never leaves the device&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;tech-stack&quot;&gt;Tech Stack&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;WebCodecs API for frame-level video encoding&lt;/li&gt;
  &lt;li&gt;Canvas for scoreboard overlay rendering&lt;/li&gt;
  &lt;li&gt;Vanilla JS + modern browser APIs&lt;/li&gt;
&lt;/ul&gt;</content>

      
      
      
      
      

      <author>
          <name>Tung Lin</name>
        
          <email>tunglin@yahoo.com</email>
        
        
      </author>

      
        <category term="WebCodecs, Video Processing" />
      

      

      
        <summary type="html">GamePoint LA is a fully browser-based sports match recording tool. Users mark the start and end of each point directly in the browser, and the app automatically exports the clipped video with a scoreboard overlay rendered frame-by-frame.</summary>
      

      
      
    </entry>
  
    <entry>
      <title type="html">YouBike Live</title>
      <link href="https://tunglinn.github.io/post/youbike-data/" rel="alternate" type="text/html" title="YouBike Live" />
      <published>2025-01-01T00:00:00+00:00</published>
      <updated>2025-01-01T00:00:00+00:00</updated>
      <id>https://tunglinn.github.io/post/youbike-data</id>
      <content type="html" xml:base="https://tunglinn.github.io/post/youbike-data/">&lt;p&gt;YouBike Live tracks the availability of Taipei’s public bike-sharing stations in real time. A Python scraper polls the YouBike API on a schedule, persists records to a SQLite database, and exposes the data through a lightweight REST API. The frontend renders all active stations on an interactive Leaflet map with live counts.&lt;/p&gt;

&lt;h2 id=&quot;components&quot;&gt;Components&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Scraper&lt;/strong&gt; — Python script polling the YouBike TDX feed, writing deltas to SQLite&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Database&lt;/strong&gt; — SQLite with time-series records per station&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;API&lt;/strong&gt; — lightweight endpoint layer serving current station state&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Frontend&lt;/strong&gt; — Leaflet map with per-station markers, availability counts, and Chart.js history sparklines&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;tech-stack&quot;&gt;Tech Stack&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Python (scraper, API)&lt;/li&gt;
  &lt;li&gt;SQLite&lt;/li&gt;
  &lt;li&gt;Cloudflare Workers (edge deployment)&lt;/li&gt;
  &lt;li&gt;Leaflet.js + Chart.js&lt;/li&gt;
&lt;/ul&gt;</content>

      
      
      
      
      

      <author>
          <name>Tung Lin</name>
        
          <email>tunglin@yahoo.com</email>
        
        
      </author>

      
        <category term="Data Engineering, Live Maps" />
      

      

      
        <summary type="html">YouBike Live tracks the availability of Taipei’s public bike-sharing stations in real time. A Python scraper polls the YouBike API on a schedule, persists records to a SQLite database, and exposes the data through a lightweight REST API. The frontend renders all active stations on an interactive Leaflet map with live counts.</summary>
      

      
      
    </entry>
  
    <entry>
      <title type="html">Parking Lot Map</title>
      <link href="https://tunglinn.github.io/post/parking-lot-map/" rel="alternate" type="text/html" title="Parking Lot Map" />
      <published>2023-12-15T00:00:00+00:00</published>
      <updated>2023-12-15T00:00:00+00:00</updated>
      <id>https://tunglinn.github.io/post/parking-lot-map</id>
      <content type="html" xml:base="https://tunglinn.github.io/post/parking-lot-map/">&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://parkingreform.org/parking-lot-map&quot;&gt;The Project&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Improved user experience, optimized data loading, and automated data insertion. A summary of what I learned:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Python scripting for automation&lt;/li&gt;
  &lt;li&gt;How to design for the user and improve their experience&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Details.&lt;/strong&gt;
Working in Progress.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Takeaways.&lt;/strong&gt; While I learned so many technical aspects of web development, UX, and data visualization, my biggest takeaway is how to truly understand the process, which required me to develop the skill of self-learning effectively. It’s also about the habits I build, like writing documentation, industry standard programming, and acheiving broader understanding.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is parking reform?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Parking is mundane, inevitable, and rage-inducing. However, to many communities, it is a vehicle for change in affordable housing, climate change, and safer streets.&lt;/p&gt;

&lt;p&gt;One of the most common ways cities and states have changed their parking codes is by removing them all together. Across the United States and the world, there are parking minimums required for new and/or re-use developments. While some safety codes and building codes are often written in blood, parking code cannot claim the same. Resources that were used to develop parking codes have poor data and is based on peak hours, which leaves many parking lots empty most of the time. Additionally, there is the argument of letting supply, demand, and the free market to dictate how many parking spaces a developer allocates.&lt;/p&gt;

&lt;p&gt;The Parking Reform Network is a dedicated, advocacy organization for parking reform. Amongst its tools, resources, and advocacy, is a parking reform map, which tracks parking reform across the country (and eventually around the world, too).&lt;/p&gt;</content>

      
      
      
      
      

      <author>
          <name>Tung Lin</name>
        
          <email>tunglin@yahoo.com</email>
        
        
      </author>

      
        <category term="Web Development, UX, Python" />
      

      

      
        <summary type="html">The Project</summary>
      

      
      
    </entry>
  
    <entry>
      <title type="html">Parking Reform Map</title>
      <link href="https://tunglinn.github.io/post/reform-map/" rel="alternate" type="text/html" title="Parking Reform Map" />
      <published>2023-06-15T00:00:00+00:00</published>
      <updated>2023-06-15T00:00:00+00:00</updated>
      <id>https://tunglinn.github.io/post/reform-map</id>
      <content type="html" xml:base="https://tunglinn.github.io/post/reform-map/">&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://parkingreform.org/mandates-map&quot;&gt;The Project&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A map migration from Shiny(R) to JavaScript. Here’s a comprehensive list of everything I learned:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;JavaScript, HTML, CSS&lt;/li&gt;
  &lt;li&gt;GitHub&lt;/li&gt;
  &lt;li&gt;CI/CD&lt;/li&gt;
  &lt;li&gt;WebDev pipeline/infrastructure&lt;/li&gt;
  &lt;li&gt;Testing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This was planned to be about a six month migration, with me as the main contributor and Eric as my supervisor. I spent 5-15 hours a week on the project, while I worked part-time as an EMT and moved from Los Angeles back to my home town near San Francisco.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Details.&lt;/strong&gt;
Like I mentioned, I did not know much about web development. We needed this migration done because the Shiny server costs $40/month, in which we don’t take advantage of most of the computing power and features of it. Also, efforts to revamp the map fell short due to the restraints with Shiny/R. Overall, we had a deadline before the Shiny server would shutdown.&lt;/p&gt;

&lt;p&gt;The first piece I set up is a blank page instead of the Shiny app. We used Parcel to run the local development server and eventually bundle and build the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/dist&lt;/code&gt; file for staging and production.&lt;/p&gt;

&lt;p&gt;Next up is the actual map, in which we opted for LeafletJS. I worked with HTML and CSS to structure the site to resemble the Shiny app as closely as possible. Creating button icons and popups helped me get familiar with GitHub, CI/CD, and testing standards.&lt;/p&gt;

&lt;p&gt;After wading in the swamps of HTML and CSS, I returned to the map by finally loading in our data (compiled by our volunteers!). Our data includes fields like city name, coordinates, and type of reform. I started with just the coordinates and created a CircleMarker for each entry.&lt;/p&gt;

&lt;p&gt;To use the rest of our data, we have popup details when users click on a CircleMarker. I had already successfully made a popup, so this ticket was smooth-sailing.&lt;/p&gt;

&lt;p&gt;Now, it’s time for the filters, which includes multi-select inputs, a population slider, a toggle, and a search bar. We decided on checkboxes for multi-select options. Since we wanted to keep the project small and clean, we did not use libraries like Bootstrap or React. Instead, I found ways to create a double-headed slider and toggle through basic HTML elements. Eric implemented the search bar, using Choice.js.&lt;/p&gt;

&lt;p&gt;One month before we expected the Shiny server to shutdown, ___ sent a notice of an early shutdown. Thankfully, the most important components have already been migrated, so it was just a matter of fixing some bugs and pushing the staging site to production!&lt;/p&gt;

&lt;p&gt;Once the migration was complete, we turned back to the design changes we wanted to do, but couldn’t with the Shiny app.&lt;/p&gt;

&lt;p&gt;There were two problems with the old map.&lt;/p&gt;

&lt;p&gt;1) You are immedietely hit with thousands of data points.&lt;/p&gt;

&lt;p&gt;2) The core cities that removed parking minimums were not explicitly obvious.&lt;/p&gt;

&lt;p&gt;However, both views have their advantages. Lots of data shows that parking reform is happening more and more, while showing the core cities is much cleaner and easier to digest.&lt;/p&gt;

&lt;p&gt;To address both of these problems, we decided to change the view to filter for just core cities, but include a counter on the page. Therefore, the counter would indicate that there are thousands more cities with some type of parking reform.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Takeaways.&lt;/strong&gt; While I learned so many technical aspects of web development, UX, and data visualization, my biggest takeaway is how to truly understand the process, which required me to develop the skill of self-learning effectively. It’s also about the habits I build, like writing documentation, industry standard programming, and acheiving broader understanding.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is parking reform?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Parking is mundane, inevitable, and rage-inducing. However, to many communities, it is a vehicle for change in affordable housing, climate change, and safer streets.&lt;/p&gt;

&lt;p&gt;One of the most common ways cities and states have changed their parking codes is by removing them all together. Across the United States and the world, there are parking minimums required for new and/or re-use developments. While some safety codes and building codes are often written in blood, parking code cannot claim the same. Resources that were used to develop parking codes have poor data and is based on peak hours, which leaves many parking lots empty most of the time. Additionally, there is the argument of letting supply, demand, and the free market to dictate how many parking spaces a developer allocates.&lt;/p&gt;

&lt;p&gt;The Parking Reform Network is a dedicated, advocacy organization for parking reform. Amongst its tools, resources, and advocacy, is a parking reform map, which tracks parking reform across the country (and eventually around the world, too).&lt;/p&gt;</content>

      
      
      
      
      

      <author>
          <name>Tung Lin</name>
        
          <email>tunglin@yahoo.com</email>
        
        
      </author>

      
        <category term="Web Development" />
      

      

      
        <summary type="html">The Project</summary>
      

      
      
    </entry>
  
    <entry>
      <title type="html">Parking Database</title>
      <link href="https://tunglinn.github.io/post/parking-database/" rel="alternate" type="text/html" title="Parking Database" />
      <published>2023-03-01T00:00:00+00:00</published>
      <updated>2023-03-01T00:00:00+00:00</updated>
      <id>https://tunglinn.github.io/post/parking-database</id>
      <content type="html" xml:base="https://tunglinn.github.io/post/parking-database/">&lt;p&gt;&lt;strong&gt;The Project&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Read about this project &lt;a href=&quot;https://parkingreform.org/2023/06/15/building-a-u-s-parking-minimums-database/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is parking reform?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Parking is mundane, inevitable, and rage-inducing. However, to many communities, it is a vehicle for change in affordable housing, climate change, and safer streets.&lt;/p&gt;

&lt;p&gt;One of the most common ways cities and states have changed their parking codes is by removing them all together. Across the United States and the world, there are parking minimums required for new and/or re-use developments. While some safety codes and building codes are often written in blood, parking code cannot claim the same. Resources that were used to develop parking codes have poor data and is based on peak hours, which leaves many parking lots empty most of the time. Additionally, there is the argument of letting supply, demand, and the free market to dictate how many parking spaces a developer allocates.&lt;/p&gt;

&lt;p&gt;The Parking Reform Network is a dedicated, advocacy organization for parking reform. Amongst its tools, resources, and advocacy, is a parking reform map, which tracks parking reform across the country (and eventually around the world, too).&lt;/p&gt;</content>

      
      
      
      
      

      <author>
          <name>Tung Lin</name>
        
          <email>tunglin@yahoo.com</email>
        
        
      </author>

      
        <category term="Database Development, Data Management" />
      

      

      
        <summary type="html">The Project</summary>
      

      
      
    </entry>
  
    <entry>
      <title type="html">EMT-B — Ambulife</title>
      <link href="https://tunglinn.github.io/post/emt/" rel="alternate" type="text/html" title="EMT-B — Ambulife" />
      <published>2022-06-15T00:00:00+00:00</published>
      <updated>2022-06-15T00:00:00+00:00</updated>
      <id>https://tunglinn.github.io/post/emt</id>
      <content type="html" xml:base="https://tunglinn.github.io/post/emt/"></content>

      
      
      
      
      

      <author>
          <name>Tung Lin</name>
        
          <email>tunglin@yahoo.com</email>
        
        
      </author>

      
        <category term="Patient Care, Documentation" />
      

      

      
        <summary type="html"></summary>
      

      
      
    </entry>
  
    <entry>
      <title type="html">Silicon Valley Bike Exchange</title>
      <link href="https://tunglinn.github.io/post/bike/" rel="alternate" type="text/html" title="Silicon Valley Bike Exchange" />
      <published>2022-06-15T00:00:00+00:00</published>
      <updated>2022-06-15T00:00:00+00:00</updated>
      <id>https://tunglinn.github.io/post/bike</id>
      <content type="html" xml:base="https://tunglinn.github.io/post/bike/"></content>

      
      
      
      
      

      <author>
          <name>Tung Lin</name>
        
          <email>tunglin@yahoo.com</email>
        
        
      </author>

      
        <category term="Community, Bike Repair" />
      

      

      
        <summary type="html"></summary>
      

      
      
    </entry>
  
    <entry>
      <title type="html">Daily Bruin</title>
      <link href="https://tunglinn.github.io/post/dailybruin/" rel="alternate" type="text/html" title="Daily Bruin" />
      <published>2022-02-01T00:00:00+00:00</published>
      <updated>2022-02-01T00:00:00+00:00</updated>
      <id>https://tunglinn.github.io/post/dailybruin</id>
      <content type="html" xml:base="https://tunglinn.github.io/post/dailybruin/">&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://dailybruin.com/author/tung-lin&quot;&gt;My contributions&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;</content>

      
      
      
      
      

      <author>
          <name>Tung Lin</name>
        
          <email>tunglin@yahoo.com</email>
        
        
      </author>

      
        <category term="Videography, Reporting, Data Visualization" />
      

      

      
        <summary type="html">My contributions</summary>
      

      
      
    </entry>
  
</feed>
