littlelogs

Keep a social journal of your work progress as you make and learn things.

January 2017

rhitakorrr
rhitakorrr

Tonight, I continued working on the documentation for the #MidnightMurderParty beta test. I filled in a lot of the functionality details from an earlier version of the testing documentation, but a lot has changed since that version. I’ll probably finish the draft of the new doc tomorrow.

Also, between @wearing2raincoats and me, we’ve picked up 3 or 4 more beta testers. Still looking for a couple more before the beta rolls around next week.

rhitakorrr
rhitakorrr

I’ve gotten back to #MidnightMurderParty over the past two days.

  • Yesterday I did most of the research needed to write Episode 4.
  • Tonight I started working on the documentation for beta testers. I wrote up a broad checklist of the functionality testers will need to verify and reviewed it with @larouxn. Tomorrow, I plan to add a larger section detailing each item on the list.
  • Also tonight, I:
    • Set up the domain for the beta test.
    • Compiled a list of pre-beta todos (all small things that I can do this week)
    • Integrated some stuff into the MMP Slack for fun.
rhitakorrr
rhitakorrr

#MidnightMurderParty development is finished!

Okay, maybe not entirely, but @larouxn and I just closed and merged in the last remaining development issues tonight. There’s still the beta test, which I’m sure will reveal some bugs, but until then, I have no reason to open up Sublime Text or fiddle with code. It feels like finishing that first draft of a story: yes, there is editing ahead, but right now I’m just really excited to have completed a first draft!

