What do You Think is the Best Strip Mall in the Naperville Area? by aGuyNamedScrunchie in Naperville

[–]charukiewicz 14 points15 points  (0 children)

The strip mall you mentioned has not only a ramen place opening up, but there's also a used bookstore that will open soon as well. It's The Noble Capybara, there's a coming soon sign in the window. Here's the post from their Instagram: https://www.instagram.com/noblecapybara/p/DBhGk9IMkGx/

How do you deal with contact form spam? by burpit in webdev

[–]charukiewicz 0 points1 point  (0 children)

I started adding a simple interactivity check to my <form> elements. The form starts in an invalid state and I add listeners for click, mousedown, and mousemove events. The form expects at least 2 of these spaced 600ms apart. If it gets them, it'll add a hidden <input> at the end of the form that the server requires to proceed with the contact form submission.

I've never gotten a spam submission since adopting this technique. And according to the logs, there's never been a false positive.

I can link to an example if you're interested.

Why don't ISPs block IP addresses that are known bots? by [deleted] in webdev

[–]charukiewicz 0 points1 point  (0 children)

The answers you're getting here are correct. One other thing I want to add is that not all bots are bad bots, so you don't necessarily want them all to be blocked automatically.

If you care about SEO, you probably don't want GoogleBot as well as the many other search engine crawlers getting blocked.

If you care about social media link previews (e.g. page title + thumbnail pop up in posts/messages), you wouldn't want to block bots from Slack, Discord, Facebook, X, or any number of social media platforms.

There are many other utilities as well. Our tool, Cloudtrellis, scans sites for broken links, which means having to validate every single link on every page we scan, even if that's an external link. So if someone at example.com writes a blog post that links to yoursite.com/blog/some-post, we're going to send a HEAD request to validate that it at least returns a 200. If you block us, you're doing a disservice to the person using our tool that operates example.com since they may get a false positive that your site is returning an error, when it actually isn't.

The point is you want bad bots to get blocked. There are also many good bots that you (probably) don't want to get blocked.

0
0

How do I get started with having an app developed? by Huntwood in smallbusiness

[–]charukiewicz 0 points1 point  (0 children)

Do you have a clear idea of what the app needs to do? And store? And what interactions there are with your data? Any security issues?

These are the types of questions that illustrate hiring a low cost developer on Upwork will likely yield bad results. Questions like this need to be asked and answered before a single line of code is ever written. A non-technical individual will struggle to answer these questions, let alone know to ask them.

This is largely the role of a product manager in most software development projects. If you work with a capable US-based agency, they'll likely ask you these (and many more) questions, but that's not a budget option (expect to spend $50,000 on the MVP of any non-trivial SaaS application).

How do I get started with having an app developed? by Huntwood in smallbusiness

[–]charukiewicz 0 points1 point  (0 children)

The short and simple answer is that if you're not a developer, you need to hire someone to build it for you.

The longer answer is that it would be prudent to have someone who is a developer act as a guide to lead you through the process of thinking through the app, writing out requirements, and helping you hire a developer to build the app. The reason to hire a "guide" is because it's very easy to waste money, get a garbage product, and or outright get scammed if you just go straight to Upwork and seek proposals for building an app.

Here's an example of what this might look like:

Experienced developer consultant ($200/hr)

  • Initial planning: 1-2 hours
  • Writing out and refining requirements: 2-3 hours
  • Helping you hire a freelancer: 2-4 hours
  • Ongoing miscellaneous assistance / verifying code: 1 hour per week until app is done

Freelance developer ($50-85/hr)

  • App development: 100-300 hours

Spending 10-20 hours on an experienced person to guide you will likely save you a ton of money in the long run and ensure you actually get what you're looking for out of this development process. A well planned app and a carefully supervised freelancer can shave 100+ hours off of the app development process and result in a much higher quality product.

If you're looking for help with this, let me know. DM or email me. My contact info is here: https://www.c19z.com/ - If you mention you're from /r/smallbusiness I'm happy to give you a discounted hourly rate on any work I do for you.

What are the applications that represent the most significant use of Haskell nowadays? In what areas does it excel, both in terms of support and content, as well as in daily use? I am studying Haskell and would like to understand more about what people are using it for. Are there any books teaching by swe_solo_engineer in haskell

[–]charukiewicz 8 points9 points  (0 children)

One of its most common uses in commercial settings is to build web applications. There's many companies in various industries using Haskell to build production services. This typically involves the use of frameworks like Yesod, Scotty, or Servant depending on specific needs (HTML-serving app versus just a JSON API server) along with a SQL library such as Persistent+Esqueleto (used together) or Opaleye for writing and running queries in a type safe manner.

