Keras callbacks are hooks you pass to fit/evaluate/predict to observe and control training. You get global, batch, and epoch methods, a logs dict with metrics, and full access to self.model (e.g., stop training, tweak optimizer LR, save checkpoints). The guide shows a full custom callback, early stopping at min loss, and a bespoke learning-rate scheduler—plus pointers to built-ins like TensorBoard and ModelCheckpoint.Keras callbacks are hooks you pass to fit/evaluate/predict to observe and control training. You get global, batch, and epoch methods, a logs dict with metrics, and full access to self.model (e.g., stop training, tweak optimizer LR, save checkpoints). The guide shows a full custom callback, early stopping at min loss, and a bespoke learning-rate scheduler—plus pointers to built-ins like TensorBoard and ModelCheckpoint.

TensorBoard, Checkpoints, and Custom Hooks in Keras

17 min read

Content Overview

  • Introduction

  • Setup

  • Keras callbacks overview

  • An overview of callback methods

  • Global methods

  • Batch-level methods for training/testing/predicting

  • Epoch-level methods (training only)

  • A basic example

  • Usage of logs dict

  • Usage of self.model attribute

  • Examples of Keras callback applications

  • Early stopping at minimum loss

  • Learning rate scheduling

  • Built-in Keras callbacks

    \

\

Introduction

A callback is a powerful tool to customize the behavior of a Keras model during training, evaluation, or inference. Examples include tf.keras.callbacks.TensorBoard to visualize training progress and results with TensorBoard, or tf.keras.callbacks.ModelCheckpoint to periodically save your model during training.

In this guide, you will learn what a Keras callback is, what it can do, and how you can build your own. We provide a few demos of simple callback applications to get you started.

Setup

import tensorflow as tf from tensorflow import keras 

Keras callbacks overview

All callbacks subclass the keras.callbacks.Callback class, and override a set of methods called at various stages of training, testing, and predicting. Callbacks are useful to get a view on internal states and statistics of the model during training.

You can pass a list of callbacks (as the keyword argument callbacks) to the following model methods:

  • keras.Model.fit()
  • keras.Model.evaluate()
  • keras.Model.predict()

An overview of callback methods

Global methods

on_(train|test|predict)_begin(self, logs=None)

Called at the beginning of fit/evaluate/predict.

on_(train|test|predict)_end(self, logs=None)

Called at the end of fit/evaluate/predict.

Batch-level methods for training/testing/predicting

on_(train|test|predict)_batch_begin(self, batch, logs=None)

Called right before processing a batch during training/testing/predicting.

on_(train|test|predict)_batch_end(self, batch, logs=None)

Called at the end of training/testing/predicting a batch. Within this method, logs is a dict containing the metrics results.

Epoch-level methods (training only)

on_epoch_begin(self, epoch, logs=None)

Called at the beginning of an epoch during training.

on_epoch_end(self, epoch, logs=None)

Called at the end of an epoch during training.

A basic example

Let's take a look at a concrete example. To get started, let's import tensorflow and define a simple Sequential Keras model:

\

# Define the Keras model to add callbacks to def get_model():     model = keras.Sequential()     model.add(keras.layers.Dense(1, input_dim=784))     model.compile(         optimizer=keras.optimizers.RMSprop(learning_rate=0.1),         loss="mean_squared_error",         metrics=["mean_absolute_error"],     )     return model 

Then, load the MNIST data for training and testing from Keras datasets API:

\

# Load example MNIST data and pre-process it (x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data() x_train = x_train.reshape(-1, 784).astype("float32") / 255.0 x_test = x_test.reshape(-1, 784).astype("float32") / 255.0  # Limit the data to 1000 samples x_train = x_train[:1000] y_train = y_train[:1000] x_test = x_test[:1000] y_test = y_test[:1000] 

Now, define a simple custom callback that logs:

  • When fit/evaluate/predict starts & ends
  • When each epoch starts & ends
  • When each training batch starts & ends
  • When each evaluation (test) batch starts & ends
  • When each inference (prediction) batch starts & ends

\

