How I Made $100 Before Launching Career Craft AI

As a developer, I’m happiest when I’m building, creating something cool. But when it comes to selling my creations, let’s just say I’ve had more than my fair share of the learning curves. ๐Ÿ˜›

But this time was different. This time, I decided to give it a shot before diving headfirst into launching Career Craft AI. And you know what? Well, it actually worked out reasonably well.

So, what’s Career Craft AI? It’s a collection of AI tools designed to make job applications effortless.

You’re familiar with job descriptions (JDs) โ€“ they’re verbose, lengthy, and sifting through them to find key requirements is rather time-consuming. And as for writing cover letters? Well, you may spend hours trying to craft perfect cover letters, yet they often leave you unsatisfied.

That’s one problem we are determined to tackle with Career Craft AI. Our ‘Write Cover Letter with AI‘ tool is here to save those hours. You can input the job description and your resume summary, and with just a single click, you get a personalized, impactful cover letter in seconds.


However, these tools didn’t just magically appear out of thin air. Nope, they’ve been months in the making, refined and improved with each round of user feedback.

When I first started working on the “Write Cover Letter with AI” tool back in mid-2023, I had no idea where it would take me. Moreover, GPT models, LangChain were still in their infancy at that time. I showed it to a few friends as a fun project, then life got in the way (as it often does), and it fell by the wayside. But as luck would have it, I decided to give it another shot.

Starting with a basic MVP, I reached out to a few friends and ex-colleagues for feedback. They requested longer cover letters (which we now offer), details about the company’s nature (now added in our AI tool), and enhancements to professional profiles for influencers, among other suggestions. These early-user inputs were invaluable to us. With each iteration, we carefully considered their feedback, making tweaks and improvements along the way.

And you know what? It paid off. Over the months, our AI tools got better and better. It was not just building AI tools, but crafting effective solutions tailored to the needs of real job seekers. To be honest, we didn’t have too many of them – but those who experienced how many hours they could easily save with an AI-generated cover letter draft, were quite happy.

So, fast forward to last week, Career Craft AI was finally ready for its public debut. And while we may not have hoards of sign-ups flooding in just yet, we’ve got something even better โ€“ a few testimonials from early users who saw the potential in our little project from the start.

Oh, you know what the cherry on top was? Career Craft AI made a little over $100 before its official launch on 28แต—สฐ Feb ’24. Sure, it’s not a fortune, but it’s a start. And it’s proof that Career Craft AI has potential โ€“ and Iโ€™m determined to unlock it.

What next? Growing beyond the initial launch buzz, of course! That means learning and practicing some marketing (ahem!). As for the development, besides improvement to the current AI tools, we plan to launch a few more AI tools for resume. I want Career Craft AI to be the go-to platform for job seekers everywhere, offering a complete suite of AI tools to make their job applications effortless.

So, here’s to the exciting adventure ahead with Career Craft AI โ€“ it’s going to be one heck of a ride. Join us to follow this journey.


Build a Stunning Portfolio in Minutes with Python and Bootstrap

I needed a simple way to extract and add snippets created from the Open Graph tags (og:xyz) of my own articles, published across various websites.The goal was to quickly put together my writing portfolio. The Open Graph snippets (aka “cards”), are those good-looking previews visible on social media platforms when you share a link/URL as shown below.

Open Graph Preview Card

I couldn’t find one such tool/script to accomplish my goal. So I decided to write one myself. Follow along for this brief tutorial, or simply use the free portfolio-maker tool directly.

If you need a No-Code tool with a user-friendly GUI, don’t miss Portfolio Maker Pro. It allows you to create professional portfolios in seconds without any coding skills. Check it out now on Gumroad.

Prerequisite

  • Some familiarity with basic HTML and CSS. Although, the tool will automatically create a portfolio for you if you’re fine with the default theme.
  • Familiarity with Python – installing packages and running Python code from the command line.

Open Graph Tags

Here are some Open Graph tags from an HTML file. These tags are used by the social media platforms to generate attractive previews.

The Python tool extracts these tags from a website to create a portfolio snippet. It won’t be able to create a snippet if these tags are absent.

<meta property="og:title" content="Web Page Title" />
<meta property="og:description" content="Longer description..." />
<meta property="og:image" content="Image URL" />
<meta property="og:url" content="Website/Web-page URL" />

Bootstrap Cards

Since the portfolio needs to be responsive, this tool uses Bootstrap template – it is a ready-made website framework that you can use to quickly and easily create a responsive website. The portfolio-maker tool only uses the CSS part of the framework, not JavaScript. You can include it in the HTML via CDN as shown below –

<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css" 
rel="stylesheet" integrity="sha384-4bw+/aepP/YC94hEpVNVgiZdgIC5+VKNBQNGCHeKRQN+PtmoHDEXuppvnDJzQIu9" 
crossorigin="anonymous">