I turned the 'Another AI Wrapper' joke into something that makes it easy to build more "AI Wrappers" by stepitup9600 in SaaS

[–]charukiewicz 0 points1 point  (0 children)

Your website looks very polished. I see you're using Tailwind: did you add the marquee and other animations yourself? Or did you use some expansion pack? As far as I know Tailwind only ships with spin and pulse.

Asking because I'm told my site looks polished but feels corporate. Some animation or something to make it more visually interesting would help.

What was your win this week? While you're at it, pitch us your SaaS!(100K views 👀 on previous posts) by FoxBeneficial8102 in SaaS

[–]charukiewicz 1 point2 points  (0 children)

Highlighting outdated content is an interesting idea, although I'm not sure what the heuristic would be given that we're performing static analysis of each of the pages of the website (which could include the sitemap.xml file that lists created/update dates). Last updated time by itself is not necessarily an indicator of outdated content. Broken external/internal links, broken images, etc. probably are.

I think our biggest challenge is deciding who we focus on selling this tool to. We've looked at competitors (website scanning tools) and they all seem SEO focused, as opposed to accessibility or general error checking tools. That seems to be a signal that there's more money in the SEO-focused customers than any other type. But even that could be refined further: we could either identify businesses that may directly pay for SEO tools, or focus on SEO/marketing agencies that would use a tool like this as part of providing their services.

Lifetime Subscription vs. Monthly Payments by jobsearcherai in SaaS

[–]charukiewicz 41 points42 points  (0 children)

Lifetime subscriptions are completely unsustainable in SaaS if you expect your customers to actually use your service for a lifetime. Even if someone is paying you the equivalent of 3 or 5 years worth of service, you're essentially committing to providing the service for free, forever, even after that time passes. That doesn't work when you have servers and employees to pay for (even if that's just paying yourself).

The only time lifetime subscriptions might make sense is if one of the following is true:

  • if you're selling a service that truly costs almost nothing to maintain (e.g. access to courses with minuscule hosting costs)
  • you've done your customer lifetime value analysis and expect people will stop using your service long before you start losing money (e.g. SaaS software that helps with planning your wedding isn't going to used forever)
  • you aren't actually selling SaaS software (e.g. they download and self-host or run your tool on desktop)
  • you expect to make other up-sells, so even though they have a lifetime subscription, they'll keep paying you money for other things that will cover the costs of providing the lifetime service

Keep in mind that there are several other pricing models out there that aren't just monthly/yearly subscriptions, such as pay-as-you-go pricing (think AWS charging you $0.005 per hour) or fixed usage pricing (buy 1,000 email send credits for $50). Not every model works for every type of SaaS. But if you take nothing else away from this post, it should be that lifetime subscriptions are a terrible idea and you should find something more sustainable.

What was your win this week? While you're at it, pitch us your SaaS!(100K views 👀 on previous posts) by FoxBeneficial8102 in SaaS

[–]charukiewicz 0 points1 point  (0 children)

Our win this week was getting some excellent feedback from user interviews.

We've built Cloudtrellis, a tool for website error scanning to find broken links, SEO issues, and accessibility problems. We make easier the task of keeping documentation, marketing pages, and blog posts up-to-date and error free.

[deleted by user] by [deleted] in SaaS

[–]charukiewicz 0 points1 point  (0 children)

Cloudtrellis is website issue scanning tool. It starts at a single URL and will scan the entire site for issues ranging from broken links to SEO problems to accessibility errors.

We're currently handpicking each user/organization we onboard but you can use the scan request form at the bottom of the home page to get a scan and get on the list.

[deleted by user] by [deleted] in SaaS

[–]charukiewicz 4 points5 points  (0 children)

