Sprint 3 Reflection: Data Translation and Visualization Implementation
Sprint Duration: April 12-18, 2026
Sprint Duration: April 12-18, 2026
Zone Layout Table
Initial testing for Zone 1, top left pattern displays cap at 50 diagonal lines and overlaps twice. Also this would pose an issue for when we print for several weeks, it will overlap and the design is too confusing for reading. Bottom right design adds the noise/density of line.
Next, we tested all four zones together. The margin was initially too large (2 cm), so we reduced it to 2 mm, resulting in a more accurate layout that fits the wristband dimensions.
A remaining issue is in Zone 1: it currently shows 4 lines (4k steps), but future weeks with higher step counts (e.g., 6k being 6 lines) will overlap with existing engravings since the wristband is reused, creating potential clarity issues.
More sample runs (bottom): To address the overlapping issue, we capped the number of lines at 10, ensuring consistent spacing and leaving room for additional activity in future prints.
Our terminal displaying the data from start to end of week and the calculations so we can verify if they following information is correct, then press enter to start engraving.
This is our final testing of Zone 4 of level 3, the fractal pattern (right side).
Link -Video of engraving (sped up 10x)
Aro: In this sprint, we worked on converting the Fitbit data into physically engraved patterns that fit within the wristband's constraints. We both worked on implementing the Python drawing functions, integrating the Fitbit data, and ensuring the script ran correctly end-to-end. This patina tracker/ wristband is a visual record that accumulates and evolves over time. Like the paper, we divide the wristband into 4 distinct zones.
My main contribution was building the core drawing script, draw_wristband.py. This included writing the four zone functions: draw_zone1() through draw_zone4(), each encoding a different type of activity data into a distinct visual pattern according to what the paper had. We first started by thinking about how to represent the data on the wristband and how we would use code to represent that. After having a clear, written, and detailed plan (Detailed in our sprint plan), we started coding.
Zone 1 presented its own challenge. Like the paper's step encoding, we map step count to the number of diagonal strokes (1000 steps = 1 diagonal line). However, we had to figure out how to prevent overcrowding and overlapping across repeated weekly prints. Our calculation is: avg_steps = sum(steps_vals) // max(1, sum(1 for s in steps_vals if s > 0)). avg_steps is the single average across all 7 days. So Zone 1 draws the same pattern for the whole week, not one per day. Following the paper's reasoning that 10,000 steps per day is considered a normal activity level, we mapped 1,000 steps to one diagonal line and capped the maximum at 10 strokes, so the pattern stays readable regardless of how active the week was. Active time control the noise level of the dots, similar to what they had in the paper. More active time produces cleaner, smoother lines, while less activity results in more jitter and sporadic dots. We implemented this noise using a Gaussian distribution formula directly inspired by the paper's approach.
One notable difference from the paper is how we handled Zones 2 and 3. In the original Patina Engraver paper, those zones used an up-down zigzag pattern similar to Zone 1. We chose to replace that with vertical stipple lines instead of one per day because they create a clearer visual separation between days and make the calorie and sleep data easier to read at a glance. It would also be more straightforward to code. We kept the up-to-down engraving for zone 2 vs down-to-up engravign for zone 3 like how they had in the paper to differentiate between the two.
Zone 4 follows the paper directly: a recursive fractal cross that increases in complexity across three distance levels (0–20 km, 20–40 km, 40–60 km).
Regarding the data, first, i manually downloaded the fitbit data from the tracker just like how we diud in the previous print and the paste that into ourt patina-engraver file so that we can use it. then I worked on integrating the Fitbit data pipeline and writing loader functions that parse CSV and JSON exports and map them to the correct dates.
Getting the data to align properly across different file formats and date string styles was a challenge but after dennuging and testing it worked as inteded.
Another ongoing part of my work this sprint was I painted four new wristband prototypes. Then Galina and I repeatedly test-printed the script on paper to balancing code correctness with physical output. Repeated testing on paper was the only real way to catch any issues. And we fixed the code accordingly as described in our documentation.
Toward the end of the sprint, Galina and I began exploring material alternatives for the engraving tool. Our current setup uses a pen attached to the AxiDraw, which we plan to replace with a needle. As we tried manyally scratching the paint off and mimic the dotting process, we realize it will need lot more force to stach and for the layer underneath to be visible but the plotter does not generate enough downward force to scratch through the paint layer on the wristband. As a workaround, we are considering replacing the needle with a pen of a different color to mimic the patina effect. The pattern would still be drawn by the AxiDraw.
Overall, this sprint was a success. We now have a working Python script that loads real Fitbit data, generates all four zones, and sends them to the AxiDraw which was the core goal. The foundation is solid enough to build on in Sprint 4.
Galina:
In this sprint, Aro and I focused on translating Fitbit data into actual visual patterns that can be physically drawn within the constraints of the wristband. While Aro worked more on implementing the Python drawing functions and integrating the data, I focused on refining how the data should be represented visually and ensuring the designs were readable and scalable over time.
My main contribution was helping define the structure and logic behind each zone, especially Zone 1. Initially, we tried mapping 1,000 steps directly to one line, but this quickly became problematic because it caused overcrowding and would not work for repeated weekly engravings. To solve this, we revised the design to cap the number of lines and keep spacing consistent, allowing the pattern to remain readable and leave room for future data. I also helped rethink Zones 2 and 3 so that each day is represented clearly within its own segment while still maintaining a consistent visual system across the band.
Another key part of my work was testing and validating the physical output using the AxiDraw. By running multiple test prints, we were able to identify issues such as incorrect margins, scaling problems, and overlapping patterns. For example, we initially used a 2 cm margin, which was too large, and corrected it to 2 mm to better fit the wristband dimensions. I also helped analyze how patterns would behave over multiple weeks, which influenced our decision to constrain and standardize the designs.
In addition, I contributed to documenting our design decisions as well as reorganizing and adding sprint documentation. I also assisted in testing different materials and finishes (black vs. white silicone, different paint layers) to evaluate which surface produces the clearest markings for future engraving.
A challenge this sprint was balancing accurate data representation with visual clarity, especially given the physical limitations of the wristband and the fact that the design will accumulate over time. However, through testing and iteration, we were able to refine a system that is both functional and scalable.
Overall, this sprint was successful because we now have a working system that generates full wristband visualizations from real data, along with a much clearer design approach for how that data should be represented physically.