class CustomCallback(keras.callbacks.Callback):     def on_train_begin(self, logs=None):         keys = list(logs.keys())         print("Starting training; got log keys: {}".format(keys))      def on_train_end(self, logs=None):         keys = list(logs.keys())         print("Stop training; got log keys: {}".format(keys))      def on_epoch_begin(self, epoch, logs=None):         keys = list(logs.keys())         print("Start epoch {} of training; got log keys: {}".format(epoch, keys))      def on_epoch_end(self, epoch, logs=None):         keys = list(logs.keys())         print("End epoch {} of training; got log keys: {}".format(epoch, keys))      def on_test_begin(self, logs=None):         keys = list(logs.keys())         print("Start testing; got log keys: {}".format(keys))      def on_test_end(self, logs=None):         keys = list(logs.keys())         print("Stop testing; got log keys: {}".format(keys))      def on_predict_begin(self, logs=None):         keys = list(logs.keys())         print("Start predicting; got log keys: {}".format(keys))      def on_predict_end(self, logs=None):         keys = list(logs.keys())         print("Stop predicting; got log keys: {}".format(keys))      def on_train_batch_begin(self, batch, logs=None):         keys = list(logs.keys())         print("...Training: start of batch {}; got log keys: {}".format(batch, keys))      def on_train_batch_end(self, batch, logs=None):         keys = list(logs.keys())         print("...Training: end of batch {}; got log keys: {}".format(batch, keys))      def on_test_batch_begin(self, batch, logs=None):         keys = list(logs.keys())         print("...Evaluating: start of batch {}; got log keys: {}".format(batch, keys))      def on_test_batch_end(self, batch, logs=None):         keys = list(logs.keys())         print("...Evaluating: end of batch {}; got log keys: {}".format(batch, keys))      def on_predict_batch_begin(self, batch, logs=None):         keys = list(logs.keys())         print("...Predicting: start of batch {}; got log keys: {}".format(batch, keys))      def on_predict_batch_end(self, batch, logs=None):         keys = list(logs.keys())         print("...Predicting: end of batch {}; got log keys: {}".format(batch, keys)) 

Let's try it out:

\

model = get_model() model.fit(     x_train,     y_train,     batch_size=128,     epochs=1,     verbose=0,     validation_split=0.5,     callbacks=[CustomCallback()], )  res = model.evaluate(     x_test, y_test, batch_size=128, verbose=0, callbacks=[CustomCallback()] )  res = model.predict(x_test, batch_size=128, callbacks=[CustomCallback()]) 

\

