Welcome to this, the fourth and final installment of our series on implementing passkeys in Clojure and React Native. Part one covered the background on how passkeys work and the data model, part two covered user registration, and part three covered user authentication. Today, we’re going to build the client using react-native-passkey . Passkeys on the Client The react-native-passkey documentation…
Welcome back to this series on implementing passkeys in Clojure. For background on how passkeys work and how we’re building this backend, please refer back to part one of the series which covers the data model behind our implementation, and part two , which covers user registration. User Authentication Today, we’ll complete the backend of our passkey service by building the endpoints needed to…
Welcome back to this series on implementing passkeys in Clojure. For background on how passkeys work and how we’re building this backend, please refer back to part one of the series . User Registration Today, we’ll be building the API endpoints we need for users to register a new passkey on our service. The flow looks like this: A user makes a request with their account information to start the…
This is part one of a series. Find part two here . For the past few months, I’ve been searching for a good authentication solution or my mashup Farcaster sports client Sportscaster . As I noticed myself increasingly drawn towards the convenience of sites and apps that use passkeys in place of a traditional username/password combo or something a little more exotic like magic email or text links, I…
As of version 0.70.0, Meta’s Hermes became the default JavaScript engine for React Native . While JSC is still supported, the React ecosystem moves fast, and what is the default now can quickly become the only supported option. The Problem ClojureScript depends on Google Closure as both a standard library and a compiler. Hermes does not yet support ES6 classes , which are used in several places in…
Four years ago, I published the first version of Outboard , my iOS app for saving and organizing places, written in ClojureScript on React Native . While the experience of building a functional, reactive UI in ClojureScript was a dream, the experience of duct-taping the various fast-moving bits of Javascript build pipelines and compilation systems was not. Over the course of the four years since…
In building the web frontend for Outboard , I am using Apple’s MapKit JS , which is delivered via CDN and not included in my application’s bundle locally. Under ClojureScript’s advanced compilation, this means there are places where type hinting for externs is necessary. My code initially looked like this: ( go ( let [ map ( js/mapkit.Map. "map-element" ) ; ... annotation ( <! ( fetch-annotation…
Thanks to Microsoft’s diligent open-source work , we can now build an app on macOS in a modern Lisp, with a connected REPL and everything. For those of us who remember the 90s , this is truly the dankest timeline. The only dependency Krell requires above vanilla React Native is react-native-tcp-socket , which as of 3.6.0 compiles just fine on macOS. Building a macOS app, then, just requires…
Update 29 September 2020 Krell support is now build into Cider. When launching a ClojureScript REPL from your project ( C-c C-x j s ), select the krell option. To avoid needing to make a choice on startup, add the following to .dir-locals.el in the root of your project directory: (( nil . (( cider-default-cljs-repl . krell )))) Original Post Krell is a new, minimalist system for interfacing…
Once you’ve grokked the Re-Frame philosophy for building truly reactive applications on React in ClojureScript, you will want to apply it everywhere. One obvious and ubiquitous application of effects is asynchronous HTTP requests, and of course there is an officially sanctioned library for handling these. One problem: it relies on an AJAX library that only works with the browser XHR…
I try to hang out in the #cljsrn channel on Clojurians Slack to answer questions that I can as they come up, and one in particular that I also puzzled over has recurred: Why is there so much keyboard lag on my TextInput elements? Is this inherent in React Native or ClojureScript? Fortunately, it’s not. The issue is how you handle the element’s state. Most people start out with something like this:…
A major feature of Outboard , my iOS app written with ClojureScript on React Native , is the ability to add places to your lists from a share extension inside Apple’s Maps, Google Maps, Yelp, or other apps that supply URLs. React Native ships with AsyncStorage , a LocalStorage analog for iOS and Android apps, but on iOS, that data is sandboxed to the app alone. To share between an app and an…
For the past few years, I’ve kept a Notes.app list of restaurants, hikes, bars, and other things I’ve been meaning to visit. It was messy, not geographically-aware, and difficult to quickly add to. Not finding any satisfactory solutions elsewhere, I decided to scratch my own itch and build an app worth a spot on my home screen. Outboard is the result of the last five months of side project…
In part one and part two of this series, we looked at how to build a ClojureScript environment that we can deploy to AWS Lambda and the API Gateway that will respond to the outside world as a web service. With that done, today we’ll see how to go about deploying it. First, you’ll need to have an Amazon AWS account , with your AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY environment variables set.…