Event-Driven Systems in FinTech. How Spiko Leverages Effect
#5: Event-Driven Systems in FinTech. How Spiko Leverages Effect
This podcast episode features Samuel Briole, CTO of Spiko, a Paris-based FinTech startup building infrastructure for issuing regulated financial products on public blockchains, specifically risk-free products. Spiko utilizes the Effect extensively from day one, for both backend and frontend development, particularly for managing asynchronous operations, API integrations, and smart contracts.
This podcast episode features Samuel Briole, CTO of Spiko, a Paris-based FinTech startup building infrastructure for issuing regulated financial products on public blockchains, specifically risk-free products.
Spiko utilizes the Effect extensively from day one, for both backend and frontend development, particularly for managing asynchronous operations, API integrations, and smart contracts.
Learn more about & follow Samuel:
Effect is an ecosystem of tools for building robust, production-grade applications in TypeScript.
Song: Dosi & Aisake - Cruising [NCS Release]
Music provided by NoCopyrightSounds
Free Download/Stream: http://ncs.io/Cruising
Watch: http://ncs.lnk.to/CruisingAT/youtube
- (00:00) - Intro & why Spiko chose Effect
- (07:22) - Hiring engineers without Effect experience
- (10:06) - Spiko’s Architecture & Apps
- (15:12) - Event-Driven Systems
- (22:45) - Choosing RabbitMQ over Kafka or NATS
- (28:26) - Why they built effect-messaging
- (39:53) - Effect Schema, Versioning, Async Messaging
- (46:44) - Agents & Effect AI
- (53:21) - Closing Thoughts & Looking Ahead
Transcript
00:00
we've been a small team so far
00:03
but we've been working
00:04
with Effect from scratch.
00:07
when I decided
00:08
the stack for Spiko
00:10
I chosed Effect because it was the natural
00:12
successor to fp-ts.
00:15
And for hiring people
00:17
most of the
00:18
employees didn't know Effect
00:20
before they came at Spiko.
00:22
and I trained them
00:24
and they also trained
00:25
with the documentation
00:27
and so far it's been okay.
00:30
I think the
00:30
documentation has really improved
00:34
there is still a learning curve
00:35
that is a bit higher than other libraries,
00:38
but I think it's okay.
00:43
Welcome to "Cause & Effect," a podcast
00:46
about the TypeScript library and
00:47
ecosystem called Effect,
00:49
helping engineers to build
00:51
production-ready software. I'm
00:53
your host Johannes Schickling,
00:54
and I've been building with Effect for
00:56
over four years. With this
00:57
podcast, I want to help others
00:59
understand the powers and benefits of
01:01
using Effect. In this episode, I'm
01:04
talking to Samuel Briole,
01:06
CTO at Spiko, which is a Paris-based
01:09
fintech startup trusted
01:10
with over 400 million euros
01:12
under management. In this conversation,
01:15
we dive deep into Spiko's
01:16
event-driven architecture,
01:18
built entirely with Effect and how they
01:20
leverage RabbitMQ as an
01:22
event broker to scale their
01:24
backend systems. Let's get into it.
01:27
Hey, Samuel, it's so great
01:28
to have you on the podcast.
01:29
How are you doing?
01:31
Hi, I'm good.
01:32
How are you?
01:34
I'm doing fantastic.
01:35
I'm quite impressed with
01:37
what you all are building
01:38
and I want to learn a lot more.
01:39
But before getting
01:40
into what you're building,
01:41
would you mind introducing yourself
01:43
and sharing what you do?
01:45
Sure.
01:45
So I'm Samuel.
01:47
I'm CTO at Spiko and we are a French
01:50
startup based in Paris.
01:52
So we are a FinTech,
01:55
especially in the finance sector.
01:57
And we are building a new infrastructure
02:01
for issuing regulated products,
02:03
regulated financial
02:04
products on public blockchains.
02:08
And we especially focus
02:10
on risk-free products.
02:13
we allow people to buy a bond of,
02:17
I don't know, from, of the French State
02:19
or of the US States.
02:22
So they can have a risk-free rate.
02:27
They can earn a
02:28
risk-free rate on their cash.
02:31
So basically if you're based in the US,
02:35
it's a very common thing to
02:37
have like a risk-free rate
02:39
yielding on your cash, but in Europe,
02:42
it's not very common to have that.
02:44
our mission is to
02:46
democratize this kind of product.
02:49
we launched Spiko one year ago
02:52
and the company was
02:53
created one year before,
02:54
so it was been working for two years.
02:57
And we launched our products one year ago
03:00
and today we have
03:01
around 400 millions of euros
03:05
under management, which
03:07
is quite a nice milestone.
03:11
And also last month we raised a Series A.
03:16
So we raised with Index Ventures,
03:19
which is famous for
03:21
supporting the Revolut
03:22
and the Robinhood in
03:24
the same financial sector.
03:26
That is awesome.
03:26
Well, first of all, congratulations
03:28
on those amazing milestones,
03:30
like 400 million under management
03:33
or whatever is the best way to put it.
03:35
That is impressive.
03:36
And then also congrats on the series A
03:38
with Index Ventures.
03:40
I'm curious to learn a little bit more
03:42
about like both your personal background,
03:44
how you arrived there, but also about
03:47
how you should think
03:48
about Spiko as a company,
03:50
how many engineers are working at Spiko.
03:53
So maybe you can give a
03:54
little bit more detail here.
03:56
Sure.
03:56
I did an engineering school
03:58
where I learned physics
03:59
and I almost started a PhD
04:02
in quantum physics.
04:03
But at some point I
04:06
decided that I didn't want
04:08
to do research and I switched to
04:10
software engineering.
04:12
So during my studies,
04:13
I was building like an
04:16
app for discovering electronic music.
04:19
So I learned to code a bit by myself.
04:22
And I was like, okay, it's so cool.
04:23
I want to do this as my job.
04:27
I started my career
04:29
in a small service company.
04:31
And quickly I wanted to
04:33
build my product from scratch.
04:36
So I worked for a company called Inato
04:39
so I was maybe the second engineer.
04:43
And then I tried to launch my own startup
04:47
and I failed two times.
04:50
And then I met the founders of Spiko.
04:53
And I found the mission really exciting.
04:57
And also the technological,
05:00
challenge at Spiko
05:02
using the blockchains
05:03
and also innovating both
05:05
on the tech side and
05:06
on the financial side
05:08
was very exciting.
05:09
So that's how I arrived at Spiko.
05:12
That is awesome.
05:13
And there's quite a bit of overlap there
05:15
with other people in
05:17
the Effect community.
05:18
You mentioned the folks at Inato.
05:21
I had the pleasure of
05:22
meeting some of them
05:24
throughout the last
05:25
two Effect Conferences.
05:27
And it seems like there's
05:28
quite the active Effect scene
05:30
in Paris, which I'm sure we'll talk
05:32
a little bit later about as well.
05:34
But yeah, that journey so far sounds
05:36
really, really cool.
05:37
I see a bunch of
05:38
parallels and similarities.
05:40
I'm currently still
05:42
working on a music app
05:44
for me personally
05:45
focused on electronic music.
05:46
So I wish it certainly
05:48
seemed to share that passion here
05:50
but now you're a CTO at Spiko.
05:53
So what does that entail
05:55
and how many other
05:56
engineers are you working with?
05:58
the engineering team at Spiko
06:00
is currently five people
06:01
and there is one joining soon.
06:04
And our goal is to reach around, I think
06:08
10 people next year.
06:09
So we'll split into probably two teams.
06:12
we've been a small team so far
06:15
but we've been working
06:17
with Effect from scratch.
06:19
So everyone in the team is using Effect
06:23
and everyone is doing
06:24
TypeScript and Effect in the team.
06:26
That's awesome.
06:27
So you mentioned to me before
06:29
that you joined as the first employee
06:32
besides the founders.
06:33
So you were there from the very beginning
06:36
and the other engineers
06:37
who joined afterwards,
06:39
did they have any prior Effect experience
06:41
or any other relevant
06:43
experience besides TypeScript?
06:45
Or I'm just curious
06:47
like how I should think
06:48
about the sequencing
06:50
now Spiko has been around
06:51
for two years.
06:52
You've probably written
06:53
some of the first lines of code
06:55
and then the other
06:56
engineers you brought on,
06:58
was it a prerequisite for
06:59
them to already know Effect?
07:01
Did you train them?
07:02
No, it's not a prerequisite.
07:04
I discovered the functional
07:07
programming at Inato
07:08
when I was working at
07:09
Inato and we used fp-ts.
07:11
And then when I decided to choose
07:15
like the stack for Spiko
07:17
I chosed Effect because it was natural
07:19
successor to fp-ts.
07:22
And for hiring people
07:24
most of the
07:25
employees didn't know Effect
07:27
before they came at Spiko.
07:30
I think none of them knew
07:33
Effect and I trained them
07:36
and they also trained
07:37
with the documentation
07:39
and so far it's been okay.
07:42
I think the
07:43
documentation has really improved
07:46
there is still a learning curve
07:48
that is a bit higher than other libraries,
07:50
but I think it's okay.
07:52
Also at Spiko, we have, I mean,
07:54
we are all Full Stack
07:55
and Dev Ops and we,
07:58
we do all kinds of things
07:59
and we also develop smart contracts.
08:02
And so far we don't have
08:04
specialized roles in tech.
08:06
So when we hire people,
08:08
we try to hire people
08:10
who can quickly jump
08:11
on new technologies and
08:13
learn this technology.
08:14
So, so far everyone has
08:18
been learning Effect.
08:20
That is awesome.
08:21
Congratulations on that.
08:22
I share that similar path to you
08:25
that I found my way to Effect through
08:27
functional programming,
08:28
but I do think that this
08:30
won't be what brings most people
08:33
to effect these days and
08:34
certainly in the future.
08:36
So I'm curious, like what is your
08:39
teaching methodology
08:40
when you bring on
08:42
someone new to the team?
08:43
Are you precisely
08:45
already looking for someone
08:46
with functional programming backgrounds
08:48
or are you rather like
08:50
not mentioning FP at all?
08:52
Like how you're
08:53
explaining Effect to new engineers?
08:56
It's a good question.
08:57
I don't mention
08:58
functional programming.
08:59
I just say it's inspired by functional
09:02
programming concepts,
09:04
but I don't think it's
09:06
a good way to put it to,
09:07
to say it's functional
09:08
programming because it's not.
09:10
I prefer
09:10
to describe Effect as
09:13
a framework
09:14
that has type level error
09:17
and included dependency management.
09:20
So basically in TypeScript by default,
09:22
you have, you would have the success type
09:25
of a function that is correctly typed,
09:28
but here you have, you have
09:29
also errors and dependencies.
09:32
So I think it's a simple way to put it,
09:36
like you will have also success,
09:38
the error and the dependencies.
09:40
So maybe we can switch gears slightly
09:43
and talk a little bit
09:44
more about the architecture
09:46
of the product that you're building.
09:49
So maybe we can start by you describing
09:53
which sort of like
09:54
consumer facing parts there are.
09:56
Is there maybe a mobile app?
09:58
Is there a web app?
09:59
Are there some other primitives?
10:01
And then switching gears
10:03
and describing more of like
10:04
the backend architecture.
10:06
So, so far we have three apps,
10:11
three front-end apps written in
10:12
TypeScript and React.
10:14
we are building a platform
10:15
that connects financial
10:17
product issuers, distributors,
10:20
and also we have like
10:22
the admin interface.
10:25
So we have three types
10:27
of users in our system,
10:30
investors, distributors, and admins.
10:35
So basically we built three apps
10:37
and they are all connected to three APIs.
10:42
And all these APIs are
10:44
connected to backend services.
10:47
And so the way we
10:50
designed our backend is we built,
10:53
I would say not microservices,
10:55
but I would say macroservices.
10:57
It's not a monolith, but
10:59
we have like a few services.
11:01
One service to manage, I don't know,
11:03
fund operations, one to manage orders,
11:07
one manages the blockchain stuff.
11:12
So that's how we designed our backend.
11:15
Got it.
11:16
And so given those different APIs,
11:19
I assume you're using
11:20
the various building blocks
11:22
that Effect provides for that.
11:24
For example, the Effect HTTP
11:27
packages from the Platform.
11:29
Absolutely.
11:30
So at the beginning, when we started,
11:33
there was no platform package in Effect.
11:35
I think it was two years ago.
11:38
And Platform
11:39
almost did not exist, I think.
11:41
So the first thing I did was wrapping
11:45
Express into Effect,
11:48
which came up as a very bad idea
11:51
because it was a mess
11:53
to manage dependencies, and
11:54
I had like some
11:55
non-Effect code in my code base,
11:57
which wasn't really nice.
12:00
So basically my entry
12:01
point wasn't an Effect.
12:03
It was an Express server.
12:05
And Effect was in each endpoint handler,
12:10
I had to Effect.runPromise my code.
12:14
But later the Effect
12:16
platform package came in Effect
12:18
and we switched to it.
12:20
And at the time there
12:23
was no HTTP API module.
12:26
So we used effect-http
12:30
which was a lib
12:31
written by Milan Suk.
12:32
And we used it for a while actually.
12:34
And I even met Milan at
12:36
the first Effect Conference
12:37
and it was awesome to meet
12:42
everyone at this conference.
12:44
But yeah, we used it for a while
12:46
and then HTTP API module arrived
12:52
and we switched to it.
12:53
We migrated everything to it then.
12:55
Yeah, I mean, I
12:57
remember those transitions well
12:59
similar to you where,
13:01
like I also used fp-ts in the past
13:04
where you got those like much more fine
13:07
granular primitives,
13:08
but not as high level of a thing
13:11
such as like an HTTP module.
13:14
And I still remember,
13:15
getting something really nice,
13:17
like getting those
13:18
primitives from Effect,
13:20
but having to give up on
13:22
higher level primitives
13:23
where you like imagining Express or Koa
13:27
or like all of those different things,
13:29
you arguably had better primitives,
13:31
like you had middlewares, et cetera.
13:34
And now you kind of needed to,
13:36
you got one thing,
13:37
but you had to give up of another thing.
13:39
And now you're kind of wondering,
13:40
what should I do about this?
13:42
And you did a similar thing as I did,
13:44
which is like trying to rebuild
13:46
those higher level primitives.
13:48
But now it's so nice
13:50
that it was just always
13:51
just a matter of time
13:52
until the Effect ecosystem
13:55
and the Effect Core
13:57
which give us some of those primitives.
13:59
And now finally the time has come over
14:01
the last year or so.
14:04
if you're going through that transition,
14:06
it's just so nice how
14:07
much code you can delete
14:09
and how everything
14:10
just fits like a glove.
14:12
So I wanna learn more about the backend,
14:14
but maybe briefly to wrap
14:16
up on the front end first,
14:18
how much or how little are
14:20
using Effect on the front end?
14:23
Are you stopping by
14:24
basically consuming the HTTP APIs
14:27
or are using Effect
14:29
in a more involved way
14:31
on the front end?
14:32
No, we use it only for data fetching.
14:34
So, but it's very convenient
14:37
because with the HTTP API module,
14:39
you can write APIs in
14:41
the declarative way.
14:43
So you have auto-generated
14:46
clients, which is type safe.
14:48
So basically we have a lib
14:52
that exports the HTTP API
14:56
specification and we have the clients,
14:59
we just import the client from the app.
15:02
But maybe in the future we could use it
15:07
even in a more involved
15:09
way, but it's not the case yet.
15:10
Got it, that makes sense.
15:12
So yeah, let's talk a little
15:13
bit more about the backend.
15:14
So you mentioned already
15:15
those like three pillars
15:17
of your application, like
15:19
if I remember correctly,
15:20
like the investor facing ones,
15:22
then the distributor
15:24
facing ones, and then the admin,
15:26
which I suppose is like your company.
15:28
so at the
15:28
minimum for each of those,
15:30
there seems to be an HTTP API,
15:32
but then you also
15:33
need to interface somehow
15:35
with like external services.
15:37
So is that all done from those HTTP APIs
15:40
or are there some
15:41
other parts in the system,
15:43
maybe like some message buzz or yeah,
15:46
maybe you can explain a little bit more
15:48
of like how the backend
15:49
works and how Effect helps there.
15:51
So as I told you, we have multiple
15:53
services now backend
15:55
and they sometimes need to communicate
15:58
between one and another.
16:00
So the first thing we did
16:03
was to build an internal API.
16:06
So for each service, we
16:07
built an internal HTTP API
16:10
because it was the same
16:10
technology as external APIs.
16:14
So it was easy for one
16:15
service to call another service.
16:17
We had the same,
16:18
auto-generative client,
16:20
everything was type safe.
16:22
So it felt very nice.
16:24
And at some point we had to,
16:28
run some, I would
16:29
say some background jobs,
16:30
for instance, an investor
16:33
wants to create an order
16:35
and we need to send him an email.
16:37
But before sending the
16:38
email, we need to generate PDF
16:40
and like a lot of stuff has to happen
16:43
and it will take maybe several seconds,
16:47
maybe 10 seconds. I don't know
16:49
But we want to do it as a background job.
16:51
So we can answer with
16:53
the HTTP response quickly.
16:55
So the first thing we did
16:58
was using our internal API
17:02
but we used something to
17:04
avoid blocking the HTTP response.
17:08
so we used Effect.forkDaemon
17:11
so we would fork the
17:14
execution of an internal API call
17:16
into the, I would say the global scope.
17:20
So it would not be blocking for answering
17:24
or for responding with the HTTP status
17:27
but the server would
17:29
still make the request
17:30
to another internal service.
17:33
And we did that for a while
17:35
especially for the emails,
17:37
every kind of background jobs.
17:39
And at some point
17:41
we had a lot of internal API calls
17:43
and we still have some, but at some point
17:46
I wanted to bring a new,
17:49
a better kind of
17:50
architecture to do these kind of things.
17:53
And what people tipically
17:55
do is bring a message broker
18:00
that is connecting to all microservices
18:02
so service can just
18:04
drop events or commands
18:06
in the message broker
18:07
and service can also listen
18:09
to events or commands and handle them.
18:13
Got it.
18:13
So let me just see
18:15
whether I understood correctly.
18:17
So you basically have
18:19
those HTTP endpoints.
18:20
You're running them, are
18:22
you running them on something
18:23
like AWS Lambda or on stateful servers?
18:27
Yes, everything runs in Kubernetes.
18:31
Okay, so you're
18:32
running that in Kubernetes
18:33
so you have the benefit
18:35
of long running servers.
18:36
So it's one of the
18:37
questions I would have had otherwise
18:39
is when you say fork deamon, now you
18:42
basically need to think
18:43
about like the request lifecycle
18:45
but otherwise also the
18:46
lifecycle of a server.
18:48
So if you have the lifecycle of a server
18:50
that makes that certainly easier.
18:52
But the more complexity
18:54
that you had sort of like
18:56
as your app develops and evolves,
18:59
typically it gets more
19:00
complex than simpler over time.
19:02
And so you always had that trade off of
19:04
like you want to
19:06
if the client does something, it should
19:08
get a request response
19:10
as quickly as possible.
19:12
And now you have that
19:14
tension where on the one hand
19:17
you want to keep the response snappy and
19:19
as quick as possible.
19:20
And on the other side, you
19:22
had more and more complexity,
19:23
more and more stuff and
19:25
features that should be handled.
19:27
So far, you've always kind of let that
19:29
run in the background
19:30
by basically through the
19:33
request response lifecycle
19:35
would already create a
19:37
Effect fiber for like a fork.
19:41
The details here don't matter too much.
19:43
But basically now the
19:45
question is like the little job
19:48
that now somehow runs through the event,
19:51
like JavaScript event loop that maybe
19:54
gets out of control.
19:56
Maybe like what if you need
19:57
to do error handling there,
19:58
maybe how many of those
20:00
are running at the same time.
20:02
So this is the situation you were facing.
20:05
And now you thought about, okay, what is
20:07
like the architectural,
20:09
architectually proper way to deal with that.
20:12
And that is where you arrived at.
20:14
Let's look into event
20:15
buses. Is that correct?
20:16
Yeah, absolutely.
20:17
So we wanted to have a bit more control
20:20
with this kind of background jobs.
20:22
Also for
20:23
the structure of the code base,
20:27
we wanted to avoid like
20:29
dependencies between services,
20:31
like some service, they
20:33
just want to drop an event
20:34
and they don't have to know
20:36
about the API of other services.
20:40
So it made more sense
20:41
to just drop an event
20:43
and not calling the service directly is
20:46
also like a best practice
20:48
I think in terms of software design.
20:50
When your system gets complex,
20:52
you want to have like better architecture
20:56
and dependencies enforcement.
20:58
That makes sense.
20:58
And so I just want to get a better
21:00
understanding of like the nature
21:02
of the things that should
21:03
kind of happen in the background.
21:05
Are those purely things
21:06
that need to be kicked off
21:08
but are no longer relevant for the user
21:11
experience in the front end?
21:13
So like if you click a
21:15
button in the front end,
21:16
you're like getting the request response
21:19
cycle back and a thing happens
21:22
and then you don't really care too much
21:24
what is happening in the background.
21:26
Or is there stuff that
21:27
happens in the background
21:28
that the front end might now be like
21:30
pulling for in some way?
21:32
Most of the time we don't call responses.
21:34
It's just like background like I don't
21:36
know, send an email or we call.
21:41
So we're also connected with blockchains
21:43
and blockchains are complex systems.
21:46
But basically, the registry of our funds
21:49
are written on the blockchains
21:50
and the blockchains evolves.
21:52
But yeah, a lot of events are
21:54
happening on the blockchains
21:55
and we basically pull the
21:57
blockchain continuously.
21:59
We index all these events
22:01
and sometimes when a
22:03
specific event happens,
22:04
we want to trigger some code.
22:06
So for these kinds of scenarios, it's
22:08
really nice to have an
22:11
event-driven architecture.
22:13
Got it. Yeah, so you're
22:14
mentioning an event bus.
22:16
So let's dive in. What did you do there?
22:20
Suppose there are many different options.
22:22
You're not the first one to embrace an
22:25
event-driven architecture.
22:27
So how did you go about that?
22:29
Did you build something like that before?
22:31
Did you have any sort
22:32
of relevant experience?
22:34
Walk me through sort of like the
22:36
You getting up to speed on that topic
22:39
and then evaluating different options to
22:41
what you've ultimately implemented.
22:44
So we had like a
22:46
discussion with all my team
22:47
discussion with all my team and there are many options,
22:49
but for us, we prefer to
22:52
use an open source project.
22:55
So we didn't want to be tied to a
22:59
specific cloud provider,
23:01
like I don't know, SQS from Amazon, from
23:04
AWS or Google PubSub.
23:07
And basically, at the end,
23:09
we had three main choices.
23:11
So the first was Kafka, because Kafka is
23:14
widely used, big enterprise.
23:17
And it's probably the most used
23:20
in the financial sector.
23:22
So it would have been a good fit for us.
23:25
The second choice was
23:26
RabbitMQ, because it's battle-tested,
23:30
it's well-used, plenty of plugins, etc.
23:34
And the third was like
23:36
the new to the game is NATS.
23:39
It's more recent, but it's very
23:41
lightweight and
23:43
It seemed very nice.
23:44
So we decided to eliminate
23:47
Kafka because it was
23:48
heavy to run locally,
23:50
not easy to run on Kubernetes.
23:51
I think they are a great option to run on Kubernetes,
23:56
but it was not the lightweight option.
24:00
Overall, we chose RabbitMQ
24:02
because it was more battle-tested,
24:04
because it had a UI
24:06
interface to play with.
24:09
So we were more confident with something
24:12
that is a bit battle-tested.
24:14
And we didn't need to have
24:16
something that is super fast
24:20
or that can handle
24:21
millions of message per seconds.
24:23
Also, it's not a very critical choice for
24:28
us because
24:29
All the data that goes into
24:30
RabbitMQ is not persistent.
24:32
It's temporary because once the message
24:35
is consumed, it disappears.
24:37
So at some point, if we want to switch to
24:40
another message broker,
24:42
we could. It wouldn't be so hard for us to switch.
24:45
So we were like, "Okay, RabbitMQ seems
24:48
nice. Let's go and let's try it."
24:50
But the adventure was a bit
24:53
rough after we made that choice
24:56
because we discovered a lot of things
24:59
that were not so nice
25:00
about RabbitMQ and AMQP.
25:04
And maybe if I knew them before, maybe I
25:07
would not have chosen something like that.
25:10
Let's definitely go into that.
25:13
For those folks who have never used
25:15
Rabbit, you also mentioned AMQP.
25:18
Would you mind giving a
25:20
quick explainer of what those are
25:22
and how they relate to each other?
25:25
Sure.
25:26
I'm not an expert, but
25:27
here is my understanding.
25:29
AMQP is a protocol, like HTTP.
25:32
It's a protocol that is turned out for
25:35
sending and consuming messages.
25:38
And there are several brokers that
25:42
implement this protocol.
25:44
RabbitMQ is one of
25:45
them, but
25:46
You have other types of message brokers
25:50
that implement AMQP.
25:52
For instance, I think ActiveMQ.
25:56
Everything that has an MQ in the name is
25:59
probably an AMQP client and server.
26:04
Actually, it's quite nice
26:05
because AMQP is widely used.
26:08
RabbitMQ is one of the most popular
26:11
implementation of an AMQP server.
26:14
I think I've used RabbitMQ in the past,
26:17
but it's been a little while.
26:19
And I'm dealing with other kinds of
26:21
event-driven systems these days
26:23
where I'm exploring event sourcing more
26:25
in a front-end context.
26:27
Some similarities, but also very
26:30
different when it comes to the use case
26:32
that you're describing.
26:34
So very curious to
26:35
learn more about yours.
26:37
You mentioned that you were running into
26:39
some issues with RabbitMQ.
26:42
So maybe you can describe a little bit
26:44
more chronologically
26:45
how you went about it,
26:47
what you were aiming for, which sort of
26:50
assumptions or hopes
26:51
that maybe turned out different than you
26:53
thought, and what did you arrive at?
26:56
It's an interesting question.
26:57
So when we started to implement,
26:59
the connection between RabbitMQ
27:02
and our back-end services, what we did
27:05
was we basically wrapped
27:07
the AMQP library into Effect.
27:10
So we used the official
27:12
library called AMQPlib.
27:15
the official implementation for Node.js.
27:18
basically when you connect to RabbitMQ
27:21
from Node.js, you create two objects.
27:23
One is the connection, so
27:24
you initiate the connection,
27:26
and then you initiate a channel which
27:28
represents a connection channel
27:31
between the client and the server.
27:33
So you initiate these two objects, and
27:36
what we did is we put
27:38
them into, I think, a layer,
27:40
an effect layer that was scoped so when
27:43
the dependency lifetime was ended,
27:46
we could close the
27:47
connection, close the channel.
27:49
So that's pretty basic.
27:51
Then we could just call our channel to
27:54
send message and subscribe to it.
27:56
What was a bit challenging is that at some
28:00
point, we discovered that our services
28:03
were not consuming messages anymore
28:05
or they were not sending
28:08
messages anymore to the server.
28:11
Why?
28:12
Because the connection and the channel
28:14
between client and server
28:16
was closed at some point
28:17
for any reason.
28:19
Maybe the connection between the service
28:22
and the server had a problem.
28:25
So we are running a
28:28
RabbitMQ in the Kubernetes cluster.
28:30
It's quite safe because we use
28:31
RabbitMQ as a cluster in
28:33
our Kubernetes cluster.
28:35
So we always have the persistence of
28:38
messages and replications of events.
28:42
But sometimes one node of
28:44
the RabbitMQ cluster goes down,
28:46
and then the connection between the
28:48
service and the RabbitMQ node goes down.
28:52
The problem with the AMQPlib is that
28:55
when the connection object is failing,
28:58
there is no autoreconnection.
28:59
So basically, the connection just drops.
29:02
It was a challenge for us to implement an
29:05
automatic reconnection of the service.
29:07
So we iterated a bit on this problem.
29:10
The first thing we did is that
29:11
In our Kubernetes
29:14
health check endpoint,
29:15
we would add a check to see if the
29:17
connection was alive.
29:18
If the connection was not alive,
29:20
so Kubernetes could just kill the bot,
29:22
we would start a new one
29:23
with a fresh connection.
29:25
But still, it was not a good solution
29:29
because we were using some events.
29:31
We had a lot of issues with that.
29:33
What we did is we tried to implement a
29:37
way to reconnect automatically.
29:40
That's how I ended up writing a library
29:43
called effect-messaging
29:44
to wrap the AMQP
29:47
connection, the AMQP channel,
29:48
and add autoreconnection to this.
29:51
In Effect, when you create a connection
29:54
object and you provide it in a layer,
29:57
then you can't mutate the object.
29:59
that is in the layer.
30:01
But in the AMQPlib
30:03
there is no function,
30:05
there is no method of
30:06
connection to refresh.
30:08
So you have to replace
30:11
the object completely.
30:12
This was an interesting problem.
30:15
When I started implementing
30:17
the effect-messaging library,
30:20
I digged a little bit into Effect
30:23
and into what data structure I could
30:26
choose to represent this.
30:29
I ended up using something
30:31
I think I would never use
30:35
in standard application.
30:37
I ended up using the Ref module to
30:40
represent a mutable state.
30:42
So what I did is instead of providing a connection object
30:46
from the AMQPlib
30:47
I provided a Ref of the connection.
30:50
Then I could listen to events and to
30:54
close events from the connection
30:57
and then refresh the
30:58
connection and mutate the Ref.
31:01
People using the layer
31:03
would have the new connection.
31:05
I love that you walked us
31:07
through from the high level
31:10
to the lowest level
31:11
what you need to understand
31:13
and leverage some lesser known pieces of
31:17
Effect to implement this.
31:18
Even though it's very specific,
31:20
what I think is universal about that
31:23
experience that you went through
31:25
is that Effect allows
31:27
you to model the realities
31:30
of your application at this
31:32
point of your infrastructure.
31:34
Since this is what for me most of software
31:37
development is about.
31:39
You're trying to
31:40
figure out what is the goal,
31:42
what are the building
31:43
blocks, what are the materials,
31:45
what are the pieces that we can use here.
31:48
Then you need to develop what is
31:50
sometimes referred to
31:51
as mechanical empathy for the building
31:54
blocks that you have.
31:55
And here mechanical empathy is understanding,
31:59
"Okay, there's a connection.
32:01
In an ideal world, this
32:03
connection would suffice
32:05
and would never be super stable
32:07
and there's just one
32:09
computer is never going down.
32:12
Super duper easy."
32:13
But the tricky part here is we're dealing
32:16
with distributed systems
32:18
and with distributed systems
32:19
there arise a ton of problems
32:21
and now you need to
32:23
model for those cases.
32:25
The specifics is one thing here,
32:28
but I think what is
32:30
applicable to almost any situation
32:33
is you need to model your reality of your
32:36
application, of your system.
32:39
This is, I think, now
32:40
that you've figured out
32:42
what are the primitives of
32:43
Effect that you need to use,
32:45
you could use them and
32:46
model your domain perfectly.
32:49
In a way where it's
32:52
kind of a one-to-one fit
32:53
to reality and implementation.
32:57
Maybe the first time you
32:58
look at this you might think,
33:00
"Why are all of those things needed?"
33:01
But now that you understand
33:03
it, understand
33:05
each piece here has a reason.
33:07
This is what I also
33:08
appreciate about so many pieces
33:11
in the Effect
33:12
platform packages, et cetera,
33:14
where maybe you look at it
33:15
the first time you think,
33:17
"Why are those three things needed?"
33:19
Isn't one sufficient?
33:20
But then you realize,
33:21
"Oh, actually, those are here
33:23
for those various scenarios."
33:25
And they're split up into three that is
33:28
not a leaky abstraction.
33:30
So many things in the
33:31
JavaScript ecosystems
33:32
are designed in a leaky, abstracted way.
33:36
And this is what I
33:37
appreciate about Effect.
33:38
It kind of absorbs the reality of the
33:41
materials you're working with.
33:43
And I think this is
33:44
exactly what you've done
33:45
in the effect-messaging layer.
33:47
And also just on a personal note,
33:49
this definitely
33:50
resonates in regards to the work
33:53
I've been doing over
33:54
the last couple of years
33:55
where I'm diving very
33:56
deep into distributed systems
33:58
where reconnection, et
34:00
cetera, is the bread and butter.
34:02
So kudos to you to next to
34:05
building a FinTech product,
34:07
also dealing with distributed systems
34:10
and building a library in that regard.
34:12
So congrats, that is awesome.
34:15
Actually, it was super interesting.
34:17
And I think it's also part of our job to
34:22
have a resilient system.
34:24
And it's very important for our product.
34:27
But it was a really funny experience
34:29
to also do this kind of lower
34:33
I mean, it's lower than stuff that we
34:38
rarely do in a FinTech startup
34:41
because we often use existing libraries.
34:44
It's really fun, actually.
34:47
And now for someone else, there is an
34:49
existing library for that
34:51
where someone can look at this
34:54
and already absorb your
34:56
mental model of the world.
34:58
You had to do the modeling
34:59
carefully yourself before
35:02
where you needed to figure out,
35:04
"Is this kind of
35:05
abstraction modeling correct?
35:07
Should there be more pieces?
35:09
Should there cannot be condensed more?"
35:11
And now someone can look and say,
35:14
"Okay, event-driven sounds great,
35:16
RabbitMQ sounds great. Let me try that."
35:19
And if you've designed it well, they are
35:22
falling in a pit of success.
35:24
So that is amazing.
35:25
And now that you've created this
35:27
environment for your fellow engineers,
35:29
what is it like now to
35:31
work with that system?
35:32
You mean the developer
35:34
experience with that library?
35:37
Exactly. You've created the
35:39
world that you wanted to see.
35:40
You wanted to have
35:42
RabbitMQ as a message broker.
35:44
You wanted from your API servers,
35:47
wanted to publish events
35:49
onto the message broker.
35:51
So how is that working?
35:53
And then we should also
35:54
talk about the consumer side
35:55
of how those events are being processed
35:58
and any sort of interesting
36:00
things emerging from that.
36:02
Sure.
36:03
I think the library of effect-messaging
36:05
at the moment,
36:06
it mainly solves the
36:07
problem of reconnection
36:09
and having a strong connection layer.
36:11
And I also created
36:13
higher-level interfaces,
36:15
like publisher interface
36:17
and subscriber interface.
36:19
That can allow people to
36:23
subsctibe to events and publish.
36:26
So at the moment, I kept
36:27
this interface
36:29
very generic.
36:30
So we could add more
36:32
message brokers to the library
36:34
in the future if we wanted to.
36:36
But at Spiko, we use RabbitMQ,
36:39
so we used AMQP
36:40
publisher, AMQP subscribers.
36:43
I mean, we don't have any
36:44
more problem with connections
36:46
and failing connections.
36:48
but those are abstractions on top of this
36:51
publisher subscriber
36:52
where we have a strong
36:55
typing of events and payloads,
36:57
like event types payloads.
37:00
this is not in the
37:01
effect-messaging library.
37:02
It's something we built
37:03
on top in our codebase.
37:06
basically
37:06
when we want to create a new event,
37:08
we declare a new interface
37:11
with an event type and payload.
37:13
And that's it.
37:14
But maybe in the future
37:16
If we find the good abstraction for it,
37:18
maybe we could add these kind of features
37:22
to effect-messaging
37:23
the vision I
37:24
have maybe for this library
37:26
would be to do something that
37:27
is similar to HTTP API module,
37:30
but to describe events.
37:32
So I think it's a bit of an ideal world,
37:34
and it's not done yet,
37:36
but we could imagine
37:38
something where you declare
37:39
your messaging API
37:41
with events and payloads
37:43
in a declarative way,
37:44
and it would create both a subscriber
37:47
and the publisher for these events.
37:50
Also, another part
37:51
that is very interesting
37:53
is that with HTTP API module,
37:56
you can generate open API specs.
37:59
And I've done a bit of research,
38:01
and there is an equivalence
38:02
in the Async messaging world.
38:05
There is an equivalent of
38:07
open API called AsyncAPI,
38:10
I don't think it's very popular yet,
38:11
but it's a way to
38:14
expose Async messaging APIs.
38:17
So it could be interesting in the future.
38:19
Maybe we want to drop events from a
38:23
Node.js application,
38:24
and there is a new team
38:26
using the NOSO language
38:27
that wants to generate codegen,
38:30
a subscriber for these events.
38:32
It could use a generic interface. It could use a
38:36
specification to generate a client
38:38
for these events.
38:39
Maybe in the future we'll have that.
38:41
No, this makes perfect sense,
38:43
and I do hope that Effect Platform
38:47
and more primitives inside
38:49
of the core Effect ecosystem
38:52
are moving in that direction,
38:54
similar to what we've seen already
38:56
with the Effect Platform package,
38:58
with the HTTP package, etc.
39:00
So I think there are many scenarios
39:02
where events are super
39:05
valuable primitive
39:06
here in combination with RabbitMQ,
39:09
but I think they're
39:09
more universal than that.
39:11
And I think there's
39:13
many, many related domains
39:16
and problems that
39:18
should be explored as well.
39:20
I'm not sure how relevant schema
39:22
evolution, for example,
39:23
here would be.
39:25
There are a lot of
39:25
problems and a lot of challenges
39:27
that are explored at scale
39:30
in the Kafka ecosystem, etc.,
39:32
and bring that more into
39:34
default with core Effect
39:36
I think would be super valuable.
39:38
So kudos to you for
39:39
already pioneering in that space.
39:43
I'm actually curious for the
39:44
events that you can publish
39:46
and consume through effect-messaging.
39:49
Are you already embracing
39:52
effect schemas for that?
39:53
I think the way we
39:55
describe events is with schema,
39:57
because we always use
39:58
schema for decoding everything
40:00
that comes from the outside world,
40:02
because we can't trust the outside world,
40:05
so we always decode everything,
40:08
everything that comes from the database.
40:10
We have a persistence response SQL, so we
40:13
use also Effect SQL,
40:15
but we decode with schemas,
40:17
and for messaging, we describe all the
40:22
events with schemas,
40:24
and make sure that we encode it and
40:26
decode it with schemas.
40:29
Got it.
40:30
Is the problem of schema evolution
40:32
already becoming an issue?
40:34
So you mentioned that you're not really
40:37
persisting the events
40:39
over a longer period of time,
40:40
but they're rather
40:41
like going onto the broker
40:42
until they're taken off, and that's it.
40:45
So the only schema evolution scenario
40:48
that I could think of
40:49
is that you have version
40:50
one of the service rolled out,
40:53
and then you're rolling out version two.
40:55
Somehow there's a period
40:57
of time where you still have
40:59
a backlog of many messages, which are
41:01
still of version one,
41:02
and now you've rolled
41:03
out version two of the app,
41:05
and now that expects
41:07
an event of version two,
41:09
but gets one of version one.
41:11
Have you faced that problem already,
41:13
and have you modeled around it?
41:16
Yeah, we already faced that problem,
41:18
and we're still a young company,
41:21
and we don't have millions of users,
41:23
so sometimes we take the risk to publish,
41:27
to do a breaking change,
41:28
because
41:29
we don't have a big use of message that
41:32
are being consumed,
41:33
and if we deploy a breaking change,
41:36
we have a very low
41:38
probability that we get an error
41:41
by breaking the schema.
41:43
If we really want to be careful,
41:45
what we do is we try to
41:47
avoid breaking changes,
41:49
and then we have, I think, two options.
41:51
Either we modify the existing
41:54
schema in a non-breaking way,
41:56
like for instance we
41:57
add a new optional field,
41:59
or we could just create a V2 or another
42:05
version of the event.
42:06
That makes perfect sense.
42:07
I'm just personally very interested in
42:09
that problem domain,
42:10
and so for example to say we just don't
42:14
do breaking changes,
42:15
I think that's a super valid way to go,
42:18
but I would like to get more
42:21
safety rails and guard rails
42:23
to make sure that that is actually done.
42:26
Maybe you're deep into some refactoring,
42:30
and you just have a type error over here,
42:33
and you jump to the schema
42:35
definition, you add something,
42:36
and you don't even think about it,
42:39
and TypeScript is
42:40
happy, the tests are passing,
42:42
and you do that
42:44
deployment on a Friday afternoon,
42:46
and poof, the weekend is ruined.
42:49
How do we get a little
42:50
bit more systematized help
42:53
that we say, "Hey, this is a schema,
42:55
and the schema doesn't
42:57
just exist in a vacuum,
42:59
but it exists in a chronological context,
43:03
and needs to be protected
43:06
with some special rules."
43:07
This is something that
43:08
I'm very curious about,
43:09
and I think it's
43:10
generally applicable to many,
43:12
many parts where you need a schema.
43:15
Obviously, to databases as well,
43:17
databases have their own
43:18
way of dealing with that,
43:20
but let's say you will have a little bit
43:22
of client-side storage
43:25
that you have a schema for
43:27
and you always test your app, or
43:30
rarely test your app
43:31
going from version 1 to version 2.
43:33
You test it from scratch in version 1
43:36
and from scratch in version 2,
43:38
but you rarely test those transitions.
43:41
This is just something
43:42
that I hope we get to explore
43:44
with effect schema as well.
43:47
That sounds super cool.
43:48
How ready is effect-messaging right now
43:51
if someone outside of Spiko says,
43:54
"Heck, I want to use that."
43:56
How ready for production is it?
43:58
Can people already use it?
44:00
I just want to rebound
44:02
on what you were saying,
44:03
because I think it's
44:04
also an interesting problem,
44:05
and then I answered your question about
44:07
the readiness of effect-messaging.
44:11
But avoiding breaking change
44:13
is something really important.
44:16
We discovered something called Optic
44:19
that can compare two
44:21
versions of an open API file
44:23
and that can prevent
44:26
breaking changes on open API specs.
44:29
I think I was really
44:30
happy to discover this
44:31
because in Effect you can
44:34
generate open API specs.
44:36
It's taken to the library.
44:39
Already we can profit off
44:42
the whole open API ecosystem,
44:44
including this tool.
44:46
It's a way to leverage the
44:49
existing tools in open API
44:50
to avoid breaking change.
44:52
I hope we can do this for
44:54
messaging in future as well.
44:57
To answer your questions
44:58
about effect-messaging,
45:02
I think we are probably the only company
45:05
using effect-messaging in production,
45:08
at least I don't know
45:09
any other companies who do.
45:12
But it's working fine for us.
45:16
It's production ready in the sense that
45:18
we are using it in production.
45:20
But of course, I think if
45:23
more people want to use it,
45:25
maybe we discover some
45:28
issues and it's open source.
45:29
so anyone can post
45:32
issues and contribute.
45:33
That is awesome.
45:34
It seems like you have a public roadmap
45:37
there laid out as well,
45:39
which I assume are ideas you
45:41
had along the way of thoughts
45:43
that it would be cool if at some point,
45:46
probably not promises that you're going
45:47
to ship those in the near future.
45:50
But that sounds very enticing.
45:52
It seems like you even considered
45:54
supporting other message brokers,
45:56
the one that we talked
45:57
about initially, Kafka,
45:58
NATS, Google PubSub, et cetera.
46:02
That is super interesting.
46:03
I think the vision is interesting.
46:05
Maybe I won't have time to implement.
46:08
Actually, I don't think I
46:09
will have time to implement this.
46:12
But it's open for everyone.
46:15
And if someone is interested
46:17
in writing a PubSub subscriber, PubSub publisher
46:21
I think I laid out a
46:24
very generic interface.
46:25
So it might be a good way to start.
46:30
But I see you already have one
46:32
contribution pending
46:33
from trusty GitHub Copilot
46:41
I launched the Copilot.
46:44
So I'm experimenting a
46:46
bit this week with agents
46:51
Yeah, so maybe let's use that as a segue
46:54
to talk about that topic specifically.
46:57
I mean, AI agents, coding agents, et
47:00
cetera, all the rage these days.
47:02
I'm spending a lot of time myself
47:05
exploring them, seeing
47:07
where they're good at,
47:08
where they're not yet good at, how can I
47:11
use them for my own benefits,
47:13
like for productivity reasons or just
47:17
quality of life improvements.
47:19
So I'm curious where you
47:20
found them most helpful,
47:22
and particularly also
47:23
in the context of Effect,
47:25
maybe areas where you found them to be
47:27
not great with Effect yet.
47:30
Good question
47:30
I can speak a bit about my
47:32
time with the agents.
47:33
So it's quite recent.
47:36
I was not a fan of Closo and not a fan of
47:40
AI until a few weeks ago,
47:43
a few months ago, I think,
47:45
because I didn't find it very productive.
47:49
Everything that was written
47:51
by the AI, I had to change it.
47:55
It was more a loss of time, I think, than
47:58
productivity benefits.
48:01
But after investing a bit of
48:03
time into these agents,
48:05
and I think good instructions.
48:09
So I've tested a few agents, a few things
48:13
like VS Code with Copilot, Closo,
48:18
and also like CLIs now, there was a
48:22
really interesting
48:23
project called opencode.
48:25
I don't know if you heard of it, but I
48:28
find it very interesting.
48:29
Actually, I start to see
48:31
some benefits using agents.
48:33
I mean, I don't delegate
48:36
everything to an agent,
48:38
but now it really helps
48:40
me to write code faster.
48:42
I read everything and I make sure that
48:44
it's written as I want it to be.
48:48
It comes with some
48:49
things way better than before,
48:52
because now with agents,
48:55
before doing an edit to a file,
48:57
it really researches a lot,
48:59
like it goes on the internet,
49:00
it fetches documentation.
49:02
So I set it up for the
49:04
Effect MCP for Effect docs.
49:07
I'm not sure it's very
49:08
often used by my agent,
49:10
but if the agent wants
49:12
to know more about Effect,
49:15
it has access to the
49:16
documentation, theoretically.
49:18
And now the fact that the agent is able
49:22
to grab a lot of context
49:24
from the code base from the internet,
49:27
it makes it really,
49:28
really better than before.
49:30
It's quite impressive now, I think.
49:33
Yeah, and I mean, it's worth keeping in
49:35
mind that this is
49:37
developing super quickly
49:39
and we're now recording
49:40
this at late August 2025.
49:43
If someone is watching this
49:45
like a couple of months later,
49:46
God knows what sort of AI
49:48
models are available by then.
49:51
And I'm pretty certain this is the worst
49:53
it's ever been as it is right now.
49:56
So things are developing and
49:58
improving very, very quickly.
50:00
And this is a very important topic to me
50:03
because I think it fundamentally changes
50:06
what programming means.
50:08
I hope that it will leverage us and
50:11
elevate us as system designers
50:14
to spend more time about trying to
50:17
understand the reality
50:19
and modeling the reality,
50:21
like expressing which parts of the
50:25
reality do we need to model
50:27
and which ones can we leave out.
50:30
Is it important to modelling that the
50:34
server that you're running this on
50:36
is like whatever, in a silver
50:39
casing or in a black casing?
50:40
No, that part of the
50:42
domain is not important.
50:43
But does it sit in that
50:46
one cluster or another?
50:47
You get the point.
50:48
And I think this is
50:49
more like modeling things,
50:51
expressing intent, that is
50:54
where I see things going.
50:56
And the act of implementation is probably
51:00
being taken away from us over time.
51:03
That's at least my
51:05
understanding of the future right now.
51:08
But I'm seeing it as glass half full
51:10
because what I see as the same as today
51:13
is that we're still looking for better
51:15
materials to build applications with.
51:18
And I'm convinced that AI is going to
51:21
have a very good time
51:23
building with Effect in the future
51:25
just because it is the best material to
51:28
build applications with.
51:30
But I think we still have a long way to
51:32
go to really help AIs
51:34
to be very good at working with Effect.
51:38
So you mentioned the Effect
51:39
MCP, that already helps a lot
51:41
and it will get a lot better
51:43
because we've recently
51:44
switched over the Effect docs search
51:48
to use a service and a
51:51
tool called Mixspread,
51:52
which does smart AI
51:55
indexing and retrieval.
51:57
So if you now look for interruption,
52:00
you actually now should
52:01
get a much more useful result
52:03
and we're going to wire up the same thing
52:04
for the Effect MCP as well.
52:07
So that will mean that if an AI needs to
52:10
look up interruption,
52:11
it gets better context. So
52:13
that's going to help a lot.
52:14
But the other thing
52:15
that AI really relies on,
52:18
delivering good results is that it's
52:20
trained on various little snippets
52:23
and examples similar to us humans.
52:26
Some of us are going to go to the source
52:28
and read the source code
52:30
and apply a lot of mental horsepower to
52:32
figuring out how
52:34
something should be used.
52:35
But I think the majority much rather
52:38
prefers to look for an example,
52:40
like how can I use Effect
52:41
Schema? How can I use Effect HTTP?
52:43
Or how can I use effect-messaging instead
52:46
of reading the source,
52:47
reading an example,
52:48
trusting that is correct
52:50
and then kind of like transfer applying
52:53
that on your own domain.
52:54
And this is where we still have a long
52:56
way to go to like cover all the API
52:59
use cases of Effect and
53:00
helping the coding agent,
53:02
giving it more training
53:03
material. And once we have that,
53:05
I expect a huge uptick in
53:08
how good the results are
53:10
that we're getting from
53:11
coding agents for Effect.
53:12
So that's something I'm
53:13
keeping a close eye on
53:15
and expect to see a lot of improvements
53:19
there in the future.
53:20
So as a last topic,
53:22
we can look back on many
53:24
years of Effect getting better,
53:26
but it's barely getting started. What are
53:29
you looking forward most
53:30
to in the future of Effect?
53:32
Okay. It's a good question. So first, I'm
53:35
excited to know that the
53:37
team is working on the V4.
53:39
I'm not sure what impact it will have
53:42
for us, but I'm excited.
53:44
I understand that it will have like
53:46
performance benefits.
53:48
I'm also excited to
53:50
try out the Effect AI.
53:53
So we were talking about about AI for
53:56
productivity with agents.
53:59
But I think we could also use AI for
54:03
application stuff like for automating
54:06
stuff in our business.
54:07
For instance, I give you a very simple
54:09
example, but when an investor wants to
54:14
withdraw
54:14
money from the platform,
54:17
he fills his bank number and
54:20
he has to send us a PDF or something from
54:24
a document from the bank to
54:26
justify that the correct number.
54:28
And at the moment, we have to
54:30
verify each document manually.
54:33
And this is something we
54:35
could automate with AI.
54:37
So in the future, we could, for instance,
54:40
have a service that calls an LLM sending
54:43
the bank account to check with the PDF.
54:46
And we could ask for a structured
54:49
response, like yes or
54:51
no, how confident are you?
54:53
And based on this response, we could take
54:56
a decision and programmatically validate
54:59
all of the bank accounts.
55:00
I mean, I'd highly
55:02
recommend you giving it a try.
55:04
I've used the Effect AI package for very
55:07
similar things myself.
55:09
I've built a little invoicing system for
55:12
myself that I use when I work with other
55:15
people or send out invoices myself.
55:18
I've used the Effect AI package,
55:20
particularly for that use case.
55:22
And it just worked first try.
55:25
So it is incredible
55:26
what is possible with that.
55:28
It's nowhere comparable to the amount of
55:31
effort it takes to build
55:32
effect-messaging from scratch.
55:34
But this will be a thing.
55:36
You'll be done after 15 minutes and it's
55:39
going to significantly improve the
55:42
capabilities of your products.
55:44
So don't sleep on that.
55:45
Yeah, definitely.
55:46
And actually, I think it's
55:48
a big shift of mindset also.
55:50
And I think I didn't realize it until a few
55:54
weeks ago, actually.
55:56
the way I was interacting with
55:57
LLM so far was just sending texts,
56:00
receiving texts, but
56:02
not structured texts.
56:03
Not texts I could decide to put in my
56:06
code and do an if-else on the results.
56:10
But here it's completely different.
56:12
It's a very shift of mindset.
56:15
And I think it's a
56:16
revolution for programming.
56:19
Most certainly.
56:20
Well, I'm looking forward to the next
56:22
time we have a chat to hear more about
56:24
how you're leveraging the AI packages of
56:27
Effect to ship new features.
56:29
But Samuel, I want to thank you for
56:32
taking the time and
56:34
sharing your entire journey here.
56:37
What you're building at
56:38
Spiko sounds super, super cool.
56:40
So it seems like you all are hiring.
56:43
So if you're based in Paris or want to
56:46
move to Paris, I think Spiko is probably
56:48
an interesting company
56:49
to consider applying at.
56:52
And yeah, also huge congrats on all the
56:56
milestones you've reached recently on
56:58
shipping effect-messaging.
56:59
I hope that a lot more folks are using
57:03
messaging patterns like that.
57:05
I think it's a wonderful fit with Effect.
57:08
And thank you for coming on the show.
57:11
Thank you so much as well.
57:12
It's a real pleasure for me to
57:15
participate in the podcast and also to be
57:18
part of the community.
57:20
So I want to thank you as well.
57:22
Perfect. Salut.
57:25
Salut.
57:26
Thank you for listening to the
57:27
Cause & Effect Podcast.
57:29
If you've enjoyed this episode, please
57:31
subscribe, leave a review
57:32
and share it with your friends.
57:34
If you haven't done so already, you can
57:36
join our Discord community.
57:38
And if you have any questions, feedback
57:40
or suggestions about this episode or
57:42
about Effect in general,
57:44
don't hesitate to get in touch.
57:46
See you in the next episode.