Starting training; got log keys: [] Start epoch 0 of training; got log keys: [] ...Training: start of batch 0; got log keys: [] ...Training: end of batch 0; got log keys: ['loss', 'mean_absolute_error'] ...Training: start of batch 1; got log keys: [] ...Training: end of batch 1; got log keys: ['loss', 'mean_absolute_error'] ...Training: start of batch 2; got log keys: [] ...Training: end of batch 2; got log keys: ['loss', 'mean_absolute_error'] ...Training: start of batch 3; got log keys: [] ...Training: end of batch 3; got log keys: ['loss', 'mean_absolute_error'] Start testing; got log keys: [] ...Evaluating: start of batch 0; got log keys: [] ...Evaluating: end of batch 0; got log keys: ['loss', 'mean_absolute_error'] ...Evaluating: start of batch 1; got log keys: [] ...Evaluating: end of batch 1; got log keys: ['loss', 'mean_absolute_error'] ...Evaluating: start of batch 2; got log keys: [] ...Evaluating: end of batch 2; got log keys: ['loss', 'mean_absolute_error'] ...Evaluating: start of batch 3; got log keys: [] ...Evaluating: end of batch 3; got log keys: ['loss', 'mean_absolute_error'] Stop testing; got log keys: ['loss', 'mean_absolute_error'] End epoch 0 of training; got log keys: ['loss', 'mean_absolute_error', 'val_loss', 'val_mean_absolute_error'] Stop training; got log keys: ['loss', 'mean_absolute_error', 'val_loss', 'val_mean_absolute_error'] Start testing; got log keys: [] ...Evaluating: start of batch 0; got log keys: [] ...Evaluating: end of batch 0; got log keys: ['loss', 'mean_absolute_error'] ...Evaluating: start of batch 1; got log keys: [] ...Evaluating: end of batch 1; got log keys: ['loss', 'mean_absolute_error'] ...Evaluating: start of batch 2; got log keys: [] ...Evaluating: end of batch 2; got log keys: ['loss', 'mean_absolute_error'] ...Evaluating: start of batch 3; got log keys: [] ...Evaluating: end of batch 3; got log keys: ['loss', 'mean_absolute_error'] ...Evaluating: start of batch 4; got log keys: [] ...Evaluating: end of batch 4; got log keys: ['loss', 'mean_absolute_error'] ...Evaluating: start of batch 5; got log keys: [] ...Evaluating: end of batch 5; got log keys: ['loss', 'mean_absolute_error'] ...Evaluating: start of batch 6; got log keys: [] ...Evaluating: end of batch 6; got log keys: ['loss', 'mean_absolute_error'] ...Evaluating: start of batch 7; got log keys: [] ...Evaluating: end of batch 7; got log keys: ['loss', 'mean_absolute_error'] Stop testing; got log keys: ['loss', 'mean_absolute_error'] Start predicting; got log keys: [] ...Predicting: start of batch 0; got log keys: [] ...Predicting: end of batch 0; got log keys: ['outputs'] 1/8 [==>...........................] - ETA: 0s...Predicting: start of batch 1; got log keys: [] ...Predicting: end of batch 1; got log keys: ['outputs'] ...Predicting: start of batch 2; got log keys: [] ...Predicting: end of batch 2; got log keys: ['outputs'] ...Predicting: start of batch 3; got log keys: [] ...Predicting: end of batch 3; got log keys: ['outputs'] ...Predicting: start of batch 4; got log keys: [] ...Predicting: end of batch 4; got log keys: ['outputs'] ...Predicting: start of batch 5; got log keys: [] ...Predicting: end of batch 5; got log keys: ['outputs'] ...Predicting: start of batch 6; got log keys: [] ...Predicting: end of batch 6; got log keys: ['outputs'] ...Predicting: start of batch 7; got log keys: [] ...Predicting: end of batch 7; got log keys: ['outputs'] Stop predicting; got log keys: [] 8/8 [==============================] - 0s 2ms/step 

Usage of logs dict

The logs dict contains the loss value, and all the metrics at the end of a batch or epoch. Example includes the loss and mean absolute error.

\

class LossAndErrorPrintingCallback(keras.callbacks.Callback):     def on_train_batch_end(self, batch, logs=None):         print(             "Up to batch {}, the average loss is {:7.2f}.".format(batch, logs["loss"])         )      def on_test_batch_end(self, batch, logs=None):         print(             "Up to batch {}, the average loss is {:7.2f}.".format(batch, logs["loss"])         )      def on_epoch_end(self, epoch, logs=None):         print(             "The average loss for epoch {} is {:7.2f} "             "and mean absolute error is {:7.2f}.".format(                 epoch, logs["loss"], logs["mean_absolute_error"]             )         )   model = get_model() model.fit(     x_train,     y_train,     batch_size=128,     epochs=2,     verbose=0,     callbacks=[LossAndErrorPrintingCallback()], )  res = model.evaluate(     x_test,     y_test,     batch_size=128,     verbose=0,     callbacks=[LossAndErrorPrintingCallback()], ) 

\

Up to batch 0, the average loss is   33.08. Up to batch 1, the average loss is  429.70. Up to batch 2, the average loss is  293.82. Up to batch 3, the average loss is  222.52. Up to batch 4, the average loss is  179.47. Up to batch 5, the average loss is  150.49. Up to batch 6, the average loss is  129.87. Up to batch 7, the average loss is  116.92. The average loss for epoch 0 is  116.92 and mean absolute error is    5.88. Up to batch 0, the average loss is    5.29. Up to batch 1, the average loss is    4.86. Up to batch 2, the average loss is    4.66. Up to batch 3, the average loss is    4.54. Up to batch 4, the average loss is    4.50. Up to batch 5, the average loss is    4.38. Up to batch 6, the average loss is    4.39. Up to batch 7, the average loss is    4.33. The average loss for epoch 1 is    4.33 and mean absolute error is    1.68. Up to batch 0, the average loss is    5.21. Up to batch 1, the average loss is    4.73. Up to batch 2, the average loss is    4.68. Up to batch 3, the average loss is    4.57. Up to batch 4, the average loss is    4.70. Up to batch 5, the average loss is    4.71. Up to batch 6, the average loss is    4.63. Up to batch 7, the average loss is    4.56. 

