Advertisement · 728 × 90

Posts by Danny Spangenberg

Screenshot of the Personal access tokens section in a web app.

Screenshot of the Personal access tokens section in a web app.

1 week ago 1 0 0 0
Screenshot of the profile section in a web app.

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

1 week ago 2 2 1 0
GitHub - dspangenberg/haraka-plugin-dropbox: Haraka plugin that forwards incoming emails to configured Dropbox webhook URLs. Haraka plugin that forwards incoming emails to configured Dropbox webhook URLs. - dspangenberg/haraka-plugin-dropbox

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

1 week ago 1 1 0 0
Preview
Eurosky - Building a thriving open social web for Europe Eurosky is a European initiative to build and operate sovereign social web infrastructure

New website is up! eurosky.tech

Englishs only atm. German, French, Dutch, Polish, Spanish and Italian coming soon!

1 week ago 305 104 22 13
Card with text: “Europe is still handing its most sensitive data to external powers.”

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: “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: “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”

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

1 week ago 14 6 0 0
Preview
Euro-Office sticht Microsoft Office? Europa probt den digitalen Aufstand: Mit Euro-Office will eine Initiative eine souveräne Alternative zu Microsoft etablieren.

Europa probt den digitalen Aufstand: Mit Euro-Office will eine Initiative eine souveräne Alternative zu Microsoft etablieren. www.computerwoche.de/article/4151...

1 week ago 269 78 15 3
the npmx landing page with a Transgender Pride Flag based kawaii logo built on March 31, 2026

the npmx landing page with a Transgender Pride Flag based kawaii logo built on March 31, 2026

today and always ./🏳️‍⚧️

1 week ago 373 55 8 3
Post image

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...

2 weeks ago 2061 1508 92 136
Video

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...

2 weeks ago 6 3 0 0

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!

3 weeks ago 2 1 0 0
Advertisement
Screenshot of the PdfContainer

Screenshot of the PdfContainer

Screenshot of the PdfViewer (Promise)

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 { 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 { PdfContainer } from '@/components/twc-ui/pdf-container' export const Demo = () => { return ( <PdfContainer file="/compressed.tracemonkey-pldi-09.pdf" /> ) } export default Demo

PDF-Container / PDF-Viewer

React Shadcn
#react #shadcn

3 months ago 3 0 0 0
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 { 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" }); };

3 months ago 1 0 0 0
Video

Alert dialog with promise
#react #shadcn

3 months ago 3 1 1 0
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>
  )
}

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

9 months ago 4 0 0 0