
Research
/Security News
737 Chrome VPN Extensions Linked to Brand Impersonation and Browser Traffic Redirection
The campaign amassed more than 75,000 installs by targeting Russian-speaking users seeking access to blocked services.
@astrocal/widget
Advanced tools
Embeddable booking widget for Astrocal — drop-in scheduling UI for any website or app
Add scheduling to any website in under 60 seconds. The official embeddable booking widget from Astrocal — the API-first scheduling platform built for developers.
Drop in a script tag or install from npm. Your visitors book meetings directly on your site — no redirects, no iframes, no Calendly branding.
Get started free | Widget Documentation | Live Demo
prefers-color-scheme or set it explicitly.No build step required. Load from CDN and go:
<script src="https://cdn.astrocal.dev/widget/latest/astrocal.js"></script>
<script>
Astrocal.open({
eventTypeId: "your-event-type-id",
mode: "popup",
});
</script>
Or use data attributes for zero-JavaScript setup:
<script src="https://cdn.astrocal.dev/widget/latest/astrocal.js"></script>
<div data-astrocal-event-type-id="your-event-type-id" data-astrocal-mode="inline"></div>
npm install @astrocal/widget
import { open } from "@astrocal/widget";
open({
eventTypeId: "your-event-type-id",
mode: "popup",
});
Mount the widget into a specific DOM element:
import { open, destroy } from "@astrocal/widget";
// Mount into a container
open({
eventTypeId: "your-event-type-id",
mode: "inline",
target: "#booking-container",
});
// Clean up when done
destroy("#booking-container");
open(config: WidgetConfig): voidOpens the booking widget in inline or popup mode.
close(): voidCloses the popup widget if open. No-op if no popup is active.
destroy(target: string | HTMLElement): voidDestroys an inline widget mounted on a target element. Removes the Shadow DOM and cleans up all resources. No-op if no widget is mounted on the target.
autoInit(): voidScans the DOM for elements with data-astrocal-* attributes and mounts widgets automatically.
| Property | Type | Default | Description |
|---|---|---|---|
eventTypeId | string | required | Event type UUID to display |
apiUrl | string | "https://api.astrocal.dev" | API base URL |
mode | "inline" | "popup" | "popup" | Render mode |
target | string | HTMLElement | --- | DOM element or CSS selector (inline mode) |
timezone | string | auto-detected | IANA timezone override |
theme | ThemeConfig | --- | CSS custom property overrides |
colorScheme | "light" | "dark" | "auto" | "auto" | Color scheme |
demo | boolean | false | Enable demo mode (mock data, no API calls) |
onBookingCreated | (booking: BookingResult) => void | --- | Booking success callback |
onError | (error: WidgetError) => void | --- | Error callback |
onClose | () => void | --- | Popup close callback |
Customize the widget to match your brand:
open({
eventTypeId: "your-event-type-id",
theme: {
primaryColor: "#6366f1",
primaryHoverColor: "#4f46e5",
backgroundColor: "#ffffff",
textColor: "#1f2937",
borderRadius: "12px",
fontFamily: "Inter, sans-serif",
},
});
| Property | CSS Custom Property | Description |
|---|---|---|
primaryColor | --astrocal-primary | Primary action color |
primaryHoverColor | --astrocal-primary-hover | Primary hover color |
headingColor | --astrocal-heading | Heading text color |
backgroundColor | --astrocal-bg | Widget background |
textColor | --astrocal-text | Body text color |
borderColor | --astrocal-border | Border color |
borderFocusColor | --astrocal-border-focus | Focused border color |
borderRadius | --astrocal-radius | Border radius |
fontFamily | --astrocal-font | Font family |
The package is safe to import in Node.js environments like Next.js, Nuxt, or Astro. The autoInit() function is guarded and won't run on the server. open() and destroy() require a browser and will throw a clear error if called without a DOM. close() is a silent no-op on the server.
import { open } from "@astrocal/widget";
if (typeof window !== "undefined") {
open({ eventTypeId: "..." });
}
This widget is one of several ways to integrate Astrocal scheduling into your product:
@astrocal/react) — Typed hooks, provider, and widget wrapper for React apps@astrocal/mcp-server) — Let AI agents book meetings via the Model Context ProtocolCreate a free account to get your event type ID and start embedding.
MIT
FAQs
Embeddable booking widget for Astrocal — drop-in scheduling UI for any website or app
We found that @astrocal/widget demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Research
/Security News
The campaign amassed more than 75,000 installs by targeting Russian-speaking users seeking access to blocked services.

Company News
Open source maintainers are under more pressure than ever. We're raising our open source program from the Team plan to the Business plan, free.

Security News
The supply chain control that delays freshly published gems now covers lockfile generation and gem vendoring in Ruby projects.