Compare commits
5 Commits
25ce2716a5
...
3d57ad82c5
| Author | SHA1 | Date | |
|---|---|---|---|
| 3d57ad82c5 | |||
| 598ec3fd38 | |||
| 7e41536b4f | |||
| 8434a9dae5 | |||
| c0def2f0a3 |
@@ -575,7 +575,7 @@ export default {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "Dom Corriveau",
|
title: "Dom Corriveau",
|
||||||
feedUrl: "https://blog.ctms.me/index.xml",
|
feedUrl: "https://blog.ctms.me/posts/index.xml",
|
||||||
url: "https://blog.ctms.me/",
|
url: "https://blog.ctms.me/",
|
||||||
description:
|
description:
|
||||||
"Thoughts, opinions, wild speculation, and haphazard technical advice from Dom.",
|
"Thoughts, opinions, wild speculation, and haphazard technical advice from Dom.",
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ export default {
|
|||||||
profilePic: "/img/CN20191025_301_Srt_SQUARE_crop.jpg",
|
profilePic: "/img/CN20191025_301_Srt_SQUARE_crop.jpg",
|
||||||
},
|
},
|
||||||
blogrollUrl: "/blogroll/nathanUpchurchBlogroll.opml",
|
blogrollUrl: "/blogroll/nathanUpchurchBlogroll.opml",
|
||||||
copyrightNotice: "© Nathan Upchurch 2022 - 2025",
|
copyrightNotice: "© Nathan Upchurch 2022 - 2026",
|
||||||
defaultPostImageURL: "/img/logo_post.svg",
|
defaultPostImageURL: "/img/logo_post.svg",
|
||||||
defaultPostImageAlt: "The logo for this blog: a capital letter N.",
|
defaultPostImageAlt: "The logo for this blog: a capital letter N.",
|
||||||
mastodonHost: "lounge.town",
|
mastodonHost: "lounge.town",
|
||||||
|
|||||||
297
content/blog/thoughts-on-incense-quality-price-and-snobbery.md
Normal file
@@ -0,0 +1,297 @@
|
|||||||
|
---
|
||||||
|
title: "Incense: Thoughts on Quality, Price, and Snobbery"
|
||||||
|
description: "Some thoughts on how we think about quality, how incense pricing relates to it, snobbery, and my service-industry past."
|
||||||
|
date: 2026-01-31
|
||||||
|
tags:
|
||||||
|
- Incense
|
||||||
|
synopsis: "Some thoughts on how we think about quality, how incense pricing relates to it, snobbery, and my service-industry past."
|
||||||
|
imageURL: /img/thoughts-on-incense-quality-price-and-snobbery/tennendo-kyara-incense-stick-macro-shot.webp
|
||||||
|
imageAlt: "A macro shot of a burning stick of incense with shallow depth of field."
|
||||||
|
mastodon_id: "115993146633109522"
|
||||||
|
---
|
||||||
|
Whether discussing wine, spirits, perfumes, or incense, there is much back and
|
||||||
|
forth on the subject of quality. On the one hand, there are the connoisseurs
|
||||||
|
flashing their three-plus digit purchases on enthusiast forums, and on the
|
||||||
|
other, there are the humble, salt-of-the-earth naysayers gleefully reminding
|
||||||
|
them of that time a bottle of supermarket swill beat out a premium bottle in a
|
||||||
|
wine competition. From fractions of a penny per stick for "hand dipped" fare,
|
||||||
|
to
|
||||||
|
[over ten dollars each for premium Japanese sticks](https://kikohincense.com/collections/kyara-incense/products/gyokushodo-en-no-sho)
|
||||||
|
, the world of incense has something for every budget. It seems that for every
|
||||||
|
person opining on the sublime beauty of the .5mm green-oil kyara and musk
|
||||||
|
sticks they picked up for a trifling four-figures, there is another insisting
|
||||||
|
that dollar-store punks soaked in a pungent bath of
|
||||||
|
[liquid plastic](https://en.wikipedia.org/wiki/Dipropylene_glycol) and
|
||||||
|
industrial aroma chemicals are just as good, and that anyone enjoying incense
|
||||||
|
that cost more than pennies per stick is either a poseur or a rube brainwashed
|
||||||
|
by the flashy marketing[^1] and pretty boxes of the Japanese incense industry.
|
||||||
|
Amidst the bickering, newcomers to this fragrant world want to understand what
|
||||||
|
quality means in the context of incense. How do they know that they're buying
|
||||||
|
high quality incense? Where do they find it? How does quality relate to price?
|
||||||
|
The reality is that there are as many answers as there are people, but I hope
|
||||||
|
that I can add some nuance to the conversation, address some misconceptions,
|
||||||
|
and, if I'm lucky, provide a little clarity on the subject.
|
||||||
|
|
||||||
|
[](/img/flora_botanical_incense_abundance_oud/agarwood_skins_vs_white_kinam_bead_waste.webp)
|
||||||
|
|
||||||
|
## What is quality, anyway?
|
||||||
|
|
||||||
|
In order to talk about quality, we first have to come to some agreement as to
|
||||||
|
what the word means. In the Tibetan and Chinese traditions, incense is used not
|
||||||
|
only for fragrance, but also as medicine. Therefore, a stick made with a
|
||||||
|
preponderance of very fresh and pungent material prized for its medicinal
|
||||||
|
properties might be considered high quality, although to you and I it may smell
|
||||||
|
like burning twigs with a hint of sulfur. If, like me, you understand that
|
||||||
|
there is approximately zero compelling evidence that incense is of any
|
||||||
|
medicinal value whatsoever, you will likely disagree with this assessment. I
|
||||||
|
have also heard that consumers of Chinese incense value incense that uses few
|
||||||
|
to no concentrates, whether natural extracts or synthetics. To this market, a
|
||||||
|
dry and subtle sandalwood stick might be perceived as being of high quality,
|
||||||
|
whereas consumers of Indian incense—today almost entirely a product of
|
||||||
|
perfumery—may find it utterly underwhelming compared to their usual nag champa,
|
||||||
|
powerful enough to fragrance a large open space during puja. In the west, there
|
||||||
|
is significant consumer demand for natural products[^2], so incense marketed as
|
||||||
|
"natural" will be perceived as being higher quality.
|
||||||
|
|
||||||
|
It's plain to see that quality means different things to different people. But
|
||||||
|
I wonder if it might be simply described as the degree to which something meets
|
||||||
|
the *multiple* goals or needs of the person assessing its quality. As we'll see,
|
||||||
|
enjoyment comes from many places. I strongly believe that, where it relates to
|
||||||
|
consumables, the hang-up on raw sensory pleasure as the stick by which quality
|
||||||
|
is measured needs to be put to bed. Was the week in which you had the most
|
||||||
|
orgasms or ate the tastiest meals the highest quality week in your life?
|
||||||
|
Perhaps it was, but I think that's unlikely.
|
||||||
|
|
||||||
|
I rarely drink wine, but even I have become radically bored with hearing
|
||||||
|
countless recitations of the time a handful of sommeliers roundly embarrassed
|
||||||
|
themselves by preferring a glass of supermarket wine over the competing *Chateau
|
||||||
|
Au Frou-Frou 1995*. Beyond the tiresome repetition, this sneering retort to
|
||||||
|
those who enjoy wines priced beyond a box of Barefoot belies a fundamental
|
||||||
|
misunderstanding of why people buy expensive wines in the first place. Sure,
|
||||||
|
posturing happens, but an enthusiast will snag that $400 grand cru not because
|
||||||
|
they want to show off on Instagram, nor because they necessarily think it will
|
||||||
|
taste better than a cheap bottle, but because they want to know what the output
|
||||||
|
of the estate tastes like. They want the 2008 vintage because they hear that
|
||||||
|
the humidity that year had a unique effect on the grapes. They aren't familiar
|
||||||
|
with the profile of César grapes, and would like to try a single-varietal
|
||||||
|
bottle using them. They like the floral notes that biodynamic wine-making
|
||||||
|
methods offer. And sure, if you put a glass of bottom-shelf Chardonnay in their
|
||||||
|
left hand and a glass of "the good stuff" in the right, the left hand may well
|
||||||
|
meet the lips more often, but that's beside the point.
|
||||||
|
|
||||||
|
[](/img/thoughts-on-incense-quality-price-and-snobbery/FOH-Work-Event.jpg)
|
||||||
|
|
||||||
|
In another life, I worked at an up-market cocktail lounge where we stocked
|
||||||
|
high-end spirits. One whiskey sold for $7,000[^3] a bottle. Pours of another
|
||||||
|
went for over $400 apiece[^4]. But the fifteen year old Pappy Van Winkle in the
|
||||||
|
middle of the right-hand side of those bar-shelves was just as good as that
|
||||||
|
$7,000 bottle. Although it was over $200 less per glass than our most expensive
|
||||||
|
pour, most people agreed that it tasted better. This was irrelevant; people
|
||||||
|
paid the extra money because those more expensive whiskeys were close to
|
||||||
|
impossible to get. By tasting them, you were tasting history—a precious liquid
|
||||||
|
that would, sooner or later, be lost to time. To the guests buying these
|
||||||
|
whiskeys, they were not of the utmost quality because they tasted the best.
|
||||||
|
They were of the utmost quality because they met desires beyond the want of a
|
||||||
|
tasty drink: a desire for knowledge, for experience, for a connection with the
|
||||||
|
past. All the same, after a long shift, a bartender I worked with once quipped:
|
||||||
|
"At the end of the night, I'm not looking for nuance," as he took a shot of
|
||||||
|
bottom-shelf whiskey and cracked open a can of lager.
|
||||||
|
|
||||||
|
[](/img/thoughts-on-incense-quality-price-and-snobbery/In-The-Kitchen.jpg)
|
||||||
|
|
||||||
|
## On snobbery
|
||||||
|
|
||||||
|
If we take a closer look at practices that are often dismissed as snobbery, we
|
||||||
|
soon realize that, even if they are weaponized as rituals of the upper class,
|
||||||
|
they nonetheless have working class origins.
|
||||||
|
|
||||||
|
Complex lists of flavor notes are a best-effort by those who produce a
|
||||||
|
wine/spirit/coffee/what-have-you to describe the product of their labor to
|
||||||
|
people who haven't tried it. Sticking one's nose into a Glencairn glass and
|
||||||
|
breathing in through the mouth will keep alcohol from instantly nose-blinding a
|
||||||
|
bartender-in-training, one who will be smelling hundreds of spirits over the
|
||||||
|
coming weeks. The precise weighing of coffee beans packed into a portafilter
|
||||||
|
provides consistency of flavor from drink to drink throughout a busy service.
|
||||||
|
Even the haughtiest bottle of champagne has a team of *workers* behind it who,
|
||||||
|
in pursuit of excellence, devise practices that will later be derided as
|
||||||
|
pretensions because of their association with the class of people that can
|
||||||
|
afford the product.
|
||||||
|
|
||||||
|
Working people are the taste-makers. They always have been. They create
|
||||||
|
excellence every day, categorize it, describe it, devise the best ways to
|
||||||
|
discern and appreciate the differences between one product and another. Working
|
||||||
|
people are best positioned to take on these tasks. Their deep familiarity with
|
||||||
|
what they produce is a far-cry from the shallow collection and consumption that
|
||||||
|
has been rendered into a hobby by the affluent.
|
||||||
|
|
||||||
|
## Does price matter?
|
||||||
|
|
||||||
|
So, with all that said, what exactly does *price* tell us? Obviously it will
|
||||||
|
give us a clue as to how the brand is positioned in the market but, uniquely to
|
||||||
|
incense, pricing can give us a very good clue as to the ingredients used in a
|
||||||
|
stick. Sure, there are differently priced coffee beans, but the sheer breadth
|
||||||
|
of the range of prices for incense ingredients is perhaps paralleled only by
|
||||||
|
natural perfumery.
|
||||||
|
|
||||||
|
[](/img/thoughts-on-incense-quality-price-and-snobbery/a-lot-of-coffee-beans.JPG)
|
||||||
|
|
||||||
|
Scarce does not begin to describe the dearth of highly fragrant and resinated
|
||||||
|
agarwood in today's world. Oman's prized frankincense is so terribly
|
||||||
|
over-exploited that the Omani government has all but taken over the industry in
|
||||||
|
the country, only allowing a small amount of the precious resin to be released
|
||||||
|
each year—at a premium price. Woe betide you if you are caught so much as
|
||||||
|
looking at a sandalwood tree the wrong way in India these days, and as hard as
|
||||||
|
they try, Indonesia and Australia are not yet able to match the quantity or
|
||||||
|
quality of output by India's sandalwood industry in its heyday. Typically, as
|
||||||
|
the price increases for East Asian incense, so too does the quality and/or
|
||||||
|
quantity of these precious aromatics, and any incongruence here would quickly
|
||||||
|
be noticed by enthusiasts. From
|
||||||
|
[pennies per gram for eucalyptus leaf](https://web.archive.org/web/20250906194216/https://scents-of-earth.com/eucalyptus-leaf-eucalyptus-globulus-india/)
|
||||||
|
to well beyond the price of gold for
|
||||||
|
[top-end agarwood](https://web.archive.org/web/20250428184307/https://www.ensaroud.com/product/white-kinam/)
|
||||||
|
, the range is extreme. While modern lifestyle brands market low-to-mid-range
|
||||||
|
sticks for obscene prices, whole-botanical based East Asian incense from well
|
||||||
|
known incense houses are all but forced align their pricing with the quality of
|
||||||
|
the ingredients. When your incense uses whole-plant materials, the best-grown,
|
||||||
|
freshest, rarest, and most fragrant plants come at a significant price premium
|
||||||
|
due to their rarity and the labor involved in cultivating them.
|
||||||
|
|
||||||
|
[](/img/thoughts-on-incense-quality-price-and-snobbery/sifting-ground-sage-for-incense-sticks_copy.webp)
|
||||||
|
|
||||||
|
For Indian style incense this situation is a little different. While higher
|
||||||
|
prices might reflect the use of expensive natural oils as opposed to aroma
|
||||||
|
chemicals, unfortunately, and as far as I know, incense using top-end natural
|
||||||
|
materials is all but extinct in Indian brands. I am sure there are small
|
||||||
|
artisans making premium incense in India, but it seems to be mostly smaller
|
||||||
|
western operations such as [Jeomra's Räucherwelt](https://raeucherwelt.de/) that offer Indian-style
|
||||||
|
incense made with premium natural materials. More-so than in Japanese incense,
|
||||||
|
however, pricing seems to indicate effort for Indian sticks. As opposed to
|
||||||
|
Japan's extruded sticks, it isn't at all uncommon to find agarbatti that are
|
||||||
|
hand-rolled. It's debatable as to what difference this makes to the final
|
||||||
|
fragrance. Some contend that the density of machine-extruded sticks negatively
|
||||||
|
impacts the fragrance. I have also heard that machine extrusion limits the
|
||||||
|
ingredients and composition of the incense dough. Regardless, it is inevitable
|
||||||
|
that, in very cheap commodity products, corners will be cut. Some of these
|
||||||
|
missing corners will surely affect fragrance. And of course, individual
|
||||||
|
artisans will not have the benefit of industrial equipment or processes, and
|
||||||
|
will thus charge more for their incense as it takes significantly more time to
|
||||||
|
make.
|
||||||
|
|
||||||
|
[](/img/thoughts-on-incense-quality-price-and-snobbery/extruded-incense-sticks.webp)
|
||||||
|
|
||||||
|
What do all of these pricing details say about quality, then? Little.
|
||||||
|
|
||||||
|
While price can tell us about market positioning, ingredients, and effort, this
|
||||||
|
may not mean much to you or I when it comes to our own ideas of quality. As I
|
||||||
|
look in my incense-drawer I see a $12 box of vanilla Morning Star sticks from
|
||||||
|
Nippon Kodo beside a tube of Brunei agarwood sticks from Yi-Xin Craft Incense:
|
||||||
|
$50 for two grams. I've been burning the former since I was 15 years old and
|
||||||
|
first discovered Japanese incense, a vast improvement over the cheap dipped
|
||||||
|
sticks available to me previously. It's one of the few things capable of
|
||||||
|
soothing sadness or anxiety in me, and I've been relying on it for this purpose
|
||||||
|
ever since that first encounter. On the other hand, the Brunei represents an
|
||||||
|
opportunity to sample the work of a small artisan. It's a chance to experience
|
||||||
|
an extremely rare natural material and understand how the agarwood from Brunei
|
||||||
|
differs from that found in Cambodia. I also very much enjoy the fragrance
|
||||||
|
before bed. I wouldn't dare say that one of these sticks is better than the
|
||||||
|
other. They are both competently prepared, low on off-notes, and offer a
|
||||||
|
pleasing (to me) aroma. If the prices were exchanged tomorrow, I'd still buy
|
||||||
|
both.
|
||||||
|
|
||||||
|
## Have Americans been bamboozled?
|
||||||
|
|
||||||
|
There seems to be a stereotype that American incense enthusiasts have been
|
||||||
|
bamboozled into preferring quiet Japanese incense over cheaper, more fragrant
|
||||||
|
Indian-style sticks by flashy marketing, product positioning, and fancy
|
||||||
|
packaging. As an incense enthusiast and half-American, I must object on this
|
||||||
|
point. Stick incense in this country is largely associated with stoner culture.
|
||||||
|
It's seen as a cheap, smoky way to disguise the smell of burning cannabis
|
||||||
|
(which is still illegal in many states). The incense most commonly available is
|
||||||
|
typically bottom-of-the-barrel commodity fare with all of the burning oil,
|
||||||
|
sawdust, and wood glue off-notes that it entails. Better Indian sticks, if
|
||||||
|
available, are very strong for our modern, hermetically-sealed homes. And in
|
||||||
|
the rooms of my small Chicago apartment, the powerful fragrances of Indian
|
||||||
|
incense can quickly begin to feel like suffering for my sensitive nose, even if
|
||||||
|
I might otherwise like them. There is also history at play. According to
|
||||||
|
Michael Cousineau in *The Fragrant Path: A Guide to the Art of Incense,*
|
||||||
|
Shoyeido introduced Japanese incense to the U.S.A. when the company made its
|
||||||
|
debut in the 1893 Chicago World's Fair, where the "fragrance of incense wafting
|
||||||
|
from the bazaar filled the Japanese Pavilion." For the event, Japan had far
|
||||||
|
outspent any other foreign countries in constructing Phoenix Hall, a permanent
|
||||||
|
and stunning example of Japanese architecture modeled on an ancient Buddhist
|
||||||
|
temple. The response to the exhibit was such that Shoyeido developed the
|
||||||
|
incense cone, a shape more likely to survive the long journey at sea, and
|
||||||
|
demand soon became greater than the company's production capacity.
|
||||||
|
|
||||||
|
[.")](/img/thoughts-on-incense-quality-price-and-snobbery/hooden-phoenix-hall.webp)
|
||||||
|
|
||||||
|
By describing the rationale for any perceived preference for Japanese incense
|
||||||
|
in the U.S.A., I don't mean to make any sort of value statement with respect to
|
||||||
|
the incense of either India or Japan. But I will say that, for my needs,
|
||||||
|
quality is largely to be found in Japanese sticks. That said, the Indian
|
||||||
|
incense sent over by [Irene](https://blog.rauchfahne.de/en/) has been something
|
||||||
|
of a revelation for me: well-balanced fragrances from well-made sticks that
|
||||||
|
(mostly) speak up without becoming overpowering. I have been enjoying these
|
||||||
|
sticks tremendously and I will almost certainly buy more. Nonetheless, they
|
||||||
|
fulfill a different role than my usual choices. Japanese sticks give me the
|
||||||
|
opportunity to experience genuine high-end botanicals in a way that Indian
|
||||||
|
incense rarely does. And, at least so far, no Indian sticks have come to soothe
|
||||||
|
my soul like those boring, beige little vanilla sticks from Nippon
|
||||||
|
Kodo—although I'm sure they may, given time.
|
||||||
|
|
||||||
|
## Is natural better?
|
||||||
|
|
||||||
|
Perhaps, depending on your goals, but not inherently. People have very strong
|
||||||
|
opinions on the topic of natural botanicals versus synthetic aroma chemicals,
|
||||||
|
but here's the truth: when it comes to health, natural botanicals are no better
|
||||||
|
tested for burning than synthetics. If anything, the opposite is true. I also
|
||||||
|
suspect that most people who get headaches from strong incense are reacting to
|
||||||
|
the strength of fragrance, not its constituent ingredients. After all, many
|
||||||
|
aroma chemicals are identical to the compounds found in nature.
|
||||||
|
|
||||||
|
Another harsh truth is that consumers have no way of knowing whether the
|
||||||
|
incense they burn is natural or not. Very few companies publish ingredients.
|
||||||
|
Fewer publish all of them. There are also a wide variety of fragrances that
|
||||||
|
you're simply not going to get without synthetics. Violet notes are practically
|
||||||
|
never naturally derived, and whether or not synthetics are used, you're
|
||||||
|
certainly not going to be getting any real kyara in your $14.99 box of
|
||||||
|
[Tennendo Kyara](https://kikohincense.com/products/tennendo-kyara-incense) (as
|
||||||
|
good as it is). The fact is that any respectable incense collection is going to
|
||||||
|
contain a mixture of aroma chemicals and natural botanicals, so it's worth
|
||||||
|
getting over this particular hangup early on.
|
||||||
|
|
||||||
|
That said, if you want to understand what, for instance, Australian sandalwood
|
||||||
|
smells like in incense, you'll likely reach for a stick that at least
|
||||||
|
prominently features the wood itself. Likewise, faux-and-low-agarwood sticks
|
||||||
|
scratch an entirely different itch than those that make liberal use of high-end
|
||||||
|
wood. They're both nice for different reasons.
|
||||||
|
|
||||||
|
[](/img/thoughts-on-incense-quality-price-and-snobbery/tennendo-kyara-incense-stick-macro-shot.webp)
|
||||||
|
|
||||||
|
## Putting it all together
|
||||||
|
|
||||||
|
I recognize that I haven't offered any concrete answers here, but I hope that I
|
||||||
|
might have been able to provide a little context for the discussion around
|
||||||
|
quality in incense. We know that price indicates, at very least, market
|
||||||
|
positioning and, so long as we're not dealing with a lifestyle brand, it also
|
||||||
|
gives us a clue as to the ingredients and effort that went into an incense,
|
||||||
|
although to what degree depends on its origin. What represents quality to us
|
||||||
|
depends on our preferences and goals. Are we interested in experiencing and
|
||||||
|
understanding the fragrances of natural materials? Do we want to analyze the
|
||||||
|
work of our favorite Indian perfumer? Are we looking for something that reduces
|
||||||
|
anxiety? Do we simply want to perfume a space as efficiently as possible?
|
||||||
|
Physical, emotional, intellectual, and yes, sometimes social desires will all
|
||||||
|
contribute to our degree of satisfaction and perception of quality, regardless
|
||||||
|
as to whether an incense is predominantly natural or not.
|
||||||
|
|
||||||
|
[^1]: I would like to point out that Japanese incense companies do close to no
|
||||||
|
marketing at all here in the U.S.A., these days and what does occur is
|
||||||
|
[not especially compelling](https://www.instagram.com/shoyeido_incense_usa/).
|
||||||
|
|
||||||
|
[^2]: Which often conflicts with your average consumer's exposure to highly
|
||||||
|
concentrated synthetic fragrances and the expectations that this exposure
|
||||||
|
implants in them when it comes to incense.
|
||||||
|
|
||||||
|
[^3]: For the curious, it was a Pappy 17 with the wax-dipped bottle.
|
||||||
|
|
||||||
|
[^4]: This was years ago; I dread to think what they'd go for now.
|
||||||
@@ -4,6 +4,10 @@ title: Nathan Upchurch | Changelog
|
|||||||
structuredData: none
|
structuredData: none
|
||||||
---
|
---
|
||||||
# Changelog
|
# Changelog
|
||||||
|
* 2026-02-01
|
||||||
|
* Added [Woo-Woo Incense Description Generator](/special/woo-woo-incense-description-generator).
|
||||||
|
* 2026-01-21
|
||||||
|
* Updated [blogroll](/blogroll).
|
||||||
* 2026-01-16
|
* 2026-01-16
|
||||||
* Updated [/wish](/wish).
|
* Updated [/wish](/wish).
|
||||||
* 2026-01-15
|
* 2026-01-15
|
||||||
|
|||||||
7
content/now-burning/Now Burning_2026-01-16_14:01.md
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
title: Kobunboku
|
||||||
|
manufacturer: Baieido
|
||||||
|
date: 2026-01-16 14:01:00
|
||||||
|
time: 2:01 PM
|
||||||
|
---
|
||||||
|
|
||||||
7
content/now-burning/Now Burning_2026-01-21_18:56.md
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
title: Kyara
|
||||||
|
manufacturer: Tennendo
|
||||||
|
date: 2026-01-21 18:56:00
|
||||||
|
time: 6:56 PM
|
||||||
|
---
|
||||||
|
Absolute banger of a daily agarwood stick.
|
||||||
7
content/now-burning/Now Burning_2026-01-23_10:08.md
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
title: Rose Sawayaka
|
||||||
|
manufacturer: Baieido
|
||||||
|
date: 2026-01-23 10:08:00
|
||||||
|
time: 10:08 AM
|
||||||
|
---
|
||||||
|
|
||||||
7
content/now-burning/Now Burning_2026-01-23_11:57.md
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
title: Suifu
|
||||||
|
manufacturer: Yamadamatsu
|
||||||
|
date: 2026-01-23 11:56:00
|
||||||
|
time: 11:56 AM
|
||||||
|
---
|
||||||
|
|
||||||
7
content/now-burning/Now Burning_2026-01-27_17:37.md
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
title: "Matsu no Tomo - Friend of Pine"
|
||||||
|
manufacturer: Shoyeido
|
||||||
|
date: 2026-01-27 17:37:00
|
||||||
|
time: 5:37 PM
|
||||||
|
---
|
||||||
|
|
||||||
7
content/now-burning/Now Burning_2026-01-28_09:22.md
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
title: Awaji Island Koh-shi Coffee
|
||||||
|
manufacturer: Kunjudo
|
||||||
|
date: 2026-01-28 9:21:00
|
||||||
|
time: 9:21 AM
|
||||||
|
---
|
||||||
|
Coming to dislike this one less as the days go by. Still not sure it smells like coffee though.
|
||||||
7
content/now-burning/Now Burning_2026-01-30_09:56.md
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
title: Moonlit Night
|
||||||
|
manufacturer: Les Encens du Monde
|
||||||
|
date: 2026-01-30 9:57:00
|
||||||
|
time: 9:57 AM
|
||||||
|
---
|
||||||
|
|
||||||
@@ -29,6 +29,7 @@ structuredData: none
|
|||||||
* [Slashes](/slashes)
|
* [Slashes](/slashes)
|
||||||
* Special
|
* Special
|
||||||
* [Flying Toasters](/special/flying-toasters)
|
* [Flying Toasters](/special/flying-toasters)
|
||||||
|
* [Woo-Woo Incense Description Generator](/special/woo-woo-incense-description-generator)
|
||||||
* [Status](/status)
|
* [Status](/status)
|
||||||
* [Wishes](/wish)
|
* [Wishes](/wish)
|
||||||
* [Quizzes](/quizzes)
|
* [Quizzes](/quizzes)
|
||||||
|
|||||||
230
content/special/woo-woo-incense-description-generator/index.njk
Normal file
@@ -0,0 +1,230 @@
|
|||||||
|
---
|
||||||
|
layout: layouts/base.njk
|
||||||
|
title: "Woo-Woo Incense Description Generator"
|
||||||
|
structuredData: none
|
||||||
|
---
|
||||||
|
<div class="container">
|
||||||
|
<h1>Woo-Woo Incense Description Generator</h1>
|
||||||
|
<p>Ever wonder how people come up with those confusing esoteric descriptions of their incense complete with “medicinal effects?” Want some ideas to spice up your Instagram profile, website, or Etsy listings? Well you’re in luck! Click the button below to generate an incense description so mystical you’ll swear your chakras are aligned! Music by <a href="https://pixabay.com/users/saavane-32312792/">saavane on Pixabay</a>. Woo sound effect by <a href="https://freesound.org/s/30995/">UncleSigmund on freesound</a>. Background effect from <a href="https://codepen.io/tommyho/pen/JjgoZLK">Tommy Ho on Codepen</a>. No <a href="/ai">AI</a> used—I can write slop on my own!</p>
|
||||||
|
|
||||||
|
<script src="/js/incense-description-generator.js"></script>
|
||||||
|
<script>
|
||||||
|
const audioOnClick = new Audio("/audio/30995__unclesigmund__woo-2.mp3");
|
||||||
|
const bgMusic = new Audio("/audio/new-sun-428916.mp3");
|
||||||
|
|
||||||
|
window.addEventListener("pointermove", (e) => {
|
||||||
|
bgMusic.play();
|
||||||
|
});
|
||||||
|
|
||||||
|
window.addEventListener("touchstart", (e) => {
|
||||||
|
bgMusic.play();
|
||||||
|
});
|
||||||
|
|
||||||
|
const generateWoo = (elementId, button) => {
|
||||||
|
const element = document.getElementById(elementId);
|
||||||
|
const wooButton = document.getElementById(button);
|
||||||
|
|
||||||
|
audioOnClick.play();
|
||||||
|
|
||||||
|
element.innerHTML = `
|
||||||
|
<div>
|
||||||
|
${descriptionConstructor(adjective, noun, bodyPart, verb, preposition, ingredient)}
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
wooButton.innerHTML = 'Generate Some More Woo!';
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<button onclick="generateWoo('wooContainer', 'wooButton')" id="wooButton">Generate Some Woo!</button>
|
||||||
|
<div class="card" id="wooContainer" style="padding: var(--space-s); margin-top: var(--space-l);">Click the button to generate woo…</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Background effect from https://codepen.io/tommyho/pen/JjgoZLK -->
|
||||||
|
<canvas id="shaderCanvas"></canvas>
|
||||||
|
<script src="/js/three.min.js"></script>
|
||||||
|
<script>
|
||||||
|
let scene, camera, renderer, uniforms, material, mesh;
|
||||||
|
|
||||||
|
function init() {
|
||||||
|
scene = new THREE.Scene();
|
||||||
|
camera = new THREE.OrthographicCamera(-1, 1, 1, -1, 0, 1);
|
||||||
|
|
||||||
|
renderer = new THREE.WebGLRenderer({ canvas: document.getElementById('shaderCanvas'), antialias: true });
|
||||||
|
renderer.setSize(window.innerWidth, window.innerHeight);
|
||||||
|
|
||||||
|
const vertexShader = `
|
||||||
|
varying vec2 vUv;
|
||||||
|
void main() {
|
||||||
|
vUv = uv;
|
||||||
|
gl_Position = vec4(position, 1.0);
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
|
const fragmentShader = `
|
||||||
|
uniform float time;
|
||||||
|
uniform vec2 resolution;
|
||||||
|
varying vec2 vUv;
|
||||||
|
|
||||||
|
#define PI 3.14159265358979323846
|
||||||
|
|
||||||
|
vec2 rotate(vec2 v, float a) {
|
||||||
|
float s = sin(a);
|
||||||
|
float c = cos(a);
|
||||||
|
mat2 m = mat2(c, -s, s, c);
|
||||||
|
return m * v;
|
||||||
|
}
|
||||||
|
|
||||||
|
float random(vec2 st) {
|
||||||
|
return fract(sin(dot(st.xy, vec2(12.9898, 78.233))) * 43758.5453123);
|
||||||
|
}
|
||||||
|
|
||||||
|
float noise(vec2 st) {
|
||||||
|
vec2 i = floor(st);
|
||||||
|
vec2 f = fract(st);
|
||||||
|
|
||||||
|
float a = random(i);
|
||||||
|
float b = random(i + vec2(1.0, 0.0));
|
||||||
|
float c = random(i + vec2(0.0, 1.0));
|
||||||
|
float d = random(i + vec2(1.0, 1.0));
|
||||||
|
|
||||||
|
vec2 u = f * f * (3.0 - 2.0 * f);
|
||||||
|
|
||||||
|
return mix(a, b, u.x) + (c - a) * u.y * (1.0 - u.x) + (d - b) * u.x * u.y;
|
||||||
|
}
|
||||||
|
|
||||||
|
float fbm(vec2 st) {
|
||||||
|
float value = 0.0;
|
||||||
|
float amplitude = 0.5;
|
||||||
|
float frequency = 0.0;
|
||||||
|
for (int i = 0; i < 6; i++) {
|
||||||
|
value += amplitude * noise(st);
|
||||||
|
st *= 2.0;
|
||||||
|
amplitude *= 0.5;
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
vec3 palette(float t, vec3 a, vec3 b, vec3 c, vec3 d) {
|
||||||
|
return a + b * cos(6.28318 * (c * t + d));
|
||||||
|
}
|
||||||
|
|
||||||
|
vec3 vibrancePalette(float t) {
|
||||||
|
vec3 a = vec3(0.5, 0.5, 0.5);
|
||||||
|
vec3 b = vec3(0.5, 0.5, 0.5);
|
||||||
|
vec3 c = vec3(1.0, 1.0, 1.0);
|
||||||
|
vec3 d = vec3(0.0, 0.33, 0.67);
|
||||||
|
return palette(t, a, b, c, d);
|
||||||
|
}
|
||||||
|
|
||||||
|
vec3 warmPalette(float t) {
|
||||||
|
vec3 a = vec3(0.5, 0.5, 0.5);
|
||||||
|
vec3 b = vec3(0.5, 0.5, 0.5);
|
||||||
|
vec3 c = vec3(1.0, 1.0, 1.0);
|
||||||
|
vec3 d = vec3(0.0, 0.10, 0.20);
|
||||||
|
return palette(t, a, b, c, d);
|
||||||
|
}
|
||||||
|
|
||||||
|
vec3 coolPalette(float t) {
|
||||||
|
vec3 a = vec3(0.5, 0.5, 0.5);
|
||||||
|
vec3 b = vec3(0.5, 0.5, 0.5);
|
||||||
|
vec3 c = vec3(1.0, 1.0, 1.0);
|
||||||
|
vec3 d = vec3(0.3, 0.20, 0.20);
|
||||||
|
return palette(t, a, b, c, d);
|
||||||
|
}
|
||||||
|
|
||||||
|
vec3 rainbowPalette(float t) {
|
||||||
|
vec3 a = vec3(0.5, 0.5, 0.5);
|
||||||
|
vec3 b = vec3(0.5, 0.5, 0.5);
|
||||||
|
vec3 c = vec3(1.0, 1.0, 1.0);
|
||||||
|
vec3 d = vec3(0.0, 0.33, 0.67);
|
||||||
|
return palette(t, a, b, c, d);
|
||||||
|
}
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
vec2 st = gl_FragCoord.xy / resolution.xy;
|
||||||
|
st.x *= resolution.x / resolution.y;
|
||||||
|
|
||||||
|
vec2 q = vec2(0.);
|
||||||
|
q.x = fbm(st + 0.1 * time);
|
||||||
|
q.y = fbm(st + vec2(1.0));
|
||||||
|
|
||||||
|
vec2 r = vec2(0.);
|
||||||
|
r.x = fbm(st + 1.0 * q + vec2(1.7, 9.2) + 0.15 * time);
|
||||||
|
r.y = fbm(st + 1.0 * q + vec2(8.3, 2.8) + 0.126 * time);
|
||||||
|
|
||||||
|
float f = fbm(st + r);
|
||||||
|
|
||||||
|
vec2 p = st * 2.0 - 1.0;
|
||||||
|
float a = atan(p.y, p.x);
|
||||||
|
float r2 = length(p);
|
||||||
|
|
||||||
|
vec2 uv = vec2(a / PI, r2);
|
||||||
|
uv = rotate(uv, time * 0.1);
|
||||||
|
|
||||||
|
vec3 color1 = vibrancePalette(f + time * 0.1);
|
||||||
|
vec3 color2 = warmPalette(length(q));
|
||||||
|
vec3 color3 = coolPalette(length(r.x));
|
||||||
|
vec3 color4 = rainbowPalette(f * 2.0 + time * 0.2);
|
||||||
|
|
||||||
|
vec3 color = mix(color1, color2, 0.5);
|
||||||
|
color = mix(color, color3, 0.3);
|
||||||
|
color = mix(color, color4, sin(time * 0.1) * 0.5 + 0.5);
|
||||||
|
|
||||||
|
color += 0.05 * vec3(1.0) * smoothstep(0.1, 0.2, fbm(10.0 * uv + time * 0.5));
|
||||||
|
|
||||||
|
// Add some extra vibrancy
|
||||||
|
color = pow(color, vec3(0.8));
|
||||||
|
color *= 1.1;
|
||||||
|
|
||||||
|
gl_FragColor = vec4(color, 1.0);
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
|
uniforms = {
|
||||||
|
time: { value: 1.0 },
|
||||||
|
resolution: { value: new THREE.Vector2() }
|
||||||
|
};
|
||||||
|
|
||||||
|
material = new THREE.ShaderMaterial({
|
||||||
|
uniforms: uniforms,
|
||||||
|
vertexShader: vertexShader,
|
||||||
|
fragmentShader: fragmentShader
|
||||||
|
});
|
||||||
|
|
||||||
|
mesh = new THREE.Mesh(new THREE.PlaneGeometry(2, 2), material);
|
||||||
|
scene.add(mesh);
|
||||||
|
|
||||||
|
onWindowResize();
|
||||||
|
window.addEventListener('resize', onWindowResize, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
function onWindowResize() {
|
||||||
|
renderer.setSize(window.innerWidth, window.innerHeight);
|
||||||
|
uniforms.resolution.value.x = renderer.domElement.width;
|
||||||
|
uniforms.resolution.value.y = renderer.domElement.height;
|
||||||
|
}
|
||||||
|
|
||||||
|
function animate(timestamp) {
|
||||||
|
requestAnimationFrame(animate);
|
||||||
|
uniforms.time.value = timestamp * 0.001;
|
||||||
|
renderer.render(scene, camera);
|
||||||
|
}
|
||||||
|
|
||||||
|
init();
|
||||||
|
animate(0);
|
||||||
|
</script>
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
background: none;
|
||||||
|
}
|
||||||
|
canvas {
|
||||||
|
display: block;
|
||||||
|
opacity: .35;
|
||||||
|
pointer-events: none;
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
z-index: -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
5
content/status/Status_2026-01-27_17:32.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
date: 2026-01-27 17:31:00
|
||||||
|
emoji: ✒️
|
||||||
|
comment: "A harsh truth for any new graphic designers out there: Most times, you'll get a logo. It will occasionally be vector. Once in a blue moon, it will also be CMYK / spot. Your client does not know what these things mean. They will never know what these things mean. There is nothing you can do about it."
|
||||||
|
---
|
||||||
5
content/status/Status_2026-02-03_11:07.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
date: 2026-02-03 11:04:00
|
||||||
|
emoji: 💸
|
||||||
|
comment: "Can we stop making fun of people who play the lottery please? We know we're not going to win it; we're just paying for that brief, illogical feeling of hope."
|
||||||
|
---
|
||||||
BIN
public/audio/30995__unclesigmund__woo-2.mp3
Normal file
BIN
public/audio/new-sun-428916.mp3
Normal file
|
After Width: | Height: | Size: 54 KiB |
|
After Width: | Height: | Size: 77 KiB |
|
After Width: | Height: | Size: 297 KiB |
|
After Width: | Height: | Size: 162 KiB |
|
After Width: | Height: | Size: 148 KiB |
|
After Width: | Height: | Size: 338 KiB |
|
After Width: | Height: | Size: 26 KiB |
589
public/js/incense-description-generator.js
Normal file
@@ -0,0 +1,589 @@
|
|||||||
|
// Woo-woo incense description generator
|
||||||
|
|
||||||
|
const adjective = [
|
||||||
|
"aromatic",
|
||||||
|
"climatic",
|
||||||
|
"cooling",
|
||||||
|
"deep",
|
||||||
|
"dulled",
|
||||||
|
"effervescent",
|
||||||
|
"effluent",
|
||||||
|
"effulgent",
|
||||||
|
"endless",
|
||||||
|
"evocative",
|
||||||
|
"grounding",
|
||||||
|
"healing",
|
||||||
|
"hidden",
|
||||||
|
"indolent",
|
||||||
|
"juicy",
|
||||||
|
"lactescent",
|
||||||
|
"lingering",
|
||||||
|
"ministerial",
|
||||||
|
"nourishing",
|
||||||
|
"open",
|
||||||
|
"precious",
|
||||||
|
"pungent",
|
||||||
|
"resonant",
|
||||||
|
"restless",
|
||||||
|
"sacred",
|
||||||
|
"sensual",
|
||||||
|
"shimmering",
|
||||||
|
"sparkling",
|
||||||
|
"still",
|
||||||
|
"undulating",
|
||||||
|
"unparalleled",
|
||||||
|
"warming",
|
||||||
|
];
|
||||||
|
|
||||||
|
const noun = [
|
||||||
|
["astrology", "astrologies"],
|
||||||
|
["bloom", "blooms"],
|
||||||
|
["breath", "breaths"],
|
||||||
|
["chakra", "chakras"],
|
||||||
|
["clarity", "clarities"],
|
||||||
|
["contribution", "contributions"],
|
||||||
|
["curiosity", "curiosities"],
|
||||||
|
["direction", "directions"],
|
||||||
|
["ember", "embers"],
|
||||||
|
["connection", "connections"],
|
||||||
|
["constriction", "constrictions"],
|
||||||
|
["coolness", "coolnesses"],
|
||||||
|
["expression", "expressions"],
|
||||||
|
["fire", "fires"],
|
||||||
|
["geometry", "geometries"],
|
||||||
|
["glow", "glows"],
|
||||||
|
["harmony", "harmonies"],
|
||||||
|
["meaning", "meanings"],
|
||||||
|
["nourishment", "nourishments"],
|
||||||
|
["onanism", "onanisms"],
|
||||||
|
["relationship", "relationships"],
|
||||||
|
["resonance", "resonances"],
|
||||||
|
["ritual", "rituals"],
|
||||||
|
["smoke", "smokes"],
|
||||||
|
["space", "spaces"],
|
||||||
|
["surface", "surfaces"],
|
||||||
|
["tantra", "tantras"],
|
||||||
|
["tension", "tensions"],
|
||||||
|
["transformation", "transformations"],
|
||||||
|
["vibration", "vibrations"],
|
||||||
|
["wonder", "wonders"],
|
||||||
|
];
|
||||||
|
|
||||||
|
const bodyPart = [
|
||||||
|
"appendix",
|
||||||
|
"armpit",
|
||||||
|
"bile",
|
||||||
|
"central core",
|
||||||
|
"cheeks",
|
||||||
|
"chest",
|
||||||
|
"cuticles",
|
||||||
|
"diaphragm",
|
||||||
|
"fingernails",
|
||||||
|
"flaps",
|
||||||
|
"folds",
|
||||||
|
"frenulum",
|
||||||
|
"goiter",
|
||||||
|
"humors",
|
||||||
|
"limbs",
|
||||||
|
"lingam",
|
||||||
|
"legs",
|
||||||
|
"lungs",
|
||||||
|
"meatus",
|
||||||
|
"mind",
|
||||||
|
"paunch",
|
||||||
|
"perineum",
|
||||||
|
"ribs",
|
||||||
|
"spine",
|
||||||
|
"spleen",
|
||||||
|
"throat",
|
||||||
|
"uvula",
|
||||||
|
"yoni",
|
||||||
|
"wenis",
|
||||||
|
];
|
||||||
|
|
||||||
|
const affliction = [
|
||||||
|
"abasement",
|
||||||
|
"acne",
|
||||||
|
"appropriation",
|
||||||
|
"bodaciousness",
|
||||||
|
"cirrhosis",
|
||||||
|
"concavity",
|
||||||
|
"confiscation",
|
||||||
|
"corpulence",
|
||||||
|
"defenestration",
|
||||||
|
"denunciation",
|
||||||
|
"despondency",
|
||||||
|
"erosion",
|
||||||
|
"exasperation",
|
||||||
|
"fatigue",
|
||||||
|
"fibrillation",
|
||||||
|
"flaking",
|
||||||
|
"hardening",
|
||||||
|
"hypertension",
|
||||||
|
"ill-humor",
|
||||||
|
"imbalance",
|
||||||
|
"impertinence",
|
||||||
|
"impotence",
|
||||||
|
"impropriety",
|
||||||
|
"incontinence",
|
||||||
|
"indolence",
|
||||||
|
"ingrowth",
|
||||||
|
"itching",
|
||||||
|
"leprosy",
|
||||||
|
"malignancy",
|
||||||
|
"mastication",
|
||||||
|
"melancholia",
|
||||||
|
"miasma",
|
||||||
|
"mistreatment",
|
||||||
|
"mortification",
|
||||||
|
"necrosis",
|
||||||
|
"plasticity",
|
||||||
|
"protuberance",
|
||||||
|
"psoriasis",
|
||||||
|
"putrescence",
|
||||||
|
"rumination",
|
||||||
|
"schadenfreude",
|
||||||
|
"scruples",
|
||||||
|
"seizure",
|
||||||
|
"sinkage",
|
||||||
|
"softening",
|
||||||
|
"stoppage",
|
||||||
|
"swelling",
|
||||||
|
"whiffiness",
|
||||||
|
];
|
||||||
|
|
||||||
|
const verb = [
|
||||||
|
["appreciate", "appreciates", "appreciating"],
|
||||||
|
["blend", "blends", "blending"],
|
||||||
|
["bloom", "blooms", "blooming"],
|
||||||
|
["breathe", "breathes", "breathing"],
|
||||||
|
["carry", "carries", "carrying"],
|
||||||
|
["calm", "calms", "calming"],
|
||||||
|
["cleanse", "cleanses", "cleansing"],
|
||||||
|
["clear", "clears", "clearing"],
|
||||||
|
["consolidate", "consolidates", "consolidating"],
|
||||||
|
["cool", "cools", "cooling"],
|
||||||
|
["dance", "dances", "dancing"],
|
||||||
|
["descend", "descends", "descending"],
|
||||||
|
["discern", "discerns", "discerning"],
|
||||||
|
["exacerbate", "exacerbates", "exacerbating"],
|
||||||
|
["fold", "folds", "folding"],
|
||||||
|
["govern", "governs", "governing"],
|
||||||
|
["harmonize", "harmonizes", "harmonizing"],
|
||||||
|
["linger", "lingers", "lingering"],
|
||||||
|
["masticate", "masticates", "masticating"],
|
||||||
|
["nourish", "nourishes", "nourishing"],
|
||||||
|
["retract", "retracts", "retracting"],
|
||||||
|
["scatter", "scatters", "scattering"],
|
||||||
|
["shift", "shifts", "shifting"],
|
||||||
|
["sink", "sinks", "sinking"],
|
||||||
|
["soften", "softens", "softening"],
|
||||||
|
["tingle", "tingles", "tingling"],
|
||||||
|
["titillate", "titillates", "titillating"],
|
||||||
|
["ululate", "ululates", "ululating"],
|
||||||
|
["undulate", "undulates", "undulating"],
|
||||||
|
["vent", "vents", "venting"],
|
||||||
|
["vindicate", "vindicates", "vindicating"],
|
||||||
|
["warm", "warms", "warming"],
|
||||||
|
["waver", "wavers", "wavering"],
|
||||||
|
["weave", "weaves", "weaving"],
|
||||||
|
];
|
||||||
|
|
||||||
|
const healingMethod = [
|
||||||
|
["abate", "abates", "abating"],
|
||||||
|
["alleviate", "alleviates", "alleviating"],
|
||||||
|
["assuage", "assuages", "assuaging"],
|
||||||
|
["balance", "balances", "balancing"],
|
||||||
|
["broaden", "broadens", "broadening"],
|
||||||
|
["cool", "cools", "cooling"],
|
||||||
|
["discipline", "disciplines", "disciplining"],
|
||||||
|
["edify", "edifies", "edifying"],
|
||||||
|
["elevate", "elevates", "elevating"],
|
||||||
|
["enrich", "enriches", "enriching"],
|
||||||
|
["harmonize", "harmonizes", "harmonizing"],
|
||||||
|
["heal", "heals", "healing"],
|
||||||
|
["invigorate", "invigorates", "invigorating"],
|
||||||
|
["lift", "lifts", "lifting"],
|
||||||
|
["lighten", "lightens", "lightening"],
|
||||||
|
["mitigate", "mitigates", "mitigating"],
|
||||||
|
["promote", "promotes", "promoting"],
|
||||||
|
["re-balance", "re-balances", "re-balancing"],
|
||||||
|
["refine", "refines", "refining"],
|
||||||
|
["regenerate", "regenerates", "regenerating"],
|
||||||
|
["relieve", "relieves", "relieving"],
|
||||||
|
["soften", "softens", "softening"],
|
||||||
|
["sooth", "soothes", "soothing"],
|
||||||
|
["uplift", "uplifts", "uplifting"],
|
||||||
|
["warm", "warms", "warming"],
|
||||||
|
];
|
||||||
|
|
||||||
|
const recipe = [
|
||||||
|
"agarbatti",
|
||||||
|
"blend",
|
||||||
|
"composition",
|
||||||
|
"fragrance",
|
||||||
|
"incense",
|
||||||
|
"recipe",
|
||||||
|
"stick",
|
||||||
|
];
|
||||||
|
|
||||||
|
const amount = [
|
||||||
|
"base",
|
||||||
|
"blessing",
|
||||||
|
"boatload",
|
||||||
|
"crumb",
|
||||||
|
"dash",
|
||||||
|
"dollop",
|
||||||
|
"dusting",
|
||||||
|
"glob",
|
||||||
|
"hint",
|
||||||
|
"pinch",
|
||||||
|
"shred",
|
||||||
|
"smattering",
|
||||||
|
"smidgen",
|
||||||
|
"sprinkling",
|
||||||
|
"touch",
|
||||||
|
"trace",
|
||||||
|
];
|
||||||
|
|
||||||
|
const preposition = [
|
||||||
|
"above",
|
||||||
|
"across",
|
||||||
|
"after",
|
||||||
|
"against",
|
||||||
|
"along",
|
||||||
|
"amid",
|
||||||
|
"among",
|
||||||
|
"around",
|
||||||
|
"as",
|
||||||
|
"before",
|
||||||
|
"behind",
|
||||||
|
"below",
|
||||||
|
"beneath",
|
||||||
|
"beside",
|
||||||
|
"between",
|
||||||
|
"beyond",
|
||||||
|
"following",
|
||||||
|
"from",
|
||||||
|
"into",
|
||||||
|
"like",
|
||||||
|
"near",
|
||||||
|
"onto",
|
||||||
|
"opposite",
|
||||||
|
"over",
|
||||||
|
"past",
|
||||||
|
"round",
|
||||||
|
"through",
|
||||||
|
"to",
|
||||||
|
"toward",
|
||||||
|
"under",
|
||||||
|
"underneath",
|
||||||
|
"upon",
|
||||||
|
"versus",
|
||||||
|
"via",
|
||||||
|
"with",
|
||||||
|
"within",
|
||||||
|
];
|
||||||
|
|
||||||
|
const ingredient = [
|
||||||
|
"agarwood",
|
||||||
|
"amber",
|
||||||
|
"ambergris",
|
||||||
|
"ambrette seed",
|
||||||
|
"atlas cedar",
|
||||||
|
"bergamot",
|
||||||
|
"balsam of tolu",
|
||||||
|
"basil",
|
||||||
|
"bay laurel",
|
||||||
|
"benzoin",
|
||||||
|
"borneol camphor",
|
||||||
|
"burgundy pitch",
|
||||||
|
"calamus root",
|
||||||
|
"cardamom",
|
||||||
|
"cassia",
|
||||||
|
"catnip",
|
||||||
|
"chen pi",
|
||||||
|
"chamomile",
|
||||||
|
"cinnamon",
|
||||||
|
"clove",
|
||||||
|
"colophony pine",
|
||||||
|
"copal",
|
||||||
|
"coriander",
|
||||||
|
"dammar",
|
||||||
|
"dragon’s blood",
|
||||||
|
"elemi",
|
||||||
|
"eucalyptus",
|
||||||
|
"frankincense",
|
||||||
|
"galangal root",
|
||||||
|
"galbanum",
|
||||||
|
"ginger root",
|
||||||
|
"guggul",
|
||||||
|
"hibiscus",
|
||||||
|
"hyssop",
|
||||||
|
"juniper berry",
|
||||||
|
"juniper",
|
||||||
|
"labdanum",
|
||||||
|
"laurel leaf",
|
||||||
|
"lavender",
|
||||||
|
"lemon balm",
|
||||||
|
"lemon grass",
|
||||||
|
"marjoram",
|
||||||
|
"mastic",
|
||||||
|
"mugwort",
|
||||||
|
"musk root",
|
||||||
|
"myrrh",
|
||||||
|
"nutmeg",
|
||||||
|
"oakmoss",
|
||||||
|
"onycha",
|
||||||
|
"opoponax",
|
||||||
|
"orris root",
|
||||||
|
"palo santo",
|
||||||
|
"patchouli",
|
||||||
|
"pine needle",
|
||||||
|
"pine resin",
|
||||||
|
"red cedar",
|
||||||
|
"red sandalwood",
|
||||||
|
"rose",
|
||||||
|
"rosemary",
|
||||||
|
"saffron",
|
||||||
|
"sage",
|
||||||
|
"sandalwood",
|
||||||
|
"sandarac",
|
||||||
|
"spikenard",
|
||||||
|
"spruce",
|
||||||
|
"star anise",
|
||||||
|
"storax",
|
||||||
|
"sweetgrass",
|
||||||
|
"thyme",
|
||||||
|
"tolu balsam",
|
||||||
|
"tonka bean",
|
||||||
|
"turkey rhubarb",
|
||||||
|
"turmeric",
|
||||||
|
"valerian",
|
||||||
|
"vanilla",
|
||||||
|
"vetiver",
|
||||||
|
"weeping cypress",
|
||||||
|
];
|
||||||
|
|
||||||
|
const getWord = (wordArr, usedArr, tense, plural) => {
|
||||||
|
if (wordArr == noun) {
|
||||||
|
let word = wordArr[(wordArr.length * Math.random()) | 0][0];
|
||||||
|
let pluralWord = wordArr[(wordArr.length * Math.random()) | 0][1];
|
||||||
|
|
||||||
|
let wordIsUsed = usedArr.indexOf(word) >= 0 ? true : false;
|
||||||
|
let pluralIsUsed = usedArr.indexOf(pluralWord) >= 0 ? true : false;
|
||||||
|
|
||||||
|
while (wordIsUsed == true || pluralIsUsed == true) {
|
||||||
|
word = wordArr[(wordArr.length * Math.random()) | 0][0];
|
||||||
|
pluralWord = wordArr[(wordArr.length * Math.random()) | 0][1];
|
||||||
|
|
||||||
|
wordIsUsed = usedArr.indexOf(word) >= 0 ? true : false;
|
||||||
|
pluralIsUsed = usedArr.indexOf(word) >= 0 ? true : false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return plural ? pluralWord : word;
|
||||||
|
} else if (wordArr == verb || wordArr == healingMethod) {
|
||||||
|
let word = wordArr[(wordArr.length * Math.random()) | 0][0];
|
||||||
|
let present = wordArr[(wordArr.length * Math.random()) | 0][1];
|
||||||
|
let continuous = wordArr[(wordArr.length * Math.random()) | 0][2];
|
||||||
|
|
||||||
|
let wordIsUsed = usedArr.indexOf(word) >= 0 ? true : false;
|
||||||
|
let presentIsUsed = usedArr.indexOf(present) >= 0 ? true : false;
|
||||||
|
let continuousIsUsed = usedArr.indexOf(continuous) >= 0 ? true : false;
|
||||||
|
|
||||||
|
while (
|
||||||
|
wordIsUsed == true ||
|
||||||
|
presentIsUsed == true ||
|
||||||
|
continuousIsUsed == true
|
||||||
|
) {
|
||||||
|
word = wordArr[(wordArr.length * Math.random()) | 0][0];
|
||||||
|
present = wordArr[(wordArr.length * Math.random()) | 0][1];
|
||||||
|
continuous = wordArr[(wordArr.length * Math.random()) | 0][2];
|
||||||
|
|
||||||
|
wordIsUsed = usedArr.indexOf(word) >= 0 ? true : false;
|
||||||
|
presentIsUsed = usedArr.indexOf(word) >= 0 ? true : false;
|
||||||
|
continuousIsUsed = usedArr.indexOf(continuous) >= 0 ? true : false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tense == "present") {
|
||||||
|
return present;
|
||||||
|
} else if (tense == "continuous") {
|
||||||
|
return continuous;
|
||||||
|
} else {
|
||||||
|
return word;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
let word = wordArr[(wordArr.length * Math.random()) | 0];
|
||||||
|
let isUsed = usedArr.indexOf(word) >= 0 ? true : false;
|
||||||
|
|
||||||
|
while (isUsed == true) {
|
||||||
|
word = wordArr[(wordArr.length * Math.random()) | 0];
|
||||||
|
isUsed = usedArr.indexOf(word) >= 0 ? true : false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return word;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const capitalize = (str) => {
|
||||||
|
return str[0].toUpperCase() + str.slice(1);
|
||||||
|
};
|
||||||
|
|
||||||
|
const coinFlip = () => {
|
||||||
|
return Math.random() < 0.5 ? true : false;
|
||||||
|
};
|
||||||
|
|
||||||
|
const randomNumber = (min, max) => {
|
||||||
|
return Math.floor(Math.random() * (max - min + 1) + min);
|
||||||
|
};
|
||||||
|
|
||||||
|
const descriptionConstructor = (
|
||||||
|
adjective,
|
||||||
|
noun,
|
||||||
|
bodyPart,
|
||||||
|
verb,
|
||||||
|
preposition,
|
||||||
|
ingredient,
|
||||||
|
) => {
|
||||||
|
let used = [];
|
||||||
|
let description = "<p>";
|
||||||
|
let currentWord = "";
|
||||||
|
|
||||||
|
const addWord = (list, plural, punctuation, tense, capitalizeBool) => {
|
||||||
|
currentWord = getWord(list, used, tense, plural);
|
||||||
|
|
||||||
|
capitalizeBool
|
||||||
|
? (description += capitalize(currentWord))
|
||||||
|
: (description += currentWord);
|
||||||
|
description += punctuation;
|
||||||
|
|
||||||
|
used.push(currentWord);
|
||||||
|
};
|
||||||
|
|
||||||
|
const addAdjective = (punctuation, capitalize) => {
|
||||||
|
addWord(adjective, false, punctuation, null, capitalize);
|
||||||
|
};
|
||||||
|
const addAffliction = (punctuation, capitalize) => {
|
||||||
|
addWord(affliction, false, punctuation, null, capitalize);
|
||||||
|
};
|
||||||
|
const addAmount = (punctuation, capitalize) => {
|
||||||
|
addWord(amount, false, punctuation, null, capitalize);
|
||||||
|
};
|
||||||
|
const addBodyPart = (punctuation, capitalize) => {
|
||||||
|
addWord(bodyPart, false, punctuation, null, capitalize);
|
||||||
|
};
|
||||||
|
const addHealingMethod = (punctuation, tense, capitalize) => {
|
||||||
|
addWord(healingMethod, false, punctuation, tense, capitalize);
|
||||||
|
};
|
||||||
|
const addIngredient = (punctuation, capitalize) => {
|
||||||
|
addWord(ingredient, false, punctuation, null, capitalize);
|
||||||
|
};
|
||||||
|
const addNoun = (punctuation, plural, capitalize) => {
|
||||||
|
addWord(noun, plural, punctuation, null, capitalize);
|
||||||
|
};
|
||||||
|
const addPreposition = (punctuation, capitalize) => {
|
||||||
|
addWord(preposition, false, punctuation, null, capitalize);
|
||||||
|
};
|
||||||
|
const addRecipe = (punctuation, capitalize) => {
|
||||||
|
addWord(recipe, false, punctuation, null, capitalize);
|
||||||
|
};
|
||||||
|
const addVerb = (punctuation, tense, capitalize) => {
|
||||||
|
addWord(verb, false, punctuation, tense, capitalize);
|
||||||
|
};
|
||||||
|
|
||||||
|
const insertCustomString = (str) => {
|
||||||
|
description += str;
|
||||||
|
};
|
||||||
|
|
||||||
|
const removeLastCharacter = () => {
|
||||||
|
description = description.slice(0, description.length - 1);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Construct opening sentence.
|
||||||
|
addAdjective(" ", true);
|
||||||
|
addNoun(" ");
|
||||||
|
addVerb(" ", "present");
|
||||||
|
if (coinFlip()) addPreposition(" ");
|
||||||
|
addVerb(" ", "continuous");
|
||||||
|
coinFlip() ? addNoun(". ", true) : addNoun(". ");
|
||||||
|
insertCustomString("</p>");
|
||||||
|
|
||||||
|
// Construct recipe description
|
||||||
|
insertCustomString("<p>This ");
|
||||||
|
addAdjective(" ");
|
||||||
|
addRecipe(" ");
|
||||||
|
addVerb(" ", "present");
|
||||||
|
insertCustomString("and ");
|
||||||
|
addVerb(" ", "present");
|
||||||
|
addPreposition(" ");
|
||||||
|
addNoun(" ");
|
||||||
|
insertCustomString("and ");
|
||||||
|
addNoun(".</p>");
|
||||||
|
|
||||||
|
// Construct ingredient roles
|
||||||
|
const numOfIngredients = randomNumber(2, 5);
|
||||||
|
|
||||||
|
for (let i = 0; i < numOfIngredients; i++) {
|
||||||
|
i == 0 ? insertCustomString("<p>") : null;
|
||||||
|
if (coinFlip()) {
|
||||||
|
insertCustomString("A ");
|
||||||
|
addAmount(" ");
|
||||||
|
insertCustomString("of ");
|
||||||
|
addAdjective(" ");
|
||||||
|
} else {
|
||||||
|
addAdjective(" ", true);
|
||||||
|
}
|
||||||
|
if (coinFlip()) {
|
||||||
|
if (coinFlip()) {
|
||||||
|
insertCustomString("and ");
|
||||||
|
addAdjective(" ");
|
||||||
|
addIngredient(" ");
|
||||||
|
} else {
|
||||||
|
removeLastCharacter();
|
||||||
|
insertCustomString(", yet ");
|
||||||
|
addAdjective(", ");
|
||||||
|
addIngredient(" ");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
addIngredient(" ");
|
||||||
|
}
|
||||||
|
addVerb(" ", "present");
|
||||||
|
if (coinFlip()) {
|
||||||
|
insertCustomString("and ");
|
||||||
|
addVerb(" ", "present");
|
||||||
|
}
|
||||||
|
if (coinFlip()) {
|
||||||
|
if (coinFlip()) {
|
||||||
|
insertCustomString("while ");
|
||||||
|
addHealingMethod(" ", "continuous");
|
||||||
|
addAffliction(" ");
|
||||||
|
insertCustomString("of the ");
|
||||||
|
} else {
|
||||||
|
insertCustomString("and ");
|
||||||
|
addHealingMethod(" ", "present");
|
||||||
|
addAffliction(" ");
|
||||||
|
insertCustomString("of the ");
|
||||||
|
}
|
||||||
|
i == numOfIngredients - 1 ? addBodyPart(".</p>") : addBodyPart(". ");
|
||||||
|
} else {
|
||||||
|
i == numOfIngredients - 1 ? addNoun(".</p>") : addNoun(". ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Healing properties
|
||||||
|
insertCustomString("<p>Also good for: ");
|
||||||
|
const numOfHealingProps = randomNumber(1, 5);
|
||||||
|
for (let i = 1; i <= numOfHealingProps; i++) {
|
||||||
|
i == 1 ? addAffliction(" ", true) : addAffliction(" ");
|
||||||
|
insertCustomString("of the ");
|
||||||
|
if (i == numOfHealingProps - 1) {
|
||||||
|
addBodyPart(", and ");
|
||||||
|
} else if (i == numOfHealingProps) {
|
||||||
|
addBodyPart(".</p>");
|
||||||
|
} else {
|
||||||
|
addBodyPart(", ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return description;
|
||||||
|
};
|
||||||