New blog and homepage focus
All checks were successful
Docker Deploy / build-and-push (push) Successful in 4m43s
All checks were successful
Docker Deploy / build-and-push (push) Successful in 4m43s
This commit is contained in:
@@ -31,9 +31,18 @@ export const config: Config = {
|
||||
},
|
||||
tagline: "Researcher, Full-Stack Developer, and IT Professional",
|
||||
description: "Researcher, Full-Stack Developer, and IT Professional",
|
||||
currentFocus: [
|
||||
{ label: "Masters", style: "secondary" },
|
||||
{ label: "Open Source", style: "accent" },
|
||||
{ label: "Contract Work", style: "primary" },
|
||||
],
|
||||
},
|
||||
|
||||
homepageSections: {
|
||||
currentFocus: {
|
||||
title: "Current Focus:",
|
||||
description: "What I'm currently working on",
|
||||
},
|
||||
socialLinks: {
|
||||
title: "Places I Exist:",
|
||||
description: "Find me across the web",
|
||||
@@ -91,6 +100,10 @@ export const config: Config = {
|
||||
description: "Researcher, Full-Stack Developer, and IT Professional",
|
||||
},
|
||||
homepage: {
|
||||
currentFocus: {
|
||||
title: "Current Focus:",
|
||||
description: "What I'm currently working on",
|
||||
},
|
||||
socialLinks: {
|
||||
title: "Places I Exist:",
|
||||
description: "Find me across the web",
|
||||
|
||||
36
src/content/posts/ascently-climbing-tracker.md
Normal file
36
src/content/posts/ascently-climbing-tracker.md
Normal file
@@ -0,0 +1,36 @@
|
||||
---
|
||||
title: "Building Ascently: Why I Chose Native Over Cross-Platform"
|
||||
description: "Building a fully native climbing tracker and why I didn't use Flutter or React Native."
|
||||
pubDate: "2025-02-15"
|
||||
tags: ["projects", "open-source", "mobile"]
|
||||
---
|
||||
|
||||
I've been climbing for a couple of years now, and I wanted a simple way to track my sessions and progress. The apps I tried required accounts I didn't want to create, or just felt... off. So I went and made my own.
|
||||
|
||||
## Why Native?
|
||||
|
||||
I built Ascently twice. Once in SwiftUI for iOS, and once in Jetpack Compose for Android. No Flutter, no React Native, no cross-platform frameworks.
|
||||
|
||||
This seems like a lot more work than its worth. Why would anyone willingly write the same app twice?
|
||||
|
||||
**Different platforms are different**
|
||||
|
||||
iOS users expect iOS features and design. Material You on Android looks and feels different than iOS's design language, and thats _good_. This is part of what makes these platforms unique. I wanted Ascently to feel hand-crafted for each platform and not like some fully custom design that feels out of place. SwiftUI and Jetpack Compose let me do this while maintaining the declaritive approach I appreciate so much from frameworks like Flutter. I also just genuinely enjoyed learning both frameworks.
|
||||
|
||||
## Offline-First
|
||||
|
||||
Building Ascently offline-first wasn't a feature... it was a necessity. Your sessions are saved locally and are always accessible. If you want sync, you can run your own lightweight server. But you don't _have_ to. Your data always remains yours, on your device, until you **explicitly** decide otherwise.
|
||||
|
||||
## Privacy as a Feature
|
||||
|
||||
No analytics. No tracking. No data collection. I am tired of apps treating privacy like a checkbox to tick instead of a fundamental design choice. I went out of my way to ensure that the ONLY time network calls are made is when you explicitly choose to sync or enable health integration.
|
||||
|
||||
This made the architecture simpler, honestly. No need to figure out integrating an analytics SDK to integrate. Turns out you don't need to fuss around with building the perfect "privacy respecting analytics" system if you just **don't** collect analytics to begin with.
|
||||
|
||||
## What I've Learned
|
||||
|
||||
Building native apps on both platforms taught me that cross-platform frameworks solve a real problem—but not _my_ problem. I wanted to learn native development while solving a problem I felt was never properly solved. And of course I wanted full control over the tech stack without abstractions or code generation getting in the way.
|
||||
|
||||
## Try It (Or Don't)
|
||||
|
||||
If you climb and you're looking for a simple app to manage your trips to the gym, please give [Ascently](https://ascently.atri.dad) a shot. All the code is available at [git.atri.dad/atridad/Ascently](https://git.atri.dad/atridad/Ascently).
|
||||
@@ -26,6 +26,41 @@ import { config } from "../config";
|
||||
{config.personalInfo.tagline}
|
||||
</h2>
|
||||
|
||||
{
|
||||
config.personalInfo.currentFocus && (
|
||||
<>
|
||||
<h3 class="text-lg sm:text-2xl font-bold">
|
||||
{config.homepageSections.currentFocus.title}
|
||||
</h3>
|
||||
|
||||
<div class="flex flex-wrap gap-2 justify-center mx-6">
|
||||
{config.personalInfo.currentFocus.map((focus) => {
|
||||
const badgeClass =
|
||||
focus.style === "primary"
|
||||
? "badge badge-primary"
|
||||
: focus.style === "secondary"
|
||||
? "badge badge-secondary"
|
||||
: focus.style === "accent"
|
||||
? "badge badge-accent"
|
||||
: focus.style === "neutral"
|
||||
? "badge badge-neutral"
|
||||
: focus.style === "info"
|
||||
? "badge badge-info"
|
||||
: focus.style === "success"
|
||||
? "badge badge-success"
|
||||
: focus.style === "warning"
|
||||
? "badge badge-warning"
|
||||
: focus.style === "error"
|
||||
? "badge badge-error"
|
||||
: "badge";
|
||||
|
||||
return <span class={badgeClass}>{focus.label}</span>;
|
||||
})}
|
||||
</div>
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
||||
<h3 class="text-lg sm:text-2xl font-bold">
|
||||
{config.homepageSections.socialLinks.title}
|
||||
</h3>
|
||||
|
||||
16
src/types.ts
16
src/types.ts
@@ -105,9 +105,25 @@ export interface PersonalInfo {
|
||||
};
|
||||
tagline: string;
|
||||
description?: string;
|
||||
currentFocus?: {
|
||||
label: string;
|
||||
style:
|
||||
| "primary"
|
||||
| "secondary"
|
||||
| "accent"
|
||||
| "neutral"
|
||||
| "info"
|
||||
| "success"
|
||||
| "warning"
|
||||
| "error";
|
||||
}[];
|
||||
}
|
||||
|
||||
export interface HomepageSections {
|
||||
currentFocus: {
|
||||
title: string;
|
||||
description?: string;
|
||||
};
|
||||
socialLinks: {
|
||||
title: string;
|
||||
description?: string;
|
||||
|
||||
Reference in New Issue
Block a user