Fedify is an #ActivityPub server framework in #TypeScript & #JavaScript. It aims to eliminate the complexity and redundant boilerplate code when building a federated server app, so that you can focus on your business logic and user experience.
The key features it provides currently are:
Type-safe objects for Activity Vocabulary (including some vendor-specific extensions)
Exciting news for #Fedify developers! We've just landed a major milestone for Fedify 2.0—the #CLI now runs natively on #Node.js and #Bun, not just #Deno (#456). If you install @fedify/cli@2.0.0-dev.1761 from npm, you'll get actual JavaScript that executes directly in your runtime, no more pre-compiled binaries from deno compile. This is part of our broader transition to Optique, a new cross-runtime CLI framework we've developed specifically for Fedify's needs (#374).
This change means a more natural development experience regardless of your #JavaScript runtime preference. Node.js developers can now run the CLI tools directly through their familiar ecosystem, and the same goes for Bun users. While Fedify 2.0 isn't released yet, we're excited to share this progress with the community—feel free to try out the dev version and let us know how it works for you!
Exciting news for #Fedify developers! We've just landed a major milestone for Fedify 2.0—the #CLI now runs natively on #Node.js and #Bun, not just #Deno (#456). If you install @fedify/cli@2.0.0-dev.1761 from npm, you'll get actual JavaScript that executes directly in your runtime, no more pre-compiled binaries from deno compile. This is part of our broader transition to Optique, a new cross-runtime CLI framework we've developed specifically for Fedify's needs (#374).
This change means a more natural development experience regardless of your #JavaScript runtime preference. Node.js developers can now run the CLI tools directly through their familiar ecosystem, and the same goes for Bun users. While Fedify 2.0 isn't released yet, we're excited to share this progress with the community—feel free to try out the dev version and let us know how it works for you!
Exciting news for #Fedify developers! We've just landed a major milestone for Fedify 2.0—the #CLI now runs natively on #Node.js and #Bun, not just #Deno (#456). If you install @fedify/cli@2.0.0-dev.1761 from npm, you'll get actual JavaScript that executes directly in your runtime, no more pre-compiled binaries from deno compile. This is part of our broader transition to Optique, a new cross-runtime CLI framework we've developed specifically for Fedify's needs (#374).
This change means a more natural development experience regardless of your #JavaScript runtime preference. Node.js developers can now run the CLI tools directly through their familiar ecosystem, and the same goes for Bun users. While Fedify 2.0 isn't released yet, we're excited to share this progress with the community—feel free to try out the dev version and let us know how it works for you!
Exciting news for #Fedify developers! We've just landed a major milestone for Fedify 2.0—the #CLI now runs natively on #Node.js and #Bun, not just #Deno (#456). If you install @fedify/cli@2.0.0-dev.1761 from npm, you'll get actual JavaScript that executes directly in your runtime, no more pre-compiled binaries from deno compile. This is part of our broader transition to Optique, a new cross-runtime CLI framework we've developed specifically for Fedify's needs (#374).
This change means a more natural development experience regardless of your #JavaScript runtime preference. Node.js developers can now run the CLI tools directly through their familiar ecosystem, and the same goes for Bun users. While Fedify 2.0 isn't released yet, we're excited to share this progress with the community—feel free to try out the dev version and let us know how it works for you!
Exciting news for #Fedify developers! We've just landed a major milestone for Fedify 2.0—the #CLI now runs natively on #Node.js and #Bun, not just #Deno (#456). If you install @fedify/cli@2.0.0-dev.1761 from npm, you'll get actual JavaScript that executes directly in your runtime, no more pre-compiled binaries from deno compile. This is part of our broader transition to Optique, a new cross-runtime CLI framework we've developed specifically for Fedify's needs (#374).
This change means a more natural development experience regardless of your #JavaScript runtime preference. Node.js developers can now run the CLI tools directly through their familiar ecosystem, and the same goes for Bun users. While Fedify 2.0 isn't released yet, we're excited to share this progress with the community—feel free to try out the dev version and let us know how it works for you!
Exciting news for #Fedify developers! We've just landed a major milestone for Fedify 2.0—the #CLI now runs natively on #Node.js and #Bun, not just #Deno (#456). If you install @fedify/cli@2.0.0-dev.1761 from npm, you'll get actual JavaScript that executes directly in your runtime, no more pre-compiled binaries from deno compile. This is part of our broader transition to Optique, a new cross-runtime CLI framework we've developed specifically for Fedify's needs (#374).
This change means a more natural development experience regardless of your #JavaScript runtime preference. Node.js developers can now run the CLI tools directly through their familiar ecosystem, and the same goes for Bun users. While Fedify 2.0 isn't released yet, we're excited to share this progress with the community—feel free to try out the dev version and let us know how it works for you!
Exciting news for #Fedify developers! We've just landed a major milestone for Fedify 2.0—the #CLI now runs natively on #Node.js and #Bun, not just #Deno (#456). If you install @fedify/cli@2.0.0-dev.1761 from npm, you'll get actual JavaScript that executes directly in your runtime, no more pre-compiled binaries from deno compile. This is part of our broader transition to Optique, a new cross-runtime CLI framework we've developed specifically for Fedify's needs (#374).
This change means a more natural development experience regardless of your #JavaScript runtime preference. Node.js developers can now run the CLI tools directly through their familiar ecosystem, and the same goes for Bun users. While Fedify 2.0 isn't released yet, we're excited to share this progress with the community—feel free to try out the dev version and let us know how it works for you!
Exciting news for #Fedify developers! We've just landed a major milestone for Fedify 2.0—the #CLI now runs natively on #Node.js and #Bun, not just #Deno (#456). If you install @fedify/cli@2.0.0-dev.1761 from npm, you'll get actual JavaScript that executes directly in your runtime, no more pre-compiled binaries from deno compile. This is part of our broader transition to Optique, a new cross-runtime CLI framework we've developed specifically for Fedify's needs (#374).
This change means a more natural development experience regardless of your #JavaScript runtime preference. Node.js developers can now run the CLI tools directly through their familiar ecosystem, and the same goes for Bun users. While Fedify 2.0 isn't released yet, we're excited to share this progress with the community—feel free to try out the dev version and let us know how it works for you!
Exciting news for #Fedify developers! We've just landed a major milestone for Fedify 2.0—the #CLI now runs natively on #Node.js and #Bun, not just #Deno (#456). If you install @fedify/cli@2.0.0-dev.1761 from npm, you'll get actual JavaScript that executes directly in your runtime, no more pre-compiled binaries from deno compile. This is part of our broader transition to Optique, a new cross-runtime CLI framework we've developed specifically for Fedify's needs (#374).
This change means a more natural development experience regardless of your #JavaScript runtime preference. Node.js developers can now run the CLI tools directly through their familiar ecosystem, and the same goes for Bun users. While Fedify 2.0 isn't released yet, we're excited to share this progress with the community—feel free to try out the dev version and let us know how it works for you!
Exciting news for #Fedify developers! We've just landed a major milestone for Fedify 2.0—the #CLI now runs natively on #Node.js and #Bun, not just #Deno (#456). If you install @fedify/cli@2.0.0-dev.1761 from npm, you'll get actual JavaScript that executes directly in your runtime, no more pre-compiled binaries from deno compile. This is part of our broader transition to Optique, a new cross-runtime CLI framework we've developed specifically for Fedify's needs (#374).
This change means a more natural development experience regardless of your #JavaScript runtime preference. Node.js developers can now run the CLI tools directly through their familiar ecosystem, and the same goes for Bun users. While Fedify 2.0 isn't released yet, we're excited to share this progress with the community—feel free to try out the dev version and let us know how it works for you!
Exciting news for #Fedify developers! We've just landed a major milestone for Fedify 2.0—the #CLI now runs natively on #Node.js and #Bun, not just #Deno (#456). If you install @fedify/cli@2.0.0-dev.1761 from npm, you'll get actual JavaScript that executes directly in your runtime, no more pre-compiled binaries from deno compile. This is part of our broader transition to Optique, a new cross-runtime CLI framework we've developed specifically for Fedify's needs (#374).
This change means a more natural development experience regardless of your #JavaScript runtime preference. Node.js developers can now run the CLI tools directly through their familiar ecosystem, and the same goes for Bun users. While Fedify 2.0 isn't released yet, we're excited to share this progress with the community—feel free to try out the dev version and let us know how it works for you!
Exciting news for #Fedify developers! We've just landed a major milestone for Fedify 2.0—the #CLI now runs natively on #Node.js and #Bun, not just #Deno (#456). If you install @fedify/cli@2.0.0-dev.1761 from npm, you'll get actual JavaScript that executes directly in your runtime, no more pre-compiled binaries from deno compile. This is part of our broader transition to Optique, a new cross-runtime CLI framework we've developed specifically for Fedify's needs (#374).
This change means a more natural development experience regardless of your #JavaScript runtime preference. Node.js developers can now run the CLI tools directly through their familiar ecosystem, and the same goes for Bun users. While Fedify 2.0 isn't released yet, we're excited to share this progress with the community—feel free to try out the dev version and let us know how it works for you!
Exciting news for #Fedify developers! We've just landed a major milestone for Fedify 2.0—the #CLI now runs natively on #Node.js and #Bun, not just #Deno (#456). If you install @fedify/cli@2.0.0-dev.1761 from npm, you'll get actual JavaScript that executes directly in your runtime, no more pre-compiled binaries from deno compile. This is part of our broader transition to Optique, a new cross-runtime CLI framework we've developed specifically for Fedify's needs (#374).
This change means a more natural development experience regardless of your #JavaScript runtime preference. Node.js developers can now run the CLI tools directly through their familiar ecosystem, and the same goes for Bun users. While Fedify 2.0 isn't released yet, we're excited to share this progress with the community—feel free to try out the dev version and let us know how it works for you!
Exciting news for #Fedify developers! We've just landed a major milestone for Fedify 2.0—the #CLI now runs natively on #Node.js and #Bun, not just #Deno (#456). If you install @fedify/cli@2.0.0-dev.1761 from npm, you'll get actual JavaScript that executes directly in your runtime, no more pre-compiled binaries from deno compile. This is part of our broader transition to Optique, a new cross-runtime CLI framework we've developed specifically for Fedify's needs (#374).
This change means a more natural development experience regardless of your #JavaScript runtime preference. Node.js developers can now run the CLI tools directly through their familiar ecosystem, and the same goes for Bun users. While Fedify 2.0 isn't released yet, we're excited to share this progress with the community—feel free to try out the dev version and let us know how it works for you!
Exciting news for #Fedify developers! We've just landed a major milestone for Fedify 2.0—the #CLI now runs natively on #Node.js and #Bun, not just #Deno (#456). If you install @fedify/cli@2.0.0-dev.1761 from npm, you'll get actual JavaScript that executes directly in your runtime, no more pre-compiled binaries from deno compile. This is part of our broader transition to Optique, a new cross-runtime CLI framework we've developed specifically for Fedify's needs (#374).
This change means a more natural development experience regardless of your #JavaScript runtime preference. Node.js developers can now run the CLI tools directly through their familiar ecosystem, and the same goes for Bun users. While Fedify 2.0 isn't released yet, we're excited to share this progress with the community—feel free to try out the dev version and let us know how it works for you!
We're excited to announce Optique 0.4.0, which brings significant improvements
to help text organization, enhanced documentation capabilities, and introduces
comprehensive Temporal API support.
Optique is a type-safe combinatorial CLI parser for TypeScript that makes
building command-line interfaces intuitive and maintainable. This release
focuses on making your CLI applications more user-friendly and maintainable.
Better help text organization
One of the most visible improvements in Optique 0.4.0 is the enhanced help text
organization. You can now label and group your options more effectively, making
complex CLIs much more approachable for users.
Labeled merge groups
The merge() combinator now accepts an optional label parameter, solving
a common pain point where developers had to choose between clean code structure
and organized help output:
// Before: unlabeled merged options appeared scatteredconst config = merge(connectionOptions, performanceOptions);// Now: group related options under a clear sectionconst config = merge( "Server Configuration", // New label parameter connectionOptions, performanceOptions);
This simple addition makes a huge difference in help text readability,
especially for CLIs with many options spread across multiple reusable modules.
The resulting help output clearly organizes options under
the Server Configuration section:
Demo app showcasing labeled merge groupsUsage: demo-merge.ts --host STRING --port INTEGER --timeout INTEGER --retries INTEGERServer Configuration: --host STRING Server hostname or IP address --port INTEGER Port number for the connection --timeout INTEGER Connection timeout in seconds --retries INTEGER Number of retry attempts
The new group() combinator
For cases where merge() doesn't apply, the new group()
combinator lets you wrap any parser with a documentation label:
// Group mutually exclusive options under a clear sectionconst outputFormat = group( "Output Format", or( map(flag("--json"), () => "json"), map(flag("--yaml"), () => "yaml"), map(flag("--xml"), () => "xml"), ));
This is particularly useful for organizing mutually exclusive flags, multiple
inputs, or any parser that doesn't natively support labeling. The resulting
help text becomes much more scannable and user-friendly.
Here's how the grouped output format options appear in the help text:
Demo app showcasing group combinatorUsage: demo-group.ts --json demo-group.ts --yaml demo-group.ts --xmlOutput Format: --json Output in JSON format --yaml Output in YAML format --xml Output in XML format
Rich documentation support
Optique 0.4.0 introduces comprehensive documentation fields that can be added
directly through the run() function, eliminating the need to modify parser
definitions for documentation purposes.
Brief descriptions, detailed explanations, and footers
Both @optique/core/facade and @optique/run now support brief,
description, and footer options through the run() function:
import { run } from "@optique/run";import { message } from "@optique/core/message";const result = run(parser, { brief: message`A powerful data processing tool`, description: message`This tool provides comprehensive data processing capabilities with support for multiple formats and transformations. It can handle JSON, YAML, and CSV files with automatic format detection.`, footer: message`Examples: myapp process data.json --format yaml myapp validate config.toml --strictFor more information, visit https://example.com/docs`, help: "option"});
These documentation fields appear in both help output and error messages
(when configured), providing consistent context throughout your CLI's user
experience.
The complete help output demonstrates the rich documentation features with brief
description, detailed explanation, option descriptions, default values,
and footer information:
A powerful data processing toolUsage: demo-rich-docs.ts [--port INTEGER] [--format STRING] --verbose STRINGThis tool provides comprehensive data processing capabilities with support formultiple formats and transformations. It can handle JSON, YAML, and CSV fileswith automatic format detection. --port INTEGER Server port number [3000] --format STRING Output format [json] --verbose STRING Verbosity levelExamples: myapp process data.json --format yaml myapp validate config.toml --strictFor more information, visit https://example.com/docs
These documentation fields appear in both help output and error messages
(when configured), providing consistent context throughout your CLI's user
experience.
Display default values
A frequently requested feature is now available: showing default values
directly in help text. Enable this with the new showDefault option when
using withDefault():
Default values are automatically dimmed when colors are enabled, making them
visually distinct while remaining readable.
The help output shows default values clearly marked next to each option:
Usage: demo-defaults.ts [--port INTEGER] [--format STRING] --port INTEGER Server port number [3000] --format STRING Output format [json]
Temporal API support
Optique 0.4.0 introduces a new package, @optique/temporal, providing
comprehensive support for the modern Temporal API. This brings type-safe
parsing for dates, times, durations, and time zones:
import { instant, duration, zonedDateTime } from "@optique/temporal";import { option } from "@optique/core/parser";const parser = object({ // Parse ISO 8601 timestamps timestamp: option("--at", instant()), // Parse durations like "PT30M" or "P1DT2H" timeout: option("--timeout", duration()), // Parse zoned datetime with timezone info meeting: option("--meeting", zonedDateTime()),});
The temporal parsers return native Temporal objects with full functionality:
The merge() combinator now supports up to 10 parsers (previously 5), and
the tuple() parser has improved type inference using TypeScript's const
type parameter. These enhancements enable more complex CLI structures while
maintaining perfect type safety.
Breaking changes
While we've maintained backward compatibility for most APIs, there are a few
changes to be aware of:
The Parser.getDocFragments() method now uses DocState<TState> instead
of direct state values (only affects custom parser implementations)
The merge() combinator now enforces stricter type
constraints at compile time, rejecting non-object-producing parsers
Learn more
For a complete list of changes, bug fixes, and improvements, see the
full changelog.
We hope these improvements make building CLI applications with Optique even
more enjoyable. As always, we welcome your feedback and contributions on
GitHub.
We're excited to announce Optique 0.4.0, which brings significant improvements
to help text organization, enhanced documentation capabilities, and introduces
comprehensive Temporal API support.
Optique is a type-safe combinatorial CLI parser for TypeScript that makes
building command-line interfaces intuitive and maintainable. This release
focuses on making your CLI applications more user-friendly and maintainable.
Better help text organization
One of the most visible improvements in Optique 0.4.0 is the enhanced help text
organization. You can now label and group your options more effectively, making
complex CLIs much more approachable for users.
Labeled merge groups
The merge() combinator now accepts an optional label parameter, solving
a common pain point where developers had to choose between clean code structure
and organized help output:
// Before: unlabeled merged options appeared scatteredconst config = merge(connectionOptions, performanceOptions);// Now: group related options under a clear sectionconst config = merge( "Server Configuration", // New label parameter connectionOptions, performanceOptions);
This simple addition makes a huge difference in help text readability,
especially for CLIs with many options spread across multiple reusable modules.
The resulting help output clearly organizes options under
the Server Configuration section:
Demo app showcasing labeled merge groupsUsage: demo-merge.ts --host STRING --port INTEGER --timeout INTEGER --retries INTEGERServer Configuration: --host STRING Server hostname or IP address --port INTEGER Port number for the connection --timeout INTEGER Connection timeout in seconds --retries INTEGER Number of retry attempts
The new group() combinator
For cases where merge() doesn't apply, the new group()
combinator lets you wrap any parser with a documentation label:
// Group mutually exclusive options under a clear sectionconst outputFormat = group( "Output Format", or( map(flag("--json"), () => "json"), map(flag("--yaml"), () => "yaml"), map(flag("--xml"), () => "xml"), ));
This is particularly useful for organizing mutually exclusive flags, multiple
inputs, or any parser that doesn't natively support labeling. The resulting
help text becomes much more scannable and user-friendly.
Here's how the grouped output format options appear in the help text:
Demo app showcasing group combinatorUsage: demo-group.ts --json demo-group.ts --yaml demo-group.ts --xmlOutput Format: --json Output in JSON format --yaml Output in YAML format --xml Output in XML format
Rich documentation support
Optique 0.4.0 introduces comprehensive documentation fields that can be added
directly through the run() function, eliminating the need to modify parser
definitions for documentation purposes.
Brief descriptions, detailed explanations, and footers
Both @optique/core/facade and @optique/run now support brief,
description, and footer options through the run() function:
import { run } from "@optique/run";import { message } from "@optique/core/message";const result = run(parser, { brief: message`A powerful data processing tool`, description: message`This tool provides comprehensive data processing capabilities with support for multiple formats and transformations. It can handle JSON, YAML, and CSV files with automatic format detection.`, footer: message`Examples: myapp process data.json --format yaml myapp validate config.toml --strictFor more information, visit https://example.com/docs`, help: "option"});
These documentation fields appear in both help output and error messages
(when configured), providing consistent context throughout your CLI's user
experience.
The complete help output demonstrates the rich documentation features with brief
description, detailed explanation, option descriptions, default values,
and footer information:
A powerful data processing toolUsage: demo-rich-docs.ts [--port INTEGER] [--format STRING] --verbose STRINGThis tool provides comprehensive data processing capabilities with support formultiple formats and transformations. It can handle JSON, YAML, and CSV fileswith automatic format detection. --port INTEGER Server port number [3000] --format STRING Output format [json] --verbose STRING Verbosity levelExamples: myapp process data.json --format yaml myapp validate config.toml --strictFor more information, visit https://example.com/docs
These documentation fields appear in both help output and error messages
(when configured), providing consistent context throughout your CLI's user
experience.
Display default values
A frequently requested feature is now available: showing default values
directly in help text. Enable this with the new showDefault option when
using withDefault():
Default values are automatically dimmed when colors are enabled, making them
visually distinct while remaining readable.
The help output shows default values clearly marked next to each option:
Usage: demo-defaults.ts [--port INTEGER] [--format STRING] --port INTEGER Server port number [3000] --format STRING Output format [json]
Temporal API support
Optique 0.4.0 introduces a new package, @optique/temporal, providing
comprehensive support for the modern Temporal API. This brings type-safe
parsing for dates, times, durations, and time zones:
import { instant, duration, zonedDateTime } from "@optique/temporal";import { option } from "@optique/core/parser";const parser = object({ // Parse ISO 8601 timestamps timestamp: option("--at", instant()), // Parse durations like "PT30M" or "P1DT2H" timeout: option("--timeout", duration()), // Parse zoned datetime with timezone info meeting: option("--meeting", zonedDateTime()),});
The temporal parsers return native Temporal objects with full functionality:
The merge() combinator now supports up to 10 parsers (previously 5), and
the tuple() parser has improved type inference using TypeScript's const
type parameter. These enhancements enable more complex CLI structures while
maintaining perfect type safety.
Breaking changes
While we've maintained backward compatibility for most APIs, there are a few
changes to be aware of:
The Parser.getDocFragments() method now uses DocState<TState> instead
of direct state values (only affects custom parser implementations)
The merge() combinator now enforces stricter type
constraints at compile time, rejecting non-object-producing parsers
Learn more
For a complete list of changes, bug fixes, and improvements, see the
full changelog.
We hope these improvements make building CLI applications with Optique even
more enjoyable. As always, we welcome your feedback and contributions on
GitHub.
We're excited to announce Optique 0.4.0, which brings significant improvements
to help text organization, enhanced documentation capabilities, and introduces
comprehensive Temporal API support.
Optique is a type-safe combinatorial CLI parser for TypeScript that makes
building command-line interfaces intuitive and maintainable. This release
focuses on making your CLI applications more user-friendly and maintainable.
Better help text organization
One of the most visible improvements in Optique 0.4.0 is the enhanced help text
organization. You can now label and group your options more effectively, making
complex CLIs much more approachable for users.
Labeled merge groups
The merge() combinator now accepts an optional label parameter, solving
a common pain point where developers had to choose between clean code structure
and organized help output:
// Before: unlabeled merged options appeared scatteredconst config = merge(connectionOptions, performanceOptions);// Now: group related options under a clear sectionconst config = merge( "Server Configuration", // New label parameter connectionOptions, performanceOptions);
This simple addition makes a huge difference in help text readability,
especially for CLIs with many options spread across multiple reusable modules.
The resulting help output clearly organizes options under
the Server Configuration section:
Demo app showcasing labeled merge groupsUsage: demo-merge.ts --host STRING --port INTEGER --timeout INTEGER --retries INTEGERServer Configuration: --host STRING Server hostname or IP address --port INTEGER Port number for the connection --timeout INTEGER Connection timeout in seconds --retries INTEGER Number of retry attempts
The new group() combinator
For cases where merge() doesn't apply, the new group()
combinator lets you wrap any parser with a documentation label:
// Group mutually exclusive options under a clear sectionconst outputFormat = group( "Output Format", or( map(flag("--json"), () => "json"), map(flag("--yaml"), () => "yaml"), map(flag("--xml"), () => "xml"), ));
This is particularly useful for organizing mutually exclusive flags, multiple
inputs, or any parser that doesn't natively support labeling. The resulting
help text becomes much more scannable and user-friendly.
Here's how the grouped output format options appear in the help text:
Demo app showcasing group combinatorUsage: demo-group.ts --json demo-group.ts --yaml demo-group.ts --xmlOutput Format: --json Output in JSON format --yaml Output in YAML format --xml Output in XML format
Rich documentation support
Optique 0.4.0 introduces comprehensive documentation fields that can be added
directly through the run() function, eliminating the need to modify parser
definitions for documentation purposes.
Brief descriptions, detailed explanations, and footers
Both @optique/core/facade and @optique/run now support brief,
description, and footer options through the run() function:
import { run } from "@optique/run";import { message } from "@optique/core/message";const result = run(parser, { brief: message`A powerful data processing tool`, description: message`This tool provides comprehensive data processing capabilities with support for multiple formats and transformations. It can handle JSON, YAML, and CSV files with automatic format detection.`, footer: message`Examples: myapp process data.json --format yaml myapp validate config.toml --strictFor more information, visit https://example.com/docs`, help: "option"});
These documentation fields appear in both help output and error messages
(when configured), providing consistent context throughout your CLI's user
experience.
The complete help output demonstrates the rich documentation features with brief
description, detailed explanation, option descriptions, default values,
and footer information:
A powerful data processing toolUsage: demo-rich-docs.ts [--port INTEGER] [--format STRING] --verbose STRINGThis tool provides comprehensive data processing capabilities with support formultiple formats and transformations. It can handle JSON, YAML, and CSV fileswith automatic format detection. --port INTEGER Server port number [3000] --format STRING Output format [json] --verbose STRING Verbosity levelExamples: myapp process data.json --format yaml myapp validate config.toml --strictFor more information, visit https://example.com/docs
These documentation fields appear in both help output and error messages
(when configured), providing consistent context throughout your CLI's user
experience.
Display default values
A frequently requested feature is now available: showing default values
directly in help text. Enable this with the new showDefault option when
using withDefault():
Default values are automatically dimmed when colors are enabled, making them
visually distinct while remaining readable.
The help output shows default values clearly marked next to each option:
Usage: demo-defaults.ts [--port INTEGER] [--format STRING] --port INTEGER Server port number [3000] --format STRING Output format [json]
Temporal API support
Optique 0.4.0 introduces a new package, @optique/temporal, providing
comprehensive support for the modern Temporal API. This brings type-safe
parsing for dates, times, durations, and time zones:
import { instant, duration, zonedDateTime } from "@optique/temporal";import { option } from "@optique/core/parser";const parser = object({ // Parse ISO 8601 timestamps timestamp: option("--at", instant()), // Parse durations like "PT30M" or "P1DT2H" timeout: option("--timeout", duration()), // Parse zoned datetime with timezone info meeting: option("--meeting", zonedDateTime()),});
The temporal parsers return native Temporal objects with full functionality:
The merge() combinator now supports up to 10 parsers (previously 5), and
the tuple() parser has improved type inference using TypeScript's const
type parameter. These enhancements enable more complex CLI structures while
maintaining perfect type safety.
Breaking changes
While we've maintained backward compatibility for most APIs, there are a few
changes to be aware of:
The Parser.getDocFragments() method now uses DocState<TState> instead
of direct state values (only affects custom parser implementations)
The merge() combinator now enforces stricter type
constraints at compile time, rejecting non-object-producing parsers
Learn more
For a complete list of changes, bug fixes, and improvements, see the
full changelog.
We hope these improvements make building CLI applications with Optique even
more enjoyable. As always, we welcome your feedback and contributions on
GitHub.
We're excited to announce the release of BotKit 0.3.0! This release marks a significant milestone as #BotKit now supports #Node.js alongside #Deno, making it accessible to a wider audience. The minimum required Node.js version is 22.0.0. This dual-runtime support means you can now choose your preferred #JavaScript runtime while building #ActivityPub#bots with the same powerful BotKit APIs.
One of the most requested features has landed: poll support! You can now create interactive polls in your #bot messages, allowing followers to vote on questions with single or multiple-choice options. Polls are represented as ActivityPub Question objects with proper expiration times, and your bot can react to votes through the new onVote event handler. This feature enhances engagement possibilities and brings BotKit to feature parity with major #fediverse platforms like Mastodon and Misskey.
The web frontend has been enhanced with a new followers page, thanks to the contribution from Hyeonseo Kim (@gaebalgom)! The /followers route now displays a paginated list of your bot's followers, and the follower count on the main profile page is now clickable, providing better visibility into your bot's audience. This improvement makes the web interface more complete and user-friendly.
For developers looking for alternative storage backends, we've introduced the SqliteRepository through the new @fedify/botkit-sqlite package. This provides a production-ready SQLite-based storage solution with ACID compliance, write-ahead logging (WAL) for optimal performance, and proper indexing. Additionally, the new @fedify/botkit/repository module offers MemoryCachedRepository for adding an in-memory cache layer on top of any repository implementation, improving read performance for frequently accessed data.
This release also includes an important security update: we've upgraded to #Fedify 1.8.8, ensuring your bots stay secure and compatible with the latest ActivityPub standards. The repository pattern has been expanded with new interfaces and types like RepositoryGetMessagesOptions, RepositoryGetFollowersOptions, and proper support for polls storage through the KvStoreRepositoryPrefixes.polls option, providing more flexibility for custom implementations.
We're excited to announce the release of BotKit 0.3.0! This release marks a significant milestone as #BotKit now supports #Node.js alongside #Deno, making it accessible to a wider audience. The minimum required Node.js version is 22.0.0. This dual-runtime support means you can now choose your preferred #JavaScript runtime while building #ActivityPub#bots with the same powerful BotKit APIs.
One of the most requested features has landed: poll support! You can now create interactive polls in your #bot messages, allowing followers to vote on questions with single or multiple-choice options. Polls are represented as ActivityPub Question objects with proper expiration times, and your bot can react to votes through the new onVote event handler. This feature enhances engagement possibilities and brings BotKit to feature parity with major #fediverse platforms like Mastodon and Misskey.
The web frontend has been enhanced with a new followers page, thanks to the contribution from Hyeonseo Kim (@gaebalgom)! The /followers route now displays a paginated list of your bot's followers, and the follower count on the main profile page is now clickable, providing better visibility into your bot's audience. This improvement makes the web interface more complete and user-friendly.
For developers looking for alternative storage backends, we've introduced the SqliteRepository through the new @fedify/botkit-sqlite package. This provides a production-ready SQLite-based storage solution with ACID compliance, write-ahead logging (WAL) for optimal performance, and proper indexing. Additionally, the new @fedify/botkit/repository module offers MemoryCachedRepository for adding an in-memory cache layer on top of any repository implementation, improving read performance for frequently accessed data.
This release also includes an important security update: we've upgraded to #Fedify 1.8.8, ensuring your bots stay secure and compatible with the latest ActivityPub standards. The repository pattern has been expanded with new interfaces and types like RepositoryGetMessagesOptions, RepositoryGetFollowersOptions, and proper support for polls storage through the KvStoreRepositoryPrefixes.polls option, providing more flexibility for custom implementations.
We're excited to announce the release of BotKit 0.3.0! This release marks a significant milestone as #BotKit now supports #Node.js alongside #Deno, making it accessible to a wider audience. The minimum required Node.js version is 22.0.0. This dual-runtime support means you can now choose your preferred #JavaScript runtime while building #ActivityPub#bots with the same powerful BotKit APIs.
One of the most requested features has landed: poll support! You can now create interactive polls in your #bot messages, allowing followers to vote on questions with single or multiple-choice options. Polls are represented as ActivityPub Question objects with proper expiration times, and your bot can react to votes through the new onVote event handler. This feature enhances engagement possibilities and brings BotKit to feature parity with major #fediverse platforms like Mastodon and Misskey.
The web frontend has been enhanced with a new followers page, thanks to the contribution from Hyeonseo Kim (@gaebalgom)! The /followers route now displays a paginated list of your bot's followers, and the follower count on the main profile page is now clickable, providing better visibility into your bot's audience. This improvement makes the web interface more complete and user-friendly.
For developers looking for alternative storage backends, we've introduced the SqliteRepository through the new @fedify/botkit-sqlite package. This provides a production-ready SQLite-based storage solution with ACID compliance, write-ahead logging (WAL) for optimal performance, and proper indexing. Additionally, the new @fedify/botkit/repository module offers MemoryCachedRepository for adding an in-memory cache layer on top of any repository implementation, improving read performance for frequently accessed data.
This release also includes an important security update: we've upgraded to #Fedify 1.8.8, ensuring your bots stay secure and compatible with the latest ActivityPub standards. The repository pattern has been expanded with new interfaces and types like RepositoryGetMessagesOptions, RepositoryGetFollowersOptions, and proper support for polls storage through the KvStoreRepositoryPrefixes.polls option, providing more flexibility for custom implementations.
We're excited to announce the release of BotKit 0.3.0! This release marks a significant milestone as #BotKit now supports #Node.js alongside #Deno, making it accessible to a wider audience. The minimum required Node.js version is 22.0.0. This dual-runtime support means you can now choose your preferred #JavaScript runtime while building #ActivityPub#bots with the same powerful BotKit APIs.
One of the most requested features has landed: poll support! You can now create interactive polls in your #bot messages, allowing followers to vote on questions with single or multiple-choice options. Polls are represented as ActivityPub Question objects with proper expiration times, and your bot can react to votes through the new onVote event handler. This feature enhances engagement possibilities and brings BotKit to feature parity with major #fediverse platforms like Mastodon and Misskey.
The web frontend has been enhanced with a new followers page, thanks to the contribution from Hyeonseo Kim (@gaebalgom)! The /followers route now displays a paginated list of your bot's followers, and the follower count on the main profile page is now clickable, providing better visibility into your bot's audience. This improvement makes the web interface more complete and user-friendly.
For developers looking for alternative storage backends, we've introduced the SqliteRepository through the new @fedify/botkit-sqlite package. This provides a production-ready SQLite-based storage solution with ACID compliance, write-ahead logging (WAL) for optimal performance, and proper indexing. Additionally, the new @fedify/botkit/repository module offers MemoryCachedRepository for adding an in-memory cache layer on top of any repository implementation, improving read performance for frequently accessed data.
This release also includes an important security update: we've upgraded to #Fedify 1.8.8, ensuring your bots stay secure and compatible with the latest ActivityPub standards. The repository pattern has been expanded with new interfaces and types like RepositoryGetMessagesOptions, RepositoryGetFollowersOptions, and proper support for polls storage through the KvStoreRepositoryPrefixes.polls option, providing more flexibility for custom implementations.
We're excited to announce the release of BotKit 0.3.0! This release marks a significant milestone as #BotKit now supports #Node.js alongside #Deno, making it accessible to a wider audience. The minimum required Node.js version is 22.0.0. This dual-runtime support means you can now choose your preferred #JavaScript runtime while building #ActivityPub#bots with the same powerful BotKit APIs.
One of the most requested features has landed: poll support! You can now create interactive polls in your #bot messages, allowing followers to vote on questions with single or multiple-choice options. Polls are represented as ActivityPub Question objects with proper expiration times, and your bot can react to votes through the new onVote event handler. This feature enhances engagement possibilities and brings BotKit to feature parity with major #fediverse platforms like Mastodon and Misskey.
The web frontend has been enhanced with a new followers page, thanks to the contribution from Hyeonseo Kim (@gaebalgom)! The /followers route now displays a paginated list of your bot's followers, and the follower count on the main profile page is now clickable, providing better visibility into your bot's audience. This improvement makes the web interface more complete and user-friendly.
For developers looking for alternative storage backends, we've introduced the SqliteRepository through the new @fedify/botkit-sqlite package. This provides a production-ready SQLite-based storage solution with ACID compliance, write-ahead logging (WAL) for optimal performance, and proper indexing. Additionally, the new @fedify/botkit/repository module offers MemoryCachedRepository for adding an in-memory cache layer on top of any repository implementation, improving read performance for frequently accessed data.
This release also includes an important security update: we've upgraded to #Fedify 1.8.8, ensuring your bots stay secure and compatible with the latest ActivityPub standards. The repository pattern has been expanded with new interfaces and types like RepositoryGetMessagesOptions, RepositoryGetFollowersOptions, and proper support for polls storage through the KvStoreRepositoryPrefixes.polls option, providing more flexibility for custom implementations.
We're excited to announce the release of BotKit 0.3.0! This release marks a significant milestone as #BotKit now supports #Node.js alongside #Deno, making it accessible to a wider audience. The minimum required Node.js version is 22.0.0. This dual-runtime support means you can now choose your preferred #JavaScript runtime while building #ActivityPub#bots with the same powerful BotKit APIs.
One of the most requested features has landed: poll support! You can now create interactive polls in your #bot messages, allowing followers to vote on questions with single or multiple-choice options. Polls are represented as ActivityPub Question objects with proper expiration times, and your bot can react to votes through the new onVote event handler. This feature enhances engagement possibilities and brings BotKit to feature parity with major #fediverse platforms like Mastodon and Misskey.
The web frontend has been enhanced with a new followers page, thanks to the contribution from Hyeonseo Kim (@gaebalgom)! The /followers route now displays a paginated list of your bot's followers, and the follower count on the main profile page is now clickable, providing better visibility into your bot's audience. This improvement makes the web interface more complete and user-friendly.
For developers looking for alternative storage backends, we've introduced the SqliteRepository through the new @fedify/botkit-sqlite package. This provides a production-ready SQLite-based storage solution with ACID compliance, write-ahead logging (WAL) for optimal performance, and proper indexing. Additionally, the new @fedify/botkit/repository module offers MemoryCachedRepository for adding an in-memory cache layer on top of any repository implementation, improving read performance for frequently accessed data.
This release also includes an important security update: we've upgraded to #Fedify 1.8.8, ensuring your bots stay secure and compatible with the latest ActivityPub standards. The repository pattern has been expanded with new interfaces and types like RepositoryGetMessagesOptions, RepositoryGetFollowersOptions, and proper support for polls storage through the KvStoreRepositoryPrefixes.polls option, providing more flexibility for custom implementations.
We're excited to announce the release of BotKit 0.3.0! This release marks a significant milestone as #BotKit now supports #Node.js alongside #Deno, making it accessible to a wider audience. The minimum required Node.js version is 22.0.0. This dual-runtime support means you can now choose your preferred #JavaScript runtime while building #ActivityPub#bots with the same powerful BotKit APIs.
One of the most requested features has landed: poll support! You can now create interactive polls in your #bot messages, allowing followers to vote on questions with single or multiple-choice options. Polls are represented as ActivityPub Question objects with proper expiration times, and your bot can react to votes through the new onVote event handler. This feature enhances engagement possibilities and brings BotKit to feature parity with major #fediverse platforms like Mastodon and Misskey.
The web frontend has been enhanced with a new followers page, thanks to the contribution from Hyeonseo Kim (@gaebalgom)! The /followers route now displays a paginated list of your bot's followers, and the follower count on the main profile page is now clickable, providing better visibility into your bot's audience. This improvement makes the web interface more complete and user-friendly.
For developers looking for alternative storage backends, we've introduced the SqliteRepository through the new @fedify/botkit-sqlite package. This provides a production-ready SQLite-based storage solution with ACID compliance, write-ahead logging (WAL) for optimal performance, and proper indexing. Additionally, the new @fedify/botkit/repository module offers MemoryCachedRepository for adding an in-memory cache layer on top of any repository implementation, improving read performance for frequently accessed data.
This release also includes an important security update: we've upgraded to #Fedify 1.8.8, ensuring your bots stay secure and compatible with the latest ActivityPub standards. The repository pattern has been expanded with new interfaces and types like RepositoryGetMessagesOptions, RepositoryGetFollowersOptions, and proper support for polls storage through the KvStoreRepositoryPrefixes.polls option, providing more flexibility for custom implementations.
We're excited to announce the release of BotKit 0.3.0! This release marks a significant milestone as #BotKit now supports #Node.js alongside #Deno, making it accessible to a wider audience. The minimum required Node.js version is 22.0.0. This dual-runtime support means you can now choose your preferred #JavaScript runtime while building #ActivityPub#bots with the same powerful BotKit APIs.
One of the most requested features has landed: poll support! You can now create interactive polls in your #bot messages, allowing followers to vote on questions with single or multiple-choice options. Polls are represented as ActivityPub Question objects with proper expiration times, and your bot can react to votes through the new onVote event handler. This feature enhances engagement possibilities and brings BotKit to feature parity with major #fediverse platforms like Mastodon and Misskey.
The web frontend has been enhanced with a new followers page, thanks to the contribution from Hyeonseo Kim (@gaebalgom)! The /followers route now displays a paginated list of your bot's followers, and the follower count on the main profile page is now clickable, providing better visibility into your bot's audience. This improvement makes the web interface more complete and user-friendly.
For developers looking for alternative storage backends, we've introduced the SqliteRepository through the new @fedify/botkit-sqlite package. This provides a production-ready SQLite-based storage solution with ACID compliance, write-ahead logging (WAL) for optimal performance, and proper indexing. Additionally, the new @fedify/botkit/repository module offers MemoryCachedRepository for adding an in-memory cache layer on top of any repository implementation, improving read performance for frequently accessed data.
This release also includes an important security update: we've upgraded to #Fedify 1.8.8, ensuring your bots stay secure and compatible with the latest ActivityPub standards. The repository pattern has been expanded with new interfaces and types like RepositoryGetMessagesOptions, RepositoryGetFollowersOptions, and proper support for polls storage through the KvStoreRepositoryPrefixes.polls option, providing more flexibility for custom implementations.
We're excited to announce the release of BotKit 0.3.0! This release marks a significant milestone as #BotKit now supports #Node.js alongside #Deno, making it accessible to a wider audience. The minimum required Node.js version is 22.0.0. This dual-runtime support means you can now choose your preferred #JavaScript runtime while building #ActivityPub#bots with the same powerful BotKit APIs.
One of the most requested features has landed: poll support! You can now create interactive polls in your #bot messages, allowing followers to vote on questions with single or multiple-choice options. Polls are represented as ActivityPub Question objects with proper expiration times, and your bot can react to votes through the new onVote event handler. This feature enhances engagement possibilities and brings BotKit to feature parity with major #fediverse platforms like Mastodon and Misskey.
The web frontend has been enhanced with a new followers page, thanks to the contribution from Hyeonseo Kim (@gaebalgom)! The /followers route now displays a paginated list of your bot's followers, and the follower count on the main profile page is now clickable, providing better visibility into your bot's audience. This improvement makes the web interface more complete and user-friendly.
For developers looking for alternative storage backends, we've introduced the SqliteRepository through the new @fedify/botkit-sqlite package. This provides a production-ready SQLite-based storage solution with ACID compliance, write-ahead logging (WAL) for optimal performance, and proper indexing. Additionally, the new @fedify/botkit/repository module offers MemoryCachedRepository for adding an in-memory cache layer on top of any repository implementation, improving read performance for frequently accessed data.
This release also includes an important security update: we've upgraded to #Fedify 1.8.8, ensuring your bots stay secure and compatible with the latest ActivityPub standards. The repository pattern has been expanded with new interfaces and types like RepositoryGetMessagesOptions, RepositoryGetFollowersOptions, and proper support for polls storage through the KvStoreRepositoryPrefixes.polls option, providing more flexibility for custom implementations.
Fedify is an #ActivityPub server framework in #TypeScript & #JavaScript. It aims to eliminate the complexity and redundant boilerplate code when building a federated server app, so that you can focus on your business logic and user experience.
The key features it provides currently are:
Type-safe objects for Activity Vocabulary (including some vendor-specific extensions)
A simple, cross-runtime email library that works seamlessly on #Deno, #Node.js, #Bun, and edge functions. Zero dependencies, unified API, and excellent testability with built-in mock transport.
A simple, cross-runtime email library that works seamlessly on #Deno, #Node.js, #Bun, and edge functions. Zero dependencies, unified API, and excellent testability with built-in mock transport.
A simple, cross-runtime email library that works seamlessly on #Deno, #Node.js, #Bun, and edge functions. Zero dependencies, unified API, and excellent testability with built-in mock transport.
A simple, cross-runtime email library that works seamlessly on #Deno, #Node.js, #Bun, and edge functions. Zero dependencies, unified API, and excellent testability with built-in mock transport.
A simple, cross-runtime email library that works seamlessly on #Deno, #Node.js, #Bun, and edge functions. Zero dependencies, unified API, and excellent testability with built-in mock transport.
A simple, cross-runtime email library that works seamlessly on #Deno, #Node.js, #Bun, and edge functions. Zero dependencies, unified API, and excellent testability with built-in mock transport.
A simple, cross-runtime email library that works seamlessly on #Deno, #Node.js, #Bun, and edge functions. Zero dependencies, unified API, and excellent testability with built-in mock transport.
A simple, cross-runtime email library that works seamlessly on #Deno, #Node.js, #Bun, and edge functions. Zero dependencies, unified API, and excellent testability with built-in mock transport.
A simple, cross-runtime email library that works seamlessly on #Deno, #Node.js, #Bun, and edge functions. Zero dependencies, unified API, and excellent testability with built-in mock transport.
A simple, cross-runtime email library that works seamlessly on #Deno, #Node.js, #Bun, and edge functions. Zero dependencies, unified API, and excellent testability with built-in mock transport.
A simple, cross-runtime email library that works seamlessly on #Deno, #Node.js, #Bun, and edge functions. Zero dependencies, unified API, and excellent testability with built-in mock transport.
A simple, cross-runtime email library that works seamlessly on #Deno, #Node.js, #Bun, and edge functions. Zero dependencies, unified API, and excellent testability with built-in mock transport.
It's been 30 years we have #Javascript. So much in technology has changed in that time. It's kind of amazing how much the language and the broader web helped shape the world.
#deno post on the history of Javascript really cements this. Can't believe it's been that long. 😅
It's been 30 years we have #Javascript. So much in technology has changed in that time. It's kind of amazing how much the language and the broader web helped shape the world.
#deno post on the history of Javascript really cements this. Can't believe it's been that long. 😅
Last weekend I published a fun little project that allows you to use the #Rust library #Ratatui to make a #TUI (Terminal UI) in #JavaScript/#TypeScript, via #WASM.
Last weekend I published a fun little project that allows you to use the #Rust library #Ratatui to make a #TUI (Terminal UI) in #JavaScript/#TypeScript, via #WASM.
AIMindUpdate News! 🚀⚡️ Great news for Deno developers! 2.3 update brings faster compiles, local NPM support, and much more. Boost your workflow! #Deno#JavaScript#TypeScript
AIMindUpdate News! 🚀⚡️ Great news for Deno developers! 2.3 update brings faster compiles, local NPM support, and much more. Boost your workflow! #Deno#JavaScript#TypeScript
since multiple hours I was sleepless cause I wondered about how to store anything ActivityPub in #deno#kv
I think, I will finish this crazy code somewhen in the next days :) Would you be interested in such a thing?
If: Tried to solve the following fully ActivityPub conformant, meaning e.g. - multiple actors can do an action on multiple objects and it needs to be fully versioned cause Undo or Undo/Undo … - so anything is RFC 6902 <-> kv where anything is ulid and the "version" for the object is the ulid of an Update/Undo etc. - JSON Patch acknowledges the limits (e.g. size of kv values), any property is stored versioned - strongly avoiding duplicates; the "text properties" like contentMap are stored as cid and similar beneath each other by a numeric nilsimsa hash (though /me bad at math) - we can query all relationships and - additionally "where", "when", "what" questions are answered by geohash, ulid ranges or a specific hierarchic hash of as:- and our subtypes
Simplify debugging with Deno and @opentelemetry ✅ logs associated with requests ✅ immediate traces and metrics ✅ works on Node.js backends without any additional code or config ✨
Fedify is an #ActivityPub server framework in #TypeScript & #JavaScript. It aims to eliminate the complexity and redundant boilerplate code when building a federated server app, so that you can focus on your business logic and user experience.
The key features it provides currently are:
Type-safe objects for Activity Vocabulary (including some vendor-specific extensions)
why /me so silent, you ask … databases are boring but the #deno#denokv#activitypub#normalization#i18n including proper indexing with ulid, geohash, types-hash (when,where,what) and text-similarity sorting and cid stuff MUST be done properly for all the activities side effects. ¯\_(ツ)_/¯
Releasing Denostories 0.3.0, a storybook implementation for Fresh, combined with headless component behaviour testing. All right in your Fresh instance.
Data analysis in Jupyter notebooks with... TypeScript?! 😱 ✅ using `fetch` and other web standards ✅ fast dataframes with nodejs-polars ✅ easy charts with @observablehq ✅ rich interactive UIs with JavaScript
Data analysis in Jupyter notebooks with... TypeScript?! 😱 ✅ using `fetch` and other web standards ✅ fast dataframes with nodejs-polars ✅ easy charts with @observablehq ✅ rich interactive UIs with JavaScript
Do you have any suggestions, tips, opinions, dos, don’ts about headless CMSes?
I have a growing list of small/mid non-profits and collectives asking for my help to (re)make their website. I totally want to help, but I don’t have much time, especially considering that they generally have little or no funding—I would most definitely point them to @VillageOneCoop, otherwise.
Therefore, I want a super simple and replicable solution where I can copy-paste most of the code, while providing them with a stable, fast, and modern solution. I had a look at the Headless CMS section in the Jamstack website, but I need opinions from people who actually used some of that software already.
Needs
I want to code and configure everything using @eleventy
Admin interface (#WebApp) for the client to add pages and write posts
Static website in the front-end
Simple and reliable CI/CD
No/minimal maintenance after the first setup
Self-hostable (I was taking this for granted so much that I forgot to write it)
If it requires forge integration, it should support #ForgeJo
Do you have any suggestions, tips, opinions, dos, don’ts about headless CMSes?
I have a growing list of small/mid non-profits and collectives asking for my help to (re)make their website. I totally want to help, but I don’t have much time, especially considering that they generally have little or no funding—I would most definitely point them to @VillageOneCoop, otherwise.
Therefore, I want a super simple and replicable solution where I can copy-paste most of the code, while providing them with a stable, fast, and modern solution. I had a look at the Headless CMS section in the Jamstack website, but I need opinions from people who actually used some of that software already.
Needs
I want to code and configure everything using @eleventy
Admin interface (#WebApp) for the client to add pages and write posts
Static website in the front-end
Simple and reliable CI/CD
No/minimal maintenance after the first setup
Self-hostable (I was taking this for granted so much that I forgot to write it)
If it requires forge integration, it should support #ForgeJo
Releasing Denostories 0.3.0, a storybook implementation for Fresh, combined with headless component behaviour testing. All right in your Fresh instance.
#NodeJS has an incredibly mature governance model which #Deno lacks completely. Its trajectory is completely determined by the VC-backed company behind it.
I feel like this fact is often overlooked in debates whether to choose one or the other.
Is the world in need of a federated Craigslist/Kleinanzeigen platform? I am currently thinking about a project to dig into #fediverse development and learning #golang or stay with #deno and using #fedify.
EDIT: There is already something like that on the fediverse! It's called Flohmarkt. Thanks for the comments mentioning that! https://codeberg.org/flohmarkt/flohmarkt
Is the world in need of a federated Craigslist/Kleinanzeigen platform? I am currently thinking about a project to dig into #fediverse development and learning #golang or stay with #deno and using #fedify.
EDIT: There is already something like that on the fediverse! It's called Flohmarkt. Thanks for the comments mentioning that! https://codeberg.org/flohmarkt/flohmarkt
- Built-in OpenTelemetry support for span context propagators (tracecontext, baggage) - Built-in OTel tracing for node:http.request - LSP now starts the TypeScript server lazily
Is the world in need of a federated Craigslist/Kleinanzeigen platform? I am currently thinking about a project to dig into #fediverse development and learning #golang or stay with #deno and using #fedify.
EDIT: There is already something like that on the fediverse! It's called Flohmarkt. Thanks for the comments mentioning that! https://codeberg.org/flohmarkt/flohmarkt
Is the world in need of a federated Craigslist/Kleinanzeigen platform? I am currently thinking about a project to dig into #fediverse development and learning #golang or stay with #deno and using #fedify.
EDIT: There is already something like that on the fediverse! It's called Flohmarkt. Thanks for the comments mentioning that! https://codeberg.org/flohmarkt/flohmarkt
Is the world in need of a federated Craigslist/Kleinanzeigen platform? I am currently thinking about a project to dig into #fediverse development and learning #golang or stay with #deno and using #fedify.
EDIT: There is already something like that on the fediverse! It's called Flohmarkt. Thanks for the comments mentioning that! https://codeberg.org/flohmarkt/flohmarkt
- Built-in OpenTelemetry support for span context propagators (tracecontext, baggage) - Built-in OTel tracing for node:http.request - LSP now starts the TypeScript server lazily
- Built-in OpenTelemetry support for span context propagators (tracecontext, baggage) - Built-in OTel tracing for node:http.request - LSP now starts the TypeScript server lazily
- Built-in OpenTelemetry support for span context propagators (tracecontext, baggage) - Built-in OTel tracing for node:http.request - LSP now starts the TypeScript server lazily
- Built-in OpenTelemetry support for span context propagators (tracecontext, baggage) - Built-in OTel tracing for node:http.request - LSP now starts the TypeScript server lazily
- Built-in OpenTelemetry support for span context propagators (tracecontext, baggage) - Built-in OTel tracing for node:http.request - LSP now starts the TypeScript server lazily
- Built-in OpenTelemetry support for span context propagators (tracecontext, baggage) - Built-in OTel tracing for node:http.request - LSP now starts the TypeScript server lazily
- Built-in OpenTelemetry support for span context propagators (tracecontext, baggage) - Built-in OTel tracing for node:http.request - LSP now starts the TypeScript server lazily
I have migrated one #TypeScript application to #Deno and I think it is fine. Probably, it doesn’t make much sense to migrate existing applications, but give it a shot when making one from scratch.
I have migrated one #TypeScript application to #Deno and I think it is fine. Probably, it doesn’t make much sense to migrate existing applications, but give it a shot when making one from scratch.
Any deno kv experts out here? For FLOSS ActivityPub Clients: I am looking for best practices for a key which has a geohash as secondary index and might be searchable by Date as well, like an as `Event` with a `location` :)
Denostories version 0.2.0 - added support for automated headless checks. So it takes advantage of Fresh's isomorphic rendering to basically combine storybook with snapshot testing.
Denostories version 0.2.0 - added support for automated headless checks. So it takes advantage of Fresh's isomorphic rendering to basically combine storybook with snapshot testing.
Over the past few months, we've made several improvements to our documentation: 🗂️ better organized examples 📸 video tutorials 💻 more documentation in API reference and much more —
Are you still using npm transpile services like esm.sh and unpkg.com? ❌ dependency deduplication ❌ install hooks and native add-ons ❌ loading data files
Here's why we recommend importing npm packages natively via npm specifiers 👇
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust @fedify foundation.
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust @fedify foundation.
Just integrated #Deno's new workspaces feature into the #Fedify repository! This means we can now manage the main package, CLI tool, and examples all in one place. The best part? No more custom import map generators—everything's simpler and more intuitive for new contributors. Loving how Deno 2.0's workspace support makes managing monorepos so much cleaner.
Are you still using npm transpile services like esm.sh and unpkg.com? ❌ dependency deduplication ❌ install hooks and native add-ons ❌ loading data files
Here's why we recommend importing npm packages natively via npm specifiers 👇
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust #Fedify foundation.
ALT text detailsimport {
createBot,
InProcessMessageQueue,
MemoryKvStore,
mention,
text,
} from "@fedify/botkit";
// Create a bot instance:
const bot = createBot<void>({
// The bot will have fediverse handle "@greetbot@mydomain":
username: "greetbot",
// Set the display name:
name: "Greet Bot",
// Set the profile icon (avatar):
icon: new URL("https://mydomain/icon.png"),
// Set the bio:
summary: text`Hi, there! I'm a simple fediverse bot created by ${
mention("@hongminhee@hollo.social")}.`,
// Store data in memory (for development):
kv: new MemoryKvStore(),
// Use in-process message queue (for development):
queue: new InProcessMessageQueue(),
});
// A bot can respond to a mention:
bot.onMention = async (session, message) => {
await message.reply(text`Hi, ${message.actor}!`);
};
// Or, a bot also can actively publish a post:
const session = bot.getSession("https://mydomain/");
setInterval(async () => {
await session.publish(text`Hi, forks! It's an hourly greeting.`);
}, 1000 * 60 * 60);
export default bot;
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust #Fedify foundation.
ALT text detailsimport {
createBot,
InProcessMessageQueue,
MemoryKvStore,
mention,
text,
} from "@fedify/botkit";
// Create a bot instance:
const bot = createBot<void>({
// The bot will have fediverse handle "@greetbot@mydomain":
username: "greetbot",
// Set the display name:
name: "Greet Bot",
// Set the profile icon (avatar):
icon: new URL("https://mydomain/icon.png"),
// Set the bio:
summary: text`Hi, there! I'm a simple fediverse bot created by ${
mention("@hongminhee@hollo.social")}.`,
// Store data in memory (for development):
kv: new MemoryKvStore(),
// Use in-process message queue (for development):
queue: new InProcessMessageQueue(),
});
// A bot can respond to a mention:
bot.onMention = async (session, message) => {
await message.reply(text`Hi, ${message.actor}!`);
};
// Or, a bot also can actively publish a post:
const session = bot.getSession("https://mydomain/");
setInterval(async () => {
await session.publish(text`Hi, forks! It's an hourly greeting.`);
}, 1000 * 60 * 60);
export default bot;
🎉 Announcing BotKit 0.1.0: A new framework for creating ActivityPub bots!
We're thrilled to announce the initial release of #BotKit, a #TypeScript framework that makes creating standalone #ActivityPub bots simpler than ever before. With BotKit, you can create a complete fediverse bot in just a single TypeScript file!
Key features:
🔋 Standalone bot creation—no need for a Mastodon/Misskey account
Over the past few months, we've made several improvements to our documentation: 🗂️ better organized examples 📸 video tutorials 💻 more documentation in API reference and much more —
🎉 Announcing BotKit 0.1.0: A new framework for creating ActivityPub bots!
We're thrilled to announce the initial release of #BotKit, a #TypeScript framework that makes creating standalone #ActivityPub bots simpler than ever before. With BotKit, you can create a complete fediverse bot in just a single TypeScript file!
Key features:
🔋 Standalone bot creation—no need for a Mastodon/Misskey account
Over the past few months, we've made several improvements to our documentation: 🗂️ better organized examples 📸 video tutorials 💻 more documentation in API reference and much more —
🎉 Announcing BotKit 0.1.0: A new framework for creating ActivityPub bots!
We're thrilled to announce the initial release of #BotKit, a #TypeScript framework that makes creating standalone #ActivityPub bots simpler than ever before. With BotKit, you can create a complete fediverse bot in just a single TypeScript file!
Key features:
🔋 Standalone bot creation—no need for a Mastodon/Misskey account
🎉 Announcing BotKit 0.1.0: A new framework for creating ActivityPub bots!
We're thrilled to announce the initial release of #BotKit, a #TypeScript framework that makes creating standalone #ActivityPub bots simpler than ever before. With BotKit, you can create a complete fediverse bot in just a single TypeScript file!
Key features:
🔋 Standalone bot creation—no need for a Mastodon/Misskey account
🎉 Announcing BotKit 0.1.0: A new framework for creating ActivityPub bots!
We're thrilled to announce the initial release of #BotKit, a #TypeScript framework that makes creating standalone #ActivityPub bots simpler than ever before. With BotKit, you can create a complete fediverse bot in just a single TypeScript file!
Key features:
🔋 Standalone bot creation—no need for a Mastodon/Misskey account
🎉 Announcing BotKit 0.1.0: A new framework for creating ActivityPub bots!
We're thrilled to announce the initial release of #BotKit, a #TypeScript framework that makes creating standalone #ActivityPub bots simpler than ever before. With BotKit, you can create a complete fediverse bot in just a single TypeScript file!
Key features:
🔋 Standalone bot creation—no need for a Mastodon/Misskey account
🎉 Announcing BotKit 0.1.0: A new framework for creating ActivityPub bots!
We're thrilled to announce the initial release of #BotKit, a #TypeScript framework that makes creating standalone #ActivityPub bots simpler than ever before. With BotKit, you can create a complete fediverse bot in just a single TypeScript file!
Key features:
🔋 Standalone bot creation—no need for a Mastodon/Misskey account
🎉 Announcing BotKit 0.1.0: A new framework for creating ActivityPub bots!
We're thrilled to announce the initial release of #BotKit, a #TypeScript framework that makes creating standalone #ActivityPub bots simpler than ever before. With BotKit, you can create a complete fediverse bot in just a single TypeScript file!
Key features:
🔋 Standalone bot creation—no need for a Mastodon/Misskey account
🎉 Announcing BotKit 0.1.0: A new framework for creating ActivityPub bots!
We're thrilled to announce the initial release of #BotKit, a #TypeScript framework that makes creating standalone #ActivityPub bots simpler than ever before. With BotKit, you can create a complete fediverse bot in just a single TypeScript file!
Key features:
🔋 Standalone bot creation—no need for a Mastodon/Misskey account
🎉 Announcing BotKit 0.1.0: A new framework for creating ActivityPub bots!
We're thrilled to announce the initial release of #BotKit, a #TypeScript framework that makes creating standalone #ActivityPub bots simpler than ever before. With BotKit, you can create a complete fediverse bot in just a single TypeScript file!
Key features:
🔋 Standalone bot creation—no need for a Mastodon/Misskey account
🎉 Announcing BotKit 0.1.0: A new framework for creating ActivityPub bots!
We're thrilled to announce the initial release of #BotKit, a #TypeScript framework that makes creating standalone #ActivityPub bots simpler than ever before. With BotKit, you can create a complete fediverse bot in just a single TypeScript file!
Key features:
🔋 Standalone bot creation—no need for a Mastodon/Misskey account
🎉 Announcing BotKit 0.1.0: A new framework for creating ActivityPub bots!
We're thrilled to announce the initial release of #BotKit, a #TypeScript framework that makes creating standalone #ActivityPub bots simpler than ever before. With BotKit, you can create a complete fediverse bot in just a single TypeScript file!
Key features:
🔋 Standalone bot creation—no need for a Mastodon/Misskey account
🎉 Announcing BotKit 0.1.0: A new framework for creating ActivityPub bots!
We're thrilled to announce the initial release of #BotKit, a #TypeScript framework that makes creating standalone #ActivityPub bots simpler than ever before. With BotKit, you can create a complete fediverse bot in just a single TypeScript file!
Key features:
🔋 Standalone bot creation—no need for a Mastodon/Misskey account
🎉 Announcing BotKit 0.1.0: A new framework for creating ActivityPub bots!
We're thrilled to announce the initial release of #BotKit, a #TypeScript framework that makes creating standalone #ActivityPub bots simpler than ever before. With BotKit, you can create a complete fediverse bot in just a single TypeScript file!
Key features:
🔋 Standalone bot creation—no need for a Mastodon/Misskey account
🎉 Announcing BotKit 0.1.0: A new framework for creating ActivityPub bots!
We're thrilled to announce the initial release of #BotKit, a #TypeScript framework that makes creating standalone #ActivityPub bots simpler than ever before. With BotKit, you can create a complete fediverse bot in just a single TypeScript file!
Key features:
🔋 Standalone bot creation—no need for a Mastodon/Misskey account
🎉 Announcing BotKit 0.1.0: A new framework for creating ActivityPub bots!
We're thrilled to announce the initial release of #BotKit, a #TypeScript framework that makes creating standalone #ActivityPub bots simpler than ever before. With BotKit, you can create a complete fediverse bot in just a single TypeScript file!
Key features:
🔋 Standalone bot creation—no need for a Mastodon/Misskey account
🎉 Announcing BotKit 0.1.0: A new framework for creating ActivityPub bots!
We're thrilled to announce the initial release of #BotKit, a #TypeScript framework that makes creating standalone #ActivityPub bots simpler than ever before. With BotKit, you can create a complete fediverse bot in just a single TypeScript file!
Key features:
🔋 Standalone bot creation—no need for a Mastodon/Misskey account
🎉 Announcing BotKit 0.1.0: A new framework for creating ActivityPub bots!
We're thrilled to announce the initial release of #BotKit, a #TypeScript framework that makes creating standalone #ActivityPub bots simpler than ever before. With BotKit, you can create a complete fediverse bot in just a single TypeScript file!
Key features:
🔋 Standalone bot creation—no need for a Mastodon/Misskey account
🎉 Announcing BotKit 0.1.0: A new framework for creating ActivityPub bots!
We're thrilled to announce the initial release of #BotKit, a #TypeScript framework that makes creating standalone #ActivityPub bots simpler than ever before. With BotKit, you can create a complete fediverse bot in just a single TypeScript file!
Key features:
🔋 Standalone bot creation—no need for a Mastodon/Misskey account
🎉 Announcing BotKit 0.1.0: A new framework for creating ActivityPub bots!
We're thrilled to announce the initial release of #BotKit, a #TypeScript framework that makes creating standalone #ActivityPub bots simpler than ever before. With BotKit, you can create a complete fediverse bot in just a single TypeScript file!
Key features:
🔋 Standalone bot creation—no need for a Mastodon/Misskey account
🎉 Announcing BotKit 0.1.0: A new framework for creating ActivityPub bots!
We're thrilled to announce the initial release of #BotKit, a #TypeScript framework that makes creating standalone #ActivityPub bots simpler than ever before. With BotKit, you can create a complete fediverse bot in just a single TypeScript file!
Key features:
🔋 Standalone bot creation—no need for a Mastodon/Misskey account
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust @fedify foundation.
Fedify is an #ActivityPub server framework in #TypeScript & #JavaScript. It aims to eliminate the complexity and redundant boilerplate code when building a federated server app, so that you can focus on your business logic and user experience.
The key features it provides currently are:
Type-safe objects for Activity Vocabulary (including some vendor-specific extensions)
Fedify is an #ActivityPub server framework in #TypeScript & #JavaScript. It aims to eliminate the complexity and redundant boilerplate code when building a federated server app, so that you can focus on your business logic and user experience.
The key features it provides currently are:
Type-safe objects for Activity Vocabulary (including some vendor-specific extensions)
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust #Fedify foundation.
ALT text detailsimport {
createBot,
InProcessMessageQueue,
MemoryKvStore,
mention,
text,
} from "@fedify/botkit";
// Create a bot instance:
const bot = createBot<void>({
// The bot will have fediverse handle "@greetbot@mydomain":
username: "greetbot",
// Set the display name:
name: "Greet Bot",
// Set the profile icon (avatar):
icon: new URL("https://mydomain/icon.png"),
// Set the bio:
summary: text`Hi, there! I'm a simple fediverse bot created by ${
mention("@hongminhee@hollo.social")}.`,
// Store data in memory (for development):
kv: new MemoryKvStore(),
// Use in-process message queue (for development):
queue: new InProcessMessageQueue(),
});
// A bot can respond to a mention:
bot.onMention = async (session, message) => {
await message.reply(text`Hi, ${message.actor}!`);
};
// Or, a bot also can actively publish a post:
const session = bot.getSession("https://mydomain/");
setInterval(async () => {
await session.publish(text`Hi, forks! It's an hourly greeting.`);
}, 1000 * 60 * 60);
export default bot;
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust @fedify foundation.
- Correct handling of compilerOptions.types - Better handling of npm package types - Improvements to node:fs FileHandle - Make deno outdated more robust Run `deno upgrade` to get it
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust @fedify foundation.
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust @fedify foundation.
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust @fedify foundation.
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust @fedify foundation.
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust @fedify foundation.
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust @fedify foundation.
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust @fedify foundation.
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust @fedify foundation.
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust @fedify foundation.
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust @fedify foundation.
- Correct handling of compilerOptions.types - Better handling of npm package types - Improvements to node:fs FileHandle - Make deno outdated more robust Run `deno upgrade` to get it
- Correct handling of compilerOptions.types - Better handling of npm package types - Improvements to node:fs FileHandle - Make deno outdated more robust Run `deno upgrade` to get it
- Correct handling of compilerOptions.types - Better handling of npm package types - Improvements to node:fs FileHandle - Make deno outdated more robust Run `deno upgrade` to get it
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust @fedify foundation.
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust @fedify foundation.
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust @fedify foundation.
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust @fedify foundation.
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust @fedify foundation.
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust @fedify foundation.
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust @fedify foundation.
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust @fedify foundation.
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust @fedify foundation.
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust @fedify foundation.
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust @fedify foundation.
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust @fedify foundation.
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust @fedify foundation.
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust @fedify foundation.
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust @fedify foundation.
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust @fedify foundation.
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust @fedify foundation.
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust @fedify foundation.
Made it all the way through an installation with only one question: where to install the bootloader. That's much better than the tedious series of questions that I always answer the same way in that clumsy installer UI, and I can keep reusing that preseed with slightly different values for new VMs going forwards.
I was worried the few hours I spent wouldn't be worth it, but I think it is.
Key Points: ➡️ BotKit enables the creation of standalone ActivityPub bots, free from platform constraints. ➡️ It is user-friendly and written in TypeScript, ensuring type safety. ➡️ BotKit is easy to deploy with minimal dependencies on various virtual servers. ➡️ Powered by #Fedify, a robust #ActivityPub framework.
Thanks to all who have participated. If we haven't contacted you about stickers, then please let us know (or email andy@deno.com).
Finally, one lucky winner will get the elite, special edition, hyper exclusive Deno sticker. (Here's Phil seeing it for the first time.) ️ More details 👇️ https://deno.com/blog/advent-of-code-2024
Thanks to all who have participated. If we haven't contacted you about stickers, then please let us know (or email andy@deno.com).
Finally, one lucky winner will get the elite, special edition, hyper exclusive Deno sticker. (Here's Phil seeing it for the first time.) ️ More details 👇️ https://deno.com/blog/advent-of-code-2024
Thanks to all who have participated. If we haven't contacted you about stickers, then please let us know (or email andy@deno.com).
Finally, one lucky winner will get the elite, special edition, hyper exclusive Deno sticker. (Here's Phil seeing it for the first time.) ️ More details 👇️ https://deno.com/blog/advent-of-code-2024
Key Points: ➡️ BotKit enables the creation of standalone ActivityPub bots, free from platform constraints. ➡️ It is user-friendly and written in TypeScript, ensuring type safety. ➡️ BotKit is easy to deploy with minimal dependencies on various virtual servers. ➡️ Powered by #Fedify, a robust #ActivityPub framework.
Key Points: ➡️ BotKit enables the creation of standalone ActivityPub bots, free from platform constraints. ➡️ It is user-friendly and written in TypeScript, ensuring type safety. ➡️ BotKit is easy to deploy with minimal dependencies on various virtual servers. ➡️ Powered by #Fedify, a robust #ActivityPub framework.
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust #Fedify foundation.
ALT text detailsimport {
createBot,
InProcessMessageQueue,
MemoryKvStore,
mention,
text,
} from "@fedify/botkit";
// Create a bot instance:
const bot = createBot<void>({
// The bot will have fediverse handle "@greetbot@mydomain":
username: "greetbot",
// Set the display name:
name: "Greet Bot",
// Set the profile icon (avatar):
icon: new URL("https://mydomain/icon.png"),
// Set the bio:
summary: text`Hi, there! I'm a simple fediverse bot created by ${
mention("@hongminhee@hollo.social")}.`,
// Store data in memory (for development):
kv: new MemoryKvStore(),
// Use in-process message queue (for development):
queue: new InProcessMessageQueue(),
});
// A bot can respond to a mention:
bot.onMention = async (session, message) => {
await message.reply(text`Hi, ${message.actor}!`);
};
// Or, a bot also can actively publish a post:
const session = bot.getSession("https://mydomain/");
setInterval(async () => {
await session.publish(text`Hi, forks! It's an hourly greeting.`);
}, 1000 * 60 * 60);
export default bot;
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust #Fedify foundation.
ALT text detailsimport {
createBot,
InProcessMessageQueue,
MemoryKvStore,
mention,
text,
} from "@fedify/botkit";
// Create a bot instance:
const bot = createBot<void>({
// The bot will have fediverse handle "@greetbot@mydomain":
username: "greetbot",
// Set the display name:
name: "Greet Bot",
// Set the profile icon (avatar):
icon: new URL("https://mydomain/icon.png"),
// Set the bio:
summary: text`Hi, there! I'm a simple fediverse bot created by ${
mention("@hongminhee@hollo.social")}.`,
// Store data in memory (for development):
kv: new MemoryKvStore(),
// Use in-process message queue (for development):
queue: new InProcessMessageQueue(),
});
// A bot can respond to a mention:
bot.onMention = async (session, message) => {
await message.reply(text`Hi, ${message.actor}!`);
};
// Or, a bot also can actively publish a post:
const session = bot.getSession("https://mydomain/");
setInterval(async () => {
await session.publish(text`Hi, forks! It's an hourly greeting.`);
}, 1000 * 60 * 60);
export default bot;
@wraptile I tried bottle, Flask is a POS. The sample code & libs do not work. I now avoid it and use #Deno instead.
When #AppEngine cost more than $10 and required more API changes (data api) I wrote my own static #HTML engine based on #Jeckyl (#Python) and when the compile times blew out re-wrote it in #Rust.
Static HTML is the fastest & pretty much hack proof. cc @bluetea
ALT text detailsFerrari Festival, Lygon St Melbourne
Last weekend took out the time to see the 2007 Grand Prix Ferrari Festival celebrating the 60th year of Ferrari in Lygon St in Melbourne.
Taken at the corner of Lygon & Argyle Place, Lygon St, near Case Del Gelato. In typical Melbourne style, the weather started warm, got a bit sunny then overcast and rained.
source https://www.flickr.com/photos/bootload/416173287/
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust #Fedify foundation.
ALT text detailsimport {
createBot,
InProcessMessageQueue,
MemoryKvStore,
mention,
text,
} from "@fedify/botkit";
// Create a bot instance:
const bot = createBot<void>({
// The bot will have fediverse handle "@greetbot@mydomain":
username: "greetbot",
// Set the display name:
name: "Greet Bot",
// Set the profile icon (avatar):
icon: new URL("https://mydomain/icon.png"),
// Set the bio:
summary: text`Hi, there! I'm a simple fediverse bot created by ${
mention("@hongminhee@hollo.social")}.`,
// Store data in memory (for development):
kv: new MemoryKvStore(),
// Use in-process message queue (for development):
queue: new InProcessMessageQueue(),
});
// A bot can respond to a mention:
bot.onMention = async (session, message) => {
await message.reply(text`Hi, ${message.actor}!`);
};
// Or, a bot also can actively publish a post:
const session = bot.getSession("https://mydomain/");
setInterval(async () => {
await session.publish(text`Hi, forks! It's an hourly greeting.`);
}, 1000 * 60 * 60);
export default bot;
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust #Fedify foundation.
ALT text detailsimport {
createBot,
InProcessMessageQueue,
MemoryKvStore,
mention,
text,
} from "@fedify/botkit";
// Create a bot instance:
const bot = createBot<void>({
// The bot will have fediverse handle "@greetbot@mydomain":
username: "greetbot",
// Set the display name:
name: "Greet Bot",
// Set the profile icon (avatar):
icon: new URL("https://mydomain/icon.png"),
// Set the bio:
summary: text`Hi, there! I'm a simple fediverse bot created by ${
mention("@hongminhee@hollo.social")}.`,
// Store data in memory (for development):
kv: new MemoryKvStore(),
// Use in-process message queue (for development):
queue: new InProcessMessageQueue(),
});
// A bot can respond to a mention:
bot.onMention = async (session, message) => {
await message.reply(text`Hi, ${message.actor}!`);
};
// Or, a bot also can actively publish a post:
const session = bot.getSession("https://mydomain/");
setInterval(async () => {
await session.publish(text`Hi, forks! It's an hourly greeting.`);
}, 1000 * 60 * 60);
export default bot;
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust #Fedify foundation.
ALT text detailsimport {
createBot,
InProcessMessageQueue,
MemoryKvStore,
mention,
text,
} from "@fedify/botkit";
// Create a bot instance:
const bot = createBot<void>({
// The bot will have fediverse handle "@greetbot@mydomain":
username: "greetbot",
// Set the display name:
name: "Greet Bot",
// Set the profile icon (avatar):
icon: new URL("https://mydomain/icon.png"),
// Set the bio:
summary: text`Hi, there! I'm a simple fediverse bot created by ${
mention("@hongminhee@hollo.social")}.`,
// Store data in memory (for development):
kv: new MemoryKvStore(),
// Use in-process message queue (for development):
queue: new InProcessMessageQueue(),
});
// A bot can respond to a mention:
bot.onMention = async (session, message) => {
await message.reply(text`Hi, ${message.actor}!`);
};
// Or, a bot also can actively publish a post:
const session = bot.getSession("https://mydomain/");
setInterval(async () => {
await session.publish(text`Hi, forks! It's an hourly greeting.`);
}, 1000 * 60 * 60);
export default bot;
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust #Fedify foundation.
ALT text detailsimport {
createBot,
InProcessMessageQueue,
MemoryKvStore,
mention,
text,
} from "@fedify/botkit";
// Create a bot instance:
const bot = createBot<void>({
// The bot will have fediverse handle "@greetbot@mydomain":
username: "greetbot",
// Set the display name:
name: "Greet Bot",
// Set the profile icon (avatar):
icon: new URL("https://mydomain/icon.png"),
// Set the bio:
summary: text`Hi, there! I'm a simple fediverse bot created by ${
mention("@hongminhee@hollo.social")}.`,
// Store data in memory (for development):
kv: new MemoryKvStore(),
// Use in-process message queue (for development):
queue: new InProcessMessageQueue(),
});
// A bot can respond to a mention:
bot.onMention = async (session, message) => {
await message.reply(text`Hi, ${message.actor}!`);
};
// Or, a bot also can actively publish a post:
const session = bot.getSession("https://mydomain/");
setInterval(async () => {
await session.publish(text`Hi, forks! It's an hourly greeting.`);
}, 1000 * 60 * 60);
export default bot;
Deno is committed to web standards - that's why we co-founded WinterCG two years ago. Today marks the next step in that journey: WinterCG moves to Ecma International as technical comittee 55 (TC55).
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust #Fedify foundation.
ALT text detailsimport {
createBot,
InProcessMessageQueue,
MemoryKvStore,
mention,
text,
} from "@fedify/botkit";
// Create a bot instance:
const bot = createBot<void>({
// The bot will have fediverse handle "@greetbot@mydomain":
username: "greetbot",
// Set the display name:
name: "Greet Bot",
// Set the profile icon (avatar):
icon: new URL("https://mydomain/icon.png"),
// Set the bio:
summary: text`Hi, there! I'm a simple fediverse bot created by ${
mention("@hongminhee@hollo.social")}.`,
// Store data in memory (for development):
kv: new MemoryKvStore(),
// Use in-process message queue (for development):
queue: new InProcessMessageQueue(),
});
// A bot can respond to a mention:
bot.onMention = async (session, message) => {
await message.reply(text`Hi, ${message.actor}!`);
};
// Or, a bot also can actively publish a post:
const session = bot.getSession("https://mydomain/");
setInterval(async () => {
await session.publish(text`Hi, forks! It's an hourly greeting.`);
}, 1000 * 60 * 60);
export default bot;
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust #Fedify foundation.
ALT text detailsimport {
createBot,
InProcessMessageQueue,
MemoryKvStore,
mention,
text,
} from "@fedify/botkit";
// Create a bot instance:
const bot = createBot<void>({
// The bot will have fediverse handle "@greetbot@mydomain":
username: "greetbot",
// Set the display name:
name: "Greet Bot",
// Set the profile icon (avatar):
icon: new URL("https://mydomain/icon.png"),
// Set the bio:
summary: text`Hi, there! I'm a simple fediverse bot created by ${
mention("@hongminhee@hollo.social")}.`,
// Store data in memory (for development):
kv: new MemoryKvStore(),
// Use in-process message queue (for development):
queue: new InProcessMessageQueue(),
});
// A bot can respond to a mention:
bot.onMention = async (session, message) => {
await message.reply(text`Hi, ${message.actor}!`);
};
// Or, a bot also can actively publish a post:
const session = bot.getSession("https://mydomain/");
setInterval(async () => {
await session.publish(text`Hi, forks! It's an hourly greeting.`);
}, 1000 * 60 * 60);
export default bot;
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust #Fedify foundation.
ALT text detailsimport {
createBot,
InProcessMessageQueue,
MemoryKvStore,
mention,
text,
} from "@fedify/botkit";
// Create a bot instance:
const bot = createBot<void>({
// The bot will have fediverse handle "@greetbot@mydomain":
username: "greetbot",
// Set the display name:
name: "Greet Bot",
// Set the profile icon (avatar):
icon: new URL("https://mydomain/icon.png"),
// Set the bio:
summary: text`Hi, there! I'm a simple fediverse bot created by ${
mention("@hongminhee@hollo.social")}.`,
// Store data in memory (for development):
kv: new MemoryKvStore(),
// Use in-process message queue (for development):
queue: new InProcessMessageQueue(),
});
// A bot can respond to a mention:
bot.onMention = async (session, message) => {
await message.reply(text`Hi, ${message.actor}!`);
};
// Or, a bot also can actively publish a post:
const session = bot.getSession("https://mydomain/");
setInterval(async () => {
await session.publish(text`Hi, forks! It's an hourly greeting.`);
}, 1000 * 60 * 60);
export default bot;
Deno is committed to web standards - that's why we co-founded WinterCG two years ago. Today marks the next step in that journey: WinterCG moves to Ecma International as technical comittee 55 (TC55).
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust #Fedify foundation.
ALT text detailsimport {
createBot,
InProcessMessageQueue,
MemoryKvStore,
mention,
text,
} from "@fedify/botkit";
// Create a bot instance:
const bot = createBot<void>({
// The bot will have fediverse handle "@greetbot@mydomain":
username: "greetbot",
// Set the display name:
name: "Greet Bot",
// Set the profile icon (avatar):
icon: new URL("https://mydomain/icon.png"),
// Set the bio:
summary: text`Hi, there! I'm a simple fediverse bot created by ${
mention("@hongminhee@hollo.social")}.`,
// Store data in memory (for development):
kv: new MemoryKvStore(),
// Use in-process message queue (for development):
queue: new InProcessMessageQueue(),
});
// A bot can respond to a mention:
bot.onMention = async (session, message) => {
await message.reply(text`Hi, ${message.actor}!`);
};
// Or, a bot also can actively publish a post:
const session = bot.getSession("https://mydomain/");
setInterval(async () => {
await session.publish(text`Hi, forks! It's an hourly greeting.`);
}, 1000 * 60 * 60);
export default bot;
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust #Fedify foundation.
ALT text detailsimport {
createBot,
InProcessMessageQueue,
MemoryKvStore,
mention,
text,
} from "@fedify/botkit";
// Create a bot instance:
const bot = createBot<void>({
// The bot will have fediverse handle "@greetbot@mydomain":
username: "greetbot",
// Set the display name:
name: "Greet Bot",
// Set the profile icon (avatar):
icon: new URL("https://mydomain/icon.png"),
// Set the bio:
summary: text`Hi, there! I'm a simple fediverse bot created by ${
mention("@hongminhee@hollo.social")}.`,
// Store data in memory (for development):
kv: new MemoryKvStore(),
// Use in-process message queue (for development):
queue: new InProcessMessageQueue(),
});
// A bot can respond to a mention:
bot.onMention = async (session, message) => {
await message.reply(text`Hi, ${message.actor}!`);
};
// Or, a bot also can actively publish a post:
const session = bot.getSession("https://mydomain/");
setInterval(async () => {
await session.publish(text`Hi, forks! It's an hourly greeting.`);
}, 1000 * 60 * 60);
export default bot;
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust #Fedify foundation.
ALT text detailsimport {
createBot,
InProcessMessageQueue,
MemoryKvStore,
mention,
text,
} from "@fedify/botkit";
// Create a bot instance:
const bot = createBot<void>({
// The bot will have fediverse handle "@greetbot@mydomain":
username: "greetbot",
// Set the display name:
name: "Greet Bot",
// Set the profile icon (avatar):
icon: new URL("https://mydomain/icon.png"),
// Set the bio:
summary: text`Hi, there! I'm a simple fediverse bot created by ${
mention("@hongminhee@hollo.social")}.`,
// Store data in memory (for development):
kv: new MemoryKvStore(),
// Use in-process message queue (for development):
queue: new InProcessMessageQueue(),
});
// A bot can respond to a mention:
bot.onMention = async (session, message) => {
await message.reply(text`Hi, ${message.actor}!`);
};
// Or, a bot also can actively publish a post:
const session = bot.getSession("https://mydomain/");
setInterval(async () => {
await session.publish(text`Hi, forks! It's an hourly greeting.`);
}, 1000 * 60 * 60);
export default bot;
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust #Fedify foundation.
ALT text detailsimport {
createBot,
InProcessMessageQueue,
MemoryKvStore,
mention,
text,
} from "@fedify/botkit";
// Create a bot instance:
const bot = createBot<void>({
// The bot will have fediverse handle "@greetbot@mydomain":
username: "greetbot",
// Set the display name:
name: "Greet Bot",
// Set the profile icon (avatar):
icon: new URL("https://mydomain/icon.png"),
// Set the bio:
summary: text`Hi, there! I'm a simple fediverse bot created by ${
mention("@hongminhee@hollo.social")}.`,
// Store data in memory (for development):
kv: new MemoryKvStore(),
// Use in-process message queue (for development):
queue: new InProcessMessageQueue(),
});
// A bot can respond to a mention:
bot.onMention = async (session, message) => {
await message.reply(text`Hi, ${message.actor}!`);
};
// Or, a bot also can actively publish a post:
const session = bot.getSession("https://mydomain/");
setInterval(async () => {
await session.publish(text`Hi, forks! It's an hourly greeting.`);
}, 1000 * 60 * 60);
export default bot;
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust #Fedify foundation.
ALT text detailsimport {
createBot,
InProcessMessageQueue,
MemoryKvStore,
mention,
text,
} from "@fedify/botkit";
// Create a bot instance:
const bot = createBot<void>({
// The bot will have fediverse handle "@greetbot@mydomain":
username: "greetbot",
// Set the display name:
name: "Greet Bot",
// Set the profile icon (avatar):
icon: new URL("https://mydomain/icon.png"),
// Set the bio:
summary: text`Hi, there! I'm a simple fediverse bot created by ${
mention("@hongminhee@hollo.social")}.`,
// Store data in memory (for development):
kv: new MemoryKvStore(),
// Use in-process message queue (for development):
queue: new InProcessMessageQueue(),
});
// A bot can respond to a mention:
bot.onMention = async (session, message) => {
await message.reply(text`Hi, ${message.actor}!`);
};
// Or, a bot also can actively publish a post:
const session = bot.getSession("https://mydomain/");
setInterval(async () => {
await session.publish(text`Hi, forks! It's an hourly greeting.`);
}, 1000 * 60 * 60);
export default bot;
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust #Fedify foundation.
ALT text detailsimport {
createBot,
InProcessMessageQueue,
MemoryKvStore,
mention,
text,
} from "@fedify/botkit";
// Create a bot instance:
const bot = createBot<void>({
// The bot will have fediverse handle "@greetbot@mydomain":
username: "greetbot",
// Set the display name:
name: "Greet Bot",
// Set the profile icon (avatar):
icon: new URL("https://mydomain/icon.png"),
// Set the bio:
summary: text`Hi, there! I'm a simple fediverse bot created by ${
mention("@hongminhee@hollo.social")}.`,
// Store data in memory (for development):
kv: new MemoryKvStore(),
// Use in-process message queue (for development):
queue: new InProcessMessageQueue(),
});
// A bot can respond to a mention:
bot.onMention = async (session, message) => {
await message.reply(text`Hi, ${message.actor}!`);
};
// Or, a bot also can actively publish a post:
const session = bot.getSession("https://mydomain/");
setInterval(async () => {
await session.publish(text`Hi, forks! It's an hourly greeting.`);
}, 1000 * 60 * 60);
export default bot;
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust #Fedify foundation.
ALT text detailsimport {
createBot,
InProcessMessageQueue,
MemoryKvStore,
mention,
text,
} from "@fedify/botkit";
// Create a bot instance:
const bot = createBot<void>({
// The bot will have fediverse handle "@greetbot@mydomain":
username: "greetbot",
// Set the display name:
name: "Greet Bot",
// Set the profile icon (avatar):
icon: new URL("https://mydomain/icon.png"),
// Set the bio:
summary: text`Hi, there! I'm a simple fediverse bot created by ${
mention("@hongminhee@hollo.social")}.`,
// Store data in memory (for development):
kv: new MemoryKvStore(),
// Use in-process message queue (for development):
queue: new InProcessMessageQueue(),
});
// A bot can respond to a mention:
bot.onMention = async (session, message) => {
await message.reply(text`Hi, ${message.actor}!`);
};
// Or, a bot also can actively publish a post:
const session = bot.getSession("https://mydomain/");
setInterval(async () => {
await session.publish(text`Hi, forks! It's an hourly greeting.`);
}, 1000 * 60 * 60);
export default bot;
Deno is committed to web standards - that's why we co-founded WinterCG two years ago. Today marks the next step in that journey: WinterCG moves to Ecma International as technical comittee 55 (TC55).
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust #Fedify foundation.
ALT text detailsimport {
createBot,
InProcessMessageQueue,
MemoryKvStore,
mention,
text,
} from "@fedify/botkit";
// Create a bot instance:
const bot = createBot<void>({
// The bot will have fediverse handle "@greetbot@mydomain":
username: "greetbot",
// Set the display name:
name: "Greet Bot",
// Set the profile icon (avatar):
icon: new URL("https://mydomain/icon.png"),
// Set the bio:
summary: text`Hi, there! I'm a simple fediverse bot created by ${
mention("@hongminhee@hollo.social")}.`,
// Store data in memory (for development):
kv: new MemoryKvStore(),
// Use in-process message queue (for development):
queue: new InProcessMessageQueue(),
});
// A bot can respond to a mention:
bot.onMention = async (session, message) => {
await message.reply(text`Hi, ${message.actor}!`);
};
// Or, a bot also can actively publish a post:
const session = bot.getSession("https://mydomain/");
setInterval(async () => {
await session.publish(text`Hi, forks! It's an hourly greeting.`);
}, 1000 * 60 * 60);
export default bot;
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust #Fedify foundation.
ALT text detailsimport {
createBot,
InProcessMessageQueue,
MemoryKvStore,
mention,
text,
} from "@fedify/botkit";
// Create a bot instance:
const bot = createBot<void>({
// The bot will have fediverse handle "@greetbot@mydomain":
username: "greetbot",
// Set the display name:
name: "Greet Bot",
// Set the profile icon (avatar):
icon: new URL("https://mydomain/icon.png"),
// Set the bio:
summary: text`Hi, there! I'm a simple fediverse bot created by ${
mention("@hongminhee@hollo.social")}.`,
// Store data in memory (for development):
kv: new MemoryKvStore(),
// Use in-process message queue (for development):
queue: new InProcessMessageQueue(),
});
// A bot can respond to a mention:
bot.onMention = async (session, message) => {
await message.reply(text`Hi, ${message.actor}!`);
};
// Or, a bot also can actively publish a post:
const session = bot.getSession("https://mydomain/");
setInterval(async () => {
await session.publish(text`Hi, forks! It's an hourly greeting.`);
}, 1000 * 60 * 60);
export default bot;
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust #Fedify foundation.
ALT text detailsimport {
createBot,
InProcessMessageQueue,
MemoryKvStore,
mention,
text,
} from "@fedify/botkit";
// Create a bot instance:
const bot = createBot<void>({
// The bot will have fediverse handle "@greetbot@mydomain":
username: "greetbot",
// Set the display name:
name: "Greet Bot",
// Set the profile icon (avatar):
icon: new URL("https://mydomain/icon.png"),
// Set the bio:
summary: text`Hi, there! I'm a simple fediverse bot created by ${
mention("@hongminhee@hollo.social")}.`,
// Store data in memory (for development):
kv: new MemoryKvStore(),
// Use in-process message queue (for development):
queue: new InProcessMessageQueue(),
});
// A bot can respond to a mention:
bot.onMention = async (session, message) => {
await message.reply(text`Hi, ${message.actor}!`);
};
// Or, a bot also can actively publish a post:
const session = bot.getSession("https://mydomain/");
setInterval(async () => {
await session.publish(text`Hi, forks! It's an hourly greeting.`);
}, 1000 * 60 * 60);
export default bot;
Deno is committed to web standards - that's why we co-founded WinterCG two years ago. Today marks the next step in that journey: WinterCG moves to Ecma International as technical comittee 55 (TC55).
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust #Fedify foundation.
ALT text detailsimport {
createBot,
InProcessMessageQueue,
MemoryKvStore,
mention,
text,
} from "@fedify/botkit";
// Create a bot instance:
const bot = createBot<void>({
// The bot will have fediverse handle "@greetbot@mydomain":
username: "greetbot",
// Set the display name:
name: "Greet Bot",
// Set the profile icon (avatar):
icon: new URL("https://mydomain/icon.png"),
// Set the bio:
summary: text`Hi, there! I'm a simple fediverse bot created by ${
mention("@hongminhee@hollo.social")}.`,
// Store data in memory (for development):
kv: new MemoryKvStore(),
// Use in-process message queue (for development):
queue: new InProcessMessageQueue(),
});
// A bot can respond to a mention:
bot.onMention = async (session, message) => {
await message.reply(text`Hi, ${message.actor}!`);
};
// Or, a bot also can actively publish a post:
const session = bot.getSession("https://mydomain/");
setInterval(async () => {
await session.publish(text`Hi, forks! It's an hourly greeting.`);
}, 1000 * 60 * 60);
export default bot;
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust #Fedify foundation.
ALT text detailsimport {
createBot,
InProcessMessageQueue,
MemoryKvStore,
mention,
text,
} from "@fedify/botkit";
// Create a bot instance:
const bot = createBot<void>({
// The bot will have fediverse handle "@greetbot@mydomain":
username: "greetbot",
// Set the display name:
name: "Greet Bot",
// Set the profile icon (avatar):
icon: new URL("https://mydomain/icon.png"),
// Set the bio:
summary: text`Hi, there! I'm a simple fediverse bot created by ${
mention("@hongminhee@hollo.social")}.`,
// Store data in memory (for development):
kv: new MemoryKvStore(),
// Use in-process message queue (for development):
queue: new InProcessMessageQueue(),
});
// A bot can respond to a mention:
bot.onMention = async (session, message) => {
await message.reply(text`Hi, ${message.actor}!`);
};
// Or, a bot also can actively publish a post:
const session = bot.getSession("https://mydomain/");
setInterval(async () => {
await session.publish(text`Hi, forks! It's an hourly greeting.`);
}, 1000 * 60 * 60);
export default bot;
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust #Fedify foundation.
ALT text detailsimport {
createBot,
InProcessMessageQueue,
MemoryKvStore,
mention,
text,
} from "@fedify/botkit";
// Create a bot instance:
const bot = createBot<void>({
// The bot will have fediverse handle "@greetbot@mydomain":
username: "greetbot",
// Set the display name:
name: "Greet Bot",
// Set the profile icon (avatar):
icon: new URL("https://mydomain/icon.png"),
// Set the bio:
summary: text`Hi, there! I'm a simple fediverse bot created by ${
mention("@hongminhee@hollo.social")}.`,
// Store data in memory (for development):
kv: new MemoryKvStore(),
// Use in-process message queue (for development):
queue: new InProcessMessageQueue(),
});
// A bot can respond to a mention:
bot.onMention = async (session, message) => {
await message.reply(text`Hi, ${message.actor}!`);
};
// Or, a bot also can actively publish a post:
const session = bot.getSession("https://mydomain/");
setInterval(async () => {
await session.publish(text`Hi, forks! It's an hourly greeting.`);
}, 1000 * 60 * 60);
export default bot;
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust #Fedify foundation.
ALT text detailsimport {
createBot,
InProcessMessageQueue,
MemoryKvStore,
mention,
text,
} from "@fedify/botkit";
// Create a bot instance:
const bot = createBot<void>({
// The bot will have fediverse handle "@greetbot@mydomain":
username: "greetbot",
// Set the display name:
name: "Greet Bot",
// Set the profile icon (avatar):
icon: new URL("https://mydomain/icon.png"),
// Set the bio:
summary: text`Hi, there! I'm a simple fediverse bot created by ${
mention("@hongminhee@hollo.social")}.`,
// Store data in memory (for development):
kv: new MemoryKvStore(),
// Use in-process message queue (for development):
queue: new InProcessMessageQueue(),
});
// A bot can respond to a mention:
bot.onMention = async (session, message) => {
await message.reply(text`Hi, ${message.actor}!`);
};
// Or, a bot also can actively publish a post:
const session = bot.getSession("https://mydomain/");
setInterval(async () => {
await session.publish(text`Hi, forks! It's an hourly greeting.`);
}, 1000 * 60 * 60);
export default bot;
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust #Fedify foundation.
ALT text detailsimport {
createBot,
InProcessMessageQueue,
MemoryKvStore,
mention,
text,
} from "@fedify/botkit";
// Create a bot instance:
const bot = createBot<void>({
// The bot will have fediverse handle "@greetbot@mydomain":
username: "greetbot",
// Set the display name:
name: "Greet Bot",
// Set the profile icon (avatar):
icon: new URL("https://mydomain/icon.png"),
// Set the bio:
summary: text`Hi, there! I'm a simple fediverse bot created by ${
mention("@hongminhee@hollo.social")}.`,
// Store data in memory (for development):
kv: new MemoryKvStore(),
// Use in-process message queue (for development):
queue: new InProcessMessageQueue(),
});
// A bot can respond to a mention:
bot.onMention = async (session, message) => {
await message.reply(text`Hi, ${message.actor}!`);
};
// Or, a bot also can actively publish a post:
const session = bot.getSession("https://mydomain/");
setInterval(async () => {
await session.publish(text`Hi, forks! It's an hourly greeting.`);
}, 1000 * 60 * 60);
export default bot;
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust #Fedify foundation.
ALT text detailsimport {
createBot,
InProcessMessageQueue,
MemoryKvStore,
mention,
text,
} from "@fedify/botkit";
// Create a bot instance:
const bot = createBot<void>({
// The bot will have fediverse handle "@greetbot@mydomain":
username: "greetbot",
// Set the display name:
name: "Greet Bot",
// Set the profile icon (avatar):
icon: new URL("https://mydomain/icon.png"),
// Set the bio:
summary: text`Hi, there! I'm a simple fediverse bot created by ${
mention("@hongminhee@hollo.social")}.`,
// Store data in memory (for development):
kv: new MemoryKvStore(),
// Use in-process message queue (for development):
queue: new InProcessMessageQueue(),
});
// A bot can respond to a mention:
bot.onMention = async (session, message) => {
await message.reply(text`Hi, ${message.actor}!`);
};
// Or, a bot also can actively publish a post:
const session = bot.getSession("https://mydomain/");
setInterval(async () => {
await session.publish(text`Hi, forks! It's an hourly greeting.`);
}, 1000 * 60 * 60);
export default bot;
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust #Fedify foundation.
ALT text detailsimport {
createBot,
InProcessMessageQueue,
MemoryKvStore,
mention,
text,
} from "@fedify/botkit";
// Create a bot instance:
const bot = createBot<void>({
// The bot will have fediverse handle "@greetbot@mydomain":
username: "greetbot",
// Set the display name:
name: "Greet Bot",
// Set the profile icon (avatar):
icon: new URL("https://mydomain/icon.png"),
// Set the bio:
summary: text`Hi, there! I'm a simple fediverse bot created by ${
mention("@hongminhee@hollo.social")}.`,
// Store data in memory (for development):
kv: new MemoryKvStore(),
// Use in-process message queue (for development):
queue: new InProcessMessageQueue(),
});
// A bot can respond to a mention:
bot.onMention = async (session, message) => {
await message.reply(text`Hi, ${message.actor}!`);
};
// Or, a bot also can actively publish a post:
const session = bot.getSession("https://mydomain/");
setInterval(async () => {
await session.publish(text`Hi, forks! It's an hourly greeting.`);
}, 1000 * 60 * 60);
export default bot;
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust #Fedify foundation.
ALT text detailsimport {
createBot,
InProcessMessageQueue,
MemoryKvStore,
mention,
text,
} from "@fedify/botkit";
// Create a bot instance:
const bot = createBot<void>({
// The bot will have fediverse handle "@greetbot@mydomain":
username: "greetbot",
// Set the display name:
name: "Greet Bot",
// Set the profile icon (avatar):
icon: new URL("https://mydomain/icon.png"),
// Set the bio:
summary: text`Hi, there! I'm a simple fediverse bot created by ${
mention("@hongminhee@hollo.social")}.`,
// Store data in memory (for development):
kv: new MemoryKvStore(),
// Use in-process message queue (for development):
queue: new InProcessMessageQueue(),
});
// A bot can respond to a mention:
bot.onMention = async (session, message) => {
await message.reply(text`Hi, ${message.actor}!`);
};
// Or, a bot also can actively publish a post:
const session = bot.getSession("https://mydomain/");
setInterval(async () => {
await session.publish(text`Hi, forks! It's an hourly greeting.`);
}, 1000 * 60 * 60);
export default bot;
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust #Fedify foundation.
ALT text detailsimport {
createBot,
InProcessMessageQueue,
MemoryKvStore,
mention,
text,
} from "@fedify/botkit";
// Create a bot instance:
const bot = createBot<void>({
// The bot will have fediverse handle "@greetbot@mydomain":
username: "greetbot",
// Set the display name:
name: "Greet Bot",
// Set the profile icon (avatar):
icon: new URL("https://mydomain/icon.png"),
// Set the bio:
summary: text`Hi, there! I'm a simple fediverse bot created by ${
mention("@hongminhee@hollo.social")}.`,
// Store data in memory (for development):
kv: new MemoryKvStore(),
// Use in-process message queue (for development):
queue: new InProcessMessageQueue(),
});
// A bot can respond to a mention:
bot.onMention = async (session, message) => {
await message.reply(text`Hi, ${message.actor}!`);
};
// Or, a bot also can actively publish a post:
const session = bot.getSession("https://mydomain/");
setInterval(async () => {
await session.publish(text`Hi, forks! It's an hourly greeting.`);
}, 1000 * 60 * 60);
export default bot;
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust #Fedify foundation.
ALT text detailsimport {
createBot,
InProcessMessageQueue,
MemoryKvStore,
mention,
text,
} from "@fedify/botkit";
// Create a bot instance:
const bot = createBot<void>({
// The bot will have fediverse handle "@greetbot@mydomain":
username: "greetbot",
// Set the display name:
name: "Greet Bot",
// Set the profile icon (avatar):
icon: new URL("https://mydomain/icon.png"),
// Set the bio:
summary: text`Hi, there! I'm a simple fediverse bot created by ${
mention("@hongminhee@hollo.social")}.`,
// Store data in memory (for development):
kv: new MemoryKvStore(),
// Use in-process message queue (for development):
queue: new InProcessMessageQueue(),
});
// A bot can respond to a mention:
bot.onMention = async (session, message) => {
await message.reply(text`Hi, ${message.actor}!`);
};
// Or, a bot also can actively publish a post:
const session = bot.getSession("https://mydomain/");
setInterval(async () => {
await session.publish(text`Hi, forks! It's an hourly greeting.`);
}, 1000 * 60 * 60);
export default bot;
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust #Fedify foundation.
ALT text detailsimport {
createBot,
InProcessMessageQueue,
MemoryKvStore,
mention,
text,
} from "@fedify/botkit";
// Create a bot instance:
const bot = createBot<void>({
// The bot will have fediverse handle "@greetbot@mydomain":
username: "greetbot",
// Set the display name:
name: "Greet Bot",
// Set the profile icon (avatar):
icon: new URL("https://mydomain/icon.png"),
// Set the bio:
summary: text`Hi, there! I'm a simple fediverse bot created by ${
mention("@hongminhee@hollo.social")}.`,
// Store data in memory (for development):
kv: new MemoryKvStore(),
// Use in-process message queue (for development):
queue: new InProcessMessageQueue(),
});
// A bot can respond to a mention:
bot.onMention = async (session, message) => {
await message.reply(text`Hi, ${message.actor}!`);
};
// Or, a bot also can actively publish a post:
const session = bot.getSession("https://mydomain/");
setInterval(async () => {
await session.publish(text`Hi, forks! It's an hourly greeting.`);
}, 1000 * 60 * 60);
export default bot;
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust #Fedify foundation.
ALT text detailsimport {
createBot,
InProcessMessageQueue,
MemoryKvStore,
mention,
text,
} from "@fedify/botkit";
// Create a bot instance:
const bot = createBot<void>({
// The bot will have fediverse handle "@greetbot@mydomain":
username: "greetbot",
// Set the display name:
name: "Greet Bot",
// Set the profile icon (avatar):
icon: new URL("https://mydomain/icon.png"),
// Set the bio:
summary: text`Hi, there! I'm a simple fediverse bot created by ${
mention("@hongminhee@hollo.social")}.`,
// Store data in memory (for development):
kv: new MemoryKvStore(),
// Use in-process message queue (for development):
queue: new InProcessMessageQueue(),
});
// A bot can respond to a mention:
bot.onMention = async (session, message) => {
await message.reply(text`Hi, ${message.actor}!`);
};
// Or, a bot also can actively publish a post:
const session = bot.getSession("https://mydomain/");
setInterval(async () => {
await session.publish(text`Hi, forks! It's an hourly greeting.`);
}, 1000 * 60 * 60);
export default bot;
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust #Fedify foundation.
ALT text detailsimport {
createBot,
InProcessMessageQueue,
MemoryKvStore,
mention,
text,
} from "@fedify/botkit";
// Create a bot instance:
const bot = createBot<void>({
// The bot will have fediverse handle "@greetbot@mydomain":
username: "greetbot",
// Set the display name:
name: "Greet Bot",
// Set the profile icon (avatar):
icon: new URL("https://mydomain/icon.png"),
// Set the bio:
summary: text`Hi, there! I'm a simple fediverse bot created by ${
mention("@hongminhee@hollo.social")}.`,
// Store data in memory (for development):
kv: new MemoryKvStore(),
// Use in-process message queue (for development):
queue: new InProcessMessageQueue(),
});
// A bot can respond to a mention:
bot.onMention = async (session, message) => {
await message.reply(text`Hi, ${message.actor}!`);
};
// Or, a bot also can actively publish a post:
const session = bot.getSession("https://mydomain/");
setInterval(async () => {
await session.publish(text`Hi, forks! It's an hourly greeting.`);
}, 1000 * 60 * 60);
export default bot;
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust #Fedify foundation.
ALT text detailsimport {
createBot,
InProcessMessageQueue,
MemoryKvStore,
mention,
text,
} from "@fedify/botkit";
// Create a bot instance:
const bot = createBot<void>({
// The bot will have fediverse handle "@greetbot@mydomain":
username: "greetbot",
// Set the display name:
name: "Greet Bot",
// Set the profile icon (avatar):
icon: new URL("https://mydomain/icon.png"),
// Set the bio:
summary: text`Hi, there! I'm a simple fediverse bot created by ${
mention("@hongminhee@hollo.social")}.`,
// Store data in memory (for development):
kv: new MemoryKvStore(),
// Use in-process message queue (for development):
queue: new InProcessMessageQueue(),
});
// A bot can respond to a mention:
bot.onMention = async (session, message) => {
await message.reply(text`Hi, ${message.actor}!`);
};
// Or, a bot also can actively publish a post:
const session = bot.getSession("https://mydomain/");
setInterval(async () => {
await session.publish(text`Hi, forks! It's an hourly greeting.`);
}, 1000 * 60 * 60);
export default bot;
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust #Fedify foundation.
ALT text detailsimport {
createBot,
InProcessMessageQueue,
MemoryKvStore,
mention,
text,
} from "@fedify/botkit";
// Create a bot instance:
const bot = createBot<void>({
// The bot will have fediverse handle "@greetbot@mydomain":
username: "greetbot",
// Set the display name:
name: "Greet Bot",
// Set the profile icon (avatar):
icon: new URL("https://mydomain/icon.png"),
// Set the bio:
summary: text`Hi, there! I'm a simple fediverse bot created by ${
mention("@hongminhee@hollo.social")}.`,
// Store data in memory (for development):
kv: new MemoryKvStore(),
// Use in-process message queue (for development):
queue: new InProcessMessageQueue(),
});
// A bot can respond to a mention:
bot.onMention = async (session, message) => {
await message.reply(text`Hi, ${message.actor}!`);
};
// Or, a bot also can actively publish a post:
const session = bot.getSession("https://mydomain/");
setInterval(async () => {
await session.publish(text`Hi, forks! It's an hourly greeting.`);
}, 1000 * 60 * 60);
export default bot;
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust #Fedify foundation.
ALT text detailsimport {
createBot,
InProcessMessageQueue,
MemoryKvStore,
mention,
text,
} from "@fedify/botkit";
// Create a bot instance:
const bot = createBot<void>({
// The bot will have fediverse handle "@greetbot@mydomain":
username: "greetbot",
// Set the display name:
name: "Greet Bot",
// Set the profile icon (avatar):
icon: new URL("https://mydomain/icon.png"),
// Set the bio:
summary: text`Hi, there! I'm a simple fediverse bot created by ${
mention("@hongminhee@hollo.social")}.`,
// Store data in memory (for development):
kv: new MemoryKvStore(),
// Use in-process message queue (for development):
queue: new InProcessMessageQueue(),
});
// A bot can respond to a mention:
bot.onMention = async (session, message) => {
await message.reply(text`Hi, ${message.actor}!`);
};
// Or, a bot also can actively publish a post:
const session = bot.getSession("https://mydomain/");
setInterval(async () => {
await session.publish(text`Hi, forks! It's an hourly greeting.`);
}, 1000 * 60 * 60);
export default bot;
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust #Fedify foundation.
ALT text detailsimport {
createBot,
InProcessMessageQueue,
MemoryKvStore,
mention,
text,
} from "@fedify/botkit";
// Create a bot instance:
const bot = createBot<void>({
// The bot will have fediverse handle "@greetbot@mydomain":
username: "greetbot",
// Set the display name:
name: "Greet Bot",
// Set the profile icon (avatar):
icon: new URL("https://mydomain/icon.png"),
// Set the bio:
summary: text`Hi, there! I'm a simple fediverse bot created by ${
mention("@hongminhee@hollo.social")}.`,
// Store data in memory (for development):
kv: new MemoryKvStore(),
// Use in-process message queue (for development):
queue: new InProcessMessageQueue(),
});
// A bot can respond to a mention:
bot.onMention = async (session, message) => {
await message.reply(text`Hi, ${message.actor}!`);
};
// Or, a bot also can actively publish a post:
const session = bot.getSession("https://mydomain/");
setInterval(async () => {
await session.publish(text`Hi, forks! It's an hourly greeting.`);
}, 1000 * 60 * 60);
export default bot;
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust #Fedify foundation.
ALT text detailsimport {
createBot,
InProcessMessageQueue,
MemoryKvStore,
mention,
text,
} from "@fedify/botkit";
// Create a bot instance:
const bot = createBot<void>({
// The bot will have fediverse handle "@greetbot@mydomain":
username: "greetbot",
// Set the display name:
name: "Greet Bot",
// Set the profile icon (avatar):
icon: new URL("https://mydomain/icon.png"),
// Set the bio:
summary: text`Hi, there! I'm a simple fediverse bot created by ${
mention("@hongminhee@hollo.social")}.`,
// Store data in memory (for development):
kv: new MemoryKvStore(),
// Use in-process message queue (for development):
queue: new InProcessMessageQueue(),
});
// A bot can respond to a mention:
bot.onMention = async (session, message) => {
await message.reply(text`Hi, ${message.actor}!`);
};
// Or, a bot also can actively publish a post:
const session = bot.getSession("https://mydomain/");
setInterval(async () => {
await session.publish(text`Hi, forks! It's an hourly greeting.`);
}, 1000 * 60 * 60);
export default bot;
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust #Fedify foundation.
ALT text detailsimport {
createBot,
InProcessMessageQueue,
MemoryKvStore,
mention,
text,
} from "@fedify/botkit";
// Create a bot instance:
const bot = createBot<void>({
// The bot will have fediverse handle "@greetbot@mydomain":
username: "greetbot",
// Set the display name:
name: "Greet Bot",
// Set the profile icon (avatar):
icon: new URL("https://mydomain/icon.png"),
// Set the bio:
summary: text`Hi, there! I'm a simple fediverse bot created by ${
mention("@hongminhee@hollo.social")}.`,
// Store data in memory (for development):
kv: new MemoryKvStore(),
// Use in-process message queue (for development):
queue: new InProcessMessageQueue(),
});
// A bot can respond to a mention:
bot.onMention = async (session, message) => {
await message.reply(text`Hi, ${message.actor}!`);
};
// Or, a bot also can actively publish a post:
const session = bot.getSession("https://mydomain/");
setInterval(async () => {
await session.publish(text`Hi, forks! It's an hourly greeting.`);
}, 1000 * 60 * 60);
export default bot;
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust #Fedify foundation.
ALT text detailsimport {
createBot,
InProcessMessageQueue,
MemoryKvStore,
mention,
text,
} from "@fedify/botkit";
// Create a bot instance:
const bot = createBot<void>({
// The bot will have fediverse handle "@greetbot@mydomain":
username: "greetbot",
// Set the display name:
name: "Greet Bot",
// Set the profile icon (avatar):
icon: new URL("https://mydomain/icon.png"),
// Set the bio:
summary: text`Hi, there! I'm a simple fediverse bot created by ${
mention("@hongminhee@hollo.social")}.`,
// Store data in memory (for development):
kv: new MemoryKvStore(),
// Use in-process message queue (for development):
queue: new InProcessMessageQueue(),
});
// A bot can respond to a mention:
bot.onMention = async (session, message) => {
await message.reply(text`Hi, ${message.actor}!`);
};
// Or, a bot also can actively publish a post:
const session = bot.getSession("https://mydomain/");
setInterval(async () => {
await session.publish(text`Hi, forks! It's an hourly greeting.`);
}, 1000 * 60 * 60);
export default bot;
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust #Fedify foundation.
ALT text detailsimport {
createBot,
InProcessMessageQueue,
MemoryKvStore,
mention,
text,
} from "@fedify/botkit";
// Create a bot instance:
const bot = createBot<void>({
// The bot will have fediverse handle "@greetbot@mydomain":
username: "greetbot",
// Set the display name:
name: "Greet Bot",
// Set the profile icon (avatar):
icon: new URL("https://mydomain/icon.png"),
// Set the bio:
summary: text`Hi, there! I'm a simple fediverse bot created by ${
mention("@hongminhee@hollo.social")}.`,
// Store data in memory (for development):
kv: new MemoryKvStore(),
// Use in-process message queue (for development):
queue: new InProcessMessageQueue(),
});
// A bot can respond to a mention:
bot.onMention = async (session, message) => {
await message.reply(text`Hi, ${message.actor}!`);
};
// Or, a bot also can actively publish a post:
const session = bot.getSession("https://mydomain/");
setInterval(async () => {
await session.publish(text`Hi, forks! It's an hourly greeting.`);
}, 1000 * 60 * 60);
export default bot;
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust #Fedify foundation.
ALT text detailsimport {
createBot,
InProcessMessageQueue,
MemoryKvStore,
mention,
text,
} from "@fedify/botkit";
// Create a bot instance:
const bot = createBot<void>({
// The bot will have fediverse handle "@greetbot@mydomain":
username: "greetbot",
// Set the display name:
name: "Greet Bot",
// Set the profile icon (avatar):
icon: new URL("https://mydomain/icon.png"),
// Set the bio:
summary: text`Hi, there! I'm a simple fediverse bot created by ${
mention("@hongminhee@hollo.social")}.`,
// Store data in memory (for development):
kv: new MemoryKvStore(),
// Use in-process message queue (for development):
queue: new InProcessMessageQueue(),
});
// A bot can respond to a mention:
bot.onMention = async (session, message) => {
await message.reply(text`Hi, ${message.actor}!`);
};
// Or, a bot also can actively publish a post:
const session = bot.getSession("https://mydomain/");
setInterval(async () => {
await session.publish(text`Hi, forks! It's an hourly greeting.`);
}, 1000 * 60 * 60);
export default bot;
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust #Fedify foundation.
ALT text detailsimport {
createBot,
InProcessMessageQueue,
MemoryKvStore,
mention,
text,
} from "@fedify/botkit";
// Create a bot instance:
const bot = createBot<void>({
// The bot will have fediverse handle "@greetbot@mydomain":
username: "greetbot",
// Set the display name:
name: "Greet Bot",
// Set the profile icon (avatar):
icon: new URL("https://mydomain/icon.png"),
// Set the bio:
summary: text`Hi, there! I'm a simple fediverse bot created by ${
mention("@hongminhee@hollo.social")}.`,
// Store data in memory (for development):
kv: new MemoryKvStore(),
// Use in-process message queue (for development):
queue: new InProcessMessageQueue(),
});
// A bot can respond to a mention:
bot.onMention = async (session, message) => {
await message.reply(text`Hi, ${message.actor}!`);
};
// Or, a bot also can actively publish a post:
const session = bot.getSession("https://mydomain/");
setInterval(async () => {
await session.publish(text`Hi, forks! It's an hourly greeting.`);
}, 1000 * 60 * 60);
export default bot;
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust #Fedify foundation.
ALT text detailsimport {
createBot,
InProcessMessageQueue,
MemoryKvStore,
mention,
text,
} from "@fedify/botkit";
// Create a bot instance:
const bot = createBot<void>({
// The bot will have fediverse handle "@greetbot@mydomain":
username: "greetbot",
// Set the display name:
name: "Greet Bot",
// Set the profile icon (avatar):
icon: new URL("https://mydomain/icon.png"),
// Set the bio:
summary: text`Hi, there! I'm a simple fediverse bot created by ${
mention("@hongminhee@hollo.social")}.`,
// Store data in memory (for development):
kv: new MemoryKvStore(),
// Use in-process message queue (for development):
queue: new InProcessMessageQueue(),
});
// A bot can respond to a mention:
bot.onMention = async (session, message) => {
await message.reply(text`Hi, ${message.actor}!`);
};
// Or, a bot also can actively publish a post:
const session = bot.getSession("https://mydomain/");
setInterval(async () => {
await session.publish(text`Hi, forks! It's an hourly greeting.`);
}, 1000 * 60 * 60);
export default bot;
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust #Fedify foundation.
ALT text detailsimport {
createBot,
InProcessMessageQueue,
MemoryKvStore,
mention,
text,
} from "@fedify/botkit";
// Create a bot instance:
const bot = createBot<void>({
// The bot will have fediverse handle "@greetbot@mydomain":
username: "greetbot",
// Set the display name:
name: "Greet Bot",
// Set the profile icon (avatar):
icon: new URL("https://mydomain/icon.png"),
// Set the bio:
summary: text`Hi, there! I'm a simple fediverse bot created by ${
mention("@hongminhee@hollo.social")}.`,
// Store data in memory (for development):
kv: new MemoryKvStore(),
// Use in-process message queue (for development):
queue: new InProcessMessageQueue(),
});
// A bot can respond to a mention:
bot.onMention = async (session, message) => {
await message.reply(text`Hi, ${message.actor}!`);
};
// Or, a bot also can actively publish a post:
const session = bot.getSession("https://mydomain/");
setInterval(async () => {
await session.publish(text`Hi, forks! It's an hourly greeting.`);
}, 1000 * 60 * 60);
export default bot;
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust #Fedify foundation.
ALT text detailsimport {
createBot,
InProcessMessageQueue,
MemoryKvStore,
mention,
text,
} from "@fedify/botkit";
// Create a bot instance:
const bot = createBot<void>({
// The bot will have fediverse handle "@greetbot@mydomain":
username: "greetbot",
// Set the display name:
name: "Greet Bot",
// Set the profile icon (avatar):
icon: new URL("https://mydomain/icon.png"),
// Set the bio:
summary: text`Hi, there! I'm a simple fediverse bot created by ${
mention("@hongminhee@hollo.social")}.`,
// Store data in memory (for development):
kv: new MemoryKvStore(),
// Use in-process message queue (for development):
queue: new InProcessMessageQueue(),
});
// A bot can respond to a mention:
bot.onMention = async (session, message) => {
await message.reply(text`Hi, ${message.actor}!`);
};
// Or, a bot also can actively publish a post:
const session = bot.getSession("https://mydomain/");
setInterval(async () => {
await session.publish(text`Hi, forks! It's an hourly greeting.`);
}, 1000 * 60 * 60);
export default bot;
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust #Fedify foundation.
ALT text detailsimport {
createBot,
InProcessMessageQueue,
MemoryKvStore,
mention,
text,
} from "@fedify/botkit";
// Create a bot instance:
const bot = createBot<void>({
// The bot will have fediverse handle "@greetbot@mydomain":
username: "greetbot",
// Set the display name:
name: "Greet Bot",
// Set the profile icon (avatar):
icon: new URL("https://mydomain/icon.png"),
// Set the bio:
summary: text`Hi, there! I'm a simple fediverse bot created by ${
mention("@hongminhee@hollo.social")}.`,
// Store data in memory (for development):
kv: new MemoryKvStore(),
// Use in-process message queue (for development):
queue: new InProcessMessageQueue(),
});
// A bot can respond to a mention:
bot.onMention = async (session, message) => {
await message.reply(text`Hi, ${message.actor}!`);
};
// Or, a bot also can actively publish a post:
const session = bot.getSession("https://mydomain/");
setInterval(async () => {
await session.publish(text`Hi, forks! It's an hourly greeting.`);
}, 1000 * 60 * 60);
export default bot;
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust #Fedify foundation.
ALT text detailsimport {
createBot,
InProcessMessageQueue,
MemoryKvStore,
mention,
text,
} from "@fedify/botkit";
// Create a bot instance:
const bot = createBot<void>({
// The bot will have fediverse handle "@greetbot@mydomain":
username: "greetbot",
// Set the display name:
name: "Greet Bot",
// Set the profile icon (avatar):
icon: new URL("https://mydomain/icon.png"),
// Set the bio:
summary: text`Hi, there! I'm a simple fediverse bot created by ${
mention("@hongminhee@hollo.social")}.`,
// Store data in memory (for development):
kv: new MemoryKvStore(),
// Use in-process message queue (for development):
queue: new InProcessMessageQueue(),
});
// A bot can respond to a mention:
bot.onMention = async (session, message) => {
await message.reply(text`Hi, ${message.actor}!`);
};
// Or, a bot also can actively publish a post:
const session = bot.getSession("https://mydomain/");
setInterval(async () => {
await session.publish(text`Hi, forks! It's an hourly greeting.`);
}, 1000 * 60 * 60);
export default bot;
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust #Fedify foundation.
ALT text detailsimport {
createBot,
InProcessMessageQueue,
MemoryKvStore,
mention,
text,
} from "@fedify/botkit";
// Create a bot instance:
const bot = createBot<void>({
// The bot will have fediverse handle "@greetbot@mydomain":
username: "greetbot",
// Set the display name:
name: "Greet Bot",
// Set the profile icon (avatar):
icon: new URL("https://mydomain/icon.png"),
// Set the bio:
summary: text`Hi, there! I'm a simple fediverse bot created by ${
mention("@hongminhee@hollo.social")}.`,
// Store data in memory (for development):
kv: new MemoryKvStore(),
// Use in-process message queue (for development):
queue: new InProcessMessageQueue(),
});
// A bot can respond to a mention:
bot.onMention = async (session, message) => {
await message.reply(text`Hi, ${message.actor}!`);
};
// Or, a bot also can actively publish a post:
const session = bot.getSession("https://mydomain/");
setInterval(async () => {
await session.publish(text`Hi, forks! It's an hourly greeting.`);
}, 1000 * 60 * 60);
export default bot;
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust #Fedify foundation.
ALT text detailsimport {
createBot,
InProcessMessageQueue,
MemoryKvStore,
mention,
text,
} from "@fedify/botkit";
// Create a bot instance:
const bot = createBot<void>({
// The bot will have fediverse handle "@greetbot@mydomain":
username: "greetbot",
// Set the display name:
name: "Greet Bot",
// Set the profile icon (avatar):
icon: new URL("https://mydomain/icon.png"),
// Set the bio:
summary: text`Hi, there! I'm a simple fediverse bot created by ${
mention("@hongminhee@hollo.social")}.`,
// Store data in memory (for development):
kv: new MemoryKvStore(),
// Use in-process message queue (for development):
queue: new InProcessMessageQueue(),
});
// A bot can respond to a mention:
bot.onMention = async (session, message) => {
await message.reply(text`Hi, ${message.actor}!`);
};
// Or, a bot also can actively publish a post:
const session = bot.getSession("https://mydomain/");
setInterval(async () => {
await session.publish(text`Hi, forks! It's an hourly greeting.`);
}, 1000 * 60 * 60);
export default bot;
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust #Fedify foundation.
ALT text detailsimport {
createBot,
InProcessMessageQueue,
MemoryKvStore,
mention,
text,
} from "@fedify/botkit";
// Create a bot instance:
const bot = createBot<void>({
// The bot will have fediverse handle "@greetbot@mydomain":
username: "greetbot",
// Set the display name:
name: "Greet Bot",
// Set the profile icon (avatar):
icon: new URL("https://mydomain/icon.png"),
// Set the bio:
summary: text`Hi, there! I'm a simple fediverse bot created by ${
mention("@hongminhee@hollo.social")}.`,
// Store data in memory (for development):
kv: new MemoryKvStore(),
// Use in-process message queue (for development):
queue: new InProcessMessageQueue(),
});
// A bot can respond to a mention:
bot.onMention = async (session, message) => {
await message.reply(text`Hi, ${message.actor}!`);
};
// Or, a bot also can actively publish a post:
const session = bot.getSession("https://mydomain/");
setInterval(async () => {
await session.publish(text`Hi, forks! It's an hourly greeting.`);
}, 1000 * 60 * 60);
export default bot;
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust #Fedify foundation.
ALT text detailsimport {
createBot,
InProcessMessageQueue,
MemoryKvStore,
mention,
text,
} from "@fedify/botkit";
// Create a bot instance:
const bot = createBot<void>({
// The bot will have fediverse handle "@greetbot@mydomain":
username: "greetbot",
// Set the display name:
name: "Greet Bot",
// Set the profile icon (avatar):
icon: new URL("https://mydomain/icon.png"),
// Set the bio:
summary: text`Hi, there! I'm a simple fediverse bot created by ${
mention("@hongminhee@hollo.social")}.`,
// Store data in memory (for development):
kv: new MemoryKvStore(),
// Use in-process message queue (for development):
queue: new InProcessMessageQueue(),
});
// A bot can respond to a mention:
bot.onMention = async (session, message) => {
await message.reply(text`Hi, ${message.actor}!`);
};
// Or, a bot also can actively publish a post:
const session = bot.getSession("https://mydomain/");
setInterval(async () => {
await session.publish(text`Hi, forks! It's an hourly greeting.`);
}, 1000 * 60 * 60);
export default bot;
Unlike traditional Mastodon bots, BotKit lets you build fully independent #fediverse bots that aren't constrained by platform limits. Create your entire bot in a single TypeScript file using our simple, expressive API.
Currently #Deno-only, with Node.js & Bun support planned. Built on the robust #Fedify foundation.
ALT text detailsimport {
createBot,
InProcessMessageQueue,
MemoryKvStore,
mention,
text,
} from "@fedify/botkit";
// Create a bot instance:
const bot = createBot<void>({
// The bot will have fediverse handle "@greetbot@mydomain":
username: "greetbot",
// Set the display name:
name: "Greet Bot",
// Set the profile icon (avatar):
icon: new URL("https://mydomain/icon.png"),
// Set the bio:
summary: text`Hi, there! I'm a simple fediverse bot created by ${
mention("@hongminhee@hollo.social")}.`,
// Store data in memory (for development):
kv: new MemoryKvStore(),
// Use in-process message queue (for development):
queue: new InProcessMessageQueue(),
});
// A bot can respond to a mention:
bot.onMention = async (session, message) => {
await message.reply(text`Hi, ${message.actor}!`);
};
// Or, a bot also can actively publish a post:
const session = bot.getSession("https://mydomain/");
setInterval(async () => {
await session.publish(text`Hi, forks! It's an hourly greeting.`);
}, 1000 * 60 * 60);
export default bot;
Even though it's built on #Fedify, its API looks completely different from Fedify's one. I intended to make it resembles more Discord/Telegram bot frameworks than Fedify. I think it's close to my intention.
Even though it's built on #Fedify, its API looks completely different from Fedify's one. I intended to make it resembles more Discord/Telegram bot frameworks than Fedify. I think it's close to my intention.
Even though it's built on #Fedify, its API looks completely different from Fedify's one. I intended to make it resembles more Discord/Telegram bot frameworks than Fedify. I think it's close to my intention.
Even though it's built on #Fedify, its API looks completely different from Fedify's one. I intended to make it resembles more Discord/Telegram bot frameworks than Fedify. I think it's close to my intention.
Even though it's built on #Fedify, its API looks completely different from Fedify's one. I intended to make it resembles more Discord/Telegram bot frameworks than Fedify. I think it's close to my intention.
Even though it's built on #Fedify, its API looks completely different from Fedify's one. I intended to make it resembles more Discord/Telegram bot frameworks than Fedify. I think it's close to my intention.
Even though it's built on #Fedify, its API looks completely different from Fedify's one. I intended to make it resembles more Discord/Telegram bot frameworks than Fedify. I think it's close to my intention.
Even though it's built on #Fedify, its API looks completely different from Fedify's one. I intended to make it resembles more Discord/Telegram bot frameworks than Fedify. I think it's close to my intention.
Even though it's built on #Fedify, its API looks completely different from Fedify's one. I intended to make it resembles more Discord/Telegram bot frameworks than Fedify. I think it's close to my intention.
Even though it's built on #Fedify, its API looks completely different from Fedify's one. I intended to make it resembles more Discord/Telegram bot frameworks than Fedify. I think it's close to my intention.
Even though it's built on #Fedify, its API looks completely different from Fedify's one. I intended to make it resembles more Discord/Telegram bot frameworks than Fedify. I think it's close to my intention.
Even though it's built on #Fedify, its API looks completely different from Fedify's one. I intended to make it resembles more Discord/Telegram bot frameworks than Fedify. I think it's close to my intention.
Even though it's built on #Fedify, its API looks completely different from Fedify's one. I intended to make it resembles more Discord/Telegram bot frameworks than Fedify. I think it's close to my intention.
Even though it's built on #Fedify, its API looks completely different from Fedify's one. I intended to make it resembles more Discord/Telegram bot frameworks than Fedify. I think it's close to my intention.
@wraptile I tried bottle, Flask is a POS. The sample code & libs do not work. I now avoid it and use #Deno instead.
When #AppEngine cost more than $10 and required more API changes (data api) I wrote my own static #HTML engine based on #Jeckyl (#Python) and when the compile times blew out re-wrote it in #Rust.
Static HTML is the fastest & pretty much hack proof. cc @bluetea
ALT text detailsFerrari Festival, Lygon St Melbourne
Last weekend took out the time to see the 2007 Grand Prix Ferrari Festival celebrating the 60th year of Ferrari in Lygon St in Melbourne.
Taken at the corner of Lygon & Argyle Place, Lygon St, near Case Del Gelato. In typical Melbourne style, the weather started warm, got a bit sunny then overcast and rained.
source https://www.flickr.com/photos/bootload/416173287/
Is anybody interested in joining me in a strictly for fun extracurricular project creating an "open source Technorati"? Currently building it in #Deno / #FreshJS / #MongoDB
I’ve been building a new project with #Deno v2 and part of me is really enjoying it. The other part is getting annoyed, mainly because the syntax is really close to #nodeJS but not quite
I'm troubleshooting a mysterious TypeError: fetch failed exception when using #Node.js's built-in fetch() function. When I make the same request in #Deno or #Bun, it responds fine. Anyone know why this only happens in Node.js?
ALT text detailsDeno 2.1.4
exit using ctrl+d, ctrl+c, or close()
REPL is running with all permissions allowed.
To specify permissions, run `deno repl` with allow flags.
> await fetch("https://social.zarchbox.fr/notes/a2dn3k8kt5hm3gci");
Response {
body: ReadableStream { locked: false },
bodyUsed: false,
headers: Headers {
"alt-svc": 'h3=":443"; ma=2592000',
"cache-control": "public, max-age=15",
"content-length": "10828",
"content-security-policy": "default-src 'self' 'unsafe-inline'; img-src *; media-src *; frame-ancestors *",
"content-type": "text/html; charset=utf-8",
date: "Mon, 30 Dec 2024 15:59:09 GMT",
server: "Caddy",
"strict-transport-security": "max-age=15552000; preload",
vary: "Origin, Accept",
"x-frame-options": "DENY"
},
ok: true,
redirected: false,
status: 200,
statusText: "OK",
url: "https://social.zarchbox.fr/notes/a2dn3k8kt5hm3gci"
}
>
ALT text detailsWelcome to Bun v1.1.42
Type ".help" for more information.
[!] Please note that the REPL implementation is still experimental!
Don't consider it to be representative of the stability or behavior of Bun overall.
> await fetch("https://social.zarchbox.fr/notes/a2dn3k8kt5hm3gci");
Response {}
>
ALT text detailsWelcome to Node.js v23.5.0.
Type ".help" for more information.
> await fetch("https://social.zarchbox.fr/notes/a2dn3k8kt5hm3gci");
Uncaught TypeError: fetch failed
at node:internal/deps/undici/undici:13484:13
at process.processTicksAndRejections (node:internal/process/task_queues:105:5)
at async REPL1:1:33 {
[cause]: AggregateError [ETIMEDOUT]:
at internalConnectMultiple (node:net:1139:18)
at internalConnectMultiple (node:net:1215:5)
at Timeout.internalConnectMultipleTimeout (node:net:1739:5)
at listOnTimeout (node:internal/timers:616:11)
at process.processTimers (node:internal/timers:549:7) {
code: 'ETIMEDOUT',
[errors]: [ [Error], [Error] ]
}
}
>
I’ve been building a new project with #Deno v2 and part of me is really enjoying it. The other part is getting annoyed, mainly because the syntax is really close to #nodeJS but not quite
Just got to know that bundling static assets (like in golang) is now possible using `deno compile` command, A much anticipated feature which was landed in #Deno v2.1
I like that @deno_land tries to be an all-in solution. I like that about go as well. Good tooling, rich standard library. What is difficult, though, is that the js ecosystem is so fragmented. For instance, I’m trying to use drizzle ORM with SQLite. That’s far from straightforward. They don’t include examples for Deno. Translating commands to how Deno likes them is a hassle and I run into issues with migrations #development#javascript#deno
Update on #FreeJavaScript: Oracle has filed a notice of appearance, signaling engagement in the JavaScript trademark case. Aside from this, we’ve had no communication. Their response is due by January 4th.
Has anyone tried integrating #Sentry with #Deno Deploy? Locally, error reports and traces are sent to Sentry just fine, but after deploying to Deno Deploy, nothing is sent to Sentry. Has anyone experienced this?
Deno has the best foundation for the future. It's built on web standards like promises, fetch() or ES modules. This, combined with the fact that it's ecosystem is now more mature than ever and dependency management is actually fun, makes Deno the best choice for mission-critical applications.
We’ve submitted a formal petition to cancel the JavaScript trademark: it is generic, Oracle has abandoned it, and Oracle committed fraud on the USPTO during the last trademark renewal.
Oracle has until January 4th to respond, or the case will go into default, which will result in the trademark being canceled.
According to the docs in the Sentry SDK, OpenTelemetry integration is out of the box and doesn't require any configuration, but Spans instrumented using the OpenTelemetry API are ignored. Spans made with the Sentry API are working fine.
This extension is a fork of the official deno extension. Adds support for Deno LSP on notebooks. It also defines a new notebook type (*.nb.ts). This way you can use "import" between notebooks. Lastly, it also adds a notebook controller for vscode, so you can use deno's jupyter kernel in vscode without Python.
Developing an node.js compatible npm package in deno seems to be possible with the dnt tool. I have not tried it yet but, if it works, it is brilliant (it is so much smoother to develop with deno than with node+npm)
Hi everyone, I am now looking for full-time work! If you have a remote Software Engineer position available and work with #Frontend web tech (#HTML / #CSS / #JS / #TS / #React, etc), #NodeJS (or #Bun / #Deno ), #Kubernetes, or #Nix / #NixOS then please reach out! I love building tools to solve problems and delight users.
For examples of my previous work, links to my projects, and my resume, please see my website: https://jakehamilton.dev
Thought it might be fun to make a small jsr package that actually has a bit of real-world utility. So here's `isit` as in `isit("Friday") ? "Hooray!" : "Boo!"` which I'll use in our morning work standup bot to send a different Teams meeting link depending on what day it is. Maybe it'll be useful to someone else too. It supports custom Dates and timezone offsets too. Enjoy! https://jsr.io/@phocks/isit
Finally, #IntelliJ supports import_map.json. This support is implemented over the Deno LSP. By default, the IDE uses the import_map.json file from the project root. If you want to specify another file, you can do so in Preferences / Settings | Languages & Frameworks | Deno. Please note that changes in import_map currently require you to restart the Deno LSP service.
What is import_map.json? Is it how the deno.json"imports" key was handled in past versions of #Deno?
#IntelliJ seems to have issues handling the imports for the #Deno file deno.json, and, while it resolves the dependencies correctly, it doesn’t provide any syntax highlighting for objects imported through the import aliases…
This doesn’t work…
import {RedisKvStore} from "@fedify/redis"
This does:
import {RedisKvStore} from "https://jsr.io/@fedify/redis/0.3.0/src/kv.ts"
Any ideas that could help fix or mitigate the problem?
Just for fun I decided to try publishing a package on this new JSR "open-source package registry". Quick, simple, and fun. Love it! https://jsr.io/@phocks
"By default, #Deno programs don’t have access to the filesystem, the network, etc. — you need to explicitly opt into those via permission flags. Deno’s permission flags extend to its dependencies. You no longer need to conduct audits on your dependencies — simply run your program and see what access your app and its dependencies require."
If you're interested in adding scripting capabilities to your #RustLang applications and missed my talk at @eurorust, you can find my slides and my well-commented @deno_land 🦕 demo code online. The recording will (afaik) be published next month.
ALT text detailsNiklas standing on the stage, presenting his talk "Runtime Scripting for Rust Applications". The slide shown next to him mentions reasons for integrating scripting languages into Rust applications: Fast prototyping (aided by hot reloading), extending applications without needing to alter their source code (through plugins), and to collaborate with people that find Rust too complicated.
If you've been avoiding #JavaScript & #TypeScript due to the complexity of the #Node.js ecosystem, give #Deno a try. Everything is simplified and you can start coding right away without having to set up a development environment.
With zero-overhead bindings to V8 APIs, memory safety through Rust’s ownership model, and great docs, it’s battle-hardened and production-ready. From here on, Rusty V8 will follow Chrome versions for predictable upgrades.
‣ Add `process` global variable, remove `window` ‣ Improve dep management ‣ Permission system updates ‣ Many stabilizations ‣ Better CommonJS support ‣ Test documentation with `deno test --doc`
#Fedify started out exclusively for #Deno, but now also supports #Node.js and #Bun. However, the #logo we created in the early days still features the character from Deno. Should Fedify change its logo now?
@hongminhee I did try #deno some time ago, but feel like i made the mistake of skipping essential steps as I was impatient, expected it to be more similar #nodejs than it seemed and already had other new things in that project to learn so i dropped deno.
When you learned it did you only use the official docs or did you had other good material? Did you had bigger gotchas which would have been helpful to know beforehand?
But maybe i should just start small again making an hello world and the rest follows. 🤔
#Fedify is built in #Deno for ease of development, but it also supports #Node.js and #Bun using #dnt. Deno's DX is so good that I don't regret this decision, and I'm looking forward to Deno 2.0 as well.
I'm a #softwaredev focusing on #javascript & #typescript specifically #deno. Right now, I'm working on a blog called Craig's Deno Diary. I also contribute to a few Deno projects and am taking a break from working in the corporate world.
I have over 20 years of experience in web development, first using Java and recently JavaScript/TypeScript. Before that I was a #journalist for 10 years.
I live in #Maine USA & try to enjoy the beautiful environment here as often as possible.
I've published an article titled "What every developer needs to know about the Deno third party module registry" on my blog Craig's Deno Diary.
The article highlights an API that pulls data from the registry as content for the Deno Third Party Modules page (deno.land/x). Of particular interest is the explanation how the API is used to rank modules based on a 'popularity score'. I also created an app that demonstrates a way to use the API. #deno@deno_land
The latest post to my blog Craig's Deno Diary has been published: "A Comprehensive Guide to Deno KV"
Consider this article as a one-stop location for Deno KV info. The post includes sections on pagination, tracking record version history and sorting KV records.
Associated with the article is a repo containing 12 code examples demonstrating all the concepts and tech used in the blog post. #deno#denokv
I've published a new post to Craig's Deno Diary on fresh-testing-library. This library fills a large void in #Deno Fresh #testing by allowing unit testing of Fresh components, middleware and route handling. It is a library that every #denofresh dev should use.
The requirements are: - needs to work offline in #docker - user scripts can load additional dependencies, that also need to work offline the next launch - user can access script dir and write scripts with vscode. Version of reactive-home needs to match the current docker image version - should be available on #jsr
I have an idea of how I can achieve this, but it is annoying to refactor and test because, at the end of the day, it needs to work again since it powers my #SmartHome haha #deno
I really want to refactor parts of my reactive home project. But before I do that, I need to refactor the release flow and the packaging. I tried this once a few months ago, but failed miserably and reverted all commits. It is a #deno project which loads user defined scripts. And everything needs to run inside #docker. Currently, I just use http imports for that, but the image should work offline. This should be easy, right?
Version 0.5.0 of #LogTape, the zero-dependency #logging library for #Deno, #Node.js, #Bun, edge functions, and browsers, has been released! The main additions include:
• Contexts • ANSI color formatter • Comprehensive docs • A few API conveniences
It’s been years since I’ve used NodeJS and was curious about the current situation. Is Deno a thing? I see they backtracked a bit and now have an NPM compatibility layer (although I don’t mind that). And I think I like the direction with JSR.io. Is Bun alright? I’ve seen some comments saying that it was not ready for v1 yet. Is this going to be like an io.js situation and we will all go back to Node eventually?
Hosting on Deno Deploy just got more performant with beta Web Cache API support: 🚀 sub-millisecond read latency 🚅 multi Gbps write throughput 💾 unbounded storage
Deno 1.46 is not only the last 1.x release, but also one of the biggest: - Simpler CLI - Multi-threaded web servers - HTML, CSS, YAML support in `deno fmt` - Better Node/npm compat (support for playwright, google-cloud, etc.) and much more 👇️
I just published a post to my Craig's Deno Diary blog on the Ultra v2 framework which allows full-stack React apps to run in a Deno environment.
Ultra supports many React libraries and features including Tailwind, React Router and React Query. Version 2 works with React 18 which includes suspense for async rendering.
The blog post focuses on creating, developing and deploying a full-stack Ultra app.
The latest post to my blog Craig's Deno Diary has been published: "A Comprehensive Guide to Deno KV"
Consider this article as a one-stop location for Deno KV info. The post includes sections on pagination, tracking record version history and sorting KV records.
Associated with the article is a repo containing 12 code examples demonstrating all the concepts and tech used in the blog post. #deno#denokv
#LogTape is a logging library for #JavaScript and #TypeScript. It provides a simple and flexible logging system that is easy to use and easy to extend. The highlights of LogTape are:
• Zero dependencies • Designed to be used in libraries as well as apps • Supports virtually every runtime: #Node.js, #Deno, #Bun, edge functions, and browsers • Structured logging • Logger categories (names) are hierarchical • Dead simple sink (destination) interface
I'm unsure whether to adopt an emerging JavaScript runtime like #Bun or #Deno for #Fedify's tutorial, or stick with traditional #Node.js. 🤔
If I choose Bun/Deno, it comes with built-in #TypeScript support, hot reloading, and a fetch-style HTTP server, so I don't have to explain much about it, but I need to deal with installing Bun/Deno itself.
On the other hand, Node.js can be assumed to be already installed on the reader's system, but they will need to set up TypeScript, hot reloading, etc.
#Deno and #Bun people are putting an incredible amount of work modernizing server side js.
The energy is reminding me of early day #Python - so many new tools made with proper care behind rather than most of NodeJS ecosystem which is just glued together with band-aids and staples :blobcatgrimacing:
That being said, after working with Deno for the past week it still feels a bit too bleeding edge though it does work with #jupyter!
#LogTape is a logging library for #JavaScript and #TypeScript. It provides a simple and flexible logging system that is easy to use and easy to extend. The highlights of LogTape are:
• Zero dependencies • Designed to be used in libraries as well as apps • Supports virtually every runtime: #Node.js, #Deno, #Bun, edge functions, and browsers • Structured logging • Logger categories (names) are hierarchical • Dead simple sink (destination) interface
@hongminhee : we do also start to build anything #ActivityPub with #deno (incl. journalistic CMS client, public broadcaster thing, taxiteam client) and so, I work on a UI system with #fresh for all the `type`s …
#Fedify is an #ActivityPub server framework in #TypeScript & #JavaScript. It aims to eliminate the complexity and redundant boilerplate code when building a federated server app, so that you can focus on your business logic and user experience.
The key features it provides currently are:
• Type-safe objects for Activity Vocabulary (including some vendor-specific extensions) • #WebFinger client and server • HTTP Signatures • Middleware for handling webhooks • #NodeInfo protocol • #Node.js, #Deno, and #Bun support • CLI toolchain for testing and debugging
If you're curious, take a look at the Fedify website! There's comprehensive docs, a demo, a tutorial, example code, and more:
Fedify is an #ActivityPub server framework in #TypeScript & #JavaScript. It aims to eliminate the complexity and redundant boilerplate code when building a federated server app, so that you can focus on your business logic and user experience.
The key features it provides currently are:
Type-safe objects for Activity Vocabulary (including some vendor-specific extensions)
When it comes to learning #TypeScript, one of my favorite tools is Deno's #Jupyter kernel (https://lnkd.in/g2GPc_gM). It makes writing quick examples easy and accessible. I'll need to eventually write up how this all works, but the combination of #Deno, Jupyter, #Tailscale, and Juno Connect (an iOS/iPadOS Jupyter client) have given me the ability to play around on the go.