Usage of self.model attribute

In addition to receiving log information when one of their methods is called, callbacks have access to the model associated with the current round of training/evaluation/inference: self.model.

Here are a few of the things you can do with self.model in a callback:

  • Set self.model.stop_training = True to immediately interrupt training.
  • Mutate hyperparameters of the optimizer (available as self.model.optimizer), such as self.model.optimizer.learning_rate.
  • Save the model at period intervals.
  • Record the output of model.predict() on a few test samples at the end of each epoch, to use as a sanity check during training.
  • Extract visualizations of intermediate features at the end of each epoch, to monitor what the model is learning over time.
  • etc.

Let's see this in action in a couple of examples.

Examples of Keras callback applications

Early stopping at minimum loss

This first example shows the creation of a Callback that stops training when the minimum of loss has been reached, by setting the attribute self.model.stop_training (boolean). Optionally, you can provide an argument patience to specify how many epochs we should wait before stopping after having reached a local minimum.

tf.keras.callbacks.EarlyStopping provides a more complete and general implementation.

\

import numpy as np   class EarlyStoppingAtMinLoss(keras.callbacks.Callback):     """Stop training when the loss is at its min, i.e. the loss stops decreasing.      Arguments:         patience: Number of epochs to wait after min has been hit. After this         number of no improvement, training stops.     """      def __init__(self, patience=0):         super().__init__()         self.patience = patience         # best_weights to store the weights at which the minimum loss occurs.         self.best_weights = None      def on_train_begin(self, logs=None):         # The number of epoch it has waited when loss is no longer minimum.         self.wait = 0         # The epoch the training stops at.         self.stopped_epoch = 0         # Initialize the best as infinity.         self.best = np.inf      def on_epoch_end(self, epoch, logs=None):         current = logs.get("loss")         if np.less(current, self.best):             self.best = current             self.wait = 0             # Record the best weights if current results is better (less).             self.best_weights = self.model.get_weights()         else:             self.wait += 1             if self.wait >= self.patience:                 self.stopped_epoch = epoch                 self.model.stop_training = True                 print("Restoring model weights from the end of the best epoch.")                 self.model.set_weights(self.best_weights)      def on_train_end(self, logs=None):         if self.stopped_epoch > 0:             print("Epoch %05d: early stopping" % (self.stopped_epoch + 1))   model = get_model() model.fit(     x_train,     y_train,     batch_size=64,     steps_per_epoch=5,     epochs=30,     verbose=0,     callbacks=[LossAndErrorPrintingCallback(), EarlyStoppingAtMinLoss()], ) 

\

Up to batch 0, the average loss is   23.53. Up to batch 1, the average loss is  480.92. Up to batch 2, the average loss is  328.49. Up to batch 3, the average loss is  248.52. Up to batch 4, the average loss is  200.53. The average loss for epoch 0 is  200.53 and mean absolute error is    8.30. Up to batch 0, the average loss is    5.02. Up to batch 1, the average loss is    5.80. Up to batch 2, the average loss is    5.51. Up to batch 3, the average loss is    5.38. Up to batch 4, the average loss is    5.42. The average loss for epoch 1 is    5.42 and mean absolute error is    1.90. Up to batch 0, the average loss is    5.80. Up to batch 1, the average loss is    6.89. Up to batch 2, the average loss is    6.68. Up to batch 3, the average loss is    6.35. Up to batch 4, the average loss is    6.57. The average loss for epoch 2 is    6.57 and mean absolute error is    2.07. Restoring model weights from the end of the best epoch. Epoch 00003: early stopping <keras.src.callbacks.History at 0x7fd3802cbb80> 

Learning rate scheduling

In this example, we show how a custom Callback can be used to dynamically change the learning rate of the optimizer during the course of training.

See callbacks.LearningRateScheduler for a more general implementations.

\

