Skip to main content

An Overly Explicit Computation with Character Stacks

20 Feb 2026

In the main post I go over a talk I gave today yesterday explaining how factorization homology relates to (quantum) character stacks. In this post I want to do a sample computation which gives some justification that the main theorem from that talk (which is not mine) actually does work!

Recall from that blog post that we can compute the category of sheaves on the character stack Ch(Σ,G) by integrating BG over Σ in the sense of factorization homology:

QCoh(Ch(Σ,G))ΣRep(G)

Let’s take a simple surface (like the annulus) and a simple group (like GL1=C×) and just… check!

There’s a lot of problems with what I’m doing here… For one, I’m not actually sure if I’m working -categorically or 1-categorically! It’s possible that when I say QCoh and Vect and what not I really mean the derived category of quasicoherent sheaves and chain complexes, etc… that seems likely to me since I’m using a lot of formal gluing and duality statements, which tend to work better in the derived world… I really need to sit down and learn enough algebraic geometry to appreciate the differences between the derived and underived stories, but unfortunately that will have to wait for another day.

Another problem is that I’m only going to naively check that the objects of these categories seem to agree. It’s almost certainly possible to work with the arrows by hand as well and check that they agree, but I don’t have time to do that right now. Plus, in case we are working in a derived setting, I definitely don’t have time to check the infinitely many higher cells!

So with these caveats, I’ll follow in the footsteps of Jim Dolan and just press on doing computations to see if something meaningful pops out.


Let’s start with the left hand side.

When Σ is the annulus and G is C× we see that

Ch(Σ,G)Hom(π1Σ,G)/GHom(Z,C×)/C×C×/C×C××BC×

The last step is because here C× is acting on itself by conjugation – which is the trivial action since C× is abelian. We know a point with the trivial action gives rise to a BC× and how we have C× many such points, so that we get a C××BC× in total.

So now we want to compute quasicoherent sheaves on this space, but products on the geometric side are coproducts (read: tensor products) on the algebraic side so we get

QCoh(Ch(Σ,G))QCoh(C××BC×)QCoh(C×)QCoh(BC×)QCoh(C×)Rep(C×)Rep(Z)ZVect

In the last step we’ve used the fact that C×=Spec(C[t±]) so that its category of sheaves is just modules over C[t±], which we recognize as the group algebra of Z. So such a module is exactly a vector space with an action of Z. In fact this is some kind of Fourier duality, where sheaves on C× (some kind of circle) are interchanged with representations of Z (the dual group).

We’ve also used the fact that QCoh(BG) is Rep(G), where for us G=C×. Moreover, by Fourier duality again, Rep(C×) is the same as QCoh(Z), but a sheaf on a discrete set like Z is just a choice of vector space above each point, so that we get the category of Z-graded vector spaces.

Now of course we would expect tensor products to distribute over sums, and we know that Vect is the monoidal unit, so that at the end of the day we’ve computed

QCoh(Ch(Σ,G))ZRep(Z)

the category of quasicoherent sheaves on the character stack is the category of Z-graded Z-modules! Which almost sounds like the kind of thing one can understand and compute with!


Next, the right hand side.

We compute factorization homology by excision – by cutting a surface into disks glued along collared embeddings and using the fact that the factorization homology of a disk with coefficients in A is just A again.

So we decompose the annulus into disks glued along their collared boundary

and then we can inductively compute the factorization homology by a Mayer-Vietoris style argument. Concretely, say you have an E2-algebra A and you’re interested in computing factorization homology over the annulus. We want to do this in an oriented sense, and out of laziness I’m going to draw the annulus as though it’s a circle. Then we get

where as usual I’m writing Aop to mean A with the reversed algebra structure: aopb is defined to be ba. This makes the computation look more like the Hochschild homology computation it is, but could possibly be confusing since we’re about to work in the case where A=Rep(C×) is a monoidal category! So just remember that in what follows Rep(C×)op doesn’t mean the opposite category! It means the same category with the definition of flipped – MopN is NM.

Then for us, we find ourselves wanting to compute

Rep(C×)opRep(C×)opRep(C×)Rep(C×)

Here I’m switching over to for the tensor product of categories in order to keep it straight with the monoidal product inside a particular category later.

Now again Fourier duality makes this look less scary, since we know that Rep(C×)ZVect! We need to know the monoidal structure now, and it will come as no surprise that we swap the “pointwise” monoidal structure on Rep(C×) with the “convolution” monoidal structure on ZVect!

To see why, consider the one dimensional C× representation Vn where zC× acts by scalar multiplication by zn. This is the generator for the grade n copy of of Vect. Now what is VnVm supposed to be? Well z acts diagonally so that z(vnvm)=(znvn)(zmvm)=zn+m(vnvm) and VnVm is Vn+m.

So cashing out the Rep(C×) for ZVect everywhere we get

(ZVect)op(ZVect)op(ZVect)(ZVect)

