API Reference
Classes
Cheat Sheet
Operators & filters
Addons, Adapters and Derived Work
Typescript
Knowledge Base
Quick Reference
Declare Database
var db = new Dexie("MyDatabase");
db.version(1).stores({
friends: "++id, name, age, *tags",
gameSessions: "id, score"
});
NOTE: Don’t declare all columns like in SQL. You only declare properties you want to index, that is properties you want to use in a where(…) query.
Schema Syntax
| ++ | Auto-incremented primary key |
| & | Unique |
| * | Multi-entry index |
| [A+B] | Compound index |
Upgrade
db.version(1).stores({
friends: "++id,name,age,*tags",
gameSessions: "id,score"
});
db.version(2).stores({
friends: "++id, [firstName+lastName], yearOfBirth, *tags", // Change indexes
gameSessions: null // Delete table
}).upgrade(tx => {
// Will only be executed if a version below 2 was installed.
return tx.friends.modify(friend => {
friend.firstName = friend.name.split(' ')[0];
friend.lastName = friend.name.split(' ')[1];
friend.birthDate = new Date(new Date().getFullYear() - friend.age, 0);
delete friend.name;
delete friend.age;
});
});
Read more about database versioning
Class Binding
class Friend {
// Prototype method
save() {
return db.friends.put(this); // Will only save own props.
}
// Prototype property
get age() {
return moment(Date.now()).diff (this.birthDate, 'years');
}
}
db.friends.mapToClass(Friend);
Reference: Table.mapToClass()
Add Items
await db.friends.add({name: "Josephine", age: 21});
await db.friends.bulkAdd([
{name: "Foo", age: 31},
{name: "Bar", age: 32}
]);
Reference: Table.add() Table.bulkAdd()
Update Items
await db.friends.put({id: 4, name: "Foo", age: 33});
await db.friends.bulkPut([
{id: 4, name: "Foo2", age: 34},
{id: 5, name: "Bar2", age: 44}
]);
await db.friends.update(4, {name: "Bar"});
await db.customers
.where("age")
.inAnyRange([ [0, 18], [65, Infinity] ])
.modify({discount: 0.5});
Reference: Table.put(), Table.bulkPut(), Table.update(), Collection.modify()
Delete items
await db.friends.delete(4);
await db.friends.bulkDelete([1,2,4]);
const oneWeekAgo = new Date(Date.now() - 60*60*1000*24*7);
await db.logEntries
.where('timestamp').below(oneWeekAgo)
.delete();
Reference: Table.delete(), Table.bulkDelete(), Collection.delete()
Query Items
const someFriends = await db.friends
.where("age").between(20, 25)
.offset(150).limit(25)
.toArray();
await db.friends
.where("name").equalsIgnoreCase("josephine")
.each(friend => {
console.log("Found Josephine", friend);
});
const abcFriends = await db.friends
.where("name")
.startsWithAnyOfIgnoreCase(["a", "b", "c"])
.toArray();
References: Table.where(), WhereClause, Collection
await db.friends
.where('age')
.inAnyRange([[0,18], [65, Infinity]])
.modify({discount: 0.5});
References: Table.where(), WhereClause, Collection.modify()
const friendsContainingLetterA = await db.friends
.filter(friend => /a/i.test(friend.name))
.toArray();
Reference: Table.filter()
const forbundsKansler = await db.friends
.where('[firstName+lastName]')
.equals(["Angela", "Merkel"])
.first();
Read more about compound index
In Dexie 2.0, you could do the above query a little simpler:
const forbundsKansler = await db.friends.where({
firstName: "Angela",
lastName: "Merkel"
}).first();
Or simply:
const forbundsKansler = await db.friends.get({
firstName: "Angela",
lastName: "Merkel"
});
// This query is equal to:
// select * from friends where firstName='Angela' order by lastName
const angelasSortedByLastName = await db.friends
.where('[firstName+lastName]')
.between([["Angela", ""], ["Angela", "\uffff"])
.toArray()
await db.friends
.where('age').above(25)
.or('shoeSize').below(8)
.or('interests').anyOf('sports', 'pets', 'cars')
.modify(friend => friend.tags.push("marketing-target"));
Reference: Collection.or()
Retrieve TOP 5 items
const best5GameSession = await db.gameSessions
.orderBy("score").reverse()
.limit(5)
.toArray();
References: Table.orderBy(), Collection.reverse(), Collection.limit()
Joining
var db = new Dexie('music');
db.version(1).stores({
genres: '++id,name',
albums: '++id,name,year,*tracks',
bands: '++id,name,*albumIds,genreId'
});
async function getBandsStartingWithA () {
// Query
const bands = await db.bands
.where('name')
.startsWith('A')
.toArray();
// Attach resolved properies "genre" and "albums" on each band
// using parallell queries:
await Promise.all (bands.map (async band => {
[band.genre, band.albums] = await Promise.all([
db.genres.get (band.genreId),
db.albums.where('id').anyOf(band.albumIds).toArray()
]);
});
return bands;
}
Storing Binary Data
var db = new Dexie("MyImgDb");
db.version(1).stores({
friends: "name"
});
// Download and store an image
async function downloadAndStoreImage() {
const res = await fetch("some-url-to-an-image.png");
const blob = await res.blob();
// Store the binary data in indexedDB:
await db.friends.put({
name: "David",
image: blob
});
}
Indexing Binary Data (IndexedDB 2.0)
IndexedDB 2.0 contains support for indexing binary data. This spec is supported by Chrome and Safari and partially Firefox (Firefox has a bug when using binary primary key, but works well with binary index).
var db = new Dexie("MyImgDb");
db.version(1).stores({
friends: "id, name" // use binary UUID as id
});
// IndexedDB 2.0 allows indexing ArrayBuffer and XXXArray
// (typed arrays) (but not Blobs)
async function playWithBinaryPrimKey() {
// Store the binary data in indexedDB:
await db.friends.put({
id: new Uint8Array([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]),
name: "David"
});
// Retrieve by binary search
const friend = await db.friends.get(
new Uint8Array([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]));
if (friend) {
console.log(`Found friend: ${friend.name}`);
} else {
console.log(`Friend not found`);
}
}
Transaction
await db.transaction('rw', [db.friends], async () => {
const friend = await db.friends.get(1);
++friend.age;
await db.friends.put(friend);
});
Ongoing Transaction
const db = new Dexie("MyImgDb");
db.version(1).stores({
friends: "id, name, *tags"
});
function goodFriends() {
return db.friends
.where('tags')
.equals('close-friend');
}
async function addComment(friendId, comment) {
await db.friends
.where('id')
.equals(friendId)
.modify(friend => {
friend.comments.push(comment);
});
}
async function spreadYourLove() {
// Make an atomic change:
await db.transaction('rw', db.friends, async () => {
const goodFriendKeys = await goodFriends().primaryKeys();
await Promise.all(
goodFriendKeys.map(id => addComment(id, "I like you!"))
);
});
}
The above code snippet shows that you can reuse “transactionless” code (function goodFriends() and addComment()) but execute it within a transaction (spreadYourLove()).
Reference: Dexie.transaction()
Parent Transaction
// Make one large atomic change that calls other
// functions that already use a transaction.
db.transaction('rw', db.friends, db.diary, async () => {
await spreadYourLove();
await db.diary.log({date: Date.now(), text: "Today I successfully spread my love"});
}).catch (err => {
console.error ("I failed to spread my love :( " + err.stack);
});
The above snippet shows that you can also reuse code that is indeed transaction-aware, but encapsulate several such functions in an overall umbrella-transaction.
NOTE: The code above may look like it could only execute this transaction one-at-a-time, but with thanks to zone technology, this code can work in parallell with other transactions. (Dexie implements its own zone system and is not dependent on zone.js)
Reference: Dexie.transaction()
Working with Asynchronic APIs
Dexie.js is an asynchronic API. In synchronic APIs, errors are normally handled using exceptions. This is very convinient because you code on without doing error checking everywhere and instead catch exceptions on a higher level. Asynchronic APIs normally use success- and error events to signal back when operation complete. Since indexedDB uses a combination of exceptions and error events to notify the caller, it is quite cumbersome to code against it using correct error handling - you need both to do try..catch and request.onerror for each and every request. Dexie.js solves this by working with ECMAScript6 compliant Promises making error handling as easy as it is on a synchronous API with try..catch error handling.
Working with Promises
Promise based APIs (such as Dexie.js) will look more like synchronous APIs than event based APIs, but instead of returning the result, it will return an instance of Promise. ECMAScript6 promises has two methods: then() and catch(). These methods expects a callback to call when the operation succeeds or fails respectively. All asynchronic methods in Dexie returns a Promise instance and this makes the API way more easy to use, as you will see in our examples.
Promise-Specific Data (zone)
Dexie Promises supports a pattern similar to Thread-local storage where it is possible to have static properties that is bound to the executing promise and all it’s child-promises. This is similar Angular’s zone.js but in an unobtrusive way (no requirement of including any monkey-patching script). Dexie.js and it’s transaction API heavily depends on it’s transaction zones since it enables code to be aware of the currently executing transaction without having to pass transaction objects around. Promise-Specific Data doc.
Exception Handling
With Dexie, in contrary to indexedDB, there is one single way to catch exceptions - through the Promise.catch() method. Nowhere do you need to do a standard try..catch(). The reason for this is to not enforce the caller to need to think about several ways of error handling. When you work with transactions, you will also get the benefit of being able to catch all errors in one single place - at the end of the transaction, instead of having to catch() every promise of each database operation. Any uncatuch error (no matter error events, exception or miss-spelled variable in your code) will abort the ongoing Transaction and trigger its returned Promise to reject, waking up any catch() clause attached to the transaction scope.
db.transaction('rw', db.friends, function() {
...
window.MissSpelledVar.NonExistingVar = 3; // Will fail!
}).catch (function (err) {
// Transaction will abort!
console.error(err);
});
All transaction promises should either be catched or returned to its caller.
Catching means Handling!
If you catch a Promise from a database operation within a transaction, it will be considered to be handled and the transaction will not be aborted. This could be a common pitfall when people catch promises within transactions just to log it but expecting the transaction to abort. Solution: re-throw the errors that you don’t handle!
db.transaction('rw', db.friends, function() {
db.friends.add({id: 1, name: "Foo"}).catch(function(e) {
console.error("Failed to add Foo friend");
throw e; // Rethrow to abort transaction.
});
})
Working With Transactions
Whenever you want to do more than a single operation, you simplify your code by using transactions. By working with transactions, you get the following benefits:
- If modifying database and any error occur - error event or exception of any kind - then transaction will abort and every modification will be rolled back.
- No need to handle promises if you don’t like. Everything is encapsulated in the transaction so you can handle that instead.
- You may do all write operations synchronically without the need to wait for it to finish before starting the next one. (see the 2nd example code below).
- Even read-operations can be done the line after a write operations without waiting for write to finish - still your result will include all modifications. This is possible because all operations are queued when there is a pending write operation going on in current transaction.
- Not a single error will just slip away - you catch all in the final catch() method - both error events and ordinary exceptions of any kind.
Here is how you enter a transaction block:
db.transaction('rw', db.friends, db.pets, function () {
// Any database error event that occur will abort transaction and
// be sent to the catch() method below.
// The exact same rule if any exception is thrown what so ever.
return db.pets.add({name: 'Bamse', kind: 'cat'}).then(function (petId) {
return db.friends.add({name: 'Kate', age: 89, pets: [petId]});
});
}).catch(function (error) {
// Log or display the error
console.error (error.stack || error);
});
Notes:
- ‘friends’ and ‘pets’ are objectStores registered using Version.stores() method.
"rw"
should be replaced with"r"
if you are just going to do read operations.- Also errors from chained database operations within the transaction, or plain exceptions happening in any then() callback of any chained operation will be catched by the transaction’s catch() method.
- It is possible to prohibit the transaction from being aborted if a failing DB operation is catched explicitely:
db.transaction('rw', db.friends, function() {
db.friends.add({id:1, name:"Fredrik"});
db.friends.add({id:1, name:"Fredrik"}).catch(function (err) {
// Adding same primary key twice will of course fail. But
// since we catch this error explicitely, the transaction
// wont abort. This makes it possible to continue the
// transaction in a managed way. If you still want to abort
// the transaction, just do Dexie.currentTransaction.abort(),
// throw an exception, or just:
// return Promise.reject(err);
});
}).then (function () {
alert ("Transaction successfully completed");
});
When working with transactions, you may query a recent add(), put(), update(), delete() or modify() operation on the next line without waiting for it to finish. The waiting is taken care of by the framework. See the difference below on how that may simplify your code to work with a transaction and not having to call .then() all the time.
Code Example Without Transaction
db.friends.add({ name: "Ulla Bella", age: 87, isCloseFriend: 0 }).then(function () {
return db.friends.add({ name: "Elna", age: 99, isCloseFriend: 1 });
}).then(function (){
return db.friends.where("age").above(65).each(function (friend) {
console.log("Retired friend: " + friend.name);
});
}).catch(function (error) {
console.error(error);
})
Same Code Example With Transaction
db.transaction("rw", db.friends, function () {
db.friends.add({ name: "Ulla Bella", age: 87, isCloseFriend: 0 });
db.friends.add({ name: "Elna", age: 99, isCloseFriend: 1 });
db.friends.where("age").above(65).each(function (friend) {
console.log("Retired friend: " + friend.name);
});
}).catch(function (error) {
console.error(error);
});
The sample above shows that there’s no need to wait for the add() operations to finish when working within the same transaction.
The Auto-Commit Behavior of IndexedDB Transactions
IndexedDB will commit a transaction as soon as it isn’t used within the same task. This means that you MUST NOT call any other async API (at least not wait for it to finish) within a transaction scope. If you do, you will get a TransactionInactiveError thrown at you as soon as you try to continue using the transaction. This cannot be worked around by encapsulating the call with Dexie.Promise since it is a behaviour of IndexedDB.
News in Dexie 2.0.0-beta.6: You can now wait for other async APIs and still hold the transaction active, using Dexie.waitFor()
Nested IndexedDB Transactions
Since version 0.9.8, Dexie supports nested transactions:
db.transaction('rw', db.friends, db.pets, function () {
// MAIN transaction block
db.transaction('rw', db.pets, function () {
// SUB transaction block
});
});
The power with nested transactions is that functions that use a transaction can be reused by higher-level code that surrounds all of its calls into a bigger transaction.
See also Dexie.transaction() for more information on how to use transactions.
Table of Contents
- API Reference
- Best Practices
- Building Addons
- Collection
- Collection.and()
- Collection.clone()
- Collection.count()
- Collection.delete()
- Collection.desc()
- Collection.distinct()
- Collection.each()
- Collection.eachKey()
- Collection.eachPrimaryKey()
- Collection.eachUniqueKey()
- Collection.filter()
- Collection.first()
- Collection.keys()
- Collection.last()
- Collection.limit()
- Collection.modify()
- Collection.offset()
- Collection.or()
- Collection.primaryKeys()
- Collection.raw()
- Collection.reverse()
- Collection.sortBy()
- Collection.toArray()
- Collection.uniqueKeys()
- Collection.until()
- Compound Index
- Consuming Dexie as a module
- Deprecations
- Derived Work
- Design
- Dexie
- Dexie.AbortError
- Dexie.BulkError
- Dexie.ConstraintError
- Dexie.DataCloneError
- Dexie.DataError
- Dexie.DatabaseClosedError
- Dexie.IncompatiblePromiseError
- Dexie.InternalError
- Dexie.InvalidAccessError
- Dexie.InvalidArgumentError
- Dexie.InvalidStateError
- Dexie.InvalidTableError
- Dexie.MissingAPIError
- Dexie.ModifyError
- Dexie.NoSuchDatabaseErrorError
- Dexie.NotFoundError
- Dexie.Observable
- Dexie.Observable.DatabaseChange
- Dexie.OpenFailedError
- Dexie.PrematureCommitError
- Dexie.QuotaExceededError
- Dexie.ReadOnlyError
- Dexie.SchemaError
- Dexie.SubTransactionError
- Dexie.Syncable
- Dexie.Syncable.IDatabaseChange
- Dexie.Syncable.IPersistentContext
- Dexie.Syncable.ISyncProtocol
- Dexie.Syncable.StatusTexts
- Dexie.Syncable.Statuses
- Dexie.Syncable.registerSyncProtocol()
- Dexie.TimeoutError
- Dexie.TransactionInactiveError
- Dexie.UnknownError
- Dexie.UnsupportedError
- Dexie.UpgradeError()
- Dexie.VersionChangeError
- Dexie.VersionError
- Dexie.[table]
- Dexie.addons
- Dexie.async()
- Dexie.backendDB()
- Dexie.close()
- Dexie.currentTransaction
- Dexie.debug
- Dexie.deepClone()
- Dexie.defineClass()
- Dexie.delByKeyPath()
- Dexie.delete()
- Dexie.derive()
- Dexie.events()
- Dexie.exists()
- Dexie.extend()
- Dexie.fakeAutoComplete()
- Dexie.getByKeyPath()
- Dexie.getDatabaseNames()
- Dexie.hasFailed()
- Dexie.ignoreTransaction()
- Dexie.isOpen()
- Dexie.js
- Dexie.name
- Dexie.on()
- Dexie.on.blocked
- Dexie.on.error
- Dexie.on.populate
- Dexie.on.populate-(old-version)
- Dexie.on.ready
- Dexie.on.versionchange
- Dexie.open()
- Dexie.override()
- Dexie.semVer
- Dexie.setByKeyPath()
- Dexie.shallowClone()
- Dexie.spawn()
- Dexie.table()
- Dexie.tables
- Dexie.transaction()
- Dexie.transaction()-(old-version)
- Dexie.verno
- Dexie.version
- Dexie.version()
- Dexie.vip()
- Dexie.waitFor()
- DexieError
- Docs Home
- Download
- Export and Import Database
- Getting Started
- Hello World
- How To Use the StorageManager API
- Inbound
- IndexSpec
- Indexable Type
- IndexedDB on Safari
- Migrating existing DB to Dexie
- MultiEntry Index
- Promise
- Promise.PSD
- Promise.catch()
- Promise.finally()
- Promise.on.error
- Promise.onuncatched
- Questions and Answers
- Releasing Dexie
- Samples
- Simplify with yield
- Table
- Table Schema
- Table.add()
- Table.bulkAdd()
- Table.bulkDelete()
- Table.bulkGet()
- Table.bulkPut()
- Table.clear()
- Table.count()
- Table.defineClass()
- Table.delete()
- Table.each()
- Table.filter()
- Table.get()
- Table.hook('creating')
- Table.hook('deleting')
- Table.hook('reading')
- Table.hook('updating')
- Table.limit()
- Table.mapToClass()
- Table.name
- Table.offset()
- Table.orderBy()
- Table.put()
- Table.reverse()
- Table.schema
- Table.toArray()
- Table.toCollection()
- Table.update()
- Table.where()
- The three main limitations of IndexedDB
- Transaction
- Transaction.abort()
- Transaction.on.abort
- Transaction.on.complete
- Transaction.on.error
- Transaction.table()
- Tutorial
- Typescript
- Understanding the basics
- Version
- Version.stores()
- Version.upgrade()
- WhereClause
- WhereClause.above()
- WhereClause.aboveOrEqual()
- WhereClause.anyOf()
- WhereClause.anyOfIgnoreCase()
- WhereClause.below()
- WhereClause.belowOrEqual()
- WhereClause.between()
- WhereClause.equals()
- WhereClause.equalsIgnoreCase()
- WhereClause.inAnyRange()
- WhereClause.noneOf()
- WhereClause.notEqual()
- WhereClause.startsWith()
- WhereClause.startsWithAnyOf()
- WhereClause.startsWithAnyOfIgnoreCase()
- WhereClause.startsWithIgnoreCase()
- db.syncable.connect()
- db.syncable.delete()
- db.syncable.disconnect()
- db.syncable.getOptions()
- db.syncable.getStatus()
- db.syncable.list()
- db.syncable.on('statusChanged')
- db.syncable.setFilter()
- unhandledrejection-event


Image slider with focus
Image editor modal
Open modal
Open modal 2
SHOW SELECTED
Modal title
Black & white
Auto crop all
Crop & Edit next
Crop & Save
Loading...
Add or select a picture
Device
Instagram
Facebook
Camera


Critique
Outpatient App
Advantages
- Create “Tribes” for each resident; including family, friends, care providers, and others on a need-to-know basis.
- Share updates with Tribe members – all at once, individually or a select group
- Improve communications between care staff and resident tribes
- Track and monitor individul patient treatment/care progress
Disadvantages
- A nurse can not monitor his/her daily progress
- No functionality to for the supervisor to monitor the activites a nurse in real-time
- A nurse can not transfer his or her patient to another nurse
- No systematic way of transiting from one pattient to another in the app.
- No functionality for the nurse to create a schedule except for the patient
Vivendi Desktop App
Advantages
- The supervisor can plan nurses daily and weekly roster
- It can be use to write patient bill
Disadvantages
- No mobile App except desktop application
- Event the destop version can not scan the PZN of patient medication
- A nurse can not monitor his/her daily progress in a digital platform
- No functionality to for the supervisor to monitor the activites a nurse in real-time
- A nurse can not transfer his or her patient to another nurse digitaly


Integrating With WPF
This section covers integrating with WPF user interfaces. This covers handling the application lifecycle, binding to dependency properties and listening to events.
The WPF Scheduler
Tempo.WPF provides an implementation of IScheduler which uses a WPF dispatcher to perform the work. Normally, applications do not need to use WpfScheduler directly, since the TempoApp.Init method will construct one for you.
Application Lifecycle
The helper method TempoApp.Init is provided to construct the top-level Tempo scope for the application. This method observes the Startup and Exit events of the Application object, so that it knows when to create and destroy the top-level scope. This means that TempoApp.Init must be called before the application is started, otherwise the Startup event will not be handled. The constructor is usually the best place to do this.
Binding to Dependency Properties
Dependency properties can be bound to value cells, in either direction. The PropertyAdapter class provides two methods, Read and Write, to handle this interaction boundary. The Read method returns a read-only cell which observes the dependency property, while Write returns a write-only cell that forwards any modifications to the dependency property. These cells can then be bound to other cells managed by Tempo.
Listening to Events
In addition to dependency properties, WPF controls expose regular .NET events too. Observing .NET events is covered in Integrating With External Events.
Binding to Selector Controls
While IListCellRead<T>.Bind
can be used to bind directly to IList objects, and hence could bind to the
Selector.Items property, this does not correctly preserve the selection state of the
Selector control. Instead, Tempo.Wpf provides the SelectorBinding.Bind method which
includes additional logic to ensure the selection remains consistent when the source
list is modified.


The title bar shows the name of the current file or current folder:
For a folder, the path and the name of the file being loaded are separated by a dash:
If the file has been modified but not saved, the name of the file is followed by the modification indicator :
The main window can be resized as follows:
Furthermore, the goban and comment panels are separated by a resize bar dividing the main window between these two panels:
In the user interface, below the menu bar, are located four toolbars, which can be:
After installation, the toolbars are as follow:
The toolbars can be:
The location of the toolbars is stored and restored when starting Drago.
The user interface enables to load several files in the same time and to choose the one displayed using a tab bar:
The number of tabs is limited only by the resources of the system. Tabs enable to create an undefined number of editing sessions, problem solving sessions, game engine sessions, etc..
Each tab has a title with a glyph enabling to identifying its current mode:
Pop up menus are open when right clicking or double clicking on the tab bar. These menus are described here.
Each tab can independently display three different views:
By default, each tab has a close button:
This button can be hidden with the advanced settings.
The side bar gathers several panels related to the current game and current mode. By clicking on the upper area, the position of the side bar may be modified:
The side bar may be:
|
|
|
The side bar may be resized by clicking on the vertical split bar.
| By clicking on the center part of the split bar, the side bar may be minimized. | When the side bar is minimized, the node information (move number, next player, prisoners) is displayed in the status bar. | The side bar position is restored by clicking again on its center part. |
The visibility of six of the panels is
optional. These six panels are:
The default visibility of these panels is controlled by the settings in the Side bar tab of the Options dialog. It is also possible to show or hide one of these panels for the current tab by clicking on the tool button . The list of variations, the game tree and the comment panels are separated by resizing bars enabling their sizes to be adjusted. Additionaly, their relative order may be changed by drag ad drop. |
The game information panel enables to display some game information (players, ranks, date, ...) as stored in the current game file. The panel enables also to display the player images. The content of this panel can be configured in the Side bar tab of the option dialog.
This panel displays the timing properties (time left and byo-yomi stones). Timing properties can be inserted with the timing dialog box of the Edit/Insert menu.
The list of variations displays the followups to the current move, depending on settings in the Moves tab of the Options dialog.
The game tree lets you view and traverse the variations of a game. Clicking on a stone enables to go to the related position.
The node name and the comments for the current move or current position are displayed in the associated display panels. If these panels are not visible, depending on the settings of the Side bar tab of the Options dialog, it is possible to edit the node names and comments with the Edit/Insert... dialog.
The node name enables you to give a short description of the current move or position. Comments have no size limitation.
An option enables to customize the size of the font used for comments.
Markups enable you to identify a move or an intersection. They are selected with the Edit/Markup menu or by right clicking on the Markup button of the toolbar:
When editing a game:
When starting a game with the game engine:
While playing a game with the game engine:
The status bar has six fields showing:
| the number of the current game and the number of games in the current file | |
| the position of the last move, when the move number should be displayed on a markup | |
| unknown or not handled SGF properties | |
| icons clarifying the content of the next filed (annotation, pass, result of game analysis functions) | ... |
| display of annotation, pass or result of game analysis functions | |
| display of node information (move number, next player, prisoners) when the side bar is minimized |


new SantaHat(p, x1, y1, x2, y2)
Represents a Santa Hat image that can be drawn to a surface
Parameters:
| Name | Type | Description |
|---|---|---|
p |
p5 | p5.js instance |
x1 |
int | x-coordinate of the bounding box's top left corner |
y1 |
int | y-coordinate of the bounding box's top left corner |
x2 |
int | x-coordinate of the bounding box's bottom right corner |
y2 |
int | y-coordinate of the bounding box's bottom right corner |
Methods
draw(surf)
Method to draw the hat on a given surface
Parameters:
| Name | Type | Description |
|---|---|---|
surf |
p5.Graphics | Surface to draw on. Must be a p5.Graphics object. |
drawBox(surf)
Method to draw the bounding box for debugging purposes
Parameters:
| Name | Type | Description |
|---|---|---|
surf |
p5.Graphics | Surface to draw on. Must be a p5.Graphics object. |
resize()
Resizing function that is run after the image is loaded to
fit the bounding box appropriately
Also sets the offsets for x and y so it is positioned correctly


2 Keys
2.1 General Key
- Leaves evergreen, needle like, scale like or both, usually hard, mostly resinous or odorous. Reproducing through cones -> Key 1 (Conifers)
Leaves evergreen, deciduous or absent, not needle or scale like, resinous or not. Reproducing (almost exclusively) through flowers and fruits -> 3 (Flowering plants)
- Leaves evergreen and parallel veined -> Key 2
- If leaves evergreen, then not parallel veined -> 5
- Leaves or leaf scars >2 per node (whorled, pseudowhorled or in bundles) -> Key 3
Leaves or leaf scars <3 per node -> 7
- Leaves or leaf scars 2 per node (opposite or subopposite) -> Key 4
- Leaves or leaf scars 1 per node (alternate) -> Key 5
2.2 Key 1: Coniferous plants reproducing by cones
Conifers are seed plants without flowers, instead reproducing through cones. Only a few species are deciduous and the rest are evergreen. Most coniferous genera are highly distinct, with discrete and interesting characters.
- Leaves whorled. Either whorled on short shoots and needle like, 3(4)-whorled around a twig or in large distant whorls -> Key 1.1
- Leaves not whorled -> 3
- Leaves needle like, in bundles of 2’s, 3’s or 5’s -> Pinus
- If leaves needle like, not bundled -> 5
- Leaves strictly opposite, adnate, scale like -> Key 1.2
- Leaves alternate or spiral. Adnate, scale like or not -> 7
- Young twigs brown or grey (by year 2). If shoot ribbed, not green -> Key 1.3
- Young twigs green (until year 3). Shoot ribbed by green leaf bases -> Key 1.4
2.2.1 Key 1.1: Leaves whorled
- Leaves deciduous, cones persistent… Larix
- Leaves evergreen -> 3
- Leaves in rosettes of 20-80 leaves on short shoots … Cedrus
- Leaves never on short shoots -> 5
- Leaves many, >7, 70-120mm long in large, distant whorls … Sciadopitys
- Leaves in 3’s, rarely 4’s -> 7
- Leaves blunt tipped … Fitzroya (cupressoides)
- Leaves sharply pointed … Juniperus
2.2.2 Key 1.2: Leaves strictly opposite, scale like (Cupressaceae)
Cupressus - foliage in spray like plumes, branchlets at varying angles. Twigs rounded or 4-sided, the scale-leaves even on all sides
x Cupressocyparis - foliage in flattened pinnate sprays, cone globular and woody. Young shoots only slightly flat, nearly 4-sided
Chamaecyparis - foliage in flattened pinnate sprays, cone globular and woody. Twigs flat, the facial scale-leaves usually flat, rarely keeled, the lateral scale-leaves keeled. Young shoots distinctly flat. Terminal shoot usually ‘whip-like’, drooping; cones globose, the peltate scales touching only at the margins
Thuja - foliage in flattened pinnate sprays, cone flask shaped, leathery. Twigs flat, the facial scale-leaves usually flat, rarely keeled, the lateral scale-leaves keeled. Young shoots distinctly flat. Terminal shoot erect; cones ovate to oblong, their scales overlapping. Foliage spreading in flat sprays, aromatic when crushed; scale-leaves a different colour on lower sides from upper
Platycladus -foliage in flattened pinnate sprays, cone flask shaped, leathery. Foliage scentless. Twigs flat, the facial scale-leaves usually flat, rarely keeled, the lateral scale-leaves keeled. Young shoots distinctly flat. Foliage in vertical sprays, without scent when crushed; scale-leaves the same colour on both sides
- Leaves broader, with large white patches below… Thujopsis (dolabrata)
- Leaves smaller, not broad -> 3
- Shoots with at least some leaves in whorls of 3 (check young foliage)… Juniperus
- Leaves never 3-whorled -> 5
- Branchlets spreading in 3 dimensions. Twigs rounded or 4-sided. Scale leaves all similar. Female cone thickly woody… Cupressus
- Branchlets arranged in 1 plane, or rarely 3 dimensions. Twigs flat, or slightly flat and 4 sided. -> 7
- Young shoots slightly flat and nearly 4 sided. One common cultivar with branchlets in 3 dimensions… x Cupressocyparis (leylandii)
- Young shoots very flat, lateral scale leaves keeled -> 9
- Scale leaves same colour on both sides, scentless foliage when crushed… Platycladus (orientalis)
- Scale leaves lighter or whitish at margins below -> 11
- Female cones globular and woody, terminal shoots whip-like… Chamaecyparis
- Female cones flask shaped with scales overlapping, terminal shoots erect… Thuja (plicata)
Olfactory table:
Thujopsis Juniperus - smells like gin? Cupressus x Cupressocyparis Platycladus - no smell Chamaecyparis Thuja - sweet pineapple
2.2.3 Key 1.3: Young twigs brown or grey
- Leaves with sucker like base, attached directly to twig… Abies
- Leaves without sucker like base, attached to a projection on twig -> 3
- Leaves with indistinct petiole, twig very rough when leaves fallen… Picea
- Leaves with obvious petiole, bare shoots slightly rough -> 5
- Leaves minutely serrate, buds hidden by leaves… Tsuga
- Leaves entire, buds prominent… Pseudotsuga (menziesii)
2.2.4 Key 1.4: Young twigs green
- Leaves with a petiole… Taxus (baccata)
- Leaves sessile -> 3
- Leaves of two kinds, scale like, and linear/flat… Sequoia (sempervirens)
- Leaves all similar -> 5
- Leaves >25mm long, >10mm wide, sharply spine tipped… Araucaria (araucana)
- Leaves <25mm long -> 7
- Leaves spirally arranged, with free part 3-7mm… Sequoiadendron (giganteum)
- Leaves in 5 ranks, incurved, with free part 5-20mm… Cryptomeria (japonica)
2.3 Key 2: Leaves evergreen, parallel veined (Asparagaceae)
- Leaves >20cm long in rosettes at apex of stem, palm-like -> 3
- Leaves <20cm long spirally arranged on stems … Ruscus
- Leaves with translucent veins … Cordyline (australis)
- Leaves with indistinct opaque veins … Yucca
2.4 Key 3: Leaves or leaf scars whorled
- Leaves evergreen -> 3
- Leaves deciduous, leaf scars apparent -> 15
- Leaves pseudowhorled -> 5
- Leaves in true whorls -> 7
- Matted evergreen shrub < 0.4m … Empetrum
- Tall shrub to small tree >2m … Rhododendron
- Leaves 3 whorled -> 9
- Leaves >4 whorled -> 11
- Young twigs glandular hairy … Erica
- Young twigs not glandular hairy -> 11
- Leaves > 10mm wide … Kalmia
- Leaves < 1mm wide … Erica
- Leaves tough >6mm wide, strongly retrorsely scabrid … Rubia
- Lvs ± 1mm wide … Erica
- Leaf scars minute, many, alternate, raised on spurs on second year shoots, reproductive organs cones … Larix
- Leaf scars larger, 3 per node, not raised -> 17
- Twigs stout, leaf scars large with ~ 12 bundle traces in an ellipse. Buds usually arranged in two large and one small … Catalpa (bignonioides)
- Twigs slender, leaf scars smaller with 3 or fewer bundle traces -> 19
- Bundle trace 1, twigs mostly dead… Fuschia
- Bundle traces 3 -> 21
- Twigs with stellate scales … Deutzia (better characters?)
- Twigs hairless or with simple hairs … Hydrangea
Add Philadelphus?
2.5 Key 4: Leaves or leaf scars opposite
- Plants scrambling, climbing or parasitic on trees -> Key 4.1
- Plants not as above -> 3
- Plants evergreen -> Key 4.2
- Plants deciduous -> Key 4.3
2.5.1 Key 4.1: Climbing, or epiphytic plants parasitic on trees
- Plant parasitic on tree branches with twigs repeatedly forked at the nodes -> 3
- Plant rooted in soil -> 5
- Twigs sickly green … Viscum (album)
- Twigs brown … Loranthus (rare hortal)
- Evergreen (or semi-evergreen) -> 7
- Deciduous -> 9
- Leaves simple … Lonicera
- Leaves compound, climbing using coiling petioles … Clematis
- Climbing by coiling petioles, persisting in winter … Clematis
- Climbing by aerial roots or scrambling -> 11
- Anvil shaped hairs on stems, stems twining clockwise, fruits persistent with many overlapping papery bracts … Humulus (lupulus)
- Not as above -> 13
- Bundle traces 1, scrambling, weakly climbing … Jasminum (nudiflorum)
- Bundle traces >1 -> 15
- Bundle traces 3 … Lonicera
- Bundle traces 5 … Schizophragma (hydrangoides)
2.5.2 Key 4.2: Evergreen plants
- Leaves simple and entire -> 3
- Leaves compound or toothed -> 5
- Trailing, thin, wiry shrubs <20cm tall at maturity -> Key 4.2.1
- Tree or upright shrub -> Key 4.2.2
- Leaves ternate… Choisya (ternata)
- Leaves toothed -> Key 4.2.3
<IP_ADDRESS> Key 4.2.1: Wiring, creeping, trailing shrubs
- Leaves with stellate hairs … Helianthemum
- Leaves with simple hairs or hairless -> 3
- Leaves translucent dotted with sunken glands, aromatic … Thymus
- Leaves not translucent dotted or aromatic -> 5
- Leaves with revolute margins -> 7
- Leaves with flat margins -> 11
- Leaves < 2mm long, petiole absent … Calluna
- Leaves >2mm long, petiole present -> 9
- Leaves linear, rounded in cross section, 2-5mm long … Frankenia
- Leaves oblong, 5-8mm long -> Loiseleuria
- Stipules absent -> 13
- Stipules present … Herniaria
- Veronica bifurcate Linnaea here
- Veronica bifurcate Linnaea here
Linnaea here?
<IP_ADDRESS> Key 4.2.2: Shrubs, trees. Leaves simple.
- Leaves with clear 2 pinnate translucent veins on leaves -> 3
- Leaves with 2 pinnate veins indistinct or absent -> 19
- Leaves sessile -> 3
- Leaves petiolate -> 9
- Leaves <1.5cm wide and with revolute margins at maturity -> 5
- Leaves >2cm wide, with either transulcent dotted leaves or with minute glands attached to veinlets. Leaf scars triangular, bundle trace 1, pith spongey and excavated (hollow) -> Hypericum
- Leaves <4mm wide, rosemary scented. Bundle traces 3 … Rosmarinus
- Leaves >4mm wide (on average), odourless. Bundle traces in a transverse line … Kalmia
- Leaves >2cm long -> 11
- Leaves <2cm long … Lonicera (leaves <2cm long? Really?)
- Leaves with dendritic hairs … Phlomis
- Leaves with hairs simple or absent -> 13
- Leaves with dense silver silky hairs below … Olearia (GARRYA? LEAVES GREY WOOLLY BELOW AND UNDULATE LEAF MARGINS?)
- Leaves hairless both sides, except for vein axils below -> 15
- Vein axils below with tufts of hairs … Viburnum
- Leaves glabrous -> 17
- Sipules present, fused between petiole bases, young twigs ± square … Coprosma
- Stipules absent, young twigs rounded, at most angled slightly below the nodes … Ligustrum
- Leaves white hairy at least below, strongly aromatic -> 21
- Leaves never white hairy, aromatic or not -> 23
- Leaves hairy with long stellate hairs both sides, lavendar scented … Lavandula
- Leaves glabrous above, rosemary scented … Rosmarinus
- Twigs square, leaves odorous -> 25
- Twigs round, leaves odourless -> 29
- Leaves gland pitted one or either side -> 25
- Leaves not gland pitted -> Buxus
- Young twigs green, minutely ciliate, menthol scented … Hyssopus
- Young twigs whitish, leaves long ciliate at base, sage scented … Satureja
- Leaves strongly revolute, <2mm long, sessile … Calluna
- Leaves not revolute -> 31
- Leaves fleshy, mealy grey <6cm, not valvate when developing … Atriplex
- Leaves not fleshy, valvate when developing … Veronica (sect Hebe)
<IP_ADDRESS> Key 4.2.3: Shrubs, trees. Leaves toothed.
- Twigs with dendritic hairs … Phlomis
- Twigs never with dendritic hairs -> 3
- Twigs with stellate hairs -> 5
- Twigs without stellate hairs -> 7
- Stipules present, leaves white felted below … Buddleja
- Stipules absent, leaves stellate hairy below … Viburnum
- Leaves < 2cm long, stems creeping and prostrate … Linnaea
- Leaves >2cm long, stems never creeping -> 9
- Petiole with 1 vascular bundle -> 11
- Petiole with 3 vascular bundles -> 13
- Twigs square … Phygelius
- Twigs round -> 15
- Not net veined, weak 2 pinnate veins. Leaves with yellow blotches above, petiole green … Aucuba
- Net veined and strongly 3-pli-veined. No yellow blotches, petiole reddish … Viburnum
- Young twigs brown, each leaf tooth with a fragile claw like gland … Euonymus
- Young twigs green, leaf teeth without glands -> 17
- Leaves cuneate at base, buds with scales … Rhamnus
- Leaves rounded at base, buds naked … Phillyrea
Evergreen:
TOOTHED LVS Aucuba - bt’s 3, pith chambered with granular septa, scars slightly raised, large and crescent shaped
Buddleja - stems 4 ridged, pith large, white and continuous, scars half round or triangular, small, bt 1. Stipule scars transversely connected Viburnum - bt’s 3 or in groups of 3 with the middle bundles 2, pith continuous, leaf scars crescent shaped or angular v shaped Linnaea - leaf scars raised and shrivelled, single bt obscured Euonymus - scars small, elevated, bt 1 towards the top of the scar Phygelius - twigs square Rhamnus - pith rounded continuous and white, bt’s 3 or in a transverse series, buds with scales Phillyrea - bt 1, scars crescent shaped
LVS TERNATE Choisya - ! ENTIRE LVS Phlomis - Coprosma - Buxus - bt 1, leaf scars minute and crescent shaped, pith minute and cont. Twigs flat grooved between each pair of leaves Olearia Kalmia - bt’s in a transverse line, scars half round or shield shaped, pith small and cont Calluna - scars opposite, minute, crescent shaped, bt 1, pith round cont Hebe - Viburnum - bt’s 3 or in groups of 3 with the middle bundles 2, pith continuous, leaf scars crescent shaped or angular v shaped Ligustrum - pith moderate, white and homogenous, scars crescent shaped with bt 1 Lavandula - Rosmarinus - twigs 4 sided, leaf scars deeply u shaped, bt’s 3 Hypericum - leaf scars triangular, 1 bt, pith spongey and finally excavated ?? Garrya - bt’s 3, pith continuous, scars angularly u-shaped
?? Hyssopus Satureja ?? Atriplex
?? Helianthemum Thymus Loiseleuria Frankenia Herniaria Fuschia Weigela Kolkwitzia Phygelius Phillyrea ?? Akebia
2.5.3 Key 4.3: Deciduous plants
- Bundle trace 1 -> Key 4.3.1
- Bundle traces >1 -> 5
- Bundle traces 3 -> Key 4.3.2
- Bundle traces >3 -> Key 4.3.3
<IP_ADDRESS> Key 4.3.1: Bundle trace 1
- Twigs green … Euonymus
- Twigs not green when mature -> 3
- Trees -> 5
- Shrubs -> 9
- Terminal buds always present, buds felted brown, grey or black … Fraxinus
- Terminal buds absent -> 11
- Pith chambered, twigs densly hairy … Paulownia (tomentosa)
- Pith solid, twigs red brown… Metasequoia (glyptostryboides)
- Buds sometimes whorled in 3’s… Fuschia
- Buds strictly opposite -> 11
- Pith present, solid, whitish -> 13
- Twigs hollow or chambered, brownish -> 15
- Buds mostly in pairs at twig apices, glandular ciliate with 6-7 scales … Syringa
- Buds singular at twig apices, ciliate with ± 4 pairs of opposite scales … Ligustrum
- Buds >11 pairs of scales, twigs chambered to hollow between nodes … Forsythia
- Buds <4 pairs of scales, or absent, twigs hollow but never chambered -> 17
- Leaf scars mostly torn, partly connected by transverse ridges, buds with keeled scales. Fruits white or red berries … Symphoricarpos
- Leaf scars never torn, triangularly lens shaped, not partly connected by ridges, buds without scales … Hypericum
<IP_ADDRESS> Key 4.3.2: Bundle traces 3
- Transverse ridge not present between buds or leaf scars -> 3
- Transverse ridge present between buds or leaf scars, or leaf scars abut -> 7
- Shoots thorny, buds with 8-10 dark brown scales, terminal buds present… Rhamnus (cathartica)
- Shoots not thorny, buds red with one scale visible, terminal buds absent… Cercidiphyllum (japonicum)
- Buds hidden behind leaf scar (which is like a thin membrane)… Philadelphus
- Buds exposed and obvious -> 7
- Buds naked -> 9
- Buds with scales -> 13
- Only terminal bud naked, twigs stout… Hydrangea
- All buds naked -> 11
- Twigs but especially buds with stellate hairs… Viburnum
- Twigs and buds without stellate hairs but with medifixed hairs… Cornus
- Stipule scars large and obvious… Staphylea
- Stipule scars absent or not obvious -> 15
- Buds with a pair of scales fused, enveloping bud, buds globose, red. Or flowering in winter, fragrant… Viburnum
- Bud scales >2, not fused, not flowering in winter -> 17
- Pith hollow between nodes -> 19
- Pith solid, or spongey -> 23
- Buds solitary, twigs green … Leycesteria
- Buds often superposed or collateral, twigs never green -> 21
- Buds >3mm long, with buds often superposed… Lonicera
- Buds <3mm long, buds often collateral… Symphoricarpos
- Twigs with 2-4 ridges decurrent from nodes. 2-valved capsules persistent … Weigela
- Twigs without ridges decurrent from nodes, fruits rarely persistent -> 25
- Bundle traces forming a line, fruits persistent, bristly with 5 lobed calyx…Kolkwitzia
- Bundle traces distinct, fruits not persistent, or if they are, not as above -> 27
- Pith spongey, twigs stout… Sambucus
- Pith solid, twigs more slender… Acer
<IP_ADDRESS> Key 4.3.3: Bundle traces >3
- Leaf bases obscuring leaf scars -> 3
- Leaf scars clearly present -> 5
- Twigs green, hollow… Leycesteria (formosana)
- Twigs red or purplish, solid… Acer (section Palmata)
- At least some nodes in whorls of 3 -> 7
- Nodes strictly opposite -> 11
- Bundle traces >8 in an ellipse or horseshoe shape, terminal bud absent -> 9
- Bundle traces < 7 (usually 3-5), terminal bud present… Hydrangea
- Each node with one small leaf scar, and two large… Catalpa (bignonioides)
- Leaf scars all the same size… Clerodendron (trichotomum)
- Large stipule scars between leaf scars… Staphylea (pinnata)
- If stipule scars present, inconspicuous -> 13
- Trees -> 15
- Shrubs -> 21
- Terminal bud present, pith solid -> 17
- Terminal bud absent, pith chambered… Paulownia (tomentosa)
- Bundle traces many in a closed circle, buds furry… Fraxinus
- Bundle traces <9, distinct, buds not furry but may be hairy -> 19
- Terminal buds >15mm, leaf scars large, shield shaped… Aesculus
- Terminal buds < 15mm, leaf scars smaller, mostly crescent shaped… Acer
- Terminal bud very large (15-20mm), naked… Hydrangea
- Terminal bud smaller <15mm, often absent from shoots -> 23
- Pith wide, spongey, twigs stout … Sambucus
- Pith narrower, hard, more slender … Acer
Deciduous:
Fuschia Weigela Kolkwitzia
Clerodendron - twigs obscurely 4 sided, pith large round white and continuous, buds superposed but lower often obscured by leaf scar, round ovoid. Leaf scars sometimes in whorls of three, elliptical, bt's 9 or aggregated in a U shaped series (?). No interpetiolar ridge.
– Clerodendron trichotomum
Paulownia - twigs stout, compressed at nodes. Pith large and chambered or hollowed between nodes. Buds superposed and sessile with 4 exposed blunt scales. Scars elliptical and more or less notched at the top. Bt's many in a near closed elliptical series. Without interpetiolar ridge.
QA - Paulownia tomentosa
Rhamnus - pith rounded, continuous and white, scars small or more or less raised, bt's 3 or in a transverse series, buds small sessile (naked or scaled). No interpetiolar ridge
OB - Rhamnus alaternus
Aesculus - pith large, 6 sided, pale. Upper most buds very large, half dozen exposed scales. leaf scars shield shaped or triangular, bundle traces 3 or in three groups. Weakly ridged between buds
RG - Aesculus hippocastanum RG - Aesculus carnea RG - Aesculus indica
Sambucus - twigs (6)8-10 sided, pith large, soft and continuous, buds with 3-5 pairs of scales, end bud mostly lacking. Scars crescent shaped, 3-4 sided large and transversely connected. Bundle traces 3,5,7. Interpetiolar ridge present
SJ - ebulus SC - nigra SC - racemosa
Fraxinus - twigs stout, stiff, squarish and compressed at nodes. Buds sessile, superposed, 2-3 pairs of opposite scales, those of end bud often lobed. Bt's in a u-shaped series. Scars half round and broadly u shaped. Without interpetiolar ridge.
SC - excelsior SC - angustifolium SC - ornus
Viburnum (lantana, opulus) - twigs more or less 6 sided, pith round to 6 sided, continuous. End bud naked and stellate scurfy (lantana) or scaled and stalked ovoid (opulus). Scars crescent shaped, bt's 3
QA - opulus (interpetiolar ridge) OA - lantana (interpetiolar ridge)
Leycesteria - soft wooded shrubs, twigs slender and round and pith excavated. Buds with 1-2 pairs of exposed scales, the outer attenuate. Leaf scars raised and minute so as to equal bud. Opposite scars connect in a cross line. Bt’s 3. With interpetiolar ridge
OA/LA - formosana
Cornus - twigs often bright coloured, round to 6 sided, pith white, continuous or soft or spongey. Buds stalked, oblong with a pair of valvate scales. Leaf scars raised and crescent shaped (raised on first winter on petiole bases). Bt's 3, leaf scars transversely joined. With interpetiolar ridge weak/absent
LA - koenigii LA - mas LA - sanguinea LA - sericea
Deutzia - twigs stellate pubescent, pith round, pale and spongey or brown and excavated between nodes (in our species yes). Buds with 2-6 pairs of scales. Scars triangular or transversely elongated and connected by transverse ridges. With interpetiolar ridge
OA - scabra
Philadelphus - twigs lined to hexagonal, buds with 2 valvate and hairy scales. Leaf scars half round with a thin membrane that covers the bud or crescent shaped when this is burst, connected transversely. Bt’s 3. With interpetiolar ridge
OA - coronarius OA - microphyllus
Acer - twigs terete to six sided, pith round continuous and pale, buds with 2 to several pairs of scales, leaf scars U shaped bundle traces 3, 5, 7, 9
QA - campestre QA - cappadocicum RG/SC - negundo QA - platanoides QA - pseudoplatanus QA - saccharum
Lonicera - twigs rounded, slender, bt’s 3. With interpetiolar ridge
LA - xylosteum LA - maackii LA - formosa LA - x purpusii LA - tatarica
Hydrangea - pith large, continuous and pale, buds with 4-6 exposed scales, leaf scars crescent shaped, with connecting crossline. Bt’s 3. With interpetiolar ridge
OA - macrophylla
*Euonymus - twigs characteristically green, pith round to 4 angled, greenish and spongey. Buds with 3-5 pairs of at first serrulate scales, scars small, half elliptical, somewhat elevated. Bt 1, transverse towards the top of the scar. No interpetiolar ridge.
OB - latifolius OB - europaeus
*Ligustrum - twigs rounded to 4 lined below the nodes, pith moderate white and homogenous, buds with 2-3 exposed scales. Leaf scars crescent shaped, raised and small. Bt 1. No interpetiolar ridge
LB - vulgare LB - ovalifolium (mostly evergreen)
*Forsythia - pith chambered to excavated, twigs moderately 4 sided. Buds with a dozen pairs of scales. Leaf scars shield shaped, small. Bt 1. No interpetiolar ridge
OB - x intermedia
*Symphoricarpos - small deciduous shrubs. Pith brownish, usually excavated, buds with about 3 pairs of keeled scales. Leaf scars small and mostly torn, raised and partly connected by transverse ridges, bt 1
LA - albus LA -orbiculatus LA - x chenaultii
Hypericum - twigs angled at least below the nodes, pith brown, spongey and finally excavated. Buds with 2 or several scarcely specialised scales. Scars triangularly lens shaped, bt 1 Syringa - twigs moderate to slender, pith homogenous, buds with around 4 pairs of scales. Scars crescent or shield shaped. Bt 1 transverse and compound. No interpetiolar ridge.
LB - vulgaris
Staphylea - twigs moderate and rounded, glabrous. Pith large, continuous. Buds ovoid, glabrous 2 edged. Scars crescent shaped. Bt's 5 or 7. Stipule scars half round or elongated. With interpetiolar ridge.
2.6 Key 5: Leaves or leaf scars alternate
- Plants scrambling or climbing -> Key 5.1
- Plants not as above -> 3
- Plants evergreen -> Key 5.2
- Plants deciduous -> Key 5.3
2.6.1 Key 5.1: Plants scrambling or climbing
- Plant with leaf opposed tendrils -> 3
- Plant without tendrils -> 5
- Tendrils simple or forked and never thickened into pads, no lenticels on twigs, buds smaller, subglobose … Vitis
- Tendrils branched 2 or more times and often thickened into pads, lenticels on twigs, buds larger, round conical … Parthenocissus
- Leaves evergreen -> 7
- Leaves deciduous -> 9
- Stems with adventitious aerial roots, leaves lobed… Hedera
- Without aerial adventitious roots, leaves almost always entire… Muehlenbeckia
- Stipule (ochreae) scars encircling twigs, at least in older twigs… Fallopia
- Stipule scars absent -> 11
- Buds absent… Salpichroa (rare)
- Buds present -> 13
- Buds superposed (one above another)… Aristolochia
- Buds single at nodes -> 15
- Bundle trace 1, buds with << 12 scales -> 17
- Bundle traces 6 or 3 at level of stem, buds with ~12 mucronate scales… Akebia
- Twigs pale, inconspicuously 5 ridged, hard wooded scrambling shrub, sometimes spiny… Lycium
- Twigs darker, rounded, soft wooded twiner, never spiny. Frequently with dried berries in panicles… Solanum
2.6.2 Key 5.2: Evergreen plants
- Leaves simple -> 3
- Leaves compound -> Key 5.2.1
- Leaves entire -> Key 5.2.2
- Leaves toothed or lobed -> Key 5.2.3
<IP_ADDRESS> Key 5.2.1: Leaves compound
- Leaflets with spiny margins… Mahonia
- Leaflets without spiny margins -> 3
- Leaves 1-pinnate… Coronilla
- Leaves > 1 pinnate… Acacia
<IP_ADDRESS> Key 5.2.2: Leaves entire
- Tree or tall shrub >1.2m -> 3
- Low growing shrub <1.2m, prostrate, erect or mat forming -> 35
- Leaves with peltate scales or stellate hairs -> 5
- Leaves without peltate scales or stellate hairs -> 9
- Peltate scales present -> 7
- Peltate scales absent, stellate hairs present. Leaves spine tipped when young -> Quercus
- Leaves strongly net veined… Olearia
- Leaves not strongly net veined…Eleagnus
- Stipules modified into spines (in leaf axils), wood yellow underneath… Berberis
- Spines not present -> 11
- Leaves white felted or woolly beneath -> 13
- Leaves never white felted -> 15
- Leaves white felted, buds naked… Brachyglottis
- Leaves short woolly below, bud with several scales… Pittosporum
- Petiole with sheathing base on stem, twigs yellowish green… Griselinia
- Petiole never sheathing, twigs green or brown -> 17
- Twigs and leaves with almond odour when crushed… Photinia
- Not with an almond odour -> 19
- Leaves bay scented… Laurus
- Leaves not bay scented -> 21
- Leaves dotted with translucent glands… Skimmia
- Leaves never with translucent glands -> 23
- Leaves sessile… Bupleurum
- Petiole present -> 25
- Leaves spine tipped at apex… Ilex
- Leaves never spine tipped -> 27
- Leaves sivery due to crystalline cells on both sides… Atriplex
- Leaves never silvery -> 29
- Twigs hairless -> 31
- Twigs hairy (look closely) -> 33
- Leaves much larger > 8cm long… Rhododendron
- Leaves smaller < 7cm… Pittosporum
- Leaves in pseudowhorls at twig apex leading to bunched leaf scars from last years growth, twig hairs not S-shaped at base. Stipules absent… Pittosporum
- Leaves never in pseudowhorls, twig hairs S-shaped at base, stipules present and soon falling… Cotoneaster
35 (2). Leaves revolute at least when young, often strongly revolute at maturity -> 37
- Leaves with flat margins, not revolute when young -> 47
- Leaves hairless -> 39
- Leaves hairy -> 45
- Leaves strongly revolute, cylindrical, glandular ciliate only when young … Empetrum
- Leaves weakly revolute -> 41
- Leaves gland dotted below… Vaccinium
- Leaves not gland dotted below -> 43
- Stems >1mm diameter, not rooting at nodes… Andromeda
- Stems <1mm diameter, rooting at nodes… Vaccinium
- Leaves orange woolly below… Rhododendron (subgenus Ledum)
- Leaves white woolly below… Daboecia
- Stipules or stipule scars present… Cotoneaster (Herniaria keys out here if evergreen, but apparently alternate leaved due to one leaf smaller or aborted)
- Stipules absent -> 49
- Leaves fleshy -> 51
- Leaves not fleshy -> 55
- Leaves cylindrical, or nearly so -> 53
- Leaves flat, green… Sedum
- Leaves glaucous… Suaeda
- Leaves green… Artemisia
- Leaves ± linear… Iberis
- Leaves more obovate -> 57
- Leaves >5cm… Daphne
- Leaves <3cm -> 59
- Leaves strongly net veined… Arctostaphylos
- Leaves not net veined, very rare… Diapensia
<IP_ADDRESS> Key 5.2.3: Leaves toothed or lobed
- Leaves toothed -> 3
- Leaves lobed -> 39
- Branches spiny or thorny -> 5
- Branches unarmed -> 7
- Spines at stem nodes, leaves spine toothed… Berberis
- Spines at ends of branches, leaves not spine toothed… Pyracantha (coccinea)
- Low shrub < 60cm tall -> 9
- Large shrub or tree -> 17
- Leaves strongly net veined -> 11
- Leaves not net veined -> 13
- Leaves <3cm long, white woolly below, buds without scales… Dryas (octopetala)
- Leaves >5cm long, not white woolly below, buds with scales… Gaultheria (shallon)
- Leaves gland pitted below… Vaccinium (vitis-idaea)
- Leaves not gland pitted below -> 15
- Leaves few and clustered at stem apices… Gaultheria (procumbens)
- Leaves many and distributed along stems… Phyllodoce (caerulea)
- Plant with peltate scales… Eleagnus (macrophylla)
- Without peltate scales -> 19
- Plant with stellate hairs, buds clustered at leaf apices… Quercus
- Plant without stellate hairs -> 21
- Leaves white hairy below -> 23
- Leaves not white hairy below -> 25
- Young twigs white felted… Brachyglottis (x jubar)
- Young twigs brown… Olearia (macrodonta)
- Leaves at least at apex, spiny -> 27
- Leaves not spiny -> 29
- Twigs green, leaves >3cm, tree… Ilex
- Twigs reddish, leaves <3cm, shrub… Gaultheria
- (Young) twigs with glandular hairs or reddish bristly hairs -> 31
- (Young) twigs not glandular hairy or bristly -> 35
- Leaves aromatic with glands below… Escallonia (macrantha)
- Leaves not aromatic, no glands below -> 33
- Tall shrub to 5m, leaves cuneate at base… Arbutus (unedo)
- Shrub to 1.5m, leaves rounded to cordate at base… Gaultheria (shallon)
- Young twigs hairy -> 37
- Young twigs hairless… Prunus
- Leaves <5m long… Rhamnus (alaternus)
- Leaves >7cm long… Leucothoe (fontanesia)
39 (2). Leaves with stellate hairs -> 41
- Leaves with simple hairs, or hairless -> 43
- Stellate hairs both sides… Lavatera
- Stellate hairs below only… Quercus
- Leaves >90cm, divided to base in 30-40 lobes, in terminal crown, trunk covered in petiole bases. Palm… Trachycarpus (fortunei)
- Leaves <10cm, not as above -> 45
- Leaves white woolly on one or both sides -> 47
- Leaves not woolly or velvety, leaves to 25cm, palmately lobed… Fatsia (japonica)
- Leaves white woolly all over, pinnately lobed, aromatic. Plant not rooting at nodes… Santolina (chamaecyparissus)
- Leaves white woolly below only -> 49
- Leaves to 12cm, ovate, with translucent dots… Rubus (tricolor)
- Leaves <2cm, oblong, no translucent dots… Dryas (octopetala)
2.6.3 Key 5.3: Deciduous plants
- Twigs with spines, prickles or thorns -> Key 5.3.1
- Twigs unarmed -> 3
- Buds with bud scales -> 5
- Buds without bud scales, or buds hidden/obscured -> Key 5.3.2
- Leaf scars with 3 bundle traces, or in 3 distinct groups -> 7
- Leaf scars not with 3 bundle traces, or leaf scars and bundle traces obscured/absent -> 9
- Terminal buds present -> Key 5.3.3
- Terminal buds absent -> Key 5.3.4
- Terminal buds present -> Key 5.3.5
- Terminal buds absent -> Key 5.3.6
<IP_ADDRESS> Key 5.3.1: Twigs with spines, prickles or thorns
- Plant with prickles or spines -> 3
- Plant with thorns -> 13
- Plants with spines, occurring beneath each bud at each node -> 5
- Plants without spines, but with prickles on stems -> 9
- 1 or 3(+) spines at each node -> 7
- 2 spines at each node, flattened lengthwise and buds concealed beneath leaf scar… Robinia
- Leaf scars many on short shoots beneath bud, wood bright yellow beneath… Berberis
- Leaf scars singular and distinct above spines… Ribes (uva-crispa)
- Twigs extremely stout, leaf scars half encircling twig with ~15 bundle traces in a line… Aralia (elata)
- Not as above, bundle traces 3, if visible -> 11
- Plant with persistant petiole base, where leaf has torn off… Rubus
- Leaf scars present, almost linear… Rosa 13 (2). Twigs with peltate scales -> 15
- Twigs never with peltate scales -> 17
- Twigs without terminal buds, grey to bronze brown scales… Hippophae (rhamnoides)
- Twigs with terminal buds (in at least some twigs), olive brown to silver scales… Eleagnus (umbellatus)
- Twigs never with terminal buds -> 19
- Twigs with terminal buds -> 21
- Buds mostly lateral to thorns… Chaenomeles
- Buds, often many, on thorns themselves. (something about collateral buds?)… Prunus (spinosa) [[21. Thorns not very sharp… Malus
- Thorns sharp -> 23
- Twigs densly long, patent hairy… Mespilus (germanica)
- Twigs not hairy or adpressed hairy -> 25
- Buds purplish, acute… Pyrus
- Buds rounded, reddish… Crataegus]] IMPROVE. FIND BUDS.
<IP_ADDRESS> Key 5.3.3: Leaf scars with 3 bundle traces, terminal buds present.
(buds), (leaf scars), (twigs)
With three bundle traces
Buds with bud scales
With terminal buds
JUGLANS - lateral buds often superposed, blunt to acute with broad. Bud scales thin and scaly, rounded at tip. Leaf scars large and as broad as twig, often ± 3 lobed, with 3 groups of semi circular traces. Twigs thick, slightly angular, hairless.
ALNUS - lateral buds spiral in 1/3 divergence. First bud scale turned towards the stem (adaxial). Buds stalked. Number and shape of bundle traces variable and leaf scars too. Twigs and pith often 3 angular. Infructescences are persistent and cone like.
BETULA - only short shoots with terminal buds, with 5-8 scales on lateral short shoots and 3-5 scales on lateral buds.
STACHYURUS - buds dimorphic. inflorescence branches well developed in racemes. Terminal buds ~3mm long, laterals 2mm. 2-3 outer bud scales. Leaf scars with 3 traces, central larger, laterals less distinct. Twigs slender, glabrous, red to olive brown, long and curving down.
PRUNUS - usually ~6 exposed scales, buds collaterally multiple, elongated ovoid or conical. Terminal buds present (cherries, almonds, peaches) or absent (apricots,plums and sloes). Bundle traces 3, minute, scars half round, elliptical. Pith pale or brown, solid. May have to key out last...
RIBES - buds scales spiral , simple, rather loose, acute, short stalked. Bark shedding. Leaf scars u shaped or broadly crescent shaped. Twigs solid to spongey, decurrently ridged from nodes
ARONIA - red buds, long acute terminal bud, oblong, flattened and appressed. 5 abruptly pointed glandular denticulate scales. Leaf scars u shaped, low. Twigs with solid pith.
FAGUS - buds long fusiform with scales in 4 rows (decussate), divergent and oblique over leaf scars, >10 scales. Leaf scars half round, small, bundle traces 3. Stipular scars almost encircling twig. Twigs, slender, zig-zag, round.
POPULUS - buds dimorphic. Terminal buds surrounded by adaxial stipule scales in a spiral. Lateral buds the first bud scale is opposite the principal axis (i.e lowermost bud scale immediately over leaf scar), leaf scar mostly broadly crescent shaped to triangular, twigs rounded, rarely 5 angled.
AMELANCHIER - buds elongated with half a dozen scales (sometimes more), reddish, acute. Leaf scars narrowly crescent/U shaped. Twigs slender, zig-zag.
COTINUS - buds bluish-white with waxy bloom, two valvate bud scales. Leaf scars crescent shaped to 3 lobed. Twigs with yellow wood when scratched, with lenticels, hairless, with waxy bloom too.
MESPILUS - Buds acute ovoid with >6 bud scales, ciliate. Leaf scars small, dark, crescent shaped and indistinctly 3 traced. Twigs towards the tip densly spreading hairy.
PYRUS - terminal buds of long shoots are more densly hairy. Basal bud scales of terminal buds acute and keeled. Short shoots with terminal buds. Leaf scars small, blackish. Twigs mostly glabrous.
MALUS - unsatisfactory at present...
LABURNUM - bud scales very silver hairy, terminal 3-4mm long. Leaf scar with stipule remains at base, transversely elliptical with 3 bundle traces. Short and long shoots present. Twigs slender, slightly fluted. Pith solid, white.
LIQUIDAMBAR - buds ovoid, acute with 5-6 bud scales, glossy, reddish with thin ciliate margins. Leaf scars half elliptical, little raised on cushions, with 3 bundle traces. Twigs sometimes with corky ridges, somewhat angled, pith solid, star shaped.
DAVIDIA - buds acute ovoid, with round base, glossy dark wine red with up to 6 scales. Leaf scars half elliptical to 3 lobed with 3 bundle traces. Twigs hairless, thick, little zig-zag and pith solid with firmer plates at intervals.
SORBUS - buds variable, sub conical or oblong (globose in torminalis), with terminal buds larger than laterals with inner scales with many hairs and matted with gum, or hairless, bud scales often with a brown margin. Leaf scars with 3 or 5 bundle traces. Leaf cushions different colour to twigs(?).
The Sorbus species with 3 bundle traces are:
Sorbus torminalis - green, glossy bud scales with brown margins, terminal bud blunt (terminal buds 6mm)
Sorbus aria (agg) - Woolly buds, green with brown margin (terminal buds 10mm)
- Pith chambered… Juglans
- Pith not chambered -> 3
- Flower buds numerous on elongated racemes (hortal)… Stachyurus (praecox)
- Flower buds if present, different -> 5
- Lateral buds short to long stalked -> 7
- Lateral buds sessile -> 9
- Tree. Lateral buds long stalked, with 2(3) valvate scales… Alnus
- Small shrub. Lateral buds short stalked, with >5 scales… Ribes
- Trunk and boughs of tree with transverse stripes. Buds often collateral… Prunus
- Not as above -> 11
- Only short shoots with terminal buds (5-8 scaled), lateral buds 3-5 scaled… Betula
- Either long shoots or both long and short shoots with terminal buds -> 13
- Buds clearly dimorphic. Terminal buds: spiral bud scales, lateral buds: distichous scales with lowest above leaf scar… Populus
- Buds similar (terminal buds may be larger), or not as above -> 15
- Terminal buds elongated, slender, acute -> 17
- Terminal buds less elongate, more squat -> 21
- Buds divergent, oblique over leaf scars. >10 bud scales exposed… Fagus
- Bud more appressed to twig, <10 bud scales exposed -> 19
- 5 or fewer glandular denticulate scales on buds… Aronia
5 scales on buds… Amelanchier
- Bud scales 2, valvate. Twigs pruinose, wood yellow… Cotinus (coggyria)
- Bud scales >2, twigs not pruinose, wood not yellow -> 23
- Twigs hairy -> 25
- Twigs hairless -> 33
- Stipules persistent on leaf scar cushion. Buds densly silver hairy… Laburnum
- Stipules not persistent on leaf scar cushion -> 27
- Buds with at least some white hairs -> 29
- Buds with hairs not white or absent -> 35
- Bud scales green with brown margin, buds raised on petiole base differently coloured to rest of twig… Sorbus
- Not as above -> 31
- Lateral buds appresssed… Malus
- Lateral buds spreading -> 33
- Leaf scars raised equal to bud width, terminal bud larger to 12mm… Pyrus and Malus
- Leaf scars raised, > bud width, spreading hirsute to twig apex, terminal bud to 6mm… Mespilus
- Buds with golden hairs at tip, otherwise brown, acute conical… Pyrus
- Buds mostly hairless, buds either glossy or sticky ->37
- Buds shiny dark purple, twigs with indisinct white partitions… Davidia
- Buds sticky, green to brown. Pith 5 angled, not partitioned… Liquidambar
<IP_ADDRESS> Key 5.3.4: Leaf scars with 3 bundle traces, terminal buds absent
TILIA - bud scales 2(3), mostly green or red glistening. Leaf scars 2 ranked on shoots, stipule scars with one of the pair much elongated, bundle traces 3 or compound and then scattererd. Twigs zig-zag, pith solid.
BETULA - only short shoots with terminal buds, with 5-8 scales on lateral short shoots and (2)3-5 scales on lateral buds. Leaf scars 2 ranked, half elliptical, small, bundle traces 3, stipule scars narrow. Twigs, slender, zig-zag, round, pith minute, 3 sided, solid.
CYDONIA - buds with 1-2 exposed bud scales, appressed. Leaf scars small, shallow, u shaped, bundle traces 3, stipule scars small and elongated. Twigs gray woolly, pith small, solid.
ULMUS - buds solitary, ovoid, oblique to leaf scar, bud scales ~6, 2 ranked. Leaf scars 2 ranked, broadly crescent shaped or half round, bundle traces 3 or in 3 groups, stipule scars unequal. Twigs slender, zig-zag, rounded, pith solid.
CORYLUS - buds with 4-6 scales, obliquely sessile. Leaf scars 2 ranked anf half round/ triangular, bundle traces 3 or multiplied and obscure.
CARPINUS -
OSTRYA -
BACCHARIS -
MYRICA -
COLUTEA -
KERRIA -
SORBARIA -
PRUNUS -
RHAMNUS -
SALIX -
<IP_ADDRESS> Key 5.3.5
GINGKO
TAXODIUM
LARIX
DAPHNE
RHODODENDRON
DAPHNE
ELAEGNUS
FICUS
LIRIODENDRON
MAGNOLIA
ALNUS
SORBUS
FAGUS
PAEONIA
QUERCUS
POTENTILLA
<IP_ADDRESS> Key 5.3.6
NOTHOFAGUS
TAMARIX
MORUS
PLATANUS
CASTANEA
TILIA
AILANTHUS
GENISTA
CYTISUS
TAXODIUM
SPIRAEA
HIPPOCREPIS
COTONEASTER
POTENTILLA
Lvs simple
K = Simple, entire, alt (only helpful for evergreen taxa)
N = Simple, toothed, alt (only helpful for evergreen taxa)
TWIGS, PITH, BUDS, LEAF SCARS, BT’S
Olearia -
KA - paniculata #EVERGREEN - leaves with peltate scales, entire, alternate. Net veined. Unarmed NC - macrodonta #EVERGREEN - leaves without peltate scales, toothed, alterate. Net veined. Twigs brown, angled. Upturned spine like teeth on leaves
Eleagnus
KA - umbellata #EVERGREEN NB, NC - macrophylla
Hippophae
KA - rhamnoides
Quercus
KA - ilex #EVERGREEN NC, ND, PA - suber, ilex #EVERGREEN PA - cerris PA - robus PA - petraea PA - rubra PA - coccinea
Buddleja
KA - alternifolia
Cotoneaster
KB - many species SOME #EVERGREEN
Frangula
KB - alnus
Salix
KB - many KF
Photinia
KB - davidiana #EVERGREEN
Cydonia
KB - oblonga
Fagus
KB - sylvatica
Pyrus
KB - salicifolius
Brachyglottis
KB, NC - x jubar #EVERGREEN
Rhododendron
KB - ponticum #EVERGREEN KB, NF - luteum
Pittosporum
KB - tobira #EVERGREEN KB - tenuifolium #EVERGREEN KC - crassifolium #EVERGREEN
Berberis
KB - many sp
Laurus
KB - nobilis #EVERGREEN
Bupleurum
KB - fruticosum #EVERGREEN
Vaccinium
KB, NF - corymbosum
Cotinus
KB - coggyria
Skimmia
KC - japonica #EVERGREEN
Atriplex
KC - halimus #EVERGREEN
Ilex
KC, ND - x altaclerensis #EVERGREEN ND - aquifolium #EVERGREEN
Griselinia
KC - littoralis #EVERGREEN
Tamarix
KC - gallica KC - africana
Lycium
KC - barbarum KC - chinense
Berberis
BER - many species SOME #EVERGREEN
Spartium
KC - junceum
Genista
KC - aetnensis KC - tenera KF - tinctoria KF - hispanica occidentalis KF - anglica KF - pilosa
Hedera -
KD - helix etc
Muehlenbeckia
KD - complexa
Fallopia
KD - baldschuanica
Empetrum
KE - nigrum #EVERGREEN
Ledum
KE - palustre #EVERGREEN
Daboecia
KE - cantabrica #EVERGREEN
Vaccinium
KE - vitis-idaea #EVERGREEN KE - macrocarpon #EVERGREEN KE - oxycoccos #EVERGREEN KE - microcarpon #EVERGREEN KF - uliginosum
Andromeda
KE - polifolia #EVERGREEN
Herniaria
KF - ciliolata #EVERGREEN???
Suadea
KF - vera #EVERGREEN
Artemisia
KF - campestris maritima #EVERGREEN??
Sedum
KF - praealtum #EVERGREEN
Daphne
KF - laureola #EVERGREEN KF - mezereum
Iberis
KF - sempervirens #EVERGREEN
Arctostaphylos
KF - uva-ursi #EVERGREEN
Diapensia
KF - lapponica #EVERGREEN
<IP_ADDRESS>.<IP_ADDRESS>.<IP_ADDRESS>.<IP_ADDRESS>.<IP_ADDRESS>.<IP_ADDRESS>.<IP_ADDRESS>.<IP_ADDRESS>.<IP_ADDRESS>.<IP_ADDRESS>.<IP_ADDRESS>.<IP_ADDRESS>.<IP_ADDRESS>.<IP_ADDRESS>.<IP_ADDRESS>.0.1
Lvs toothed
Chaenomeles
NA - japonica NA - speciosa
Berberis
NA - many sp
Ribes
NA, PB - uva-crispa PB - rubrum PB - spicatum PB - alpinus PB - odoratum PB - nigrum PB -sanguineum
Pyracantha
NA - coccinea #EVERGREEN
Rhamnus
NA - cathartica ND - alaternus
Prunus
NA - spinosa ND - laurocerasus, lusitanica #EVERGREEN NF - many sp
Crataegus
NA - mollis NA - persimilis
Malus
NA - sylvestris NF - domestica
Pyrus
NA - communis NA - pyraster NA - cordata
Dryas
NB - octopetala #EVERGREEN
Gaultheria
NB, ND - shallon #EVERGREEN NB - procumbens #EVERGREEN ND - mucronata
Salix
NB - many sp NF - many sp
Arctostaphylos
NB - alpinus
Vaccinium
NB - myrtillus NB - vitis-idaea #EVERGREEN
Phyllodoce
NB - caerulea #EVERGREEN
Tilia
NB - petiolaris, tomentosa NE - many sp NF - many sp
Populus
NC - many sp NF - many sp PA - many sp
Sorbus
NC - many sp PA - many sp PA - torminalis
SD - aucuparia, domestica, cashmiriana, pseudohupehensis
Escallonia #EVERGREEN
ND - macrantha
Arbutus #EVERGREEN
ND - unedo
Leucothoe #EVERGREEN
ND - fontanesiana
Parrotia
NE - persica
Alnus
NE - glutinosa, incana, rubra NF - cordata
Castanea
NE - sativa
Corylus
NE - avenalla, colurna PB - avenalla
Betula
NE - many sp
Ulmus
NE - many sp
Carpinus
NE - betulus
Ostrya
NE - carpinifolia
Kerria
NE - japonica
Fagus
NE - sylvatica
Nothofagus
NE - obliqua, x dodecaphleps, alpina
Amelanchier
NF - lamarckii
Myrica
NF - gale, pensylvanica
Baccharis
NF - halmifolia
Spiraea
NF - many sp PB - many sp
Morus
NF - nigra
Mespilus
NF - germanica
Aronia
NF - arbutifolia, melanocarpa
Amelanchier
NF - lamarckii
<IP_ADDRESS>
leaves lobed
Lavatera
PA - arborea PB - x clementii #EVERGREEN
Platanus
PA - x hispanica, orientalis
Trachycarpus
PA - fortunei #EVERGREEN
Ficus
PA, PB - carica
Liriodendron
PA - tulipifera
Crataegus
PB - monogyna, laevigata
Santolina
PB - chamaecyparissus #EVERGREEN
Rubus
PB - tricolor #EVERGREEN PB - odoratus PB - parviflorus
RF - all other brambles SA - cockburnianus, idaeus
Dryas
PB - octopetala #EVERGREEN
Fatsia
PB - japonica #EVERGREEN
Vitis
PC - vinifera, coignetiae
Parthenocissus
PC - tricuspidata RH - inserta, quinquefolia
Solanum
PC - dulcamara
Laburnum
RA - anagryoides, x watereri, alpinum
Ulex
see key 2
<IP_ADDRESS>.<IP_ADDRESS>.1
Leaves compound
Choisya
already keyed
Medicago
RG - arborea
Akebia
RH - quinata
Rosa
SA - many sp
Robinia
SB - pseudoacacia
Juglans
SB, SD - regia
Coronilla
SB - valentina #EVERGREEN
Potentilla
SB - fruticosa
Hippocrepis
SB - emerus
Cotulea
SB - arborescens
Rhus
SD - typina
Pterocarya
SD - fraxinifolia
Ailanthus
SD - altissima
Mahonia
SD - aquifolium, x media #EVERGREEN
Sorbaria
SD - sorbifolia, kirilowii, tomentosa
Aralia
TA - elata
Acacia
TA - dealbata #EVERGREEN
Lupinus
RE - arborea
Acaena?
Cut text
- Bundle traces many (9 or more) in an elliptical, arc shaped or U-shaped series -> 19
- Bundle traces fewer (7 or less). Buds not superposed. -> 21
- Pith chambered … Paulownia (>3)
- Pith not chambered … Fraxinus (>3)
- Buds naked often behind a persistent petiole base … Cornus (3)
Buds with 5-6 scales (thorny?) … Rhamnus (3)
- Terminal buds very large, at least 2x as large as laterals, 20mm+. Leaf scars very large, distinct … Aesculus (>3)
- Terminal buds not much larger than laterals, or absent -> 25
- Stipule scars large and obvious ± 1/4 to 1/2 size of leaf scars … Staphylea (3)
- Stipule scars absent or not obvious -> 27
- Buds with a pair of scales meeting in the middle or ± so - buds globose, red … Viburnum (3)
- Buds with > 2 scales or buds naked -> 29
- Terminal buds or all buds naked -> 31
- All buds with scales -> 35
- Naked buds stellate scurfy … Viburnum (3)
- Naked buds not stellate scurfy -> 33
- Bundle traces 3. Lateral buds >5mm, adpressed, hairy … Cornus (3)
Bundle traces >3. Lateral buds minute <2mm … Hydrangea (3, but check all Hydrangeas)
Vegetative key to Quercus species:
Quercus - buds with 5-ranked scales, clustered towards end of twig. Fruits nuts held in a cupule.
- Leaves evergreen, white to grey woolly below at least when young -> 3
- Leaves deciduous -> 5
- Bark corky, leaves with 5-8 spine tipped teeth … Quercus suber
- Bark not corky, leaves only spined on young shoots … Quercus ilex
- Terminal bud cluster with long, narrow, persistent stipules … Quercus cerris
- Terminal bud cluster with without long, narrow, persistent stipules -> 7
- Leaves lobed with aristate teeth. Hairless except for tufts of orange stellate hairs in vein axils below. Petiole >2.5cm -> 9
- Leaves not toothed with aristate teeth. hairs present or not, but not as above. Petiole <2.5cm -> 11
- Leaves dull above, lobes < half way to midrib. Hair tufts inconspicuous … Quercus rubra
- Leaves shiny above, lobes > half way to midrib. Hair tufts obvious … Quercus coccinea
- Petiole to 1cm. Leaves cordate with reflexed auricles at base. Dull dark green above. Hairless or simple hairs below … Quercus robur
- Petiole >1cm. Leaves cuneate, auricles absent. Shiny dark green above. Hairs stellate below … Quercus petraea
Glossary: Stipules - small herbaceous organs at base of buds or petiole Stellate - star shaped Aristate - with an awn or bristle Cordate - heart shaped, with base rounded Auricules - small lobed appendage Cuneate - tapered to a base


They decided to help by creating their own.
Located about 30 minutes southwest of Athens in Morgan County, the remote location made it difficult for its residents to access fresh, good-quality produce. The Konkles started the Chesterhill Produce Auction, which helped bring an isolated community out of a food desert.
The Konkles had previously experienced the success of a large, fruitful produce auction managed by a local Mennonite community where they had lived in Bainbridge, and it planted a seed in Jean’s mind.
“Jean had the idea to create a produce auction in Chesterhill, and it became her big project,” said Tom Redfern, the director of sustainable agriculture and forestry at Rural Action, a local non-profit organization. “I came here to work with Rural Action’s agricultural program, and what we’re trying to do is make a local food system to help improve the economy.”
He said it’s imperative for a non-profit to be applying for all the grants they can in order to support their initiatives. Redfern said he knew better than anyone how badly Chesterhill needed Jean’s idea to pan out in the community’s favor.
Marvin died in early October 2019 at 85 years old, and Jean has been in declining health since. Redfern said he worked closely with the Konkles as they dedicated the future of their retirement to transforming rural Southeast Ohio into a profitable, local food hub. The process of developing a produce auction is long and laboring and something the Konkles had experience with when they moved to the area.
Redfern said the primary goal of the auction was to ensure that more people would have access to fresh produce while supporting the local farmers who grow it. Jean began the process by reaching out to her Amish neighbors, who were dedicated farmers and carpenters, to see if she could pique their interest in an otherwise daunting initiative.
“Community impact is a combination of economic impacts and fresh food access...Chesterhill has no grocery stores and few places to buy fresh produce. Given its central location, the Chesterhill Produce Auction meets the needs of this community by providing affordable food to residents.”-Jessica Dotson
She conducted meetings where she explained how the produce auction would be successful and how it would help generate more income for the community in Chesterhill.
Morgan County is one of the poorest counties in Ohio. It has a total population of fewer than 15,000 people with a median household income of $28,868 per year, according to a 2010 study done by the Ohio University Voinovich School for Leadership and Public Affairs.
“Rural Action worked with Jean, Ohio State University’s educational extension and a few producers from Bainbridge who had started the auction there, and we basically began meeting each month,” Redfern said.
Redfern said that Rural Action helped turn the Konkle’s dreams into a reality.
“The produce auction serves as a point of aggregation to make it worthwhile for people to come there,” Redfern said, describing the impact the auction made in combating the village’s geographical isolation.
As the auction developed, Rural Action created a culturally acceptable, functional framework to ensure the involvement of the Amish farmers who played a key role in the project’s success.
“The majority of people who participate in the produce auction are non-Amish, but the majority of food is from the Amish farms,” Redfern said.
Every Monday and Thursday afternoon from May to October, the market is open. Redfern said that many local consumers who participate in the auction purchase wholesale produce, including but not limited to local restaurants, resellers and Ohio University. However, most auction attendees are residents of Morgan County picking up a bag of produce for the week.
“Without the produce auction, Chesterhill would be very dependent on major corporate grocery chains miles away for access to food,” Levi Brown, an AmeriCorps VISTA volunteer responsible for managing the auction’s business development, said.
In June 2005, the first produce auction took place under a few shaky tents, as the official auction house was still under construction. Amish farmers watched as their produce sold in bulk, finally allowing them to turn a sustainable profit for the first time in many years.
Amish farmers often hoist fresh produce onto their horse-drawn buggies and make the journey to the auction house. Wooden pallets hold the produce on the auction floor while excited buyers inspect it, hoping to set their sights on the best fresh deals.
“These are very diversified producers,” Redfern said. “They have greenhouses, raise livestock, mill lumber and build furniture, so there’s plenty of work to do on the farms.”
Rural Action’s role has grown as the produce auction has evolved over time. Initially, the non-profit’s role was to connect the Konkles with local resources that would help them to manage the logistics of the auction. In 2010, the Konkles decided to retire permanently, and Rural Action approached them about purchasing the auction with the promise that it would remain fully functional. Rural Action now runs the auction as a social enterprise with help from community investors, various grants, loans and partnerships with local organizations.
Redfern estimated that the auction brought in approximately $370,000 in gross sales in 2019. This shows a significant increase from the auction’s early days, where a full year’s sales barely made $50,000. Despite these figures, the residents of Chesterhill say that the auction is beneficial to the community.
“A lot of people choose to go to the grocery store, but the Chesterhill Produce Auction has created a time and space for people to come and shop. They’ve brought those conveniences to the farmers, too,” said Rose Berardi, owner of the Triple Nickel Diner, a local, family-owned and operated restaurant that regularly sources produce from the auction. “I know that tons of restaurants from Athens and Morgan County buy from the produce auction, especially in order to store for the winter.”
The main goal of the auction is to create a space where people can come together to build a community, Jessica Dotson, the site assistant for the auction, said.
“Community impact is a combination of economic impacts and fresh food access,” Dotson said. “Chesterhill has no grocery stores and few places to buy fresh produce. Given its central location, the Chesterhill Produce Auction meets the needs of this community by providing affordable food to residents.”


S1REN automatically loads tweets containing certain keywords and locations, then detects potential rescue requests using machine learning.
S1REN presents potential requests for aid within an intuitive interface, letting humans dispatch help or flag tweets as false alarms.
Geographic data is extracted from tweets and mapped, allowing users to address the needs of high-priority, high-density areas.
The real-time and flexible nature of S1REN means that it can be used for any emergency and even to detect budding events, saving money and time.