class CustomLearningRateScheduler(keras.callbacks.Callback):     """Learning rate scheduler which sets the learning rate according to schedule.      Arguments:         schedule: a function that takes an epoch index             (integer, indexed from 0) and current learning rate             as inputs and returns a new learning rate as output (float).     """      def __init__(self, schedule):         super().__init__()         self.schedule = schedule      def on_epoch_begin(self, epoch, logs=None):         if not hasattr(self.model.optimizer, "lr"):             raise ValueError('Optimizer must have a "lr" attribute.')         # Get the current learning rate from model's optimizer.         lr = float(tf.keras.backend.get_value(self.model.optimizer.learning_rate))         # Call schedule function to get the scheduled learning rate.         scheduled_lr = self.schedule(epoch, lr)         # Set the value back to the optimizer before this epoch starts         tf.keras.backend.set_value(self.model.optimizer.lr, scheduled_lr)         print("\nEpoch %05d: Learning rate is %6.4f." % (epoch, scheduled_lr))   LR_SCHEDULE = [     # (epoch to start, learning rate) tuples     (3, 0.05),     (6, 0.01),     (9, 0.005),     (12, 0.001), ]   def lr_schedule(epoch, lr):     """Helper function to retrieve the scheduled learning rate based on epoch."""     if epoch < LR_SCHEDULE[0][0] or epoch > LR_SCHEDULE[-1][0]:         return lr     for i in range(len(LR_SCHEDULE)):         if epoch == LR_SCHEDULE[i][0]:             return LR_SCHEDULE[i][1]     return lr   model = get_model() model.fit(     x_train,     y_train,     batch_size=64,     steps_per_epoch=5,     epochs=15,     verbose=0,     callbacks=[         LossAndErrorPrintingCallback(),         CustomLearningRateScheduler(lr_schedule),     ], ) 

\

Epoch 00000: Learning rate is 0.1000. Up to batch 0, the average loss is   25.33. Up to batch 1, the average loss is  434.31. Up to batch 2, the average loss is  298.47. Up to batch 3, the average loss is  226.43. Up to batch 4, the average loss is  182.22. The average loss for epoch 0 is  182.22 and mean absolute error is    8.09.  Epoch 00001: Learning rate is 0.1000. Up to batch 0, the average loss is    5.55. Up to batch 1, the average loss is    5.56. Up to batch 2, the average loss is    6.20. Up to batch 3, the average loss is    6.24. Up to batch 4, the average loss is    6.34. The average loss for epoch 1 is    6.34 and mean absolute error is    2.09.  Epoch 00002: Learning rate is 0.1000. Up to batch 0, the average loss is    7.28. Up to batch 1, the average loss is    7.82. Up to batch 2, the average loss is    7.52. Up to batch 3, the average loss is    7.33. Up to batch 4, the average loss is    7.52. The average loss for epoch 2 is    7.52 and mean absolute error is    2.27.  Epoch 00003: Learning rate is 0.0500. Up to batch 0, the average loss is   10.56. Up to batch 1, the average loss is    7.01. Up to batch 2, the average loss is    6.36. Up to batch 3, the average loss is    6.18. Up to batch 4, the average loss is    5.55. The average loss for epoch 3 is    5.55 and mean absolute error is    1.90.  Epoch 00004: Learning rate is 0.0500. Up to batch 0, the average loss is    3.26. Up to batch 1, the average loss is    3.70. Up to batch 2, the average loss is    3.75. Up to batch 3, the average loss is    3.73. Up to batch 4, the average loss is    3.79. The average loss for epoch 4 is    3.79 and mean absolute error is    1.56.  Epoch 00005: Learning rate is 0.0500. Up to batch 0, the average loss is    5.90. Up to batch 1, the average loss is    5.09. Up to batch 2, the average loss is    4.59. Up to batch 3, the average loss is    4.39. Up to batch 4, the average loss is    4.50. The average loss for epoch 5 is    4.50 and mean absolute error is    1.66.  Epoch 00006: Learning rate is 0.0100. Up to batch 0, the average loss is    6.34. Up to batch 1, the average loss is    6.46. Up to batch 2, the average loss is    5.29. Up to batch 3, the average loss is    4.89. Up to batch 4, the average loss is    4.68. The average loss for epoch 6 is    4.68 and mean absolute error is    1.74.  Epoch 00007: Learning rate is 0.0100. Up to batch 0, the average loss is    3.67. Up to batch 1, the average loss is    3.06. Up to batch 2, the average loss is    3.25. Up to batch 3, the average loss is    3.45. Up to batch 4, the average loss is    3.34. The average loss for epoch 7 is    3.34 and mean absolute error is    1.43.  Epoch 00008: Learning rate is 0.0100. Up to batch 0, the average loss is    3.35. Up to batch 1, the average loss is    3.74. Up to batch 2, the average loss is    3.50. Up to batch 3, the average loss is    3.38. Up to batch 4, the average loss is    3.58. The average loss for epoch 8 is    3.58 and mean absolute error is    1.52.  Epoch 00009: Learning rate is 0.0050. Up to batch 0, the average loss is    2.08. Up to batch 1, the average loss is    2.52. Up to batch 2, the average loss is    2.76. Up to batch 3, the average loss is    2.72. Up to batch 4, the average loss is    2.85. The average loss for epoch 9 is    2.85 and mean absolute error is    1.31.  Epoch 00010: Learning rate is 0.0050. Up to batch 0, the average loss is    3.64. Up to batch 1, the average loss is    3.39. Up to batch 2, the average loss is    3.42. Up to batch 3, the average loss is    3.83. Up to batch 4, the average loss is    3.85. The average loss for epoch 10 is    3.85 and mean absolute error is    1.56.  Epoch 00011: Learning rate is 0.0050. Up to batch 0, the average loss is    3.33. Up to batch 1, the average loss is    3.18. Up to batch 2, the average loss is    2.98. Up to batch 3, the average loss is    3.02. Up to batch 4, the average loss is    2.85. The average loss for epoch 11 is    2.85 and mean absolute error is    1.31.  Epoch 00012: Learning rate is 0.0010. Up to batch 0, the average loss is    3.58. Up to batch 1, the average loss is    3.22. Up to batch 2, the average loss is    3.27. Up to batch 3, the average loss is    3.24. Up to batch 4, the average loss is    3.02. The average loss for epoch 12 is    3.02 and mean absolute error is    1.32.  Epoch 00013: Learning rate is 0.0010. Up to batch 0, the average loss is    3.37. Up to batch 1, the average loss is    3.55. Up to batch 2, the average loss is    3.31. Up to batch 3, the average loss is    3.28. Up to batch 4, the average loss is    3.27. The average loss for epoch 13 is    3.27 and mean absolute error is    1.43.  Epoch 00014: Learning rate is 0.0010. Up to batch 0, the average loss is    2.02. Up to batch 1, the average loss is    2.66. Up to batch 2, the average loss is    2.61. Up to batch 3, the average loss is    2.56. Up to batch 4, the average loss is    2.82. The average loss for epoch 14 is    2.82 and mean absolute error is    1.27. <keras.src.callbacks.History at 0x7fd3801da790> 

