Screenshot of the Personal access tokens section in a web app.
Posts by Danny Spangenberg
Screenshot of the profile section in a web app.
Instead of an Easter lamb, an app over the holidays. Fortunately, my component library has survived the update to InertiaJS 3.
#haraka #smtp #dropbox #buildinpublic #email
github.com/dspangenberg...
Need to get emails easily into your #saas via a webhook? Give the Haraka SMTP Email Server and the dropbox-plugin a try.
#haraka #smtp #dropbox #buildinpublic #email
New website is up! eurosky.tech
Englishs only atm. German, French, Dutch, Polish, Spanish and Italian coming soon!
Card with text: “Europe is still handing its most sensitive data to external powers.”
Card with text: “But Europe already has the technology, so what’s missing isn’t capability.”
Card with text: “So why isn’t Europe acting? If the tools exist, what’s holding us back?”
Card with text: “The discussions shaping Europe’s digital future are happening now. Join the Nextcloud Summit! June 9th, 2026 | Munich, Germany”
Let's be honest 😲
Europe wants #digitalsovereignty, but we're still relying on infrastructure from #BigTech we don’t control.
What’s holding us back from choosing European options? Join the conversation at the #NextcloudSummit.
📅 June 9
📍 Munich, Germany
Register here: 👉 nextcloud.com/summit
Europa probt den digitalen Aufstand: Mit Euro-Office will eine Initiative eine souveräne Alternative zu Microsoft etablieren. www.computerwoche.de/article/4151...
the npmx landing page with a Transgender Pride Flag based kawaii logo built on March 31, 2026
today and always ./🏳️⚧️
If you use GitHub (especially if you pay for it!!) consider doing this *immediately*
Settings -> Privacy -> Disallow GitHub to train their models on your code.
GitHub opted *everyone* into training. No matter if you pay for the service (like I do). WTH
github.com/settings/cop...
Mit der gestrigen Neuabstimmung im EU-Parlament ist die „freiwillige Chatkontrolle“ (Übergangsregelung seit 2021) Geschichte. Die Entscheidung über die „Chatkontrolle 2.0“ steht noch aus.
Kämpfen wir weiterhin gegen die anlasslose Massenüberwachung: mailbox.org/de/news/chat...
Don’t trust US-based companies (with your data). It’s time to move to EU providers. Where non-exist, there lies opportunity to build something!
Screenshot of the PdfContainer
Screenshot of the PdfViewer (Promise)
import { PdfViewer } from '@/components/twc-ui/pdf-viewer' const doSomething = async () => { await PdfViewer.call({ file: '/compressed.tracemonkey-pldi-09.pdf' }) }
import { PdfContainer } from '@/components/twc-ui/pdf-container' export const Demo = () => { return ( <PdfContainer file="/compressed.tracemonkey-pldi-09.pdf" /> ) } export default Demo
import { AlertDialog } from "@/components/twc-ui/alert-dialog"; const doSomething = async () => { const confirmed = await AlertDialog.call({ title: "Are you absolutely sure?", message: "This action cannot be undone. This will permanently delete your account and remove your data from our servers.", buttonTitle: "Delete Account", variant: "destructive" }); };
import { DemoContainer } from '@/components/docs/DemoContainer' import { Button } from '@/components/twc-ui/button' import { Form, useForm } from '@/components/twc-ui/form' import { FormGroup } from '@/components/twc-ui/form-group' import { TextField } from '@/components/twc-ui/textfield' import { Head } from '@inertiajs/react' interface Props { contact: App.Data.ContactData } export default function FormDemo ({ contact }: Props) { const form = useForm<App.Data.ContactData>( 'contact-form', 'post', route('contact.store'), contact ) return ( <DemoContainer> <Head title="Form Demo" /> <Form form={form} errorVariant="field"> <FormGroup> <div className="col-span-12"> <TextField label="First name" {...form.register('first_name')} /> </div> <div className="col-span-12"> <TextField label="Last name" {...form.register('last_name')} /> </div> <div className="col-span-12"> <TextField label="E-Mail" {...form.register('email')} /> </div> <div className="col-span-12"> <Button title="Save" type="submit" /> </div> </FormGroup> </Form> </DemoContainer> ) }
Sneak preview: A DRYer form with precognition. #reactjs #shadcn #intertiajs #laravel