Where the action (on objects) of (ZVect)op(ZVect) on (ZVect) is by

(VnVm)ViVnViVm

just like the bimodule action for the ordinary Hochschild homology! So, using the presentation for the relative tensor product of categories, we see that our factorization homology is generated by objects of the form

ViVj

where we add in isomorphisms

(VnViVm)VjVi(VmVjVn)

From this description it’s clear that, up to isomorphism, we can always make the Vj into V0 so that a normal form for objects of our category is

ViV0

We can do this by choosing n=(m+j), which uses up one of our two degrees of freedom. Of course, we can still freely choose m, which gives us more isomorphisms! When j=0 for simplicity (or, given the above discussion, without loss of generality), we get isomorphisms

(VnViVn)V0Vi(VnV0Vn)ViV0

So we have integer many generating objects ViV0, each of which carries integer many automorphisms given by conjugating by Vn for nZ… Moreover, these automorphisms are compatible since VnVmVn+m so that conjugating by Vn and then Vm is the same as conjugating by Vn+m.

Thus we have Z-many generating objects, each of which carries a Z-action!

So, at least at the level of objects, it’s believable that when Σ is the annulus that ΣRep(C×) is Z-graded Z-modules!

Of course, this is exactly what we were expecting, since if you recall from the previous section we computed the same thing for QCoh(Ch(Σ,C×))!


Lastly, let’s say what the “correct” way to do this is. Tom Gannon showed me how to do this when I talked to him about this yesterday. Obviously, any mistakes come from my incorrectly remembering some details, or incorrectly filling in others.

We compute the factorization homology side again… But this computation will work for any group G, and we’ll write it in that level of generality.

As before, we define Ch(Annulus,G) to be Hom(Z,G)/G, which is G/G – the quotient of G by the conjugation action on itself. We want to compare the category of quasicoherent sheaves on this stack to the factorization homology AnnulusRep(G).

As before, excision tells us that we can compute AnnulusRep(G) by the relative tensor product

Rep(G)opRep(G)opRep(G)Rep(G)

but recall that Rep(G)QCoh(BG), so we can rewrite this as

QCoh(BG)QCoh(BG)QCoh(BG)opQCoh(BG)op(1)QCoh(BG×BG×BGopBGop)(2)QCoh(G\(G×Gop)/G)(3)QCoh(G/G)

In step 1 we use the fact that the (relative) tensor product of sheaves corresponds to sheaves on the pullback. In step 2 we compute the pullback of classifying spaces. Indeed, if we wanted the (homotopy) pullback ×B(G×Gop) (remember that B preserves products) this would just be the loopspace of B(G×Gop), which is G×Gop. But we don’t have , we actually have BG=/G. So we have one left G action (from the BG) and one right G action (from the BGop) and we end up with the double quotient space G\(G×Gop)/G… Apparently if you work through the details both of these G actions are diagonal, by left/right multiplication respectively, but I haven’t tried to understand why that is. I also don’t entirely know that I’m keeping track of the “op”s correctly, and while we’re at it I’m fuzzy on the details of this “act like we’re pulling back to a pair of points and then quotient by the G actions after” stuff too… I’m sure it’s formal, and I just haven’t gotten familiar with the rules for symbol pushing yet, so let’t not worry about it.

Regardless, we find ourselves with G\(G×Gop)/G where the action is by h(g1,g2)k=(hg1k,kg2h). Then we can use one degree of symmetry by taking k=h1g21. This tells us that in the quotient we should identify (g1,g2) with (hg1g21h1,e). Note that the multiplication order is kind of funny because of all the “op”s floating around. Of course we have another degree of freedom to use by choosing h, and as before this gives us an action of G on itself by conjugation! So altogether we see that G\(G×Gop)/G is equivalent to G/G, the quotient of G by the conjugation action! But this is exactly what we expect Ch(Annulus,G) to be!

This is encouraging since this calculation looked superficially like the kind of thing we were doing by hand back in the objectwise calculation in the last section!


Ok, thanks for reading all! This was a very quick-and-dirty post, and I’m not sure I got the details right with the objectwise argument in the first half, or with the “op”s in the second half. I would normally spend a few days (or weeks) reading up on stacks, properties of QCoh, this Fourier/Cartier/Pontryagin/Whatever duality that I was using, and check that everything really does work the way I think it does… But I want to get this out at the same time as the main post. Plus I’ve already had to put two posts on the backburner which are probably mostly right but need some details checked (one is about the stack semantics for the internal logic of (1-)topoi, and one is an explicit computation of the Goldman bracket for character varieties), and I really don’t want a third post in that limbo space. This could easily become one of many technical computations stuck in my drafts, but maybe it’s nice to share some quick-and-dirty computations too, since I do a lot of those in the privacy of my own home, haha. A lot of math looks polished once it gets presented, but at least for me the early days of learning a subject often look like this.

Stay safe everyone, and stay warm!