The next important step is to choose the right card template for the website snippets that you want to include in your portfolio. This is crucial to ensure that your Portfolio looks attractive. You can choose one such card template here – 23 Bootstrap Snippets. I have chosen Bootstrap Card Responsive (HTML + CSS) template for this tool. Besides a few cosmetic changes, I have added height restrictions in the CSS to ensure that the cards are uniform for all the portfolio snippets.

At the heart of this template, there is a card designed to display a single portfolio item. Additionally, the template makes sure that these cards work well on different devices and screen sizes, even with the images they contain. This means the cards will always resize properly on various screens, including mobile phones (responsive template).

<!-- START: Portfolio Card  -->
<div class="col-xs-12 col-sm-4">
    <div class="card">
        <a class="img-card" href="<url-here>" title="">
            <img src="<image-url-here>" alt=""/>
        </a>
        <div class="card-content">
            <h4 class="card-title">
                <a href="<url-here>" title="">
                    Project/Article Title
                </a>
            </h4>
            <p class="">
                Project/Article description in short...
            </p>
        </div>
        <div class="card-read-more">
            <a href="<url-here>" class="btn btn-outline-info" title="">
                Read More
            </a>
        </div>
    </div>
</div>
<!-- END: Card - Career, beyond laddersโ€ฆ -->

Creating Portfolio Snippets with Python

Essentially, the Python code for this tool works by generating a portfolio card for each provided URL. It uses BeautifulSoup (to parse HTML), Requests (to make HTTP requests), and Jinja2 templates (to generate dynamic HTML) to create the portfolio snippets. You can install these packages with pip:

pip install requests
pip install beautifulsoup4
pip install Jinja2

Take a look at this code snippet that extracts Open Graph tags from the web pages. It uses regex with BeautifulSoup to extract all the Open Graph tags from the HTML. The code further cleans them (removes og: part), and returns a simple key-value dictionary of these tags.

def _extract_og_data(self, url: str) -> dict:
    og_tags = dict()
    try:
        resp = requests.get(url)
        if 200 == resp.status_code:
            soup = BeautifulSoup(resp.text, 'html.parser')

            regex = re.compile('.*og:.*')
            og_data = soup.find_all("meta", {"property": regex, "content": True})

            for tag in og_data:
                og_index = tag['property'].index(":") + 1
                _key = tag['property'][og_index:]
                og_tags[_key] = tag['content']
        else:
            logging.warning(f"Invalid response form the site: {resp}")
    except Exception as ex:
        logging.exception(f"Exception: {ex}")
    finally:
        return og_tags

The following code snippet invokes the _extract_og_data(...) for a list of URLs and creates Open Graph data (a list of dictionaries) for creating the portfolio. The list of URLs is read from the text file: urls.txt.

site_cards = []
for url in urls:
    og_data = self._extract_og_data(url)
    site_cards.append(og_data)

Jinja2 Templates

The portfolio is actually created using a Jinja template. Jinja is a Python template engine that offers a cleaner way to make dynamic HTML pages or other text-based documents.

In the code snippet below, the Jinja template generates multiple portfolio cards by iterating over the Open Graph data โ€” cards, and substitutes relevant data (title, image, description etc.) in the HTML template.

{% for og_card in cards %}
<!-- START: Card - {{og_card.title}} -->
<div class="col-xs-12 col-sm-4">
    <div class="card">
        <a class="img-card" href="{{og_card.url}}" title="{{og_card.title}}">
            <img src="{{og_card.image}}" alt="Featured Image"/>
        </a>
        <div class="card-content">
            <h4 class="card-title">
                <a href="{{og_card.url}}" title="More...">
                    {{ og_card.title|truncate(30, true) }}
                </a>
            </h4>
            <p class="">
                {{ og_card.description|truncate(160) }}
            </p>
        </div>
        <div class="card-read-more">
            <a href="{{og_card.url}}" class="btn btn-outline-info" title="{{og_card.title}}">
                Read More
            </a>
        </div>
    </div>
</div>
<!-- END: Card - {{og_card.title}} -->
{% endfor %}

Lastly, the portfolio generated by the template is saved in a new file. You may edit this file to use your own CSS theme. You can see one such generated portfolio here – The world of expressions.

Using Portfolio Maker

You can use this tool in two different modes via the command line:

  • Portfolio Mode: This mode generates a single portfolio page, complete with HTML and CSS, using the provided list of URLs.
  • Snippets Mode: In this mode, the tool creates Bootstrap cards. You can then incorporate this generated HTML into your existing portfolio. This mode is particularly useful when you want to seamlessly add more work samples to your current portfolio.

See this tool in action through the animated GIF below.

