Elijah Kliot

I study Computer Science at the Rochester Institute of Technology, with minors in Creative Writing and English.

My mission is to explore software as a craft, weaving my passions into the canvas of my work.

Currently I am delving into the domain of interface development, while my studies focus on graphics and artificial intelligence.


  • Ravenmasker (Ruby)

    A steganographic covert communication solution for Twitter

  • Ray Tracer (C++)

    A 3D ray tracing renderer

  • Digital Literature (Multi)

    Forays into the world of digital literature

  • Conangen (Ruby on Rails)

    A character-generator for the Conan tabletop RPG by Modiphius

  • gl-ph (Web)

    Web development for the upcoming home page of RIT's digital literature journal.

Contact Me

You can email me, but unfortunately you'll need to enable Javascript.

Take a look at my work on Github.

I can also be found on Twitter, and you can connect with me on LinkedIn.

My resume is available here.

About Me

London-born and Chicago raised, forged by the long winters of Rochester, NY.

My highest values – when it comes to my work and anything I do – are authenticity, creativity, and functionality.

If I can learn something from making it myself – making it my own – I will.

Outside of my career – professionally and academically – I spend much of my time running tabletop role playing games, bouldering, and practicing HEMA.

The people that inspire me are Robert E Howard, John Carmack, and Edmund McMillen.

Take a look at my work on Github.

Visit a friend.

If you have any questions, reach out to me personally, or glance my Twitter account.

Drawn Fates

By Dylan Smith, Aaron Collins, and Elijah Kliot

Combinatoric storytelling using tarot cards, as a capstone project for the Digital Creative Writing Workshop at RIT.

This was a group writing project, where we chose to each write the perspective of a student in a small-town high-school caught up in a supernatural plot.

I wrote the journals for Asher, while Dylan Smith wrote for Gustave and Aaron Collins wrote for Cedrick.

All development work was done by myself, while Aaron Collins was responsible for the wonderful art.

A stream of consciousness hypertext fiction on inspiration, ownership, and imposterhood.

A generative fiction Twitter bot, following a disgruntled, absurdist cafe-goer in a fantasy world.

Twitter feed will be added once I hook the API to avoid the default Twitter analytics injection. For now, visit the link in this card's title.

C++ Ray Tracer

By Chris Lemelin and Elijah Kliot

This is a semester-long project for the CSCI 711 Global Illumination class at RIT with the goal of reproducing the following image:

Checkpoint List

  1. Recreating the basic scene

  2. Phong model w/ 16x supersampling

  3. Procedural checkerboard texture

  4. Reflective surfaces

  5. Transmissive surfaces

  6. Ward tone reproduction method (Lmax := 10000nit)

k-d Tree

Standford bunny

  • k-d tree build time: 4.30769 sec
  • Render duration with k-d tree: 6.16883 sec
  • Render duration without k-d tree: too long

Photon Mapping

1000 Photons, 100 photon estimate, 11 sec build and render

10000 Photons, 100 photon estimate, 162 sec build and render

100000 Photons, 100 photon estimate, 2638 sec build and render

100000 Photons, 200 photon estimate, 3060 sec build and render time


Twitter-centric Steganography

Ravenmasker sets out to provide a steganography solution for images uploaded to the Twitter platform.

Chiefly, images uploaded to Twitter are compressed, so any steganographic solution must be able to avoid any lossiness from this obstacle, in addition to discretion among a typical Twitter feed.

The solution is described ahead, and sample tweets can be found @ravenmasker.

Getting around Twitter's image compression

Because Twitter corrupts images uploaded to its platform, we need to get around that somehow.

The answer lies in PNGs and transparency -- in order to preserve transparency in images, Twitter will respectfully avoid compressing PNGs, so long as they contain at least one transparent pixel.

This gives us a baseline to work with: encrypted images are of the PNG format, and they must have at least one transparent pixel.

Image and message domains

This led to the thought, perhaps the alpha channels (the transparencies) of each pixel could serve as a domain for mapping a message.

Principally, each pixel has 256 values (8 bits) for the alpha channel of each pixel. Each ASCII character is 7 bits, meaning each ASCII character can fit into a single pixel's transparency layer.

We're now working with a few assumptions for our domain: the image will be a PNG, and the message to encrypt will be in ASCII format. Suggestions for expanding this to other character sets is explored later.

Storing a character into a pixel

Storing an ASCII character into a pixel is simple: take the pixel's alpha value (assuming an opaque pixel with an alpha of 255), and subtract the character's ASCII value.

Getting the character back from the pixel (again, assuming the pixel was originally opaque) is straightforward: subtract the current alpha from 255, and convert that to an ASCII character.