Video summary
Andrew Connell introduces Microsoft Teams Toolkit as a comprehensive suite designed to streamline the development of Teams applications, encompassing command-line interfaces, Visual Studio Code extensions, project templates, and utility packages. The toolkit manages the entire project lifecycle, from creation and deployment to provisioning and publishing, primarily through its CLI which was formerly known as Teams FX. Although there are upcoming changes regarding the CLI package name, current workflows remain largely unaffected. The core of the development process relies on a full-stack approach utilizing Microsoft Graph APIs rather than Power Platform tools, allowing developers to build tabs, bots, message extensions, and Copilot agents directly within Visual Studio Code using various templates.
The technical architecture of a Teams app built with this toolkit typically consists of a React single-page application frontend running locally and an Azure Functions backend, orchestrated by processes that automatically handle dependency installation and recompilation. A critical aspect of the workflow involves signing into Microsoft Entra ID to automatically provision necessary resources via Bicep scripts stored in an infrastructure folder, while also pre-consenting the app for Single Sign-On across various Microsoft clients. The toolkit automates these complex setup tasks through key configuration files like `teamsapp.yaml` and `manifest.json`, enabling developers to sideload apps into their personal Teams instances for immediate testing and debugging without needing a production Azure subscription during the initial creation phase.
When it comes to deployment and hosting, the default infrastructure templates utilize Azure Static Web Apps to host client-side files alongside serverless components like Function Apps, though users have the flexibility to customize these options using `Azure.bicep` files to opt for Container Apps or App Services if preferred. The presenter strongly advocates against relying on SharePoint Framework web parts as tabs due to frequent connectivity issues between SharePoint Online and Teams, especially on mobile devices, recommending instead a standalone React SPA that offers greater stability across both platforms. Production publishing is handled by the underlying CLI, which can be seamlessly integrated into CI/CD pipelines such as GitHub Actions or Azure DevOps, ensuring that authentication relies consistently on Entra ID throughout the process.
The session concludes by highlighting the toolkit's ability to manage multiple sign-ins for distinct Microsoft 365 and Azure tenants, allowing developers to create apps in an isolated developer environment while provisioning real resources in a paid production tenant. This separation is particularly useful for training scenarios where instructors can demonstrate app functionality without consuming expensive licenses or subscriptions unnecessarily. Beyond the technical capabilities, the webinar serves as an educational resource rather than a sales pitch, with announcements made for upcoming webinars and an eight-week accelerator cohort starting in mid-April that will provide live classes, office hours, and additional resources to support continued learning and development.
Read the full video transcript
[Music]
Hello everybody and welcome to my
webinar today. Uh really happy to have
everyone joining us uh from wherever
you're connecting around the world um
for to learn more about how to uh get
started with uh Microsoft Teams and how
to start building apps for Microsoft
Teams. Um, primarily though, we're going
to focus on the tooling that's available
to you uh to create Microsoft Teams
apps. So, I'm going to walk through a
bunch of the tooling um that we have and
give you kind of a lay of the land of
like, hey, I want to build a Teams app.
I'm a developer. Where do I get started?
Um, before we kind of get dive into
this, I want to kind of explain a couple
uh things uh to kind of help you get
around the webinar and make sure that
you get the most out of this. Um, I
guess first and and foremost, if
somebody wouldn't mind uh just giving me
a little reaction uh in the chat to let
me know that you can both see me and you
can hear me uh as part of the webinar.
Um, obviously if that's not happening, I
got something I got to deal with, but I
just like to know if you can Oh, see and
hear me. Awesome. Thank you very much,
uh, Steve. Um, okay. So, in this
webinar, um, I want please feel free to
ask as many questions as you like. Drop
those in the Q&A panel. Um, I've got
more than enough time uh to answer any
of your questions here um in the uh in
during our uh the time that we have
allocated for this webinar. Um I've got
it set on the calendar for 90 minutes.
Um I have 90 minutes to spend with you
uh about talking about teams. Um but you
will absolutely see uh you'll actually
get answers to all of your questions. Um
I probably have a little bit less than
an hour of content. Um maybe even less
than that. This is very much kind of an
intro thing. Um, so we have more than
enough time uh to do your um uh to do
questions. Um, so what you should see on
the screen right now, I see a couple
people in the chat. Um, is just me and
like a picture and picture off to the
side um of my uh uh of the slide here.
Um, I can go full screen on the slide.
That's what oop, that's not the right
one. Um, this is full screen on the
slide and then I can also go full screen
on me as well. Uh, but for now I'm just
going to kind of leave it over here to
the side. You should see a couple
different experiences there. Um, another
thing too, take a minute, let me know
where you're where you're connecting
from. Go in the chat, drop a message in,
introduce yourself, uh, let me know
where you're where you're connecting
from. I can see Austin, you are in also
in northeast uh, Florida. You're about
an hour and a half away from me, I think
it is, over in Lake City. Um, I'm about
30 minutes south of I 10. Um, I'm
actually right between Jacksonville and
St. Augustine. And then I'd shoot
straight over to uh uh go straight west
over to Lake City. Um Steve from North
Carolina. Awesome. Steve, where are you
in North Carolina? Uh my family spent a
whole lot of time in western North
Carolina uh as um I got friends and
family and up in uh uh Asheville uh who
were affected by that hurricane uh last
year. Uh Greenville. Cool. Awesome. All
right. Um I see more people are
connected, so let me know where you're
connecting from. I'd love to hear it.
All right. So, let's go ahead and let's
get started. I want to give you uh well,
let's let's go and get started instead
of doing any more of that preamble here.
So, really quick, my name is Andrew
Connell. Um I am a longtime SharePoint
uh developer. I spend a lot of time in
the Microsoft 365 space. Uh these days I
spend most of my time balancing between
SharePoint framework development uh
where I have classes and I teach on that
uh Microsoft Teams app development which
we're talking about today. Um I do some
stuff with SharePoint embedded. I worked
with Microsoft early on uh for creating
a bunch of content learning content
around uh SharePoint embedded. Um let me
know if you're interested in seeing a
webinar on that. That's something else
I'd love to talk about. Um these days
I'm spending a lot of time in extending
Microsoft copilot so using declarative
agents um or custom engine agents and
it's something that I talked about in
one of my previous webinars. Um with
that being said too if you want to learn
about all the other webinars that I'm
doing I'm trying to spend a lot more
time doing these free webinars um going
forward. So I've got I think three or
four of them scheduled uh in the month
of April. Um, I did one or two of them
in March, but I've got some that are
going to be planned out and be published
pretty soon, uh, for May and June and
July. So, um, I've got ideas on what I
want to what I want to cover in the
webinars. I'd love to know what you want
to see and what you want to hear. Um, as
well, uh, and it's anything around like
Microsoft 365 developmentbased topics.
Um, I have a company named uh, Vitanos
where my mission is to help you be the
indispensable expert at the Microsoft
365 ecosystem from a web development
point of view or I say full stack
developer. Microsoft says professional
code or pro code or code first. I don't
like that because it kind of implies
that people who are just getting into
this, it's not, you're not welcome and
that's not the case. Uh full stack is
basically I do client side stuff and I
do server side stuff to implement my
client side stuff. So I could do the
full stack. I could do a database, I
could do message cues, I could do um
authentication, uh storage, you name it.
Okay, so that's a little bit about me.
Um you can see some contact info over
there on the lefth hand side. Um I'm
most active on uh Blue Sky, LinkedIn,
and on my YouTube channel. Um, there's
other places that I'm active on social
media as well, but that's really where
I'm try I'm spending most of my time uh
these days is in Blue Sky and LinkedIn
for like long form and short form
content uh and then also on YouTube uh
for uh my different videos. All right,
so what are we going to cover today? So,
I want to talk about what the team's
toolkit is. And we're in a weird time
right now because I uh it it and I'll
get to it in just a little bit. Um
because you're going to see some stuff
that when I get to my first little like
demo I want to show you that Microsoft
sure seems to be implying that something
is going to change pretty soon.
But don't worry about it. I really think
that this is still going to be very very
applicable not just today but also going
into the future as well. uh because I
don't see fundamentally stuff is really
going to change all that much. Again, we
don't know until they actually really
follow through and do and make this
change that they've kind of alluded to,
but I'll get to that in just a little
bit. So, what are we going to cover?
Well, the team's toolkit, a lot of
people think that the team's toolkit is
just this Visual Studio uh code, this VS
Code extension that we have for VS Code.
That's not true. The Teams toolkit is
actually a suite of a whole bunch of
stuff. It involves a command line
interface uh utility. It has an
extension for uh VS Code. Uh there's an
extension for Visual Studio that doesn't
have as many features as we have in the
VS Code one. It's a suite of project
templates and samples and utility
packages. It's a whole bunch of stuff,
right? So, I'm going to look at each one
of some of the each one of these things
and I'm going to go over them in uh
various degrees of depth so that you can
have a good idea of what's available to
us and what you would use um inside of
your projects. I'm going to spend most
of my time really on those first two
things. I'll talk about uh the project
templates and the utility packages, but
I really I I find that there's a lot of
stuff that we have inside of a Teams
toolkit project. And so I want to give
you a tour of the project and kind of
help you understand what you're going to
what you can um uh look forward to. Um
these tools are always being refreshed
too. Microsoft has almost a monthly
cadence of how often they're updating
these and the March update that that
shipped uh about a week and a half ago,
maybe two weeks ago. Um jam-packed with
a ton of improvements uh and things. I
haven't had a chance to check out all of
it, but if we have time today, I'll
actually uh call out some of those
things. Okay, hope that sounds good. Uh,
if there's something you want to see,
you got a question, like I said, drop it
in the Q&A panel. Um, I'm again, I will
try to answer questions as we go along,
but if I see a question that I'm going
to get to it later, I may just hold it
until then. Uh, and worst case, we'll
answer questions at the very end. Tons
of time for questions. And I have two
slides on this. Don't know why I did
that. Okay, I want to start by first
focusing on what is the team's toolkit
command line interface. This is the this
is like the big like the cornerstone of
everything related to uh the team's
toolkit and what the visual studio code
extension uh is going to leverage quite
significantly. So what the CLI is um
this used to be known as uh teams FX. So
all of this teams toolkit stuff it used
to be called teams FX. Um, and as a just
a little footnote to this too, if you
are ever curious how they've done any of
this stuff, one of the coolest things
about what the team's development uh
team has done is all of this is done in
one public GitHub repository. It's all
open. So, you can look at all the source
code for all these packages I'm going to
talk about. You can look at the the
source code for the CLI. You could look
at the the source code for the Visual
Studio extension and a whole lot more
stuff that they use to facilitate all of
this. So, uh, it's a great it's a it's a
public GitHub repo that you can take a
look
at. Um, the CLI, as I said, it was it
was initially called Teams FX for the
Teams framework, and it was renamed, I
think it was about a year ago, maybe a
year and a half or two years ago, to the
Teams toolkit CLI. So, what is this?
This is going to allow you to work from
a command line interface to create and
manage and do some changes to your
Teamsbased projects. And it also allows
you to do some stuff that's going to
help you like clean up some stuff um as
well. Now, um all of these commands you
see here, what I've done is I've
installed it and I went through and just
said I said just CLI or Teams app
space-h for help and I just said dump
out everything that you can do. And I
took this screenshot. The way you're
going to get this project is you're
going to get it through the in or this
utility is through the npm um uh the
npmjs registry. So if you go to
npmjs.com/package
uh
microsoftsapp-cli and you install this
globally on your machine, this is going
to have the command line interface uh
installed for you that that you can take
a look at. All right. Now, what's cool
about
this what's cool about this thing is
that, like I said, it's gonna allow you
to do a lot of stuff from the command
line interface. Now, what one of the
things I love about this is that you
will see in just a minute when we get
into the actual projects is that this
utility is going to make like CIN CD and
um uh the CINCD story of like comm uh
continuous integration and continuous
deployment really really clean and
really easy. Um, if you are a and
actually by a show of hands if you just
wouldn't or by a show of give me thumbs
up. How many of you are SharePoint
framework uh developers and you've
worked with the SharePoint framework for
a little while so you understand like
things like um uh like how we have like
the Gulp bundle and Gulp build and the
whole tool chain. I tell you I'm a
SharePoint framework person. I've been
the SharePoint framework person since
before they released it. Um and helping
Microsoft uh build the learning content
around it. But oh my goodness, it is
like I love what they've done with teams
and I really wish that the team the
SharePoint framework team would like
scrap their entire build tool chain and
adopt what the team's uh toolkit has
done and just kind of we use the teams
toolkit to create uh SharePoint
framework projects. Uh some of you may
be like wait a minute I thought there
was a way to create a SharePoint
framework web part as a tab inside of
the Teams toolkit visual studio code.
there is, but it still uses that whole
Yman generator story and that's uh it's
a little challenging there. So, um at
any rate, so anyway, you would install
the CLI and from here is where you can
do a whole lot of stuff with your
project. So, we can see things like um
we can add features uh to our to our
team's project. So, I can do let me get
my little pointer out here. So I can add
uh add um new features to my team's
application that I've deployed uh to uh
my team's um uh like my
team's to my team's tenant uh for my
organization. Um you can see where you
can go through and manage your different
authentication accounts. Uh you can also
manage the life cycle. We're going to
look at this a lot when we get into our
project. There's a life cycle for
deploy. There's one for uh provision.
And then there's also one for publish.
Um, also, you know, when you create a
lot of like test projects in your
developer environment and you need to
kind you want to go through and clean
all those out and delete stuff and it
usually means like, you know, if you're
in the SharePoint framework, I'm going
to end up having to go like remove the
web part from a page and then I have to
go uninstall the app that I installed
and then go to the app catalog and um
undeploy that and then remove it. And
then if I did some other stuff like
special peri done permissions, I have to
go remove a permission from API center.
Well, they have this great option that
we have now in Teams where it's
uninstall, which that says, "Hey, if you
run this from the root of the project on
your machine, it'll go clean everything
out for you. It'll undo everything,
which is really, really, really handy."
All right. Um, there's also this
validate command here. That's This is
good for if I want to validate uh a
couple different things inside of my
Teams app. So, if I wanted if I have
like my team's manifest, I want to make
sure that the JSON file for my team's
manifest is um uh is valid. It's one of
those things that I I can run the
validate command and it'll go through
and do this. Although, this is one of
the things that happens uh when I do my
uh when I do my build. Um okay, great.
So, this this is the Teams toolkit CLI.
Why don't I jump over to a a demo here
to where we can take a look at this? And
oh, this is not what I wanted to show
you. So, let me go ahead and let's close
All right. So, this is what I wanted to
show you. Okay. So, if I come over here
into the um into my console now, I'm
running on a Mac, but don't worry,
everything is exact same if you're on
Windows. Well, I mean, you have more
reboots and and blue screens than I do,
but that's neither here nor there. Um, I
already have the Teams toolkit
installed. So, I can say npm list
G, excuse me. And you can see that I
have the teams teams app CLI uh
installed and this is the most recent
version of it
3.0.10. Now, now's for the
little Easter egg part of this webinar.
Watch this. If I say, let's go bigger
here. If I go teams
app-help and I run
this, you see the same thing we saw just
a minute ago. But if I scroll up a
little bit, you're going to see this big
yellow message. And what does it say? It
says deprecation warning. Rut row. The
CLI package and its command uh are being
renamed in the upcoming release. Which
one? I don't know. It just says the uh
the existing package will no longer
receive updates. Please switch to the
new package and update your workflows
accordingly once it's
available. Well, here's what I can tell
you. And I have to be a little cagey
with this because they haven't said
anything publicly about
it.
Um, let me just let's see. Let's let's
say let me say it like this. And if you
have a question about it, go ahead and
ask the question and I'll do my best to
answer it. But the Microsoft's MVP
summit was last week in Redmond when
that's an event where MVPs I'm an MVP um
all we all get together and we listen to
a whole bunch of stuff. But the entire
event is all event is all wrapped up in
uh a non-disclosure agreement. So I
can't share with you stuff that I heard
um until Microsoft discloses different
things. So I can't say anything. Um when
I saw this message uh relatively
recently uh in in the CLI, I was like,
"Oh, I know what this is, but I can't go
any further than what they're saying
here." So let me just say it like this.
Everything that I'm going to show you
today, I do not expect anything is
really going to be different once this
uh what do they call it?
Um this being renamed in an upcoming
release. Okay. I don't expect anything
to be really all that different. Maybe
the fact that it's called Teams app CLI
and Teams app. Well, they just said in
in the message here it says it's going
to be renamed. So maybe it's just going
to be a renaming. I don't expect to see
that much more. Maybe there's be some
stuff I don't see that much more that's
going to change that's really going to
impact us. Okay. Uh now there is nothing
to switch to at this time. So you don't
have to go look and say well why are we
looking at this thing if it says please
switch to the new package and update
your workflows accordingly. I I I mean I
can't do it because it's not available
yet. And it says once it's available. So
they could have worded this a little bit
better I think. But regardless
um I just want to make sure that you're
aware of this. I just don't think that's
going to have a profound impact on
anything that I'm showing you today. All
right.
Um, you can read between the you can
read between the lines. I don't want to
go much further than that, but if you
have a question about it, please go
through and post it um in the chat. Um,
so this is how you would actually get to
the team CLI. Now, I I want you just to
the only thing we're going to really
focus on with the team CLI here is I
just want you to think about for for a
moment. I just want you to think about
things like publish or provision or
uh deploy. I want you just to think
about some of those things. Okay? Just
want you to think about that for right
now because the next thing we're going
to talk about is going to leverage some
of the commands in this and you'll
understand how it comes together in just
a few minutes. We're going to spend more
time with the with the U Visual Studio
Code um extension. So, with that, let me
let me jump back over to my slides.
Um, and let's jump into the next thing
that I want to cover here, which is the
big thing, which is the Teams Toolkit
extension for Visual Studio Code. So,
what is this? The Teams toolkit
extension for VS Code is something
you're going to get if you go to the uh
VS Code and I'll show you where you can
get this in a bit, but if you go into VS
Code and
um uh and you um
uh where I'll show you how where you can
get it, how you can install it. I've
already got mine installed. Um, this
link right here will take you to the
marketplace, uh, the VS Code, uh, the
Visual Studio Code or Visual Studio
marketplace where you can install the
extension. It's totally free. Doesn't
cost a thing, uh, to install it. We're
going to see it in just a minute. The
reason I grabbed this picture uh, is
that I want you to see about see like
all the stuff that you can end up doing
with the Teams toolkit. Um, there are
parts of it that I love, there's parts
of it that I don't like. Um, but and
I'll be a little opinionated on some of
it. I'll make sure that's really clear.
But for the most part here, you're going
to start on this left-hand side where
you're going to either create a brand
new project or you can start from a
template using one of the samples. So
once you create your project, then
you're going to go about creating your
app. You're going to start doing
whatever it is. If you're building an
app, if you're building a web part, if
you're building an extension, we're
going to do all of that. I looked at the
questions that those of you who
registered for this webinar um the
questions that you submitted ahead of
time and um I didn't get many questions.
A little disappointing, but the is I
want to make sure this webinar covered
all of your questions. But the the ones
that I saw was like one person was uh
one person or a bunch of people said, "I
need to build an app and I need to
understand how to go about doing this
and what the tooling is all about."
Well, I'm going to at least get you
started with that, but you're not going
to learn how to build everything about
the app. At the end of this webinar, I
have I'll talk about another webinar uh
that I have next week that you can
register. It's also a free webinar um to
where I'm going to go over in a lot more
depth of all the things you can build
and what kinds of scenarios you can
unlock uh for Microsoft Teams um apps.
Um, another question that came in too is
someone said, "Well, how does all this
stuff fit together uh about, you know,
between like Microsoft Graph, uh,
between um, uh, Power FX, uh, just you
name it. And the essentially the way
that this worked when you and I'm going
to I'll cover a little bit more of that
in my webinar next week. But just to
answer that one question that I saw come
up two or three times from some of you
the it is not at all so directly the
piece that you asked. It's not at all
related to Power FX that is all part of
Power Platform and there is no kind of
like overlap between building apps as
I'm showing you here and building apps
using Power Platform, okay? Or building
Power Apps or Power Automate or anything
like that. Um, I'm not saying there's
ways that you can like build one that
leverages another or vice versa, but we
would not use Power FX uh inside of a
Teams app. When you're building a Teams
app with with uh Visual Studio Code,
you're doing what Microsoft calls the
full stack or the or sorry, what I call
the full stack or Microsoft calls the
code first or the procode story.
um that is what I mean by that is that
this is you're building a web
application that you are going to deploy
and host somewhere and you're simply
going to make teams aware of your
application and how it extends teams. So
for example I'm going to build a tab and
that tab is going to be just a a web app
that's running inside of of an iframe.
That's all a tab is in teams. It's just
an iframe and when you click on the
different tabs it simply is loading
different iframes. What do I want to go
in that iframe? That's my web app that I
create. Traditionally, it's going to be
a single page
application. If I build a message
extension or if I build a web a a bot,
those are going to be leveraging uh web
services. So, when users communicate
with my bot or my message extension that
will be that will have from the teams
client, the message is going to be sent
to uh Microsoft Teams. Teams is going to
send that to something called the Azure
AI bot service, which will then redirect
the request uh to wherever my web
service is running, either on my local
laptop or when I'm doing development or
when I'm uh in uh like some other
service that's hosted uh when I'm
working in production or shared
development or test environment. I'm
going to talk more about that kind of
stuff next week, but that's just the
gist of where things come together. the
entire team's API that you end up
working with, there's a client side API
and then the entire server side REST API
is all in Microsoft Graph. So, it's a
little different from SharePoint where
those of you who are old school
SharePoint developers or SharePoint
framework developers, we had a
SharePoint REST API and today we can
still get data and interact with the
SharePoint REST API for example from the
SharePoint framework. But when we're
working in the context of um uh the
SharePoint framework, we also can get
not all endpoints but most of the
endpoints we for SharePoint we can also
get to through Microsoft Graph. Teams is
different. Teams is different because
Microsoft Graph came after the
SharePoint REST API came out. So that's
why we kind of have two ways to do it
and graph is just like a proxy to get to
the SharePoint REST API. When it comes
to Teams though, Teams came after Graph.
So everything you do with teams, you do
it through the graph endpoint. And
there's generally an endpoint called
graph.microsoft.com/ and they call it
the teamwork endpoint. Although it
really there's lots of different
endpoints, but teamwork usually falls
under the the umbrella of it's related
to Microsoft Teams. So you got things
like online meetings that's part of
teams. Okay. So anyway here, what is
this whole like life cycle that we're
doing here? Well, I or what are we doing
with the visual studio code extension?
So here we're going to build our
application. We're going to develop it.
Uh and before we're ready to debug it, I
want to go through and um I want to go
through and like you know edit the
manifest and tell Microsoft Teams what
is what kind of things do I have inside
of this app? As I said a minute ago, do
I have a tab? What kind of a tab is it?
Is it a personal app? a tab in a
personal app or those are the things I
can pin on that lefth hand rail in teams
or is it a tab that's going to run
inside of a group chat or inside of a t
a channel with inside of a team um or is
it a message extension and if it is what
is the ID of the message extension
that's registered with the Azure uh AI
bot service so that teams and the Azure
I bot service knows where my web service
is. Um is it a bot? it works the exact
same way as a message extension or as
I've covered in another webinar is it a
declarative agent where I want to um
extend and create a custom agent for
Microsoft 365 copilot the manifest file
in teams is essentially the router it's
the it just tells teams what can this
thing do and this file which we'll look
at in a minute that is just a JSON file
inside of our project so that's where
we're going to add all these different
capabilities of things that we can do
inside of uh inside of our Teams app.
Now, inside the Visual Studio Code
extension, I'm probably going to want
most likely uh going to want to sign in
to my Microsoft 365 tenant. And the
reason I do this is because when I do
the whole F5 experience in the Teams
toolkit, it that's how it's going to
upload my package and upload my app and
deploy it to my team's uh tenant for
sideloading for me to be able to test it
and develop it and play with and play
with it.
Um, now furthermore, when I want to go
through and do some stuff, uh, I want to
go uh provision my app and I want to go
do more than just that, um, I'm going to
want to provision it inside of, uh,
Azure or that's I can provision
provision inside of Azure. Now, when it
comes to the team's toolkit, all of
their templates and everything in the
toolkit assumes that you're using Azure
for all of your
stuff when it really boils down to it.
And Microsoft doesn't really say this in
their documentation. It's not it's not
as clear, but it really when it really
what it really boils down to is that
Microsoft uh Teams does not care where
your app runs. I have a customer that is
a Java shop that everything runs inside
of AWS, Amazon Web Services. There is
only one resource that you have to have
on the Microsoft side uh for your team's
app to work and that is an app
registration inside of Microsoft intra
ID. Now a lot of people think that's a
part of Azure. It's not. Um it's kind of
like intra sits up above both 365 and
Azure and there's a trust relationship
with intra. So uh I have to have an app
registration inside of intra because
teams trusts intra. So that's how code
from outside of Azure or even inside of
Azure can authenticate with intra uh and
it knows that it can trust teams and so
there's that trust relationship. So you
will have to have an intra ID app.
Doesn't cost anything. It's 100% free.
You don't have to worry about that. In
fact, you already have an intra ID
tenant when you create a Microsoft 365
tenant um because that's where all the
users and groups are going to be
stored. Um the only other kind of a
resource you may have to create inside
of Intra is if you're doing a bot or a
message extension uh because uh those
things are uh leveraging the Azure AI
bot service for the communication
routing. Teams never talks directly to
our web service. Teams talks to the
Azure AI bot service that handles the
communication to and from our uh our web
service and then it route it once it we
get a it gets a response back from our
web service it knows how to send it back
to teams so that the message gets back
to the correct conversation or to the
correct user or if the user is online on
both the desktop client the web client
maybe their tablet maybe their phone uh
they have the the message gets routed to
all of those different clients that
they're logged into uh with inside of
teams. Um for that you then you can then
uh to make it easy for the provisioning
if you're using Azure you can also sign
into Azure inside the Visual Studio Code
uh extension and what that will do is
that when you hit the F5 experience it
will do things like automatically create
the intra ID app um it'll create other
cloud resources that are necessary when
you go to maybe say do your deployment
for pieces it'll go through and it'll
deploy your Azure function if you have a
serverside API it'll go and deploy your
Azure function resource it will create
uh the Azure AI bot service registration
uh for your bot. Um so it really greatly
simplifies a lot of that stuff for you.
And then finally you can then publish
your app over to team. So once
everything has been provisioned and
everything is up and running inside the
cloud you can then publish your app. And
the process of publishing your app is
going to uh make it available to
everybody else in your organization uh
for installation and use within their
their um uh within their own team uh
their own team or on their own personal
as a as a personal app. Now um that's
not entirely necessary. That's totally
up to you. Um and furthermore, there are
things related to like the publishing
process. There's a whole there's a story
uh that you could have if you wanted to
create an app and you wanted to put it
in the public marketplace. That's
Microsoft's uh app source uh and you
could up you could deploy it to app
source and you could even set up a um uh
an offer associated with it and just
like people build apps for like iPhone
or Android, you could do the exact same
thing with your team's app and app
source and people could buy your app and
uh after Microsoft has validated it.
same kind of concept we do with all the
mobile platforms. Um they review your
code, they review your offer, they make
sure you make meet certain requirements.
Uh and then uh and they keep I think
it's like 20% or 30% of the revenue that
they receive from the app and then the
rest of it gets transferred um over to
your bank account. So you there's
actually a way that you can make money
on on building and selling Teams apps uh
through the public marketplace. Um, I
have a whole like discussion on that
that I think is a great opportunity,
too, because you get a whole like
salesforce uh uh or sales team uh
without even paying for it. So, that's
different. We'll talk about that a
little bit
later. Um, okay. So, let's take a look
at at the VS Code extension and what we
can and what we can do with this. So,
I'm going to jump back over to my
console here or back over to my uh
machine on my uh my workstation and
let's go create our first Teams app and
like see this guy running. So, what I
have here in in Visual Studio Code, I've
already got the Teams toolkit installed.
Now, if you don't have it installed, all
you do is go to the extensions um I
don't know what this thing is. Let's
just call it the left rail. You go to
the extensions rail inside of the Teams
toolkit and just do a search for Teams
toolkit. And if you haven't installed
it, you'll see how these other things I
don't have installed will be listed. And
here I have I already have it installed,
but when you select it, just like if you
select any of these other ones, it'll
take you to the page in the um in the
Visual Studio Code uh marketplace where
you can learn more about this um about
this extension and all this stuff. So
this is you can see that I'm running the
latest one that came out on Monday uh
which is I think when that deprecation
message showed up. So you know we're
just two days and looking at the brand
new one here um that you can take a look
at. actually last updated yesterday.
Wow, we are hot off the presses. 6:00 p
p.m. I wonder if that's uh UTC or
Pacific time or my local time. So 6
let's say say it's 6 p.m. my time. So
I'm Eastern time zone. So uh that's um
Wow, that's really current. Um okay, so
that makes me a little scared. I've I've
only used it one or two times since
then. So uh got to love it when things
update. Got to love the cloud stuff when
you're presenting. All right. So once
this is installed, what does it do? What
it does is it in it adds in this new tab
on your in Visual Studio Code. Now this
is going to seem a little meta. I don't
like how they do this, but it is what it
is. I'm just the messenger here. So when
I select the Teams
toolkit, when I select the Teams
toolkit, you're going to see I get a
couple different options here. So they
have these guided tutorials they've set
up here. I'm your guide. You don't need
those buttons. You've got you've got
Andrew Guide. So, I'm going to select
create a new app. And what that
essentially does is that's going to walk
me through this wizard-based experience
of what do you want to create. So, we
have all these different options here.
And then it even has one to say, hey, I
can start uh talking to to GitHub
Copilot uh to uh uh figure out what I
want to create. It can help me create my
app. Um that's brand new and it's in
preview. And so, I don't want to do a
preview thing with you. I want to do
something that I think I see most people
building and that is I want to build a
web app. I want to build a tab. Just
like in SharePoint, we want to build a
web part. I want to build a tab. Kind of
surprised nobody's asked the question,
would you use the SharePoint framework
to build a tab in Teams or would you do
it the way I'm showing you here?
Somebody has that question. Make sure
you post that in the chat so we can
cover that towards the end is I have a
I'm very opinionated on that. Um, but
you can see the other options here.
There's the bot option right there.
There's a message extension. We can even
create an Office addin. Interesting. So,
let's go through and let's pick and we
can also create the two different types
of agents for Microsoft 365 Copilot. I'm
going to start by creating a tab. So,
I'm going to choose tab. And now I start
getting all these different questions.
So, you can say I can create a
dashboard. I can create a basic tab.
That's really slim down. Um, I can use I
can use the SharePoint framework to
create my
tab. Slight tangent. I hate this option.
It's not a good option. and I will talk
I can talk about it if you're interested
if you're starting from the team's
toolkit that's not the way you want to
start even if you have SharePoint
framework experience and I will I can
explain why if someone asks a question
um in the
chat this is the option that I like to
start with the basic or so the react
with fluent UI so this is going to give
me a working app and a great thing to
start from to show you guys but this is
also what I start like 90% of my tab
projects I start with the react with
fluent UI uh project and I uh will worst
case I just start deleting some stuff
out of it and cleaning it out. The thing
I like about it too is it's already got
single sign on um already set up and
configured which is a good and a bad
thing. It's good that it's all done
because there's a lot of pieces you have
to do, but it's bad because it does it
all for you. And so if something breaks,
it's really hard to understand how do I
fix that? How do I how do I troubleshoot
if you don't understand how it was put
together? So that's something I go
through in my one of my uh in one of my
classes um uh related to Teams
dev. Um okay. So let me uh Austin, if
you wouldn't mind putting that in the
Q&A part of the of Teams. Um that will
allow me to come back and uh and address
that question. I have a longer kind of a
soap box to step on. So I want to make
sure I I'll cover that at the end and by
putting it over there I won't lose it in
the chat if it pops up. Uh so the next
question that we get is around uh what
do we want to start with Typescript or
JavaScript for our project? I'm going to
use TypeScript. Uh where do you want to
put this? It wants to put it in a
default project where off the root of
your profile called Teams apps. I don't
like that. I always go pick browse.
Where do I put all my projects? I put
them in dev. And then I give my project
a name. So this is my April uh
2025 Hello World tab. And I'll just go
ahead and hit enter. Now, what's a
little weird about this is it created
the project and it opened up another uh
Visual Studio Code extension and opened
the project or sorry, another Visual
Studio Code instance and open the
project in there. So, this first one,
like I said, kind of meta. Well, what it
did is it went through and it created
the project and uh now I can get and now
I can get rid of this other one and then
open this guy up a little bit bigger.
First, let me just resize this a
tad. And let's make it
bigger. And let's do one thing just to
see this working, right? I'm going to
see this working right out of the box.
So, one of the one of the goals that
Microsoft has on the dev tooling is uh
how fast can I get from create new
project to seeing it run. So, what's my
F5 experience? So, I'm going to come
over here to my uh now when I go back to
the Teams toolkit. If I look at the top
here, you're going to see at the top
when it gets there, it's going to show
me um okay, it's going to show me where
am I logged in. All right. So, here it
shows me I'm logged in to my uh this is
my production tenant, me atroconell.com
uh that I use for my Microsoft 365
tenant. But I can also log in to a
different tenant like a uh developer
tenant. So, what I'm going to do is I'm
going to choose this is new in the brand
new version of the teams toolkit. This
allows me to jump between different
tenants. So, I'm gonna is I'm going to
jump over to my developer tenant, which
is none of these. So, what I'm going to
do is I'm going to come over here. Let's
go back. Get out of that. Escape. I'm
going to come back over
here and I'm going to sign out of this
tenant. And then I'm going to come back
and sign
in. And it's going to open up a browser.
Apparently, Chrome was updated. And I'm
going to log in using my de my Microsoft
365 developer
tenant. Oh, I logged into that earlier.
It timed
out. Oh, and let's use
dev. I can close this page. Thank you.
So now what you see is I'm signed in on
Microsoft 365. I'm signed into my
developer tenant and I'm signed in on
Azure. I'm signed in also into my
developer tenant.
Now I it this is the part that's a
little it's a little uh misleading. I'm
not really signed into Azure as my
developer tenant. I'm signed into my
interra ID account as on on uh that
allows me also to connect to my
Microsoft 365 or sorry my Azure tenant
as well. This is going to be used if I
need to go through and provision
resources, but it's also going to be
used to create the intra ID app for my
project. So there's a whole bunch of
other stuff we can look at. We're not
going to do that just now. Let me come
back over here and let's get this build
going um right off the bat. So I'm going
to come over here and my this is my
entire project. Let me start the build.
So, I'm going to come over here and I'm
going to say you have a bunch of
different options of how you can start
this. I like to always start it with a
browser that's not my primary browser.
So, I use Chrome as my primary browser.
So, I'm going to say debug it in Teams
uh Edge use the Edge browser. So, you
can you can do your development and
debug in like a local Teams client uh
like here in the in the Microsoft 365
apps and stuff in the different desktop
clients. I don't like that. I always do
my development in the web browser um
because it's much easier to debug and
troubleshoot. So, I'm going to go ahead
and hit play on this and it worked this
morning. So, it's a live demo. So, we'll
just cross our fingers. The very first
time you run your project, this is going
to take a few minutes or maybe it
depends on your internet connection
speed of your computer. What is going on
right now behind the scenes and I'm
going to show you how it does all this
in just a minute. But what it's doing is
it's checking to see, do I have
everything installed that I need to be
able to run a Teams project. So, it's
going to need things like the Azure
Functions runtime, uh, the core the core
tools runtime. It's going to need, um,
make sure the version of Node that I'm
using is a legit is a supported version.
It's going to make sure
um, it's going to install something
called the Dev Tunnel uh, from which is
you'll see in the docs where it talks
about Enro. We don't use Enrock anymore.
or use the dev tunnel from Azure and the
Visual Studio team. Um, but it only does
that if I need it and that's I need that
in the case of bots and um, message
extensions. So once it goes through all
those prerexs, make sure certain ports
are available to me and all that stuff.
Um, once it does all of that, it then
runs npm install to download everything
that my web project needs. In
particular, this project has two
projects inside of it. It has a web
project which if I look in the source is
basically a react single page
application and then it also has a
serverside component which is an Azure
function project a nodebased Azure
function project. So it's running npm
install in uh twice once for the Azure
function project to populate node
modules and once in the react project to
populate the the web the web client.
It's almost done. It's going to launch
edge in just a second. I'm talking long
enough here so I'm giving it enough
time. the uh so there it goes. So we'll
come back to that in just a second. What
you'll see here over on the side is
there are three processes that are
running in the background. There's
starting the front end that's my web
that's my uh my react application my web
app and that's running on
uh localhost
53000. It's got a back-end process
running and this is my Azure functions
project that is running
on localhost 70 called port 7071. And
then it's also got another process
called watch backend. And what that's
doing, if you're familiar with node,
it's running nodemon in the background.
That is basically saying that, hey, if
you make any code changes over in your
um uh in your Azure functions project,
uh we'll watch for the files to change
and we'll recompile them or or we'll use
TypeScript to recompile them from the
TypeScript of the JavaScript and we'll
restart the the process so you'll get uh
so the next time you make a call to your
Azure Functions project locally,
everything will work. Okay. So what this
has now done is it's gone through and
it's created this project. So now let me
go log in at under my dev tenant again.
So dev which is this guy paste him
in. And I need a
password and then I need I'll go away
edge and then I
need
the one time password multiffactor off.
Oh my god.
Don't need that. So, what this is now
doing is it's launching Teams. It's
uploading my project and it it's
effectively it's sideloading my project
into my Teams environment so that I can
have it running locally, but I can test
it inside of Teams. So, sideloading is
something you have to enable in your
tenant. Um, the docs show you how to go
about doing this. So, what I'm going to
do is I'm just going to go ahead and
click open here. It's going to install
my app. Now, this is a personal app, so
it's a tab and a personal app. And I'll
show you how I know that in just a
minute. And I also can go through. It
also has a channel app um as well. So,
I'm not going to I'm not going to do
that. Let's just let's just click off of
this. So, where is my app installed? If
I come over here, it's installed as a
personal app. So, if I go to view more
apps, I should see my April 2025 Hello
World tab local. So, you guys see that,
right? Anybody see that? Thumbs
up. Thumbs up.
I'm going to assume that you can see it.
I see somebody turned on together mode.
That's kind of funny. Um, all right. So,
I'm going to choose uh
this. And now, this is my custom tab.
So, remember this experience we're
running through right now. All right.
Remember this experience running through
right now because when I look at the
code in just a minute, this we're going
to look at the code for this app. So,
over here, you can see the app is now
over here in the rail. But if I go off
of the app, it's going to go away. you
want to get it to stay
[Music]
there, choose the app, rightclick it,
and I can pin it. And now it will stay
in my it'll stay in my navigation. Now,
personal apps are intended just for my
use. So, for example, if I look at my
like if I have my calendar in here or my
chat, it's just my experience with chat.
I'm not collaborating in chat. I'm
talking to other people and it may be
you I'm talking to, but it's not going
to be something that's like a it's not a
a a collaborative experience. The
collaborative experience is when I have
like channels that or tabs are installed
inside of of uh teams. So in this case
here, this personal app has one tab,
which is why it's taking up the whole
screen. But if I had multiple tabs, they
would be listed out on here as well. And
I could have multiple tabs if I wanted.
Now, if I scroll down here, I want you
to see something where you'll see that
it says I want to authorize and call
Azure functions. Now, right now, it's
got single sign on already set up. The
first time I select this, it's going to
throw it's going to error out. We're not
going to see the error. If I looked in
the console, it would see the error. It
would error out because I haven't
consented to this app and given it
permissions to get information about my
profile. So, if I and that to be able to
show me right here. So, if I click on
this, it first fails and then it's like,
oh, you don't have permissions. So, I'm
going to open up the common consent
framework to ask for permissions. I'll
say I accept it. and then it will remake
the request. And now you can see I have
the value that pops up. If I go off of
the tab and then I come back to the tab
and it reloads it. Now when I go back
down here and I say authorize the Azure
function, it still is it doesn't go
through and have that same request
because now it says that oh he's already
granted the uh consent for this. Okay.
So that's just the gist of like getting
my first tab up and running. The thing
is is that you'll notice this scroll bar
here. This entire scroll bar, this is
where the iframe is. So you see how much
real estate you have access to. You have
access to the entire screen here on the
real estate uh except for the team's
chrome. So the stuff that goes on the
lefth hand side and the stuff that's up
here at the very top. Okay. So if I come
over here to the project, if I go back
over to my project and I look at what
did we create here? Well, let's look at
these different pieces. I'm going to go
ahead and just close the browser here to
shut that down in the background and
let's look at these different pieces. So
first of all, this is my Azure function.
There's nothing fancy about this
standard Azure function. I want to focus
more on the Teams project stuff. I also
want to try and teach you how to do
React today. I want to show you the
tooling. So, that's a little bit
different. I want when you get into this
team's project, I want you to look at it
and go like, I know what all this stuff
is. I recognize it from Andrew's
webinar. So, here's how this works. Your
entire team's app is going to be defined
in something called a team's uh app
package or we now just refer to it as an
app package. So, if we look at app
package, you'll notice there are three
things in it. So, ignore the build
folder. That's temporary. There's a one
picture color, one picture outline.
That's the logo for your app, right? So,
you have two images and it's going to be
the logo that you're going to use for
your application. The manifest.json file
is the main thing that's going to
describe your app. For example, it's
going to define things like the uh
icons, what the names of the files are,
the name of the app, the description of
the app, and in our case here, what I'm
really interested in is the personal
app. Now, static tabs, little bit of uh
history here. Um, static tabs or
personal apps used to be called static
tabs in the code and in the manifest.
They're still called static tabs, but
it's just a personal app. But you'll see
here what it's doing is is that my tab
has an ID called index. It has a name
home. We didn't see that because we only
have one tab. So there's no sense in
showing a single tab if there's only one
option. And then it's going to show me
what URL should load inside of my t
inside of my iframe. What what is the
URL that should load inside that iframe?
This is an environment variable that
will be replaced at runtime or sorry at
build time by the team's toolkit. Um,
it's then going to go to index.html and
then it's going to go to a route of
hashtab. So, how do I get to that? Well,
I have an index.html file. My index html
file is the JavaScript uh bundle is
going to be loaded. This web page is
going to be loaded on the um in the in
the tab. It's going to have the
JavaScript file get loaded. You'll see
here that I've got a script tag here
that I'm loading in the source of the uh
the component, my index.tsx. And you'll
notice here this thing that says root, a
div for an id of root. Well, if I come
over here and I look at under source and
I look at
index.tsx, it is going to get that div
called root, it is going to uh get a
reference to the root by creating that
root object. And then it's going to
render out a a React component called
app inside of that route. Well, there's
app. What's in app? If I go to app.tsx,
it's inside of
components/app. So, there it is right
here. I'm hovering over. I go to this
kind of scroll down a little bit here.
I'm going to collapse this fluent
provider. And here are So, this is just
this is what's going to render out. So,
this is a uh functional component, a
react functional component.
There's a re I'm using a React router
and I have a route called tab. Okay,
index.html hashtab. So I'm looking for
tab. What does that load? It add it
loads my tab component. And if I scroll
up, I can see that's inside of the
tab.tsx file. I look at
tab.tsx. It has a div that's being
rendered out with a welcome message. Oh
my gosh, we're getting deeper into the
onion. If I come over here and where's
welcome? Welcome is inside of sample.
So, if I look inside of sample and I
look at
welcome.tsx and I scroll down a little
bit down to my
div, you should see things like remember
where we saw the string.
Congratulations, your app is running in
and it told us we're running inside of
teams and then it gave us a tab list.
Build our app locally, provision it or
publish to teams. this one that we had
here for this tab for the first tab here
running local. Um, we had the code, we
had the current user, and then we also
had the Azure function that was showing
up here. So, that was all the stuff that
was showing up. That Azure Functions
piece, well, that's this guy right here.
When I look at the Azure Functions,
remember we had
a a button that said authorize and call
Azure Functions. So, I just want to give
you a little bit of a tour on how do we
get down to the actual React app. Now
again this is not an experience on a a a
uh a webinar on on building uh a react
app. I want to focus more on just the
structure of this project now and let's
focus on some of these
pieces. What makes this a teams app what
makes this a teams app is the presence
of one of these two files at least teams
app.yaml and
teamsapp.local.yaml. This teamsapp.yaml
YAML file. What this is right here,
think of this, if you're a .NET
developer, think of this as your CS Proj
file. Okay? If I open this up, I want
you to notice
something. You will see three different
life cycles. Provision, deploy, and
publish. When I hit F5, what it did was
it went through the provisioning and the
deployment phase. It didn't do publish.
Why didn't it do publish? It didn't do
publish because when I went through the
deployment and I said debug in teams,
this is using my local environment.
Well, if I go back over to my code
project or my over to my uh my files, my
project and I look at teams
app.local.yaml, it sees this environment
called local, it's going to use this one
instead and it's going to overwrite the
production one. The production one has a
publish life cycle. Ours doesn't. So,
we're not going to be able to publish
this. It's only going to run through
these two phases. What happens with
this? This is actually in the Teams
toolkit. What it's actually doing in the
Visual Studio Code extension is it's
running the Teams CLI and it's telling
it to do the provision um command. What
does the provision command do? It does
all these actions. If you've done
anything with like CI and CD and Azure
DevOps or really more au uh GitHub
actions, the the teams devel uh
developer experience is kind of inspired
from um custom actions with GitHub. So
what does it do? We have an action here
called Azure AD app create. It's really
intra ID. So what does it do? It creates
a new intra ID app called April 2025
hello world tab 1. It is going to
generate a client secret. It is going to
set it as a single tenant app, it is
then going to have once it goes and
creates that, it has a lot of stuff that
comes out of of that command. So it has
things like once I've created your intra
ID app, I'm going to have the client ID
right here. So what am I going to do?
I'm going to say, hey, go write this out
to an environment file. A AAD app client
ID. And you see all the other ones that
are listed. Well, check this out. If I
come over here into my project and I
open up the env folder, I have an
env.local file that has an AADHP client
and that is the ID of the intra ID app
that was created when I hit F5. So, it
spun all of this stuff up for me inside
this environment variable. Now, what's
what is cool about that is that this
environment variable file, this
environment variable, I can use this
throughout my entire project. For
example, if my app manifest, so here you
see we have our teams app dot uh teams
app ID or
uh where we where would I want to find
this? There you go. My tab endpoint is
on the main URL for my site localhost.
Remember we went into the
manifest tab endpoint. So it'll change
that out. What if I'm in production? I
want to build this for production and I
want this to go get packaged up and have
a new manifest. No problem. because in
my uh I would have I wouldn't use these
environment files. Instead, and this may
be going a little too deep here, but
some of you have done this. You may be
like, "Oh, sweet. This is cool." If you
go into the infra folder, it's using
Azure bicep to go create all of the
resources in Azure like an Azure static
uh web app and a Azure function. And
these par the parameters file that it's
merging with the bicep
file. What is the ID of the client? It's
going to use this client. what is the uh
and when it goes and creates this it has
exports of like what is the URL that's
being generated from this as well and it
goes through and updates all the
environment variables uh files uh
correctly so that the tab endpoint would
be the URL of my static web app right
pretty cool okay so what's nice about
this is you can go through and see all
the stuff that this is doing so first
it's going to go create the Azure AD app
unfortunately when you create it you
can't at the exact same time do other
stuff you want done. So, first we have
to create it and then it goes right back
in and it goes in and um let's see after
it creates it, let me scroll down a
little bit. It's then going to go
through and run an update. And what the
update does is it's going to use this
template file kind of hidden there.
There we go. This template file of a AAD
manifest JSON that is here in my project
to if I scroll over here set up all of
the single sign on uh configuration
stuff by creating a new scope called
access as user. And then it walks
through and creates it pre-authorizes or
preconents a bunch of Microsoft um uh
clients so that when the user goes to do
single sign on the users won't have to
grant teams permission to access their
uh to act on act on their behalf. So
you'll see that all of these
pre-authorized applications are like the
team's desktop and mobile client, the
web client, the outlook desktop client,
the outlook web client, the outlook web
client too. I don't know what ID 1 and
two is. Um, oh, this Outlook new and
Outlook Outlook classic, I guess, but
Outlook new, the one that's rolling out
now. Um, then there's a Microsoft 365
app. And there's one that apparently
doesn't have a name. Interesting. I
wonder what that one is.
Um, and then it also comes down here and
says the whole it also adds in uh like
the access some of the other access
token stuff as well. And here you can
see it's going through and setting up
some permissions. So, it creates the
enter ID app and then it goes right in
and updates it uh right after that. But
what's cool about it is that it used
this thing as the template. And if you
look over here at this at this project
file, it says once you've created the
once you've gone through and you've
created the uh you've taken this
template, it populates it with all those
values that it needs from the
environment v the environment variables
uh in our our environment setting. And
if I look at the build folder, I will
see the nope, not that one. this build
folder I will see my populated one where
now I can see that the ID of my app is
889775B that is the ID oh sorry no the
app ID that's the object ID this is the
client ID the client ID for my app is
this value right here why is that
helpful because now if I want to make
any changes to my intra ID app I can
make changes using this manifest and the
next time I hit F5 it'll update my intra
ID application uh for
me so I want to show you a little bit of
that. The big thing though that I want
to take away from before I move on to my
next few slides and start to kind of
wrap this up a bit was what's really
cool about this and the part that I love
about this about this setup uh for um
how they build projects and deploy them
and everything using teams is that it is
so flexible uh than what we have like in
the SharePoint framework because I can
go in and make changes to any of these
different things that are available to
me. So for example, provisioning creates
an in ID app. Then it goes and creates
an app inside of Microsoft Teams. Then I
run a script that goes through and set
some environment variable file
environment variable values inside that
environment variable based on these
values. Then it goes through and it
updates the intra ID app. It it uses the
teams app man uh validate manifest. So
it uses the team's app CLI and calls
validate against our manifest to make
sure that we haven't done anything
that's not that's not correct. It
generates the package. So if you're a
SharePoint framework person, this step
that I have highlighted is kind of like
the equivalent of gulp space
package-solution-
ship. So it generates that. Then it uses
that same validate to make sure is the
app package legitimate has what it
needs. Yep. Then it's going to go
through and update our our app inside of
Teams by uploading the package. It then
tells it to extend it to Microsoft 365.
And then it writes out some other values
to the environment file. When I do my
deployment, this is the big part right
here. Make sure my dev tools are
installed. Make sure that a locally
trusted developer certificate has been
trusted. If not, it will prompt the user
to do that. SharePoint framework. That's
something you got to do ahead of time.
The tools do it for you. Um, make sure
Azure Functions you're using the Azure
Functions core runtime that version
4.054.55 and where should it be
installed? Right here. Uh, and then
where should you put the certificate?
It's doing all the stuff for us when we
set this up. First run experience is
fantastic. Then run npm install inside
the root of the project to go install
the dependencies for our web project.
And then inside of our Azure function,
do the exact same thing. You get the
picture. There's all these different
steps of things that you can do down
here.
You can even go at the very top of this
file and look at the URL right here,
aka.ms/teamsfx-actions. That will take
you to the documentation for all of the
actions, explain everything they do and
how you can go in and make changes to
them or do other stuff. For example, I
have a I have a a client that is uh in a
GCC high tenant where a lot of stuff
where they can't connect directly to uh
their um uh their Microsoft Teams
instance from the um the Teams toolkit.
So, what we do is I show them how to
modify this file right here. Uh, so that
when they go to F5, there's some manual
stuff they have to do. But if they use
the out of the box one, it wouldn't work
because it would fail and say you're not
connected to Microsoft 365. Well, it's
because GCC High, the very secure
version of um the Microsoft cloud, uh,
doesn't allow that. So, we take all the
tasks out that would require that. And
there's a few manual things we can do.
If you want to know how to do that, I
have an article that I wrote in the last
few months on my website on
boyanos.io/blog where you can see how to
do that. That's really the gist though
of all of of like what makes a team's
project different. You really want to be
familiar with these two project files.
You also want to be familiar with the
manifest file, the manifest
template. Um, all of the all the
infrastructure provisioning that happens
in Azure is all done from this infra
folder. And then we have all of our
environment variables uh for modifying
and managing our project were all going
to be done inside of ENV. And then
finally, the app package is where our
package we're going to define um our
package. Now, let me wrap up my slides
real quick and I'll come back to
Austin's question here. We got another
27 minutes for questions. So, I only see
one question that's been posted, but if
you got any questions, please feel free
to go ahead and post
those. Uh let me get my pointer back to
my slides and advance them.
Okay, we've only covered two things, the
two biggest ones, but we've only covered
two parts of the Teams toolkit. There's
a lot more to it. So, as I said, you've
got the Teams CLI and the Visual Studio
Code extension that are you'll both have
them listed right here, but you also
have this the entire repository. If you
go to
github.com/offsteedev/teams-toolkit,
that is going to take you to uh the
repository that contains all of the
source code for everything that I'm
showing here. Well, everything but the
last one. That's mine. Um, so what other
stuff are you going to find in there?
Well, there's an npm package called
Teams FX. This contains a whole bunch of
stuff that you could use uh in your
team's project for um making single sign
on a little bit easier or to obtain like
a a single sign on token or a uh like an
access token that contains a open ID
connect uh token so you can identify who
the current user is. You don't have to
go create all that single signin stuff.
It's already done for you.
Furthermore, they have this other
package that if you're using React to
build your app. They've created a suite
of a whole bunch of React hooks and
utilities that we can use. So, for
example, there's a hook called use teams
that I won't have to write the code to
get the current context in my tab that
I'm in inside of Teams. It will take
care of that for me. It also will take
care of like I can say use Teams with
user credential. it it triggers the uh
the single sign on process and obtains
the token for the current user that I
can then use to identify who they are.
So that makes my life a lot easier. This
is really really useful. Um and if you
want to see how they did it, just go
look at the source code for it. All the
source code for these are all inside
this
repository. Now I got two resources that
I want to share with you if you want to
learn more about building stuff with
Teams. One of them is I have a free
nine-day email course uh called the
team's appdev on-ramp. I've got a video
version of this coming out uh in the
next month or so. Um and what this is is
it walks through uh on once a day it
sends you an email and it walks through
here's everything that you can do and
what you can build inside of Microsoft
Teams. Now I go through it's not the
same as this webinar I'm doing today or
one that I'm doing next week which I'll
talk about in a minute. But what this is
going to do is it's going to say like
why would I use the shareepoint
framework? Why would I use team uh power
apps to build an app in teams? Why would
I use the teams toolkit? And it gives
you different options, advantages and
disadvantages of each. Uh it then walks
through what can I build tabs and I walk
through all the stuff that you can do
with tabs bots all the stuff I can do
with bots. You can build dialogues. They
call them task modules but they're
really just modal dialogues. and I walk
through how you can use those both in
tabs and a web experience and if you're
using bots. Um, what about message
extensions? Uh, what about extending
team using the teams toolkit to build
custom agents for Microsoft 365 copilot?
What is the deployment story for this?
What do I need for that? So, that email
that is a free email course that you can
go to my site, you can sign up for. you
get one email right away and you get
another email the next day uh for nine
days or there's a little bit of homework
at the very bottom. It's really easy
homework, but is if you go in and you
submit your homework, then you'll get
tomorrow's lesson in about five minutes.
So, you can plow through the course if
you want uh pretty
fast. If you want to know more about
what's possible inside Teams and you
don't want to wait to go through my
email list as well or the email course
as well, I'm hosting a webinar twice
next week. once on April the 8th and
once on April the 11th that is going to
walk through a lot of what I cover in
the email course. Not any really not
hardly anything that I cover today, but
it really goes into depth on like using
tabs, using bots, using messaging
extensions and all of that stuff. things
that you can end up doing, how you can
use Teams toolkit to extend Microsoft
365 C-pilot, which is the primary way
that you would extend uh um uh Copilot.
Um other than using Copilot Studio, I'm
going to be I'm a little opinionated,
but I think if you do it the way that
using the Teams toolkit, it's a lot
cheaper and you have a lot more
capabilities to you available to you,
but too much to get into that today. Um,
okay. So, that you can sign up for
either one of those webinars. They're
both published today. Uh, for all of you
who have registered and showed up showed
up live today, you're going to get a
follow-up email from me uh later this
afternoon. Uh, that'll have links to
these webinars that you can uh also that
you can find them really easy if you
don't find them before that and you can
go sign up for it. So, another free
webinar uh is definitely going to it's a
uh uh that'll be u available twice next
week.
Okay. I want to thank all of you for
coming to this webinar live. Um, I do
have another 22 minutes to go through
questions. I see one question here from
Austin. I'm going to answer that one
first, but if you've got any other
questions, uh, please feel free and post
them. I'm not going to keep everybody
around just to keep you around or keep
the webinar going. So, if I answer
Austin's question, we have no other
questions. It's perfectly fine. Uh, but
I want to make sure that um, we don't
just extend it, just to extend it. I'll
give a give you a little bit of your
time back. Okay. So Austin asked, "Why
shouldn't we choose to start with the
SharePoint framework when I'm creating a
Teams tab?" Now, it's a good question.
So, let me answer this in one of two
ways. I want to answer this the
Microsoft way. So, I want to give you a
bunch of facts and then I want to make
sure it's very clear when I switch over
to my opinion. So you can decide if you
buy into what I say or if it just you to
say like ah this is just some random guy
doing a web webinar. I'm going to focus
on what Microsoft says. Teach their own.
No harm. I don't take any offense to it.
Um I'll cry a little bit but I won't do
it on the webinar. Uh but I want to make
sure you understand the difference
between the two. So what Microsoft did
is they have set it up to where when you
build a SharePoint framework web part
that web part can be treated as a can be
used as the source um of a tab in uh
Microsoft teams. So if I start with a
SharePoint web part. So if I go create a
brand new uh web part project uh using
um uh Ymen the Yommen SharePoint
framework gen the generator for sorry
the SharePoint framework generator for
Yommen create a brand new web part by
default today and for the last few
versions uh the web part is available as
a tab inside of teams. So, if you're a
SharePoint framework developer, uh
Microsoft would tell you you could
create your web part. You can leverage
all of your skills and knowledge you've
picked up building uh uh building web
parts for SharePoint framework for the
SharePoint framework and SharePoint
online and you can leverage those as a
tab in Teams. And the way that it works
is that once you package up your
SharePoint framework project and you
deploy it to your tenant or site
collection app
catalog, if you have a component, a web
part that in the web parts manifest, the
property called uh supported hosts says
um and here I can show this to
you. So let's create let me open up an
existing SharePoint framework web part.
So, I'm just going to go to my
SharePoint framework course and open
that
up. This guy's got
it. So, if I look at a web part
manifest, you will find a property here
called supported hosts. And what you
will see
is you will see that this one has four
different options. SharePoint web part,
uh SharePoint full page, Teams personal
app, or Teams tab. So I we already know
what a web part is and we already know
that this is like Microsoft won't say
this but basically this is treat your
web part as a single page app. um a tab
or a personal app. If you see either one
of those listed, what team what the the
admin center will show the app portal
will show you the SharePoint app portal
will sorry the SharePoint app catalog
will show you is a um uh it'll show you
icons on where this is supported and one
of the icons will definitely be
SharePoint for all of them because it's
a SharePoint component you deployed and
it will show you a teams uh icon. If you
select the project, the solution, you
can then click a button that says deploy
this to teams. And what it does is it
will on the fly create that teams app
package that I showed you using the
teams toolkit. So it creates the
manifest uh and it takes the two images
coming that are listed right here. So
there's one and there's two. It'll take
those two images, it'll dynamically
generate the manifest.json, JSON,
package it up in a zip and deploy that
to teams as an
app. Now in Teams when I go to in when I
go to add a tab that was created using
SharePoint framework, what teams does is
it adds it installs the app. But
remember when I showed you that say the
tab is is living inside of like
localhost uh under whatindex.htmlab html
tab. The URL is essentially going to be
pointing to a special SharePoint online
page that has nothing on it. And in the
in the query string of the um in the
query string of the of the the URL, it
will have a property that says a URL
parameter says component ID and it'll
have the
GOID of your web part that's defined in
the manifest and that tells that
SharePoint online page uh to in the page
where there's nothing on the page uh go
find that web part and add it to the
page. is a single big canvas and that's
what's used inside of the iframe inside
of the tab. Um, now you want to kind of
think about the web part. Does it make
sense doing this? Because web parts are
generally just like little boxes or
bigger boxes on a bigger page unless
you're doing the full page option. And
if you think about if you're doing like
a little box like on a page, does that
make sense as a tab? Because then your
tab is just got this tiny little UI like
squished in the top left corner or maybe
just centered looks a little weird.
probably should be at least uh designed
as like a full page. I don't think a I
don't think like having web part on here
and then a tab or a personal app makes
sense. I think having share full page
and a team's personal app or tab working
does make sense. So what happens when I
go into the team's toolkit and when I
create a tab I select a tab and I gave
it gave me shareepoint framework as an
option. All that does is that just says
the same way that I created a SharePoint
framework project using the Yomen
generator, the Teams toolkit creates the
tab using the Yomen generator. Um, and
it basically just does it the exact same
way. So, wherever you start, it really
doesn't
matter. So, Microsoft says, "Hey, it's
great because if you do it this way, the
advantage is is that you don't have
anything to deploy. Everything is going
to run inside SharePoint online and be
available inside of Teams. Teams people
can use it. SharePoint online people can
use the app." and it sounds great
because I can leverage the all the same
um business logic uh and experience and
skills that I have in learning the in
learning SharePoint online but here's
okay so that's what Microsoft says and
it's it is good but in my
experience and in a lot of experience of
all my of a lot of my students my
customers it is you will run into issues
uh if you're doing anything that is not
just building a web part that doesn't
talk to anything else or maybe it just
gets SharePoint data, you're going to
probably run into some problems. If
you're going to go call anything from
any of the SharePoint REST APIs, if
you're going to talk to Microsoft Graph,
if you are doing anything with custom
permissions, stuff breaks. It breaks all
the time and very very frequently.
Sometimes it will just your web part
will just all of a sudden stop working
for a little bit and you're like, why
isn't this working? And then out of the
blue it starts working again. No reason
why. Sometimes you will deploy it from
SharePoint online to Teams and you go to
use your tab and it doesn't work. If you
wait like 25 minutes, 15 minutes,
sometimes it works right away. Sometimes
after about 30 minutes it'll start
working. Why? We don't know. It's
temperamental. It's temperamental. It
doesn't work all that well. Um I find it
to be very unreliable. I find the uh oh,
I'm in Teams. It works great in the
client. It look great in the web client,
but it doesn't it doesn't work in
um I just saw another question show up.
Sorry, another question show up in the
chat. I thought it was going to show up
in the in the Q&A panel, but I'll come
back to that.
Um so the challenge with that so it it
when you the um I see very frequently if
you're using your SharePoint framework
component as a web part in the team's
mobile client or like also like in the
um in the tablet client or in the the
tablet client also mobile client uh I
frequently see that not work and when I
say not work I mean like you get like a
blank tab and you get no like error
messages or anything uh In my
experience, it's an issue between
SharePoint online in Teams. And if you
go look at the SharePoint uh uh issue
list and the SP devdocs uh repository,
even the closed issues and open issues,
like take that filter off and just
search for like teams and trying to use
a web part in there, you will find tons
of issues. Uh I've had students that
have like they've heard me go through
this like uh soap box
And they're like, "Yeah, I get it. We're
still going to go with SharePoint
framework because we have already
learned, we know React and we use the
SharePoint framework and this will just
be easier because we don't have another
site that we have to deploy to Azure."
And I'm like, "That's fine. I'm just
telling you, you're probably going to
run into issues and when you do, there
are some things that you're going to ask
me and I'm going to be like, we don't
know why that doesn't work." And trying
to get Microsoft trying to get the
SharePoint team to understand that
there's an issue and then getting the
SharePoint team to talk to the teams
guys on what's going on. They don't even
work that well together. So, I think
it's just a bad way to start. Um, and
sure enough, like I've got one student
that came back after trying this for
like two months and he's like, "This is
ridiculous. We should just start with a
Teams app." And I'm like, "That's what I
said." So, uh, I just going to warn you
that your mileage may vary. Depends on
what you do. If it's a really simple
thing you're building, you may be fine.
If you are, uh, doing a more involved
web part, I would think twice about it.
Um there is a a a development pattern
that instead if you wanted something to
work both in teams and in the SharePoint
framework, I would build a single page
app as a separate project like a React
project as a as a separate app. uh
package that up in your own npm package
and then you could then use that in your
teams app or your SharePoint framework
app and just have the the SharePoint
framework and the teams like host for
them are going to simply instantiate and
render out the share the the single page
app and then anything that you need to
pump into it from either one of those
experiences like what channel am I in if
I'm in teams or what site am I in if I'm
in uh SharePoint online what stuff can I
pump into that app that it can use
between the different hosts you
essentially use a Teams project or a
SharePoint framework single page app
project as a host for a React app. And
that way you have one codebase that's
the core of your app and then two
smaller code bases that's just the host
for that thing. That model is much more
reliable. So that's just my two cents on
it. Uh it's it's totally up to you how
you want to go with it, but um I I think
that using the SharePoint framework for
a Teams app is is uh you're you're just
you're going down a path that's like
this is going to be trouble. You could
get it to work probably, but you're
going to run into some weird stuff and
sometimes there's no explanation for why
it's not working and it just fixes
itself. So, I hope that answers your
question, Austin. I know you had to wait
like 40 minutes for it. Um but I hope
that answers your question.
Um, let's see. Savvy, you said uh maybe
you're not seeing the whole picture, but
uh could you tell me how the Visual
Studio Code Teams toolkit helps the
deployment in a production tenant, not
only with the dev phase of projects?
Okay, Savvy, great question.
Um, in the Teams, okay, so in the Teams
toolkit, the Visual Studio Code
extension does give me a way to like
publish my entire app. I'm the kind of
developer that says if you can publish
from the team's toolkit then the
permissions are not locked down enough
in your organization.
Um it's not so much it's going to help
you with that. The big thing is is that
the publishing part to publishing to
production involves one I've got
resources in Azure or whatever cloud.
I've got resources to provision. I've
got an app package that I have to to So
that would be like my website or my web
services for bots or uh my website for a
tab or web services for a
um uh bot or a message extension. Um I
have an intra ID app. I have all these
different things. because I'd want to be
able to
provision the um the the stage the
provisioning and the publishing stage or
life cycle events for my project. It's
not that the team's toolkit for VS Code
is going to help you with this. It's
that the team's app CLI is going to help
you with it. So if you have a if you
have a a a CI and CD scenario where you
want to you want to control what your
deployment looks like or even if you
don't then instead of having these
manual deployments having to put stuff
all over the place and and provision
them you can use the team's app CLI in
your production environment to take your
project and to push those things to
those different environments. The only
thing that the team's toolkit is doing
is that it gives you the ability, it
gives you the ability to um to to to
call that team's app CLI command from
the Visual Studio Code
experience. So that visual the visual
studio code experience inside of for the
team's toolkit. All it is is a way for
us to hit F5 to get our projects up and
running and have the debugger uh and get
the debugger running. Um sorry I'm
sweating here. My air conditioning went
out which is a big deal in Florida as
who was it? Austin. As Austin can attest
to. Um the
um so I can use I can use the
um the team CLI to go through to do that
provisioning stuff for me. Um or but I
can also in the VS code or I can do it
just using the CLI. And because it's a
CLI, I can also do that from any of my
CI and CD scenarios. I would have to
install the CLI in my like GitHub
actions workflow or my Azure DevOps
pipeline, but that's what it is going to
allow me to go through and to do that to
do that deployment. Um, so it's it the
only thing the Teams Toolkit Visual
Studio Code extension does is knows how
to build the project, run through a
bunch of different steps to get things
up and running and get my project
deployed using the CLI, and then launch
the browser, sideloadad the app inside
of Teams, and then attach the debugger
both for the locally running Azure
function and what's running in the
browser. So, I could do my debugging a
little bit better in the toolkit. But
other than that, it's really just a that
project file that's that's defining what
happens in each one of those life cycle
stages. So hopefully hopefully that
helped you a little bit there. I can see
you're responding in a second here, but
let me go jump over some of the
questions that people have posted. I got
to thank you. Cool. Um Andy, can I touch
on the authentication and VS Code again?
I think you said something about intra
versus authenticating to Microsoft 365
or Azure. Yes, let me let me clear that
up. You're always authenticating with
intra. It's team when you when you
authenticate with when you go to log in
in the team's toolkit. Um, and it's
going to ask you to log in twice. Once
you log in with one of them, when you go
to do the second one, you're already
logged in. So, it's going to be a really
quick experience. Um, but essentially
what it does is this is allowing you
you're going to always authenticate with
intra because both Azure and um
Microsoft 365 tenant are all they both
are using intra. But what this allows me
to do, if you remember from like my
demo,
uh, all right, I closed that
project. Ah, where'd it
go? No, open this project. I want to
open
file, open
recent hello world tab. If I go back
over here to the teams
toolkit there. So when this signs
in, let me let this go for a
second. I've signed into intra on my
developer tenant. So this is my M365
developer tenant that I got before they
stopped letting us have those. What this
is doing is uh and and then I've also
signed into my uh Azure my Azure tenant
uh which really what this one's doing is
this is working with the intra ID uh to
create the app or and this is also the
Azure subscription that would be used to
provision resources. If I try to
provision resources it would fail
because this login is not tied to an
intra sorry an Azure tenant.
This one is tied to my Microsoft 365
tenant. That Microsoft 365 tenant does
not have a co-pilot license assigned to
it. So, in this
case, uh, and it's because you can't
have it, you can't use co-pilot, uh, the
$30 per user per month license. You
can't use that in a dev tenant. But if I
log out of
this, I can then sign into my production
tenant.
which does have a co-pilot license
associated with it. And I could also
switch this one over to use my
production Azure uh my production Azure
environment. So you're it it just
depends on like you're you're working
with Microsoft 365 and I'm working with
Azure and not I'm not always working in
the same in the same tenants. I don't
have to but I can. So another good
example of this another let me give you
another example. um the my account in
Azure, the meanderconell.com account in
Azure that has subscriptions in it that
are tied to a credit card. So when I do
when I teach a class or I do a demo, I
have to put things in real Azure
resources, but I want to work inside of
my developer tenant and not populate my
production tenant that I use for my
company. I don't want to use that for
all of my um I don't want to use that
for for all of my stuff. So what for my
uh for my demos? So what I would do is I
would log into my my production Azure
tenant so that I could provision
uh my use this guy so I could go through
and provision resources in
Azure. I did sign
in. I just did that sign
in. Okay. And then like when I teach a
class or when I do demos at a
conference, I want to sign into my dev
tenant, which is this
guy. So that now I can go through and I
can do stuff inside of my dev tenant,
but all of my resources get provisioned
to a real Azure resource. So that well,
so I can pay for it, but I can also have
the demos actually work. whereas my
other login does not have the the seven
Y77K1 does not have access to an Azure
subscription. Hopefully that makes
sense. But it's just like it just gives
you flexibility. You're you're it it
you're not you don't have to have the
login you use to log into
365 be associated with an Azure
subscription. That does not have to be
directly associated. There's no direct
tie between 365 and
intra. Sorry, that's there is there's no
direct tie between 365 and Azure. That's
what I meant. Sorry. So hopefully that
cleared up uh the question that you had
there, Andy. Cool. You said thanks. Um
Jacob, I'm probably have time for one
more question after this. Um Jacob says,
"Where are the ReactJS files hosted when
the app is deployed? Does Teams toolkit
help provision Azure App Service or
Azure Storage to host the files? is a
CDN is the CDN best option for host
those performance. Good question. So I
did touch on this but in case you missed
it if you look at the the way that the
team's toolkit is set up if I look at
the infra folder and I look at
Azure.bicep Bicep. What they do is they
create, scroll
down, they create an Azure static web
app where the and so there's your Azure
static web app and then it goes through
and it creates all the stuff it needs
for an Azure function. So it creates a
server farm and then the function app.
But specifically to your question for
the client side piece to it, it uses an
Azure static web app uh to host the
React application. If you don't want
that, you can always come in here and if
you want to use like a app service uh or
if you want to use like I I'm partial to
container apps. Um if I want to use
container apps, I can go in and modify
this this uh Azure.bice file to use my
own setup however I define it. But this
is what the templates uh give us is they
they use the single um the uh static web
apps to go through and to do
this. Hopefully that answers your
question as well, Jacob.
Okay, so with that, that pretty much
wraps up what I want everything I wanted
to cover today. Um, I want to thank all
of you for sticking around today. I'll
send you a follow-up email uh later on
today with some additional links and
resources. It'll include the email
course. Uh, it'll include that I talked
about. It'll include links to those
webinars. Um, if you are interested in
learning more about uh teams appdev, the
webinars next week would be fantastic.
Um, if you are interested in uh really
joining me and really to kind of get up
to speed and learning how to do um uh
how to build apps for Microsoft Teams, I
have an 8week long uh accelerator cohort
uh class that's starting in the middle
of April, about two weeks from now.
Actually, it starts two weeks from
today. And I recognize two people in our
webinar who are actually uh enrolled for
it. I won't call you out. Um, but the
way that that's set up is that there is
a um we meet twice a week for two hours
uh each time for a live class and for
office hours and there's optional
homework and a bunch of other resources
that are available to you. You get a
whole bunch of stuff uh associated with
that. I will have a link to that in the
um uh in the in the
um I will have a link to that in
the email uh to where you can learn more
about that. Um and I will also talk
about it at the end of the webinars uh
next week uh as well uh if you're
interested in learning more about that.
So um but I can guarantee that the
webinars next week it's like 95%
educational. It is not a it's not a
sales pitch. Um, but I got a lot of
people that have been through those
accelerators and they absolutely love
them uh in terms of uh uh all the stuff
that they've learned. So, you can learn
more on my website with the link that
I'll share with you. Um, or you can just
go there right now if you go to my
team's courses and you'll find the the
thing that's talking about the live
accelerator that starts on April the
16th. Um, there's a whole bunch of stuff
on that page about it as well as well as
a bunch of testimonials for my former
students. So, with that being said, um
I'm now one minute over, so I'm going to
be respectful of your time. I didn't
think we would fill up the whole time. I
guess I talked a little long-winded and
didn't get a ton of questions, but got
some good questions. Um I hope you all
learned a lot and I really appreciate uh
you joining me today and I hope to see
you register for one of the two webinars
next week. If you're trying to decide
between each one, they're the going to
be the exact same presentation. There's
nothing there's nothing different
between the two. It's just two different
days just to make it more available to
people who couldn't make the first one.
So with that, thank you very much
everybody. I really appreciate everybody
for joining me and I hope to see you
next week.