Built-in Keras callbacks

Be sure to check out the existing Keras callbacks by reading the API docs. Applications include logging to CSV, saving the model, visualizing metrics in TensorBoard, and a lot more!

\ \

:::info Originally published on the TensorFlow website, this article appears here under a new headline and is licensed under CC BY 4.0. Code samples shared under the Apache 2.0 License.

:::

\

Market Opportunity
LETSTOP Logo
LETSTOP Price(STOP)
$0.01916
$0.01916$0.01916
+5.68%
USD
LETSTOP (STOP) Live Price Chart
Disclaimer: The articles reposted on this site are sourced from public platforms and are provided for informational purposes only. They do not necessarily reflect the views of MEXC. All rights remain with the original authors. If you believe any content infringes on third-party rights, please contact service@support.mexc.com for removal. MEXC makes no guarantees regarding the accuracy, completeness, or timeliness of the content and is not responsible for any actions taken based on the information provided. The content does not constitute financial, legal, or other professional advice, nor should it be considered a recommendation or endorsement by MEXC.

You May Also Like

SEC greenlights new generic standards to expedite crypto ETP listings

SEC greenlights new generic standards to expedite crypto ETP listings

The post SEC greenlights new generic standards to expedite crypto ETP listings appeared on BitcoinEthereumNews.com. The U.S. Securities and Exchange Commission (SEC) has approved a new set of generic listing standards for commodity-based trust shares on Nasdaq, Cboe, and the New York Stock Exchange. The move is expected to streamline the approval process for exchange-traded products (ETPs) tied to digital assets, according to Fox Business reporter Eleanor Terret. However, she added that the Generic Listing Standards don’t open up every type of crypto ETP because threshold requirements remain in place, meaning not all products will immediately qualify. To add context, she quoted Tushar Jain of Multicoin Capital, who noted that the standards don’t apply to every type of crypto ETP and that threshold requirements remain. He expects the SEC will iterate further on these standards. The order, issued on Sept. 17, grants accelerated approval of proposed rule changes filed by the exchanges. By adopting the standards, the SEC aims to shorten the time it takes to bring new commodity-based ETPs to market, potentially clearing a path for broader crypto investment products. The regulator has been delaying the decision on several altcoin ETFs, most of which are set to reach their final deadlines in October. The move was rumored to be the SEC’s way of expediting approvals for crypto ETFs. The approval follows years of back-and-forth between the SEC and exchanges over how to handle crypto-based products, with past applications facing lengthy reviews. The new process is expected to reduce delays and provide more clarity for issuers, though the SEC signaled it may revisit and refine the standards as the market evolves. While the decision marks progress, experts emphasized that the so-called “floodgates” for crypto ETPs are not yet fully open. Future SEC actions will determine how broadly these standards can be applied across different digital asset products. Source: https://cryptoslate.com/sec-greenlights-new-generic-standards-to-expedite-crypto-etp-listings/
Share
BitcoinEthereumNews2025/09/18 08:43
Optimizely Named a Leader in the 2026 Gartner® Magic Quadrant™ for Personalization Engines