Conclusion

An anecdotal joke about developers goes like this: A developer takes 2-3 days to automate a task that could have been finished in 2-3 hours. Well, with this “portfolio-maker”, I personify that imaginary developer. ๐Ÿ˜€

However, now that I’ve built this tool, all I need to do is add new URLs to the urls.txt file and then just run this tool to create the portfolio in just a few seconds. I don’t need to worry about putting the correct links, title, description, image etc. for every new article that I need to add there. ยฏ\_(ใƒ„)_/ยฏ

Do you want to build a stunning portfolio to impress your potential clients?

Make use of this portfolio-maker, now offered for free on Gumroad! Plus, it comes with full code access and a helpful video tutorial. ๐Ÿ™‚


True Lies of ChatGPT

When I say โ€œtrue liesโ€, I mean that ChatGPT is blurring the lines between truth and fiction (lies). If not impossible, it is now extremely difficult to tell what is true and what is not from the text it generates. This can lead to a sense of confusion and uncertainty, as you are unsure what to believe.

Does ChatGPT lie?

Well, we already know that ChatGPT lies – and it is not rare either. In fact, it has been called out for lying multiple times, such as in this article and in this example. It probably doesn’t matter much when it comes to gathering information about movies, books etc. However, I was shocked by the convincing fake studies that ChatGPT provided me. They sounded so credible, I almost believed them…

Researching with ChatGPT

I used a materialized view and some indexes to make a complex query on a PostgreSQL database run almost 70 times faster. For a related presentation, I was searching for publicly available studies on how others have improved their query performance by using materialized views and indexes. Google search didn’t help me much, so I decided to ask ChatGPT for some help.

ChatGPT, being the helpful assistant it is, provided me with some โ€œreal-lifeโ€ studies that showed impressive results using materialized views and indexes. However, much to my dismay, I discovered that all those studies were actually FAKE!

Here are the screenshots of my chat transcript. See for yourself how believable they all seem. I have also included those links after the screenshots – None of them exists though. ยฏ\_(ใƒ„)_/ยฏ

ChatGPT – Non-existent cases of performance enhancements with materialized views

Links provided for the examples –

Calling out lies

So, I called out the lies and asked ChatGPT again to provide me with some more credible references.

Result? Examine it yourself. ๐Ÿ‘‡๐Ÿฝ

ChatGPT – Non-existent cases of performance enhancements with materialized views

Links provided for the second set of credible examples –

You can click on these links and check if any one of them actually exists. I even tried searching for some text from those real-life examples, however, Google (or even Way Back Machine) knew nothing about these links. I have nothing more to add here.

Way Back Machine has no record of those study links provided by ChatGPT

Reasons for these lies

The Large Language Models (LLMs) such as ChatGPT are still evolving. Many important LLM behaviors emerge unpredictably. This emergence is the ability of LLMs to exhibit new and unexpected behaviors that are not explicitly programmed into them. At this stage, even the experts (including their creators) don’t fully understand how LLMs work. Furthermore, there are no reliable techniques for steering the behavior of LLMs. If you’re truly intrigued by this, please read the related paper by Sam Bowman, an expert on LLMs, titled – Eight Things to Know about Large Language Models.

As such LLMs like ChatGPT do not intentionally lie because they don’t possess consciousness or intentions. They may, however, generate incorrect or misleading information occasionally. This is clearly mentioned as one of the limitations of ChatGPT.

Think of ChatGPT as an exceptionally imaginative child who may occasionally make up believable stories while answering your questions.

Conclusion

ChatGPT can be used to generate the text that you want, but it is your responsibility to verify and validate the information you receive. Trust me on this one. ๐Ÿ˜›

Huh? Does this mean that ChatGPT is not really useful?

Nah! Not at all.

ChatGPT is extremely useful when you need to come up with different ways of writing some text. It understands the tone (informal, funny, professional etc.) of the written text quite well and can help you to convert from one tone to another. It can explain complex concepts that can be easily understood by a 10-year old, or provide advanced details of that concept to an expert in the field. It can summarize large articles or books. It can even generate poems, limericks, emails, letters, etc. as per the given instructions. It is prudent to use ChatGPT for its strengths.

Generative AI, whether it is text or image, is getting more and more sophisticated with each passing day. However, it is now more crucial than ever to exercise critical thinking in evaluating the veracity of AI-generated content. I can vouch for this!

By the way, the featured image (liar ChatGPT/Pinocchio) used in this article is created by DALL-E, using a prompt generated by ChatGPT itself. Isn’t that cool? ๐Ÿ˜Ž


Disclaimer: This blog post is based on my experience with the free version of ChatGPT (3.5?) that was available in May 2023. I’ve been informed that GPT-4 is an enhanced product and and its behavior may differ from what is described here.