It's somewhere on my infinitely expanding todo list to actually document it properly somewhere (though likely on my personal site where literally nobody will see it). Overall though it's pretty conceptually simple and straightforward to build if you've got some basic tools and are moderately handy.

I pulled a few photos of the build off my phone and threw them online. I should preface them with "I'm a software engineer, not a carpenter.". You can probably get a good idea of the whole thing from these: https://files.bogon.cloud/d/9d8d2f9b9e8f454ba305

Conceptually it's just a wooden tube the size of a 16x25 furnace filter. The middle section houses an inline duct fan which pulls air from inside the box and exhausts out a hole in the top. That draws air in through the giant holes at the end of the tube and blows it out the top. The filters slot in on either end, so any air drawn in is pulled through the filters. The whole box is built out of half a sheet of OSB and a couple lengths of 2x2 and couple small pieces of 2x4.

I used some neoprene rubber tape (the particular one I bought was sold for wrapping pipes to insulate them) where I attached the outer shell to the frame as well as under the attachment points for the fan to help seal the "inner box" and keep vibration down. Used way more screws than I needed just to try and make sure everything was as air tight as possible.

The box is sized such that the 2x2 frame matches the _outer_ size of the filter which leaves the hole a bit (3" on either dimension) smaller than the typical filter in order to accommodate most of the typical variations in filter sizes. (A 25x16 filter is... apparently never 25x16. That's actually how I ended up with these 3M filters--bought them for my furnace then found out it takes some weird even more non-standard size.) The frame the filter sits against also has some neoprene tape stapled to it to help create a seal when the filter's sitting against it.

The filter isn't actually held in place by anything but friction and the fact that I don't really move this thing around much. I built another 2x2 frame to sit outside the filter to help hold it in place as well as to have somewhere to staple some window screen so the filters didn't immediately plug with pet hair. (Last couple images show the amount of hair and dust that it catches after running it for a bit.) Since that's not fixed in place by anything you could actually put any filter _up to_ 5" deep in there--anything smaller and the frame can just slide further in. (Though I'm not sure something like a 1" filter would support the air volume the fan can pull. In a pinch you could at least put _something_ in and just run it at a lower speed though.)

The hole the fan sits in just has another strip of neoprene tape run around the inside to seal it to the top board so I don't have any major leaks there. I did end up stapling another piece of window screen over the hole just to make sure my kid or cats didn't throw any toys in there and wreck the fan.

The activated charcoal filter is just a 16x48" sheet I bought off of Amazon and cut in half and set against the filters. The frame + screen holds it against the filter well enough.

You probably can't see in any photos, but my carpentry skills are not _that_ good, so I did wind up with a few small gaps between the outer shell boards where the filters sit that weren't sealed off by anything since there's no 2x2/etc inside that part. Ended up just filling them with a glue gun. Once I was done I used a kleenex to check for any major leaks--held it around all the joins, edges of the filter frame, etc, and watched whether it got sucked towards it. I'm sure _some_ air is getting in somewhere, but definitely the vast majority of the air is going through the filters. Even with the duct fan barely above a whisper, it's pulling enough air that a balled up kleenex will stick anywhere on either filter.

I... I guess if anyone has any questions or feedback feel free! I kinda just cobbled this together one weekend when I got annoyed at the wildfire smoke, so I'm sure there's probably some room for improvement.