personal-site/out/blogs/side-project-8-15-23.html
2025-01-31 19:29:54 -05:00

83 lines
3.5 KiB
HTML

<head>
<title>Nicholas Orlowsky</title>
<link rel="stylesheet" href="/style.css">
<link rel="icon" type="image/x-icon" href="/favicon.ico">
</head>
<body>
<nav>
<a href="/">[ Home ]</a>
<a href="/blog.html">[ Blog ]</a>
<a href="/projects.html">[ Projects ]</a>
<a href="/extra.html">[ Extra ]</a>
<hr/>
</nav>
<h1>Side Project Log 8/15/2023</h1>
<p>This side project log covers work done from 8/8/2023 - 8/15/2023</p>
<h2 id="olney">Olney</h2>
<p>
I added a frontend to Olney and added a feature where it can automatically keep track of your job applications
by monitoring your email.
</p>
<h3>Frontend</h3>
<p>
The frontend was made with Svelte. I chose not to use any UI/CSS libraries as I wanted to keep the number of
dependencies low. This was another good opportunity to learn about Svelte.
</p>
<h3>Automatic Tracking via E-Mail</h3>
<p>
This is the killer feature that I initially set out to build Olney for. This works by having the user forward their
E-Mail to an instance of Olney. To receive E-Mail, Olney uses <a href="https://inbucket.org">Inbucket</a>, a mailserver
easily hostable within Docker. It listens on a websocket for incoming mail. Whenever a new mail message is received,
Olney uses the OpenAI API to get a summary of the email in the following format:
</p>
<pre><code class="language-json">
{
isRecruiting: bool, // is the message about recruiting?
recruitingInfo: null | {
location: string, // Location in City, Providence/State, Country format
company: string, // Casual name of company e.g: Google, Cisco, Apple
position: string, // Name of job position
type: "assessment" | "interview" | "offer" | "rejection" | "applied" // What the message is discussing
dateTime: string, // DateTime communication rec'd OR DateTime that is being discussed (i.e. interview date confirmation)
name: string // Name of event, giving more detail to type
} // null if message is not about recruiting, fill with values if it is
}
</code></pre>
<p>
Olney then takes some details from this data, namely: company, position, and location and then uses the OpenAI API to generate
an <a href="https://www.pinecone.io/learn/vector-embeddings/">embedding</a>. We then query the closest match out of the job applications
in the database (with <a href="https://github.com/pgvector/pgvector">pgvector</a>). Once we have the job application, we add
the event to the database, using the job application's id as a fkey.
</p>
<p>
I chose embedding as the lookup method so that we don't have to worry about the data parsed out of the email being an exact
match for what the user inputted. This also allows the lookup to work even when certain things such as location are missing from the
email.
</p>
<p>
Olney should be open-sourced/released within the next week or two.
</p>
<hr>
<p><strong>These projects had minimal/no work done on them:</strong> NWS, RingGold, SQUIRREL</p>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/dark.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min.js"></script>
<script>hljs.highlightAll();</script>
<footer>
<hr />
<p style="margin-bottom: 0px;">Copyright &#169; Nicholas Orlowsky 2025</p>
<p style="margin-top: 0px; margin-bottom: 0px;">Hosting provided by <a href="https://nws.nickorlow.com">NWS</a></p>
<p style="margin-top: 0px;">Powered by <a href="https://github.com/nickorlow/anthracite">Anthracite Web Server</a></p>
</footer>
</body>