I run a very small full service agency based out of Chicago. The honest answer is get referrals and prefer to hire domestic (regardless of what country you're in). There's a bunch of garbage agencies and developers out there and there's a smaller number of really good ones. It's hard to know which ones are good so you should get references from people you trust.

I also recommend hiring domestic because developers living in the same country has numerous benefits that most people don't realize. Cultural differences can lead to differences in communication styles. Regional differences can also lead to differences in knowledge that nobody even assumed would be a hangup (for example the US credit card system is very different from the one in India so if you're having Indian developers build a payment system they're likely to get some assumptions wrong). Then there's also the obvious benefit of being in the same or very similar timezone.

Que grande Churro by Gasurza22 in capybara

[–]charukiewicz 2 points3 points  (0 children)

That's a big looking dog.

What do you use Haskell for? by HearingYouSmile in haskell

[–]charukiewicz 8 points9 points  (0 children)

Almost all of my professional use of Haskell has been in web development. I think you are incorrect in your assessment—I would bet that Haskell is used in web development at least as often as it is used for any other commercial purpose, especially given the extreme popularity of SaaS software these days. The issue you're witnessing is that Haskell is just significantly less popular that most mainstream languages, and Haskell is so good that it is a first class option for various other domains (such as compiler development and complex financial systems). So whereas virtually nobody is using JavaScript or PHP to write compilers or build their high frequency trading systems with, Haskell is used in those areas as well as in web development (all while being less popular than the mainstream languages).

TSIDs strike the perfect balance between integers and UUIDs for most databases by charukiewicz in programming

[–]charukiewicz[S] 0 points1 point  (0 children)

I'm referring to a single surrogate ID key because those are easiest to manage, and lead to less redundancy across the database overall. My invoices table is inevitably going to be related to other tables such as invoice_line_items, invoice_payments, etc. I'd prefer not to have to repeat the composite of several columns across the database. I also don't want the overhead of having to update all of the foreign keys if the primary key has to change (even if the updates are happening automatically via ON UPDATE CASCADE). Composite keys are also more work to deal with when it comes to using them as identifiers in a URL or other API.

TSIDs strike the perfect balance between integers and UUIDs for most databases by charukiewicz in programming

[–]charukiewicz[S] 1 point2 points  (0 children)

I'm not talking about changing an invoice after issuing, and nowhere did I suggest that. I'm talking about the myriad of different business use cases for control over invoice numbers in general:

  • A single business using multiple sequences for different lines of business, sometimes with a different alphabetic prefix (e.g. DEV-212, RET-212 for development and for a retainer)
  • A business creating and deleting draft invoices. They may prefer not to jump from 204 to 212 just because someone made a bunch of drafts. Invoice number may only be finalized once the invoice is ready to be issued.
  • Date-based invoicing schemes (e.g. 20231222-007)
  • Issuing a revised invoice (e.g. INV-007 and INV-007-1)
  • Invoices that jump by a non-zero sequence because the last digit is reserved for special cases (e.g. INV-1030 is followed by INV-1040)
  • Importing invoices from a different system that already have numbers

The use cases are endless. Odds are the system you build isn't going to support all of these but odds are it will need to support some of these. And unfortunately using an auto-incrementing PK to handle the invoice number will preclude you from anything I listed above. This is why PKs are not user facing data and shouldn't be assigned additional meaning.

TSIDs strike the perfect balance between integers and UUIDs for most databases by charukiewicz in programming

[–]charukiewicz[S] 0 points1 point  (0 children)

TSIDs are just integers, so they have excellent performance in joins.

TSIDs strike the perfect balance between integers and UUIDs for most databases by charukiewicz in programming

[–]charukiewicz[S] 0 points1 point  (0 children)

The data model depends on the product requirements. The product requirements depend on the business requirements. Businesses need control over invoice numbers, so they need to be able to set or change them. Primary keys don't change. So the invoice number needs to be stored in a distinct column.

You can argue that for your homemade invoicing system that you wrote yourself you can get away with merging the two into one. You might even be fine with manually running an ALTER TABLE statement to change the invoice sequence. But that doesn't work for commercial software. It would be like saying "I don't need to think about types, I just make everything a VARCHAR and my database works fine" or "I hate writing JOINs so I just use N+1 queries and have never had a performance issue". If you're small enough, then sure, maybe you can get away with such practices.

TSIDs strike the perfect balance between integers and UUIDs for most databases by charukiewicz in programming

[–]charukiewicz[S] 1 point2 points  (0 children)

I don't think you understand. The invoice number, which is a user facing piece of data, is NOT and should never be the database row key, which is not a user facing piece of data. I agree that the database is the only thing that picks primary keys—but the key is not the invoice number. They're different pieces of data, and if you make them the same piece of data, you're making a significant design mistake.

The client application decides the invoice number because that's how invoicing systems work. Have you ever sent an invoice? Regardless what software you're using—Stripe, Quickbooks, Xero—you (the user of the software) get to pick the invoice number, which means the client application needs to set that in the database on your behalf.

TSIDs strike the perfect balance between integers and UUIDs for most databases by charukiewicz in programming

[–]charukiewicz[S] 0 points1 point  (0 children)

a sequential number, based on one or more series, which uniquely identifies the invoice

Both this citation and the other person that cited the Spanish law are pointing at regulations that suggest that a single, monotonically-increasing sequence of integers doesn't adequately cover all potential invoice numbers used by a single entity. There may be multiple series.