<?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"><channel><title><![CDATA[CS 5167 — User Interface I]]></title><description><![CDATA[This is Kevin Long's personal portfolio for CS 5167: User Interface I.]]></description><link>https://cs5167.kevinuulong.com</link><generator>RSS for Node</generator><lastBuildDate>Tue, 28 Apr 2026 02:16:01 GMT</lastBuildDate><atom:link href="https://cs5167.kevinuulong.com/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Last On Earth — Project 4]]></title><description><![CDATA[Last On Earth is a long term product review site.
It is meant to address the problem of responsible consumption, waste, and production. By encouraging and helping consumers to find products that will last not only will they need to buy fewer things a...]]></description><link>https://cs5167.kevinuulong.com/last-on-earth-project-4</link><guid isPermaLink="true">https://cs5167.kevinuulong.com/last-on-earth-project-4</guid><dc:creator><![CDATA[Kevin Long]]></dc:creator><pubDate>Thu, 11 Dec 2025 04:08:20 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1765406504698/13689574-02b8-40a8-83fb-d59a32c156c1.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Last On Earth is a long term product review site.</p>
<p>It is meant to address the problem of responsible consumption, waste, and production. By encouraging and helping consumers to find products that will last not only will they need to buy fewer things and exploit fewer of the world’s natural resources, but also longer lasting products helps to decrease the amount of waste that ends up in our landfills.</p>
<p>It also just <em>feels</em> good as a consumer to know that you are supporting the, oftentimes smaller, brands that make the products that last you a lifetime.</p>
<p>The name is a little bit of wordplay taking advantage of two meanings of the word <em>last</em>. <em>Last</em> can mean final but <em>last</em> can also mean to endure or to continue to function. Both are what we seek for the products recommended here to be.</p>
<p><a target="_blank" href="https://project4.cs5167.kevinuulong.com/"><strong>View it Live</strong></a> | <a target="_blank" href="https://github.com/kevinuulong/ui-for-good"><strong>Source Code</strong></a></p>
<h2 id="heading-design-stage">Design Stage</h2>
<p>Since this project was completed on a more aggressive timeline than some of the others I did not have as much time to gather feedback or do too many sketches.</p>
<p>I tried to make up for some of that by first creating an initial sketch and then iterating pieces of it in my head by looking at e-commerce and review sites from around the internet and shots on <a target="_blank" href="https://dribbble.com/">Dribbble</a> for inspiration.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1765408375002/6d160cd4-5186-40d6-b07e-78846ee1f027.png" alt class="image--center mx-auto" /></p>
<p>For example in my initial sketch you can see that I simply had hero text and a search bar. After looking through some e-commerce sites I decided that a hero image would be better suited and that I should shift that instructional text inside the search bar itself.</p>
<p>Not only did this change give me space for a call-to-action and a message statement to help users more quickly understand what this site is about, but it also allowed me to tie the instructions more directly to the search bar.</p>
<p>Once I had a basic layout it was time to start thinking about the theming and design.</p>
<p>For this I had two main inspirations.</p>
<p>The first is that I wanted to design it in a style that felt both a timeless and classic at the same time. It should feel like it is established and trustworthy, but not be too outdated as to feel bad. In other words, it should feel built to last.</p>
<p>Growing up in Cincinnati I’ve been surrounded by <a target="_blank" href="https://www.cincydeco.com/art/deco/cincinnati">a great wealth of Art Deco buildings</a> and influences. From Union Terminal to Carew Tower, these buildings perfectly capture that classic but timeless feel I was going for.</p>
<p><img src="https://images.unsplash.com/photo-1668173272956-201067dcfe38?fm=jpg&amp;q=60&amp;w=3000&amp;ixlib=rb-4.1.0&amp;ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" alt="a sign on a building" /></p>
<p>Probably the most distinctive Art Deco influences come in the form of my choice in type and color. I chose to pair Federo, a bold display font, with Instrument Sans, a clean modern sans-serif.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1765412108499/d41771cb-c1ef-4c93-924a-39064dbe2ff0.png" alt class="image--center mx-auto" /></p>
<p>Additionally, Art Deco utilizes a lot of intricate metal detailing so when choosing colors I picked a kind of gold-ish color to further the effect.</p>
<p>My second main inspiration was a trip I took a few years ago to Yosemite’s Mariposa Grove. <a target="_blank" href="https://www.nps.gov/yose/planyourvisit/mg.htm">Mariposa Grove</a> is home to more than 500 Giant Sequoias. Giant Sequoias are some of the oldest and largest lifeforms with many of them being 2,000+ years old.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1765412771322/63a17725-5a3c-484d-965d-5cf66879a7ad.jpeg" alt class="image--center mx-auto" /></p>
<p>Walking through the grove you are taken aback, not only <a target="_blank" href="https://www.npr.org/sections/pictureshow/2012/12/13/167163801/one-photo-126-frames-2-billion-leaves-247-feet">by the scale</a>, but also by the stories these towering giants tell. They’ve survived for millennia through fire and drought yet are still standing strong and tall as ever.</p>
<p>This resilience and longevity is the very embodiment of the type of product this project is aimed at helping people find.</p>
<p>I pay homage to these trees, and the Park Service that’s protected them, through my choice in colors, with greens and creams reminiscent of both the trees’ extensive needled canopies and classic National Park Service branding.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1765414113508/c781ae39-a421-41ad-80db-7672768eb706.png" alt class="image--center mx-auto" /></p>
<p>With all that in mind, the last step in the design process was to prototype my final design in Figma.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1765414239406/c092c970-71c8-4a0f-9e3c-32cdd4ea5b0b.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-the-app">The App</h2>
<p>The app itself is pretty simple and is easy to navigate. The home page has a hero with a tagline and a call-to-action inviting you to click or scroll to see and search the list of brands below.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1765423387477/519e3371-0007-4aa7-9fe6-90d613b8ae14.png" alt class="image--center mx-auto" /></p>
<p>The brands list has the name and logo of each of the brands as well as a score showing an overall rating based on the user reviews for that brand. This should make it easy to identify and search for the recommended brands.</p>
<p>The recommendations are split into two categories, recommended brands and brands to avoid. This is important because seeing that a brand is explicitly not recommended means that you know that it isn’t just some brand that isn’t on the site yet, but actually is of poor quality and should be avoided.</p>
<p>The search functionality lets you search for brands and products and it will filter out only the brands that sell that type of product.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1765423650924/61386b2e-631c-4767-b531-29ba6f51e2cc.png" alt class="image--center mx-auto" /></p>
<p>Clicking on the “Read why” button takes you to the brand page where you can read all the reviews and why that brand has received the score it did.</p>
<p>You can see not only the text of the review, but arguably more importantly when someone purchased a product, what type of product they purchased, and the condition the product is now in. This gives you a real insight into the quality and longevity of the brand’s products and is a very important factor in determining their overall brand score.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1765423915008/8c7f4e18-da49-4ecd-b738-045b85ab3365.png" alt class="image--center mx-auto" /></p>
<p>Clicking on the plus icon in the top right corner will open a modal that allows you to add your own review to the brand page.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1765424145913/d1e5998f-8546-4abf-9dbd-821f601388a8.png" alt class="image--center mx-auto" /></p>
<p>Here is <a target="_blank" href="https://uc.mediaspace.kaltura.com/media/t/1_d79s79d0">a brief video</a> demoing the features:</p>
<div class="hn-embed-widget" id="kaltura-ui-for-good-cs5167"></div><p> </p>
<h2 id="heading-implementation-details">Implementation Details</h2>
<p>The app is implemented using Svelte with SvelteKit.</p>
<p>All of the icons are from <a target="_blank" href="https://fonts.google.com/icons">Google’s Material Symbols</a>. The brand logos and product information are from each of the respective brands’ webpages.</p>
<p>The beautiful hero image of the Giant Sequoia is originally from <a target="_blank" href="https://unsplash.com/@polinakoroleva">Polina Koroleva</a> on <a target="_blank" href="https://unsplash.com/photos/giant-redwood-tree-with-a-person-on-a-forest-trail-G_6RANn-VoQ">Unsplash</a>.</p>
<p>The fuzzy search functionality comes from the <a target="_blank" href="https://www.fusejs.io/">fuse.js</a> library.</p>
<h2 id="heading-use-of-ai">Use of AI</h2>
<p>I used slightly more AI on this project than the past. I used it to generate dummy data in the form of reviews for each brand as this is normally something that in a deployed app would be user generated.</p>
<p>I also experimented this time with using it to help create my modal for writing a new review. It didn’t give me all the correct styling, verbiage, and functionality though so I still had to make some significant changes to get it hooked up and looking right. It did, however, speed up the relatively mundane and repetitive task of setting up each form field. I probably wouldn’t use it for this task again in the future and would instead opt to reuse old code, but it worked well enough in a last minute pinch.</p>
<h2 id="heading-future-work">Future Work</h2>
<p>Especially given the aggressive timeline of this project there are many things I think would improve this project in the future.</p>
<ul>
<li><p>Creating a Chrome extension that tracks things that you buy and sends you follow-up emails every year or so to remind you to write and/or update a review.</p>
</li>
<li><p>Adding individual product pages in addition to brand pages that would allow you to track and review specific products as opposed to a brand overall.</p>
</li>
<li><p>Part of my original vision for the project was that the site would serve as somewhat of a review aggregator, kind of like <a target="_blank" href="https://www.rottentomatoes.com/">Rotten Tomatoes</a>.</p>
<ul>
<li><p>With that in mind, something I wanted to add, but simply ran out of time for, is adding badges and/or review excerpts from sites like <a target="_blank" href="https://www.nytimes.com/wirecutter/">Wirecutter</a> or <a target="_blank" href="https://www.americastestkitchen.com/">America’s Test Kitchen</a> that do actual professional testing, comparisons, and recommendations.</p>
</li>
<li><p>This would serve as something of a critics pick type section and would not only provide further reassurance that a product is built to last, but also provide you with a quick and easy link to read more in-depth tests on trusted review sites.</p>
</li>
</ul>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Catalyst Degree Audit Redesign — Project 3]]></title><description><![CDATA[Catalyst is notorious for being a nightmare to navigate and use. From broken buttons, random log outs, and an absolute mess of an interface, it has more than its fair share of usability problems.
As a result, when possible, people tend to avoid it li...]]></description><link>https://cs5167.kevinuulong.com/catalyst-degree-audit-redesign-project-3</link><guid isPermaLink="true">https://cs5167.kevinuulong.com/catalyst-degree-audit-redesign-project-3</guid><dc:creator><![CDATA[Kevin Long]]></dc:creator><pubDate>Wed, 19 Nov 2025 03:04:10 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1763508497960/405e6c26-45eb-4a58-b715-478ecdf144db.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Catalyst is notorious for being a nightmare to navigate and use. From broken buttons, random log outs, and an absolute mess of an interface, it has more than its fair share of usability problems.</p>
<p>As a result, when possible, people tend to avoid it like the plague.</p>
<p>This is a shame because, if you can get past all its quirks it actually has a lot of really useful tools and information.</p>
<p>One of the most useful pages, especially for Seniors like us looking to graduate soon is the Degree Audit page. This page provides an overview of the credits you have fulfilled so far and a list of what you still have left to graduate.</p>
<p>Since this page is so potentially useful to us now, this is the page we decided to redesign.</p>
<p><a target="_blank" href="https://project3.cs5167.kevinuulong.com/">View it live</a> | <a target="_blank" href="https://github.com/kevinuulong/if-it-is-broke-fix-it">Source code</a></p>
<h2 id="heading-design-stage">Design Stage</h2>
<p>We performed interviews with students who’ve used Catalyst and gathered several responses. These were utilized in some of our design decisions:</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td><strong>Interview Response</strong></td><td><strong>Design Response</strong></td></tr>
</thead>
<tbody>
<tr>
<td>Slow to access information (too much scrolling)</td><td>Easy to access views where different information categories are presented.</td></tr>
<tr>
<td>Information is dense and there aren't a lot of visual cues to differentiate GPA, Classes, co-ops, etc.</td><td>Separated the categories of classes into cards (missing classes, in progress, completed), and listed the individual classes separately within those cards.</td></tr>
<tr>
<td>The header was helpful, but too much information in too little space.</td><td>Converted header into a homepage with separate sections for missing and in progress classes. Also included a diagram to help visualize the information.</td></tr>
<tr>
<td>The interviewee wanted a separation of categories for the classes.</td><td>The sidebar was implemented for easy navigation between separate categories of classes.</td></tr>
</tbody>
</table>
</div><p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1763519252779/b9f5d5da-fb1f-4afe-a619-095f143e079b.jpeg" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1763519274668/b7bc2116-1734-428c-972c-83d989fc9602.png" alt class="image--center mx-auto" /></p>
<p>The two images above were two of our individual sketches. After presenting and discussing each of our sketches, the group worked on and finalized the sketches shown below.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1763519342047/d3dec7b4-2903-4a36-85d5-9a8e662ad735.jpeg" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1763519353567/fc6b5f7b-a14d-4198-8108-3d76fc3131c2.jpeg" alt class="image--center mx-auto" /></p>
<p>The two images above show our late-stage sketches. We combined our individual sketches and discussed what we’d like to see in the redesign. Some of the key features include the “cards” showing summaries of your missing/in progress classes. As well as the sidebar, which allows for easy navigation between multiple views.</p>
<p>From these sketches we moved onto our Figma prototype:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1763519482197/db079586-869a-4926-8e92-d860f6f9fe74.png" alt class="image--center mx-auto" /></p>
<p>We retained the sidebar navigation and the card-style summaries of the classes. We updated the navbar to fall in line with other UC applications (logos/symbols), and we also ensured we followed all of the UC color guidelines. The views for missing/in progress/completed classes are very similar. This was intentional as we didn’t want any jarring switches when selecting different views. We envisioned this as a more global redesign for catalyst, so we would assume other pages would follow the styling we utilized.</p>
<h2 id="heading-the-app">The App</h2>
<p>In the home page, the users get a quick overview of their missing courses, in progress courses, and the pie chart indicating their degree progress. The navbar and the menu are at fixed positions even if you scroll down.</p>
<p><img alt /></p>
<p>The back button on the navbar allows the user to go back to the last page before the current one.</p>
<p>In the side menu, users can navigate to other pages. The planned classes button pops up the link to UC Create my schedule in a new tab.</p>
<p>In the missing classes, users can look at the courses that they were supposed to take during previous semesters. Currently, the popup icon on the courses cards pops up the search for classes page in catalyst in a new tab.</p>
<p><img alt /></p>
<p>In the future classes page, users can keep track of the classes they need to take on their upcoming semesters. The courses are sorted by the semester starting with the next semester on top.</p>
<p><img alt /></p>
<p>In the completed classes page, users can keep track of the classes they have taken starting with the previous semester on top followed by the previous semester respective to it. The courses in this page also indicated the grade student got, number of units, professor, and when the course was taken.</p>
<p><img alt /></p>
<p>View our demo video below!</p>
<div class="hn-embed-widget" id="kaltura-if-it-is-broke-fix-it-cs5167"></div><p> </p>
<h2 id="heading-implementation-details">Implementation Details</h2>
<p>We implemented our app using SvelteKit.</p>
<p>We added the official UC colors from the branding guidelines as color styles in Figma and then created reusable components to keep our design consistent.</p>
<p>We used the Google Material Symbols for our icons.</p>
<p>Our pie chart uses D3 and is based on <a target="_blank" href="https://svelte.dev/playground/9dca4b51c5f24f38a2c1ce681a1142c1?version=5.43.6">this example code</a>.</p>
<p>We have a consistent layout with the navbar at the top and page navigation on the left.</p>
<h2 id="heading-future-work">Future Work</h2>
<p>There are multiple things that we would love to implement if we had more time:</p>
<ul>
<li><p>Add a search bar to search for courses</p>
</li>
<li><p>Integrate the database into the app</p>
</li>
<li><p>The courses will open their respective course details in catalyst on a new tab.</p>
</li>
<li><p>This is a part of a larger redesign of the catalyst. So we would update the pages to follow the same styling used here.</p>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Smart Shopping Cart - Project 2]]></title><description><![CDATA[The smart object we chose to work on was a smart shopping cart.
We specifically chose to focus our efforts on a cart targeted at grocery stores for this initial prototype.
Our smart cart has functionality to import your grocery list from the grocery ...]]></description><link>https://cs5167.kevinuulong.com/smart-shopping-cart-project-2</link><guid isPermaLink="true">https://cs5167.kevinuulong.com/smart-shopping-cart-project-2</guid><dc:creator><![CDATA[Kevin Long]]></dc:creator><pubDate>Wed, 22 Oct 2025 23:34:54 GMT</pubDate><content:encoded><![CDATA[<p>The smart object we chose to work on was a smart shopping cart.</p>
<p>We specifically chose to focus our efforts on a cart targeted at grocery stores for this initial prototype.</p>
<p>Our smart cart has functionality to import your grocery list from the grocery store’s preexisting smartphone app. It then shows the user a map and a route to follow to get all their items.</p>
<p>As the user checks items off their list, they get added to their virtual “cart”. Then when the user proceeds to checkout they can review their virtual cart and pay for their items right at the cart.</p>
<p><a target="_blank" href="https://unrivaled-vacherin-9943d5.netlify.app/">View it live</a> | <a target="_blank" href="https://github.com/kevinuulong/CS5167-UI-Project-2">Source code</a></p>
<h2 id="heading-design-stage">Design Stage</h2>
<p>We began by brainstorming and gathering our requirements.</p>
<p>For this project, we wanted to make something that was ergonomic and intuitive for the users. This led us to consider design components such as an advanced scanner that monitors all products taken in and out of the cart, and make the navigation and shopping list UI easy to use and straightforward by placing the list next to the map, which allows a seamless transition between selecting and editing list items and locating them in the store.</p>
<p>Some of our initial ideas involved a 3D navigation interface.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1761173130567/590d2ed1-4b49-4dcd-9c54-d352f224d840.png" alt class="image--center mx-auto" /></p>
<p>We quickly realized however that although that was a cool idea it was not going to be feasible to implement in the time we had. We iterated on that a few times and came up with a similar design with a 2D map that still communicated all the same details.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1761173146469/adf55d60-6d87-49dc-9b9a-4e5d78859af3.png" alt class="image--center mx-auto" /></p>
<p>We then needed to iterate on that design further to include a storyboard sketch in which we showcased how the user would interact and progress through our app.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1761173159773/c1596adf-8075-4fae-ac07-87dad142b5a0.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1761173169444/b2213118-941a-4f4c-a5bb-a9cdcbd2cdb6.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1761173176288/809b5273-df2e-462d-9061-6a2402b68e55.png" alt class="image--center mx-auto" /></p>
<p>Finally we needed to create a hybrid sketch of how our interface would work on an actual cart.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1761173197691/412ca190-2567-444a-9643-c37ea97d69b9.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-the-app">The App</h2>
<p>The app works by linking your list of items from your personal profile, the one you use to login, and generates a path for you to follow to get to those items. It also gives you directions as to where on the shelf those items are. The “magic” is that it scans the barcode of the item as you put it into the cart. After this you can checkout and pay right at the cart. No need for checkout lines.</p>
<p>The pages are as follows:</p>
<h3 id="heading-login-page">Login Page</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1761173346199/3df21364-40e3-4540-b7b9-31c7e89a5610.png" alt class="image--center mx-auto" /></p>
<p>This page consists of a QR code on the left which connects the grocery app on your phone to the shopping cart, allowing a quick and easy way to load your shopping list for navigation. Otherwise, users can login with their username and password. If they don’t have an account (or don’t want to log into it), users can simply click the “No thanks” button on the bottom.</p>
<p>For testing purposes, clicking the QR code, Login button, or the “No thanks” line will take you to the next page of the application.</p>
<h3 id="heading-shopping-cart-page">Shopping Cart Page</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1761173369443/65f86e1d-bd62-43c8-b8fd-8193c5b4fd22.png" alt class="image--center mx-auto" /></p>
<p>This page’s layout has the map you follow on the left side, the grocery list in the middle, and a static image of the shopping cart on the right. The map is supposed to automatically tracks your movement, leading you to the first item on the list. When you arrive at the first item, you can check off the item as needed. When you’re finished you can push the “Checkout now” button. This will take you to the payment page, where the items you’ve checked out will be added to the list for purchase.</p>
<p>For testing, select the “Next Step”  button and the map will update as it follows the path to the item. You can click on the items to strikethrough them (which add them to the purchase list), and clicking “Checkout now” will take you to the payment page.</p>
<h3 id="heading-payment-page">Payment Page</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1761173392507/8340ec89-f5c5-48a9-81ce-84daa36a42a6.png" alt class="image--center mx-auto" /></p>
<p>The X buttons and Add Item fields are not present in the hosted version of this project. We ran into merge conflicts with little time to fix the code, and so this section was commented out of the payment page component. This functionality has been restored to show how it should look if there was enough time to fix the conflicts.</p>
<p>The payment page consists of a review section where you can view your items listed for purchase, their quantity, cost, and total price. On the right you can tap to pay with a card, or you can select “I only have cash” where an employee would help you complete a cash transaction.</p>
<p>For testing purposes we added X buttons to eliminate items from the list, as well as an add item option where you can add items not on your shopping list. This was implemented as the “magic” of the shopping cart would automatically scan items as they were added or taken out of the cart. This would add the item to the purchase list or remove it, respectively.</p>
<p>The “Cancel Transaction” will take you back to the login page.</p>
<h2 id="heading-implementation-details">Implementation Details</h2>
<p>We implemented our app using Svelte (without SvelteKit).</p>
<p>Beyond our initial sketches we finalized the look and feel of the application using Figma and used Blender for our hybrid sketch/3D model.</p>
<p>Our screens are managed from one main entrypoint which allows us to easily share/bind data between screens.</p>
<p>Our map component uses a combination of Svelte/HTML and SVGs to create what essentially consists of a bunch of modular tiles that can be rendered according to user interactions. In the real cart the user would progress simply by moving the cart and adding items that would be scanned, however for the sake of this demo app we have implemented a “Next Step” button that can instead be used to make progress along the route.</p>
<div class="hn-embed-widget" id="kaltura-smart-object-cs5167"></div><p> </p>
<h2 id="heading-future-work">Future Work</h2>
<p>If we were to actually implement this on a real cart we would have to first of all hook up a backend and/or database.</p>
<p>Additionally, due to some of our time constraints we had to hardcode some of the items and routes. In the future we would like to implement an actual pathfinding algorithm that could adapt when new items are added to the route.</p>
<p>Finally, we had some additional testing functionalities like adding and removing an item from the cart that would normally be handled by the cart automatically that we had code for but ran into last minute merge conflicts and didn’t have time to add to the hosted app.</p>
]]></content:encoded></item><item><title><![CDATA[Recording the Journey — Project 1]]></title><description><![CDATA[Oh what a journey!
For this project I built a simple reading tracker and note taking app. The need for this app arose out of my own notetaking and logging needs when reading books for a book club I am a part of.
I like to take notes about the book as...]]></description><link>https://cs5167.kevinuulong.com/recording-the-journey-project-1</link><guid isPermaLink="true">https://cs5167.kevinuulong.com/recording-the-journey-project-1</guid><dc:creator><![CDATA[Kevin Long]]></dc:creator><pubDate>Wed, 24 Sep 2025 03:27:08 GMT</pubDate><content:encoded><![CDATA[<p>Oh what a journey!</p>
<p>For this project I built a simple reading tracker and note taking app. The need for this app arose out of my own notetaking and logging needs when reading books for a book club I am a part of.</p>
<p>I like to take notes about the book as I am reading it, however all the existing solutions I have found are not well designed for books. This app aims to fix that!</p>
<p>I had a lot of fun creating this app and I hope you enjoy it.</p>
<p><a target="_blank" href="https://project1.cs5167.kevinuulong.com/">View it Live</a> | <a target="_blank" href="https://github.com/kevinuulong/recording-the-journey">Source Code</a></p>
<h2 id="heading-design-stage">Design Stage</h2>
<p>With almost any project a lot of serious design work has to happen before you can even start thinking about writing a single line of code. This project was no exception!</p>
<p>I broke my design process for this project into a few non-linear steps.</p>
<h3 id="heading-interviews">Interviews</h3>
<p>An important part of solving any problem is making sure you completely understand it and what makes the current solutions insufficient.</p>
<p>This is where conducting interviews is really beneficial.</p>
<p>For this project I conducted a couple interviews, one more formal, the other in a more informal group discussion.</p>
<p>From those discussions I came away with a list of things people liked and disliked about their current reading tracking solutions.</p>
<blockquote>
<p><strong>NOTE:</strong> The following table combines feedback from multiple different sources discussing features of several different solutions.</p>
</blockquote>
<div class="hn-table">
<table>
<thead>
<tr>
<td><strong>Liked</strong></td><td><strong>Disliked</strong></td></tr>
</thead>
<tbody>
<tr>
<td>Flexibility/freedom to format</td><td>Hard to keep organized/not designed specifically for books</td></tr>
<tr>
<td>Easy/quick to open and jot down notes</td><td>Don’t always remember/think to log reading</td></tr>
<tr>
<td>Available on desktop/tablet</td><td>Interfaces can be cluttered and/or outdated</td></tr>
<tr>
<td></td><td>Too social media-esque</td></tr>
</tbody>
</table>
</div><p>In addition to understanding what people liked and disliked I wanted to get a good grasp of the motivations people had for tracking their reading.</p>
<p>Everyone I interviewed for this project was part of their own book clubs. As such, notetaking for discussions was the primary motivating factor for tracking their reading.</p>
<p>Some also liked to have a way to keep track of what books they had read and what they thought about them.</p>
<p>After all my discussions and interviews I felt I finally had enough of an understanding of what was important to people in a reading tracking application to begin sketching some initial designs.</p>
<h3 id="heading-sketching">Sketching</h3>
<p>Especially after conducting my interviews I had a lot of different ideas when it came to the potential layout for my app. By sketching these different ideas I was able to get a much better idea of how each potential layout would look and work without having to go through the whole process of designing and developing each one.</p>
<p>I like the look and feel of physical books and bookshelves so I tried a few designs that really leaned into that.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1758664012772/75d8870d-792b-4abc-86af-7a7d82ad85ec.png" alt class="image--center mx-auto" /></p>
<p>Another design was essentially a physical notebook where each page contained scrollable notes about a specific book.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1758664096120/a5f670ac-7f89-419b-bca9-c90885e1d258.png" alt class="image--center mx-auto" /></p>
<p>Other designs leaned less heavily on skeuomorphic elements.</p>
<p>For example this design was heavily inspired by social media feeds.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1758664264117/deeabbd0-9bef-4c56-aa15-c6f974bc1634.png" alt class="image--center mx-auto" /></p>
<p>I had a few more completely different designs and design variations that combined different elements in a number of different ways, but the design I ultimately settled on was this one.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1758664483084/cf17d9d3-b939-41af-a924-d87e8f0d3fac.png" alt class="image--center mx-auto" /></p>
<p>I liked this design for a few reasons. Not only did I feel like it was the most user friendly with a clear bookshelf on the left and notes panel on the right, but it also let me combine some minimal skeuomorphic elements like physical looking books, with a more modern bookshelf and editor layout.</p>
<p>Since I was happy with this design I copied the concept over to Figma to create a more formal looking wireframe and layout to play around with.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1758664790587/c5761b75-9667-43a5-bf50-18d4d7049f64.png" alt class="image--center mx-auto" /></p>
<p>Once I was in Figma I was able to start choosing colors and styles.</p>
<p>While websites are typically the domain of clean minimal sans-serif fonts, books and printed material still overwhelmingly use serif fonts. Since I was looking to create a bookish feel I knew very early on that I wanted to use a nice serif font.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1758665975263/c8826b56-71ed-4e81-8e0b-a5c35a669feb.png" alt class="image--center mx-auto" /></p>
<p>Although you have a couple options, when it comes to serif fonts it is hard to go wrong when choosing a Garamond typeface. I settled on EB Garamond in part because it is <a target="_blank" href="https://fonts.google.com/specimen/EB+Garamond">freely available on Google Fonts</a>, but also because it’s a variable font that supports all the bells and whistles like ligatures and italics.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1758666264170/f08b7d16-3fea-4917-84cb-00180efb27f7.png" alt class="image--center mx-auto" /></p>
<p>In a similar vein I knew that I wanted my colors to feel natural and book inspired. I took inspiration from a green themed color palette I found online (pictured above) and combined some of those colors with the light cream of faded book pages and a classic dark gray and white to form my final color palette.</p>
<p>Finally, I took all of that and expanded my initial sketch and wireframe into a full design prototype in Figma.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1758666491485/6c621688-85b5-4282-bd87-6dd3b8d92705.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-feedback">Feedback</h3>
<p>Aside from conducting initial interviews it is important to get feedback early and often to ensure you don’t sink too much time and/or resources into something the end user doesn’t want.</p>
<p>I certainly followed at least the first part of that mantra. I got feedback on some of my early designs and sketches but did not get as much feedback later in the process.</p>
<p>Most of the feedback I got was pretty positive, however some of the early feedback led me to realize I had overlooked the goal tracking elements of the project in my initial designs and sketches.</p>
<p>This feedback is another reason I ended up selecting the design concept I did, since not only did it give me a place to put the notes about each book, but also a convenient place to include this overlooked goal tracking functionality.</p>
<h2 id="heading-the-app">The App</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1758669034547/75660516-6003-4820-a37b-b4d02fd541d7.png" alt class="image--center mx-auto" /></p>
<p>The app itself is divided into two main panels. On the left is the persistent bookshelf. This shows all the books that you have added and gives you the opportunity to add and switch between books.</p>
<p>On the right is the reading log. This includes information about progress towards your yearly reading goal as well as a graph showing all the reading you have logged.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1758675608305/e8834e9e-6e0f-4ed1-8b8b-c47133650bad.png" alt class="image--center mx-auto" /></p>
<p>The reading goal widget shows the number of books you have read as well as your goal for the year. This goal can be edited by clicking the “Edit goal” link.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1758675651019/8c9c7e4e-6d8a-419d-8b0e-6d7059e53a4a.png" alt class="image--center mx-auto" /></p>
<p>The reading streak widget shows all the reading you have logged and gives you an update on your streak. You can add to your log by either clicking the “Add to log” link to add reading to the current day, or click on any of the days in the chart to add or edit reading for that day.</p>
<p>Back on the left side, the bookshelf pane the “Add to log” or streak button also allows you to add reading to your log for the day.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1758675930548/e8020c9e-50a8-4792-b9d0-5062c3c18ec7.png" alt class="image--center mx-auto" /></p>
<p>To add a new book to your bookshelf you use the “Add a book” button. This pulls up a modal in which you can enter the book details.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1758676099529/2f16a244-cc38-44fe-87ba-c3ea29721509.png" alt class="image--center mx-auto" /></p>
<p>You can hit “Cancel” or the close icon to close without saving or click “Save book” to finish adding your new book to the bookshelf.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1758677024226/60cb4bc6-d1c7-44bb-a99a-8611488800df.png" alt class="image--center mx-auto" /></p>
<p>You should now see your newly added book on your bookshelf! If you click on it, or any of your other books it will pull up a notes panel on the right in place of your reading log. This is where you can write away! Take any notes you want here. This editor is intentionally rather unstructured to allow you the most freedom to write your notes the way you want them.</p>
<p>The editor supports many <a target="_blank" href="https://www.markdownguide.org/">markdown features</a> but also includes a <a target="_blank" href="https://en.wikipedia.org/wiki/WYSIWYG">WYSIWYG</a> editor toolbar at the bottom for those unfamiliar with markdown.</p>
<p>Additionally on the left side of the toolbar you will find the bookmark and finished reading options. You can use the bookmark option to keep track of what page you are on in the book and when you are finished click the checkmark button and it will add it to your yearly reading goal.</p>
<p>You can switch between books and all your data will be saved.</p>
<blockquote>
<p><strong>BONUS:</strong> I actually implemented a dark mode, although I ran out of time to add a toggle for it. Instead if you switch your computer’s preferred color scheme it will update the UI to match.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1758681970833/477776a2-a6f4-411a-9037-8fa4982b1a13.png" alt class="image--center mx-auto" /></p>
</blockquote>
<p>Here is a brief video demoing the features.</p>
<div class="hn-embed-widget" id="kaltura-recording-the-journey-cs5167"></div><p> </p>
<h2 id="heading-implementation-details">Implementation Details</h2>
<p>Especially towards the beginning I organized all the code rather well. I tried to use best coding practices and make everything that could be a well designed reusable component. You can see this most easily with the <code>Button</code> component as it is the first one I started.</p>
<p>As I added more features though and got closer to the deadline I started to become a little less organized and started throwing most of my code in the main <code>+page.svelte</code> file.</p>
<p>This touches a little on the future work I would like to do, but if I had more time I would have done a lot more code cleanup and utilizing routing. I think both the reading log panel and the notes panel should have been their own separate components/pages and the bookshelf a part of the layout. I had originally started the project using SvelteKit because I intended to do a lot more pagination/routing but I simply ran out of time.</p>
<p>One of the features I am most proud of is the reading streak graph. I spent a lot of time (probably too much) implementing it as a custom graph so that I could get it to work and look exactly how I wanted it to. I think it turned out pretty well but in the future I would probably just use an existing graphing library to save on time.</p>
<p>Another cool feature was the notes editor. I knew from the start I wanted something vaguely inspired by Notion and Google Docs, two of the solutions people had said they liked using during my interviews. They liked the free-form nature of being able to easily type and format as they so desired instead of being forced to use some popup or form.</p>
<p>The easy way for me to implement this would have been to just give them a <code>textarea</code> and call it a day, but if I did that I felt a key component of the experience would have been missing — the formatting.</p>
<p>I wanted it to be fully customizable and match my theme correctly, however creating an editor like this from scratch is <em>a lot</em> of work and would likely take a lot longer than I have to get a probably only mediocre final product.</p>
<p>What I ended up using is a library called <a target="_blank" href="https://tiptap.dev/product/editor">Tiptap</a>. Tiptap is a headless rich text editor built on <a target="_blank" href="https://prosemirror.net/">ProseMirror</a>. Essentially what that means is that Tiptap provides the place to type and you use the editor’s API to create all your own buttons, styles, and other functionality.</p>
<p>This <em>vastly</em> simplified the complexity of implementing such a feature and is what made it anywhere close to feasible to implement on this timeline.</p>
<h2 id="heading-use-of-ai">Use of AI</h2>
<p>I didn’t use much AI for this project. Every now and then when I had a bug or problem that MDN or StackOverflow couldn’t answer I would ask Google Gemini and it would sometimes give a useful answer.</p>
<p>I did experiment with using AI to write a function to generate random mock data for the reading log and it worked pretty well for that (although I later changed the data structure I was using to store that data and had to make a bunch of changes to it).</p>
<p>I have never found AI to be particularly adept at designing visual things and since this is ultimately a design project I did not find huge use for it.</p>
<h2 id="heading-future-work">Future Work</h2>
<p>Other than the obvious, I would love to actually hook this app up to a database of some kind, there are a few things I didn’t have time to get to that I would love to do if I had more time.</p>
<ul>
<li><p>I would love to make it more responsive/work on mobile.</p>
<ul>
<li>It is responsive enough to work on most desktop/laptop screens and maybe a tablet, but there is still a lot of work I would need to do If I wanted to make it a good experience on more devices.</li>
</ul>
</li>
<li><p>There are a few minor bugs in both the UI and functionality that don’t seriously affect the user experience but bug me nonetheless.</p>
</li>
<li><p>I mentioned it before, but some of the code is a mess. If I continued working on this project further I would have to clean some of that up.</p>
</li>
</ul>
]]></content:encoded></item></channel></rss>