There’s still non-development stuff to be done for MMP (#writing, editing, configuring services like #Mailchimp, etc.), so I’ll still be logging about that, but for now, I think I’ll take the rest of the night off… maybe read a book, or just try to sleep off this cold.

rhitakorrr
rhitakorrr

Between being up early for a work class and the sudden cold weather over here, I’ve managed to get sick. Trying to rest up, but I’m bad at resting, so instead I worked some more on #MidnightMurderParty. Finally seem to have gotten the Safari bug fix right, and I’ve cleaned up a lot of the URL hash navigation code. After regressing some of it, I even added some comments so I wouldn’t repeat that mistake.

Earlier in the week, I joined a 24-hour #shortstory contest, so I wrote the first draft of that tonight as well. I might do a little more editing tomorrow before I submit, but for now I need to think of a title and get some sleep.

larouxn
larouxn

Just a quick little update regarding some fun #midnightmurderparty stuff I’ve been up to this past week. Chronologically, I suppose I worked on some cross-browser testing first and my god… there are a lot of browsers these days. https://goo.gl/xXJ35W

I also learned a tad about image optimization and compression. The main difference between JPEG and PNG compression is lossiness. JPEG, a lossy format, compresses images into chunky, huge pixel mosaics in order to reduce file size. Whereas PNG, since it’s lossless, instead chooses to retain visual fidelity and simply reduce the number of colours to reduce file size. Pretty neat, different approaches.

Lastly, one rather unique thing happened during our (@rhitakorrr and I) weekly meeting this week. All of a sudden the redirect to our staging server started returning a 403 error. I was home, where the staging server is, so I checked it via the internal IP. Server was up and fine. Apparently, my public IP changed mid-meeting. Thank you Bell Canada. 😂

rhitakorrr
rhitakorrr

Added a pretty big feature (code-wise) to #MidnightMurderParty tonight: URL navigation. Now, when the user gets to a new segment, the URL hash will change to reflect the selected segment. Readers can share these URLs to send someone to that part of the book (much like the share links inside the book). When the the user changes the URL hash (think forward and back navigation), it will navigate the user to the relevant segment as if they selected that segment in the table of contents. There was briefly a recursive navigation issue, but I think I fixed it. Still needs more testing and cleanup, though.

Still got that Safari flexbox bug, it seems. The CSS autoprefixer did something pretty janky and converted flex: 1 1 0 to -webkit-box-flex: 1. The fix for Safari was supposed to be using -webkit-flex: 1 1 0 instead of -webkit-flex: 1, so tossing in -webkit-box-flex: 1 did nothing to solve the problem. I might just have to add -webkit-flex manually.

rhitakorrr
rhitakorrr

Tonight I:

  • (hopefully) fixed a Safari flexbox bug in the #MidnightMurderParty Reader. Since I don’t have any Apple devices handy, I’m waiting on @larouxn to confirm.
  • Moved midnightmurderparty.com over to Google Domains
  • Edited the #shortstory I wrote the other day
  • Printed out a QR code which I now need to scan to turn of my alarm. I put it in the kitchen next to the coffee maker.
  • Started reading another book (2/25 for my 2017 #GoodreadsChallenge)

I also wanted to set up my new phone tonight, but I’m waiting on a case for it before I switch over. Amazon Prime 2-day shipping was due to show up today, but neither item I ordered came. One said in the shipping tracker that it would arrive today before 8pm all the way until nearly midnight. Now both items have an estimated arrival time of 2-3 days from now. Apparently 2-day shipping became 4-5 day shipping somehow.

rhitakorrr
rhitakorrr

A lot’s happened over the past couple days. My graphics card died, rendering my computer unusable, so I had to learn how to install a new one on the fly, which was simple but nerve-racking since I’d never installed hardware before.

I wrote a #shortstory this morning—really a flash fiction piece—starting at 12am when I should have been asleep. I think it came out well.

@larouxn and I closed a couple more #MidnightMurderParty issues tonight. We finished up the load time optimization, so now the site shows low resolution images first while the high resolution images load in the background and are swapped in when ready.

We also began planning out the beta test, which is now slated for the end of January through the beginning of February. We’re looking for more beta testers, so if you’d like to help beta test the Midnight Murder Party Reader, let us know!

rhitakorrr
rhitakorrr

Closed three #MidnightMurderParty issues tonight, one of them being the app-breaking bug introduced in the last few Chromium versions!

I actually hadn’t planned to delve into that nasty Chromium bug until next week, but I was too curious to hold off. I ended up debugging on and off for a few days until I narrowed the bug down to this: if you use CSS columns and an overflow value other than visible (i.e. overflow: hidden|auto|etc) on the same element, all columns after the first few will render but become invisible as if visibility: hidden is applied. The point at which columns become invisible seems arbitrary based on seemingly random things like the height of the container or even the size of the viewport (which should have no effect on the fixed size container).

Tracking that down was a nightmare.

In the end, I fixed it by moving the overflow: hidden to a parent element of the div with columns and then changing all the dependent logic.

larouxn
larouxn

Completing my triumvirate of new year, new #midnightmurderparty dev and subsequent logs, I’m back to claim that though the reader is still completely borked in Chromium based browsers for every page after page 2… we have finally reached “no image curtain fall load” nirvana… with browser cache. First load is still janky, but better! By this I mean, you can’t see the image loading vertically down the page when you access the reader, provided you have some cache. This was primarily achieved by aggressively optimizing our image payload. CloudFlare is probably helping a bit too. 😄

Originally our image payload for the reader was 3.1mb. After my secondary optimization the image payload is down to just over 800kb. A ~75% size reduction! I couldn’t be happier with how well our image optimization went. @rhitakorrr and I also discussed Chromium fixes, merged in his new Google Analytics stack, and performed a bunch of routine maintenance and upgrades. The #RoadToBeta is real.

rhitakorrr
rhitakorrr

Let’s see if I can get back to daily (or at least near daily) logging again. Today, I:

  • Closed two #GitHub issues for #MidnightMurderParty. Both were small aesthetic things related to the user resizing the book, but because of some race conditions that could occur between #Elm and #JavaScript (and did occur last time I tried this), I’d been putting the issues off for a while.
  • Got some #writing done on my current #shortstory—about 700 words on the manual typewriter, which I’m enjoying quite a bit so far.

Now, I’ll probably read for a little bit and maybe play some Osu! or Overwatch. Something that starts with an ‘O’ anyway.

larouxn
larouxn

Last evening @rhitakorrr and I had our weekly Tuesday #midnightmurderparty meeting to plan out the upcoming week as well as our roadmap to beta and launch.

Work wise, I have decided to move past auto deploys, probably forever, and upgrading our Ruby version, for now, to focus on other more feasible tasks. One such task is optimizing our load times, specifically optimizing images. I noticed we were serving up some pretty unnecessarily large and uncompressed image files, multiple megabytes in fact. Subsequently, I ran all the images through this awesome, free compressor: http://optimizilla.com, and was able to cut the image payload in half.

To test this optimization I uploaded the compressed images to just our staging server. The result: our staging server, a Raspberry Pi 2 run out of my apartment (http://imgur.com/a/khE8L), was just as fast or even slightly faster than our DigitalOcean VPS. Incredible. 😲

Lastly, I added CloudFlare to my personal site. Full HTTPS for no reason, woo! 😄

rhitakorrr
rhitakorrr

Hi. It’s been a while.

While I was gone, Chromium went and entirely broke—and I mean broke, as in unusable broke—the #MidnightMurderParty reader. Yeah, one version of Chromium, it works. The next, it doesn’t. Since this breaks every Chromium-based browser (Google Chrome, Opera, Yandex, you name it), Midnight Murder Party is suddenly unreadable in all of them. The elements render, but after page two, they are all invisible as if visibility: hidden is set (which it isn’t). The only thing I’ve managed to figure out is that it’s somehow caused by CSS columns (each page is a column). @larouxn and I were planning to have a beta test next week, but that’s shot until we figure out how to get around all these broken browsers. In the meantime, I’ve added Google Analytics and better error handling/reporting.

Unrelated to MMP, I spent the holidays with my family, set a 2017 #GoodreadsChallenge of 25 books, picked up my manual typewriter from the shop, and have begun #writing a story on it!

larouxn
larouxn

Over the holidays, as I wrote in my last log, I tried to upgrade #midnightmurderparty to Ruby 2.3.2 and then 2.3.3 unsuccessfully. Well, 2.4.0 was released on Christmas and I failed to upgrade to that too.

Unfortunately, it seems the combination of one of our unmaintained gems, rvm/rvm1-capistrano3, which manages installing our gems and selecting our Ruby version during deploy and our one GitHub hosted (not RubyGems) gem, seuros/capistrano-puma, does not want to work with Ruby above version 2.3.1. It seems either I switch off RVM, originally I used ruby-install and chruby but couldn’t get deploys working, or I fork this GitHub gem and push it to RubyGems. Neither are guaranteed to work and both would kinda suck.

Aside from that, I’ve been fine tuning our error emails and finding out firsthand that a lot of random bots on the interwebs crawl your site and request nonexistent, usually PHP, files. Trying to keep from waking up to 10 ERROR 404! emails. 😅

December 2016

larouxn
larouxn

Been diving head first into technical #midnightmurderparty stuff for the past two days. Yesterday I attempted to upgrade our stack to Ruby 2.3.3, from 2.3.1, but ran into some arcane gem errors. Might have to fork a gem or two if this keeps up. For now, we’re staying on 2.3.1

Aside from the Ruby version update shenanigans, I implemented some nice error handling on the backend. Now if an HTTP error code is thrown (server error), I will be emailed. Nice for when we go live as I’ll know if anything breaks, when it broke, and what the error was without having to anymore than check my email. Also, spiced up (improved) our logging so we know everything that goes on from regular functionality to errors and beyond. Getting close to beta time! 🙂

larouxn
larouxn

Since my last log, about a month and a half ago, I’ve

  • completed my two week #song_a_day challenge | listen here
  • written a few more tunes since the challenge | listen here
  • made it through the Black Friday/Cyber Monday hustle here at Shopify
  • read Pyongyang: A Journey in North Korea by Guy Delisle, pretty interesting
  • traveled to and from New Jersey for 🇺🇸 Thanksgiving, heading back Monday for🎄
  • added caching to our NGINX configs to improve load times… should we CDN? Hmmm 🤔 #midnightmurderparty

Tonight I’m going to

  • meet with @rhitakorrr to discuss the Elm 0.18 upgrade, fine tune caching, and plan the coming week of dev
  • clean my apartment, gotta be spotless before I check out for three weeks
  • catch up with On A Sunbeam, one of the best web comics I’ve ever read
rhitakorrr
rhitakorrr

Since my last log, I’ve

  • upgraded the #midnightmurderparty front-end to #Elm 0.18
  • finished the first draft of the MMP Episode 1 rewrite
  • finished rereading Stephen King’s It
  • written the first draft of a flash fiction piece
  • started reading another book
  • dropped off my manual typewriter at the shop for repairs (which turned out to be pretty expensive!)

Tonight I’m going to

  • have an MMP dev planning meeting with @larouxn so we can get everything needed for the 1.0 release done by the end of January
  • edit the flash fiction piece I wrote last night
rhitakorrr
rhitakorrr

I keep forgetting to log here, but I’ve been pretty productive since #NaNoWriMo ended. Over the past five days, I:

  • Have continued nearly daily #writing (though not as much as during NaNo)
  • Edited and submitted a short story manuscript to a magazine (will hear back within ~2 weeks)
  • Began rewriting #midnightmurderparty Episode 1 with a hopefully better hook (if anyone wants to give me some feedback on this, let me know!)
  • Started researching for MMP Episode 4
  • Had an MMP dev meeting with @larouxn and threw together a Github Project board, which we will be reviewing tomorrow. The plan is to finish development by the end of January!
  • Started using #LifeRPG again (and programmed another tool to calculate Exp and RP in a consistent way)
  • Got OCR working for my typewritten text (new ink ribbon = darker text = good OCR)
  • Decorated my apartment for the holidays with my parents (and went to a diner; what’s more productive than diners?)

November 2016

September 2016

rhitakorrr
rhitakorrr

I was right. There was a pretty nasty bug hiding in that #midnightmurderparty refactor, but I fixed it now. Plus, I removed all the dead code paths and cleaned up the #Elm model.

I wrote a short story tonight as well, but it ended up being pretty awful. I think it has some promise, but I’m basically going to have to rewrite it from scratch tomorrow. Oh well, it’s all part of #writing.

rhitakorrr
rhitakorrr

I’m terrified right now. I finally wrote the major part of the #midnightmurderparty enhancement, which involved refactoring huge portions of navigation logic. It was the kind of refactor where you really can’t compile and test until it’s basically done.

When I finally compiled it, the compiler found two mistaken type signatures, and then it worked. But surely it couldn’t be that easy, I thought. There will definitely be errors in the runtime since I didn’t change the #JavaScript to work with it yet.

Except there weren’t. As far as I can tell, everything still works fine immediately after this massive refactor. I know this is #Elm, but this is too smooth even still. There must be a sneaky logic error somewhere, but I haven’t found it yet.

It works, and that’s terrifying.

rhitakorrr
rhitakorrr

I spent most of today apple picking with the fam and doing chores around my apartment. #LifeRPG has really been helping me stick to my new goals, and it’s very cool to see different aspects of my life all moving forward at a good pace, while also giving me some time to relax and slow down.

I got some more work done on the #midnightmurderparty enhancement I mentioned in a previous post. I anticipate being done with it by the end of the week or sooner.

rhitakorrr
rhitakorrr

Tonight I made more progress on #midnightmurderparty. I’m working on a pretty big enhancement at the moment. In the #reader, there is a lot of collision detection regarding which headings are currently within the viewport of the book. The enhancement, instead of checking all headings against the viewport every page turn, just does so once–when it renders–and stores that data in a map from page number to list of elements.

The idea is to cut the slow DOM querying out of the process and to search through less elements each page turn, but there’s another benefit I just realized yesterday. If I pass this map of page num -> element list to #Elm after the render, the Elm side of the program can perform a lot more logic without having to continuously ask the #JavaScript side to check things for it. This will cut out a ton of complexity!

Aside from that, I spent most of the day with a friend. We went to a diner, made cookies, and watched a Twitch stream of Super Mario RPG.

rhitakorrr
rhitakorrr

I’m back! This has been a longer break than I meant to take, but it was probably a good idea. I started working on forming some good habits and life balance. You know, eating, sleeping, and taking breaks instead of dev’ing 15 hours/day–just little things that help in the process of staying alive and keeping my apartment intact.

To that end, I’ve spent a couple days configuring #LifeRPG to make the process a little more fun. Progress bars are always good encouragement. Some goals I’ve set include daily reading (just joined Goodreads), regular writing, daily/weekly/monthly house chores, getting some exercise (even if that just means a mile walk), socializing more, and being more effective at my job.

So far this week I:

  • Wrote a #Haskell tool to figure out the RP value of LifeRPG rewards
  • Played Smash Bros. Melee w/ some office mates
  • Finished two books I’d been slacking on
  • Started another book
  • Finally got back to working on #midnightmurderparty!
larouxn
larouxn

Small update. Over the last five, ten minutes, or so I set up the staging server to work double duty as the deploy server while we’re short a third physical server. As a security precaution I have disabled password based login and only allow public key based authentication, intially only on prod. Thus, as part of setting up staging to deploy to prod, I ssh-copy-ided staging’s key over to prod and then locked down staging under public key auth only as well. Next step: test staging -> prod deploys. Small steps. @rhitakorrr #midnightmurderparty

larouxn
larouxn

Yesterday evening and this evening I spent some time researching, testing, and coding up a solution in the form of a POST endpoint that will allow @rhitakorrr and I to automagically deploy #midnightmurderparty whenever master is merged into via pull request or pushed to directly. Spoiler: the magic bit is GitHub webhooks. Surprise, surprise.

As of now, we have webhooks posting JSON blobs to our prod server whenever a PR or push occurs. Currently, the JSON payloads are simply logged to our app.log. Eventually the system will delegate out a bash command to #Ruby Capistrano deploy and the POST destination will be moved off of prod, to staging mayhap.

rhitakorrr
rhitakorrr

Today was strangely busy even for me. Things I did:

  • Walked 3-4 miles.
  • Collected feedback on a significantly revised opening hook for #midnightmurderparty.
  • Went food shopping / cleaned kitchen / did dishes.
  • Attempted to upgrade #OpenCart as a favor to my old Boy Scout troop. As it happens, OpenCart’s upgrade process is completely broken, and I had to roll the whole thing back. No progress was made there, unfortunately, after 3 hours of working on it.
  • Nearly completed the design of the posts for my #hakyll_portfolio_blog. Also added #Disqus, but it’s giving me odd iframe issues I’ve never seen from #Disqus before.
  • Somehow managed to squeeze in a couple episodes of Twin Peaks (I take breaks… sometimes…).

All in all, I did a bunch of unrelated but nonetheless productive things today. Well, yesterday. It’s now 2am. Goodnight.

rhitakorrr
rhitakorrr

Pushing hard on this #hakyll_portfolio_blog:

  • Improved a lot of the #CSS and fixed a nasty wrapping-under-fixed-sidebar issue.
  • Added navigation links to the sidebar as well as a conditional “return to home” button.
  • Added skills list with bars that indicate proficiency as well as a tag cloud to the sidebar.
  • Hakyll now generates a Portfolio page, which lists all my projects.

Aside from that, I’ve been gathering feedback about the first episode of #midnightmurderparty. @larouxn and I have been putting a ton of time into the site, but it doesn’t mean much if the story’s hook is weak. After hearing the feedback about the current version and the heavily revised version I proposed, it seems both versions have merit. I’m definitely going to rewrite the episode, so I guess I’ll have to find a happy medium. Can’t wait to get back to #writing!

August 2016

larouxn
larouxn

RSS Part 2: Glorious Refactor Heaven

  • Follow up to yesterday’s 'key' versus :key accessor debacle: I recursively deep_symbolized all keys. I prefer using symbols anyway. #Ruby
  • I rewrote the majority of the RSS release building and formatting code. Simplification level went through the roof. So, so, so much better. Borderline beautiful versus my RSS Feed version 1.0 and 1.1.
  • Refactor Pull Request

Overall, super happy with the RSS refactor from last night and tonight. Planning to merge and deploy shortly. #midnightmurderparty

larouxn
larouxn

RSS Part 1: Takeaways from a Trip to Dynamic Mutable Hell and Back w/ @rhitakorrr

  • With Active Record you can use as_json to turn your database records into JSON, wahoo! 😊
  • If you .merge!({key: val}) some of your JSON blobs, the merged ones become Hashes (expectedly)… which I forgot and then had some records with values only accessible via ['key'] and some via [:key].
  • Whilst iterating through an array of objects, if you insert an object into an array you initialized outside the iteration block, you’re actually only inserting a reference to that object. If the inserted object changes later but still during the loop, the one you inserted a while back has now also changed. 😒

I love #Ruby and this may not happen often… but I wish it couldn’t happen in the first place. Shoulda used #Elm. #midnightmurderparty

rhitakorrr
rhitakorrr

After a long coding binge, I finally burnt out on Friday when I hit a brick wall. I ended up git checkout -- .ing everything I had been working on and decided to take the night off. Had some friends over on Saturday and family up today. Seems the time off helped clear my thoughts because I resumed coding after my family left and came up with (what I think is) a pretty clever solution to my problem.

This ridiculous coding adventure is a bit too long to include in a log, but I documented the issue and my thought process as I went in order to keep it all straight in my head. Long story short, IE handles content wrapping in CSS columns slightly differently than other browsers, which threw my book collision logic off by a page. Nowhere near as bungled as Chrome was (IE actually does getBoundingClientRect right), but also harder to detect.

Hooray for no more high-priority bugs in the #midnightmurderparty code base (for now)!

rhitakorrr
rhitakorrr

It’s late, and I haven’t slept much all week, so I’ll keep this one brief. I intended to fix one little bug in the #midnightmurderparty #reader and then take the night off since I’ve burnt myself out really hard this week. But instead of just fixing one bug (which I did), I ended up finding a ton more. Too many to handle tonight, and almost all cross-browser issues that have no simple solution. Ugh.

I did manage to close a few issues I didn’t expect to while climbing down the rabbit hole, but I’ve been toiling with IE’s interpretation of DOM element placement in CSS column layouts for hours now with very little progress. Looks like I’m calling it quits here for the night. This is gonna bug me, though.

rhitakorrr
rhitakorrr

Tonight turned out to be more of a cleanup night than a dev night.

Also made a repository to publicly track my #midnightmurderparty writing progress!

larouxn
larouxn

Tonight was not as crazy as last night, as described in my last post, but it was still quite a crazy #midnightmurderparty dev night. Events worth noting:

  • Upgraded my internal network by changing by Bell router into a bridge and hooking up a new router I picked up yesterday. Down with 2.4GHz WiFi congestion, 5GHz AC or bust!
  • Fixed the Raspberry Pi staging server, which was completely out of commision with the aforementioned network changes.
  • Stripped out all environment variable usage in favour of a secrets YAML file.
  • Upgraded our DigitalOcean droplet to 1GB of RAM. Hot deploys work!!!

Basically: physical infrastructure, virtualized infrastructure, and code infrastructure.

larouxn
larouxn

Last night, @rhitakorrr and I jumped on a voice chat so we could discuss his monstrous build system changes for the frontend of #midnightmurderparty and then deploy it. The discussion went well. Our build system is now super powerful and will prevent browser caching, which is great considering how JS heavy the site is.

We decided to profile the RAM usage as we’ve run into our asset build process being killed before and assumed we may be running OOM since we only have a 512M box and we’re running hot deploys (server still running). Well, suspicions confirmed, we are indeed running OOM during hot deploys. Total usable RAM is 489M. Number:

  • Idle server - 88M
  • Deploy building - 250M
  • Fully running - 355M

Simple math: 489M (total) - 355M (running) - 250M (deploy) = -116M. We end up with -116M of RAM during a hot deploy. Thus, we’ll be upgrading our droplet on DigitalOcean to the $10/month box, which has a full 1GB of RAM. Oh, also, #Ruby Sinatra routing is garbage. Give me abstract named routes!

rhitakorrr
rhitakorrr

After pushing a little further with the #JavaScript config file for the #midnightmurderparty #frontend, I decided it would be better to store the config as a #yaml file and inject it during the build process. This led to a massive build script upgrade.

  • Config is now a #yaml file parsed in the build step instead of bundled #JavaScript used at runtime. This circumvents issues such as:
    • Needing to dynamically create script tags on the page based on config (which leads to all sorts of script loading order mayhem)
    • Needing to pass static data around in the #Elm model
  • Build system upgrade
    • Now injects values from config file directly into the source
    • Appends unique number to #JavaScript and #CSS sources to force bypassing the cache after a code update
    • Allows specifying --dev in terminal to run in dev mode, prod otherwise
      • Dev and prod mode both have their own values in the config file
      • If running in prod, the build script will remove console logs, debuggers, alerts, etc.
rhitakorrr
rhitakorrr

Finished the shim for Chromium-based browsers and added logic to avoid running it unless specific values were detected as “wrong.” This should prevent the fix from breaking browsers that work properly. Also fixed a recurring issue with Firefox… again.

I updated the generated #Disqus IDs to match the #midnightmurderparty #reader’s ID format, so they now work together. Though, I did have to rewrite the URL parsing logic with regex to account for more varying cases, especially links coming back from #Disqus.

Finally got a solid start on that config file. #Disqus is hooked up properly, and #Mailchimp is most of the way there. Currently, it’s just a JS file that gets bundled, but that’s leading to the need for dynamically included script elements as well as passing extra data around in the #Elm model. I’m considering injecting the config values during the build step instead, but I’ll have to think about it.

Does anyone know if there’s a standard way to do this sort of thing?

Newer Older