Optimizely Named a Leader in the 2026 Gartner® Magic Quadrant™ for Personalization Engines

Company recognized as a Leader for the second consecutive year NEW YORK, Feb. 5, 2026 /PRNewswire/ — Optimizely, the leading digital experience platform (DXP) provider
Share
AI Journal2026/02/06 00:47
Lovable AI’s Astonishing Rise: Anton Osika Reveals Startup Secrets at Bitcoin World Disrupt 2025

Lovable AI’s Astonishing Rise: Anton Osika Reveals Startup Secrets at Bitcoin World Disrupt 2025

BitcoinWorld Lovable AI’s Astonishing Rise: Anton Osika Reveals Startup Secrets at Bitcoin World Disrupt 2025 Are you ready to witness a phenomenon? The world of technology is abuzz with the incredible rise of Lovable AI, a startup that’s not just breaking records but rewriting the rulebook for rapid growth. Imagine creating powerful apps and websites just by speaking to an AI – that’s the magic Lovable brings to the masses. This groundbreaking approach has propelled the company into the spotlight, making it one of the fastest-growing software firms in history. And now, the visionary behind this sensation, co-founder and CEO Anton Osika, is set to share his invaluable insights on the Disrupt Stage at the highly anticipated Bitcoin World Disrupt 2025. If you’re a founder, investor, or tech enthusiast eager to understand the future of innovation, this is an event you cannot afford to miss. Lovable AI’s Meteoric Ascent: Redefining Software Creation In an era where digital transformation is paramount, Lovable AI has emerged as a true game-changer. Its core premise is deceptively simple yet profoundly impactful: democratize software creation. By enabling anyone to build applications and websites through intuitive AI conversations, Lovable is empowering the vast majority of individuals who lack coding skills to transform their ideas into tangible digital products. This mission has resonated globally, leading to unprecedented momentum. The numbers speak for themselves: Achieved an astonishing $100 million Annual Recurring Revenue (ARR) in less than a year. Successfully raised a $200 million Series A funding round, valuing the company at $1.8 billion, led by industry giant Accel. Is currently fielding unsolicited investor offers, pushing its valuation towards an incredible $4 billion. As industry reports suggest, investors are unequivocally “loving Lovable,” and it’s clear why. This isn’t just about impressive financial metrics; it’s about a company that has tapped into a fundamental need, offering a solution that is both innovative and accessible. The rapid scaling of Lovable AI provides a compelling case study for any entrepreneur aiming for similar exponential growth. The Visionary Behind the Hype: Anton Osika’s Journey to Innovation Every groundbreaking company has a driving force, and for Lovable, that force is co-founder and CEO Anton Osika. His journey is as fascinating as his company’s success. A physicist by training, Osika previously contributed to the cutting-edge research at CERN, the European Organization for Nuclear Research. This deep technical background, combined with his entrepreneurial spirit, has been instrumental in Lovable’s rapid ascent. Before Lovable, he honed his skills as a co-founder of Depict.ai and a Founding Engineer at Sana. Based in Stockholm, Osika has masterfully steered Lovable from a nascent idea to a global phenomenon in record time. His leadership embodies a unique blend of profound technical understanding and a keen, consumer-first vision. At Bitcoin World Disrupt 2025, attendees will have the rare opportunity to hear directly from Osika about what it truly takes to build a brand that not only scales at an incredible pace in a fiercely competitive market but also adeptly manages the intense cultural conversations that inevitably accompany such swift and significant success. His insights will be crucial for anyone looking to understand the dynamics of high-growth tech leadership. Unpacking Consumer Tech Innovation at Bitcoin World Disrupt 2025 The 20th anniversary of Bitcoin World is set to be marked by a truly special event: Bitcoin World Disrupt 2025. From October 27–29, Moscone West in San Francisco will transform into the epicenter of innovation, gathering over 10,000 founders, investors, and tech leaders. It’s the ideal platform to explore the future of consumer tech innovation, and Anton Osika’s presence on the Disrupt Stage is a highlight. His session will delve into how Lovable is not just participating in but actively shaping the next wave of consumer-facing technologies. Why is this session particularly relevant for those interested in the future of consumer experiences? Osika’s discussion will go beyond the superficial, offering a deep dive into the strategies that have allowed Lovable to carve out a unique category in a market long thought to be saturated. Attendees will gain a front-row seat to understanding how to identify unmet consumer needs, leverage advanced AI to meet those needs, and build a product that captivates users globally. The event itself promises a rich tapestry of ideas and networking opportunities: For Founders: Sharpen your pitch and connect with potential investors. For Investors: Discover the next breakout startup poised for massive growth. For Innovators: Claim your spot at the forefront of technological advancements. The insights shared regarding consumer tech innovation at this event will be invaluable for anyone looking to navigate the complexities and capitalize on the opportunities within this dynamic sector. Mastering Startup Growth Strategies: A Blueprint for the Future Lovable’s journey isn’t just another startup success story; it’s a meticulously crafted blueprint for effective startup growth strategies in the modern era. Anton Osika’s experience offers a rare glimpse into the practicalities of scaling a business at breakneck speed while maintaining product integrity and managing external pressures. For entrepreneurs and aspiring tech leaders, his talk will serve as a masterclass in several critical areas: Strategy Focus Key Takeaways from Lovable’s Journey Rapid Scaling How to build infrastructure and teams that support exponential user and revenue growth without compromising quality. Product-Market Fit Identifying a significant, underserved market (the 99% who can’t code) and developing a truly innovative solution (AI-powered app creation). Investor Relations Balancing intense investor interest and pressure with a steadfast focus on product development and long-term vision. Category Creation Carving out an entirely new niche by democratizing complex technologies, rather than competing in existing crowded markets. Understanding these startup growth strategies is essential for anyone aiming to build a resilient and impactful consumer experience. Osika’s session will provide actionable insights into how to replicate elements of Lovable’s success, offering guidance on navigating challenges from product development to market penetration and investor management. Conclusion: Seize the Future of Tech The story of Lovable, under the astute leadership of Anton Osika, is a testament to the power of innovative ideas meeting flawless execution. Their remarkable journey from concept to a multi-billion-dollar valuation in record time is a compelling narrative for anyone interested in the future of technology. By democratizing software creation through Lovable AI, they are not just building a company; they are fostering a new generation of creators. His appearance at Bitcoin World Disrupt 2025 is an unmissable opportunity to gain direct insights from a leader who is truly shaping the landscape of consumer tech innovation. Don’t miss this chance to learn about cutting-edge startup growth strategies and secure your front-row seat to the future. Register now and save up to $668 before Regular Bird rates end on September 26. To learn more about the latest AI market trends, explore our article on key developments shaping AI features. This post Lovable AI’s Astonishing Rise: Anton Osika Reveals Startup Secrets at Bitcoin World Disrupt 2025 first appeared on BitcoinWorld.
Share
Coinstats2025/09/17 23:40